远程MCP服务器功能

使用Azure Functions和Python快速构建和部署自定义远程MCP服务器到云端,支持本地调试和云端部署,提供安全性和网络隔离选项。

  • by rjayapra
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 rjayapra/ntg-occanalysis-mcp

使用说明

<!--

name:带Azure函数的远程MCP(Python) description:在Azure函数上运行远程MCP服务器。
page_type:示例 语言:

  • python
  • 二头肌
  • azdeveloper 产品:
  • azure函数
  • 蔚蓝 urlFragment:远程mcp函数python

-->

使用Azure函数(Python)开始使用远程MCP服务器

这是一个快速入门模板,可以使用Azure Functions和Python轻松构建自定义远程MCP服务器并将其部署到云端。您可以通过调试在本地计算机上克隆/还原/运行,以及 azd up 几分钟后就可以把它放在云端了。MCP服务器通过使用密钥和HTTPS进行设计来保护,并允许使用内置身份验证和/或 API管理 以及使用VNET进行网络隔离。

如果您正在寻找更多语言的此示例,请查看 .NET/C# 和 Node.js/TypeScript 版本。

以下是使用Azure Functions的远程MCP服务器的架构图:

先决条件

准备好当地环境

此特定示例需要Azure存储模拟器,因为我们将从blob存储中读取占用数据。

  1. 开始Azurite

    docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \
        mcr.microsoft.com/azure-storage/azurite
    

备注 如果你使用来自VS Code扩展的Azurite,你需要运行 Azurite: Start 现在,否则你会看到错误。

从终端本地运行MCP服务器

  1. 在新的终端窗口中切换到src文件夹:

    cd src
    
  2. 安装Python依赖项:

    pip install -r requirements.txt
    

备注 在执行以下操作之前创建虚拟环境是一种最佳做法 pip install 以避免依赖关系问题/冲突,或者如果您在CodeSpaces中运行。看 VS代码中的Python环境 了解更多信息。

  1. 在本地启动Functions主机:

    func start
    

备注 默认情况下,这将使用webhooks路由: /runtime/webhooks/mcp/sse稍后,我们将在Azure中使用它来设置客户端/主机调用的密钥: /runtime/webhooks/mcp/sse?code=<system_key>

连接到 本地 来自客户端/主机的MCP服务器

VS代码-副驾驶代理模式

  1. 添加MCP服务器 从命令面板中,将URL添加到正在运行的Function应用程序的SSE端点:

    http://0.0.0.0:7071/runtime/webhooks/mcp/sse
    
  2. 列出MCP服务器 从命令面板启动服务器

  3. 在Copilot聊天代理模式下,输入提示以触发工具,例如,输入以下提示:

    Say Hello
    
    List all available occupations
    
    Get job codes for rank S1 in NavComm
    
    Get all duty areas for occupation NavComm
    
  4. 当系统提示运行该工具时,点击同意 继续

  5. 完成后,在终端窗口中按Ctrl+C停止Functions主机进程。

MCP检查员

  1. 在一个 新终端窗口,安装并运行MCP检查器

    npx @modelcontextprotocol/inspector
    
  2. 按CTRL键单击可从应用程序显示的URL加载MCP Inspector web应用程序(例如。http://0.0.0.0:5173/#resources)

  3. 将运输类型设置为 SSE

  4. 将URL设置为正在运行的Function应用程序的SSE端点,然后 连接:

    http://0.0.0.0:7071/runtime/webhooks/mcp/sse
    

备注 此步骤在CodeSpaces中不起作用。请继续部署到远程MCP。

  1. 列出工具。单击工具,然后 运行工具.

部署到Azure以实现远程MCP

运行这个 雅匝德 命令为功能应用程序配置任何所需的Azure资源,并部署您的代码:

azd up

您可以选择加入示例中使用的ExpressRoute。为此,请先执行此操作 azd up

azd env set VNET_ENABLED true

另外, API管理 可用于提高MCP服务器的安全性和策略,以及 App Service内置身份验证 可用于设置您最喜欢的OAuth提供程序,包括Entra。

连接到您的 远程 来自客户端的MCP服务器功能应用程序

您的客户端将需要一个密钥来调用新的托管SSE端点,其格式为 https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse默认情况下,托管功能需要一个系统密钥,可以从 门户 或CLI(az functionapp keys list --resource-group <resource_group> --name <function_app_name>).获取名为的系统密钥 mcp_extension.

在MCP Inspector中连接到远程MCP服务器

对于MCP检查器,您可以在URL中包含密钥:

https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<your-mcp-extension-system-key>

在VS Code中连接到远程MCP服务器-GitHub Copilot

对于VS Code中的GitHub Copilot,您应该将密钥设置为 x-functions-key 标题在 mcp.json,你只需使用 https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse 以下示例使用输入,并在从VS Code启动服务器时提示您提供密钥。备注 mcp.json 已包含在此仓库中,并将由VS Code获取。单击服务器上的“开始”,系统将提示输入以下值 functionapp-name (在您的/.alue/*/env文件中)和 functions-mcp-extension-system-key 可以从上面的CLI命令或Function App门户中的API密钥中获取。

{
  "inputs": [
    {
      "type": "promptString",
      "id": "functions-mcp-extension-system-key",
      "description": "Azure Functions MCP Extension System Key",
      "password": true
    },
    {
      "type": "promptString",
      "id": "functionapp-name",
      "description": "Azure Functions App Name"
    }
  ],
  "servers": {
    "remote-mcp-function": {
      "type": "sse",
      "url": "https://${input:functionapp-name}.azurewebsites.net/runtime/webhooks/mcp/sse",
      "headers": {
        "x-functions-key": "${input:functions-mcp-extension-system-key}"
      }
    },
    "local-mcp-function": {
      "type": "sse",
      "url": "http://0.0.0.0:7071/runtime/webhooks/mcp/sse"
    }
  }
}

对于MCP检查器,您可以在URL中包含密钥: https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<your-mcp-extension-system-key>.

对于VS Code中的GitHub Copilot,您应该将密钥设置为 x-functions-key 标题在 mcp.json,你只需使用 https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse 以下示例使用输入,当您从VS Code启动服务器时,将提示您提供密钥:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "functions-mcp-extension-system-key",
      "description": "Azure Functions MCP Extension System Key",
      "password": true
    }
  ],
  "servers": {
    "my-mcp-server": {
      "type": "sse",
      "url": "<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse",
      "headers": {
        "x-functions-key": "${input:functions-mcp-extension-system-key}"
      }
    }
  }
}

重新部署代码

你可以运行 azd up 根据需要多次执行命令,以配置Azure资源并将代码更新部署到功能应用程序。

[!注意] 部署的代码文件总是被最新的部署包覆盖。

清理资源

使用完功能应用程序和相关资源后,您可以使用此命令从Azure中删除功能应用程序及其相关资源,从而避免产生任何进一步的成本:

azd down

有用的Azure命令

部署应用程序后,您可以使用以下命令来管理和监视应用程序:

# Get your function app name from the environment file
FUNCTION_APP_NAME=$(cat .azure/$(cat .azure/config.json | jq -r '.defaultEnvironment')/env.json | jq -r '.FUNCTION_APP_NAME')
echo $FUNCTION_APP_NAME

# Get resource group
RESOURCE_GROUP=$(cat .azure/$(cat .azure/config.json | jq -r '.defaultEnvironment')/env.json | jq -r '.AZURE_RESOURCE_GROUP')
echo $RESOURCE_GROUP

# View function app logs
az webapp log tail --name $FUNCTION_APP_NAME --resource-group $RESOURCE_GROUP

# Redeploy the application without provisioning new resources
azd deploy

源代码

MCP服务器提供以下工具:

代码段工具

工具 说明
hello_mcp 一个简单的hello world工具
get_snippet 从Azure Blob存储中按名称检索代码段
save_snippet 将带有名称的代码段保存到Azure Blob存储

职业数据工具

这些工具查询存储在Azure Blob存储中的JSON文件形式的职业数据:

工具 说明 参数
list_all_occupations 列出所有可用的职业 无
get_available_occupations 获取职业数据(全部或特定) occupation (可选)
get_all_ranks 获取职业数据中的所有独特排名 occupation (可选)
get_job_codes_for_rank 获取特定职级的职位代码 rank (必填), occupation (可选)
get_tasks_for_job_code 获取特定作业代码的任务 job_code (必填), occupation (可选)
get_tasks_for_duty_area 获取特定职责范围的任务 duty_area_code (必填), job_code (可选), occupation (可选)
get_skills_for_job_code 获取特定工作代码的技能 job_code (必填), occupation (可选)
get_knowledge_for_job_code 获取工作代码的知识项 job_code (必填), occupation (可选)
get_all_duty_areas 获取所有独特的职责范围 occupation (可选)

职业工具提示示例

List all available occupations
Get all ranks for NavComm occupation
Get job codes for rank S1 in NavComm
Get tasks for job code 514157 in NavComm
Get all duty areas for NavComm

函数代码在Python文件中定义 src 目录。MCP函数注释将这些函数作为MCP服务器工具公开。

请注意 host.json 文件还包括对实验包的引用,这是使用此功能的应用程序所必需的:

"extensionBundle": {
  "id": "Microsoft.Azure.Functions.ExtensionBundle.Experimental",
  "version": "[4.*, 5.0.0)"
}

后续步骤