返回市场
MCP-SDK功能托管-Python

MCP-SDK功能托管-Python

作者:Azure-Samples28 星标更新:2025-11-18

项目介绍

在 Azure Functions(早期预览版)上托管远程 MCP 服务器,使用官方 MCP SDK 构建

此仓库包含了在 Azure Functions 上运行使用 Python MCP SDK 构建的 MCP 服务器的说明和示例。该仓库使用天气样本服务器来演示如何实现这一点。您可以克隆并本地运行和测试服务器,然后通过 azd up 轻松部署到云端,几分钟内即可完成。

观看视频概述

<a href="https://www.youtube.com/watch?v=PAxBlQ9mFv8" target="_blank"> <img src="./media/video-thumbnail.jpg" alt="观看视频" width="500" /> </a>

将 MCP 服务器作为自定义处理器在 Azure Functions 上运行

最近,Azure Functions 发布了 Functions MCP 扩展,允许开发者使用 Functions 编程模型构建 MCP 服务器,这本质上是 Functions 的事件驱动框架,并将其远程托管在无服务器平台上。

对于已经使用 Anthropic 的 MCP SDK 构建服务器的人来说,也可以通过运行它们作为 自定义处理器 来将这些服务器托管在 Azure Functions 上。自定义处理器是轻量级的 Web 服务器,从 Functions 主机接收事件。它们允许您无需更改代码即可托管已构建的 MCP 服务器,并且可以受益于 Functions 的突发扩展能力、无服务器定价模式和安全特性。

本仓库专注于第二种托管场景:

<div align="center"> <img src="./media/function_hosting.png" alt="显示托管函数应用和自定义处理器应用的图表。" width="500"> </div>

先决条件

确保您拥有以下内容:

[!NOTE] 此示例需要您有权在用于此示例的 Azure 订阅中创建 Microsoft Entra 应用

如果您已经有现成的服务器...

[!IMPORTANT] 您的服务器必须是 无状态的 并使用 streamable-http 传输才能在今天的 Azure Functions 上进行远程托管。

以下说明将拉取本地服务器测试和部署所需的内容。最重要的是:host.jsonlocal.settings.jsoninfra。Azure Functions 只需要前两个 JSON 文件。infra 目录不是必需的,但它对于配置 Azure 资源非常方便。

您的项目不太可能有相同名称的文件和目录,但如果确实如此,您需要重命名它们以避免被覆盖。

一旦完成了必要的重命名,请按照以下步骤操作:

  1. 在 MCP 服务器项目内部,运行 azd init --template self-hosted-mcp-scaffold-python
  2. 回答提示问题
    • 继续初始化 /your/mcp/project/folder 中的应用程序吗?选择“是”。
    • 本地和模板中都存在的文件:很可能只有 README,您可以保留现有的。
    • 输入唯一的环境名称:这将成为服务器部署所在的资源组名称。
  3. host.json 中:
    • 将主 Python 脚本路径设置为 arguments 的值,例如 weather.py
    • 确保 port 值与 MCP 服务器使用的端口一致
  4. 按照从 本地测试服务器 部分开始的说明进行操作。

更多关于 模板 的细节。

如果您要从头开始...

克隆仓库并在 Visual Studio Code 中打开示例

git clone https://github.com/Azure-Samples/mcp-sdk-functions-hosting-python.git

本地测试服务器

  1. 在根目录下,运行 uv run func start 创建虚拟环境,安装依赖项并启动本地服务器
  2. 打开 mcp.json(位于 .vscode 目录中)
  3. 通过选择 local-mcp-server 上方的 Start 按钮启动服务器
  4. 点击顶部的 Copilot 图标打开聊天窗口(或 Ctrl+Command+I / Ctrl+Alt+I),然后在问题窗口中切换到 Agent 模式。
  5. 点击工具图标,确保选中 local-mcp-server 以便 Copilot 在聊天中使用: <img src="./media/mcp-tools.png" width="200" alt="MCP 工具列表截图">
  6. 当服务器显示可用工具数量时,询问“使用 #local-mcp-server 返回纽约市的天气”。Copilot 应该调用其中一个天气工具来帮助回答这个问题。
  7. 停用虚拟环境

[!NOTE] 当服务器本地启动时,Azure Functions 主机会首先 ping 根 (/) 以确保应用程序正在运行。由于根未实现,会返回 404 错误。

MCP SDK 的信息日志默认写入 stderr,这就是为什么它们在 Azure Functions 中显示为红色的原因。

部署前注册资源提供程序

在部署之前,您需要注册 Microsoft.App 资源提供程序:

az provider register --namespace 'Microsoft.App'

等待几秒钟直到注册完成。您可以使用以下命令检查状态:

az provider show -n Microsoft.App

部署

  1. 此示例使用 Visual Studio Code 作为主要客户端。将其配置为允许的客户端应用程序:

    azd env set PRE_AUTHORIZED_CLIENT_IDS aebc6443-996d-45c2-90f0-388ff96faa56
    
  2. 如果您的组织需要,指定服务管理参考。如果您不是 Microsoft 员工并且不知道是否需要设置此选项,可以跳过此步骤。但是,如果因为缺少服务管理参考而导致配置失败,您可能需要重新访问此步骤。使用 Microsoft 租户的 Microsoft 员工必须提供服务管理参考(您的服务树 ID)。没有这个,您将无法创建 Entra 应用注册,配置也会失败。

    azd env set SERVICE_MANAGEMENT_REFERENCE <service-management-reference>
    
  3. 在根目录下运行 azd up。然后选择要部署资源的 Azure 订阅并从可用区域中选择。

    部署完成后,您的终端将显示类似以下的输出:

      (✓) 完成: 资源组: rg-resource-group-name (12.061s)
      (✓) 完成: 应用服务计划: plan-random-guid (6.748s)
      (✓) 完成: 虚拟网络: vnet-random-guid (8.566s)
      (✓) 完成: 日志分析工作区: log-random-guid (29.422s)
      (✓) 完成: 存储帐户: strandomguid (34.527s)
      (✓) 完成: Application Insights: appi-random-guid (8.625s)
      (✓) 完成: 函数应用: func-mcp-random-guid (36.096s)
      (✓) 完成: 私有端点: blob-private-endpoint (30.67s)
    
      部署服务 (azd deploy)
      (✓) 完成: 部署服务 api
      - 终端: https://functionapp-name.azurewebsites.net/
    

在 Visual Studio Code 中连接到服务器

  1. 在编辑器中打开 mcp.json
  2. 通过选择 local-mcp-server 上方的 Stop 按钮停止本地服务器。
  3. 通过选择 remote-mcp-server 上方的 Start 按钮启动远程服务器。
  4. Visual Studio Code 会提示您输入函数应用名称。从终端输出或门户中复制它。
  5. 在 Agent 模式下打开 Copilot,并确保在工具列表中选中 remote-mcp-server
  6. VS Code 会提示您进行 Microsoft 身份验证。点击 Allow,然后登录您的 Microsoft 帐户(用于访问 Azure 门户的那个)。
  7. 向 Copilot 提问:“使用 #remote-mcp-server 返回西雅图的天气。”它应该调用其中一个天气工具来帮助回答。

[!TIP] 除了在 mcp.json 中启动 MCP 服务器外,您还可以通过点击 More... -> Show Output 查看服务器的输出。输出提供了有用的信息,如连接失败的原因。

您还可以点击齿轮图标将日志级别更改为“Traces”,以获取客户端(Visual Studio Code)和服务器之间交互的更多详细信息。

<img src="./media/log-level.png" width="200" alt="日志级别截图">

重新部署

如果您希望在更改后重新部署服务器,请运行 azd deploy。(参见 azd 命令 参考。)

内置服务器认证和授权

服务器应用程序配置了内置的服务器认证和授权功能,实现了 MCP 授权规范 的要求,如发出 401 挑战和暴露受保护资源元数据 (PRM)。

在 Visual Studio Code 的调试输出中,您可以看到 MCP 客户端和服务器交互的一系列请求和响应。当使用内置 MCP 服务器授权时,您应该看到以下事件序列:

  1. 编辑器向 MCP 服务器发送初始化请求。
  2. MCP 服务器响应错误,指示需要授权。响应包括指向应用程序受保护资源元数据 (PRM) 的指针。内置授权功能为服务器应用程序生成 PRM。
  3. 编辑器获取 PRM 并使用它来识别授权服务器。
  4. 编辑器尝试从授权服务器上的知名端点获取授权服务器元数据 (ASM)。
  5. Microsoft Entra ID 不支持在知名端点上的 ASM,因此编辑器回退到使用 OpenID Connect 元数据端点来获取 ASM。它通过在任何其他路径信息之前插入知名端点来尝试发现这一点。
  6. 实际上,OpenID Connect 规范定义了知名端点应在路径信息之后,而 Microsoft Entra ID 就托管在这里。所以编辑器再次尝试这种格式。
  7. 编辑器成功检索到 ASM。然后它使用这些信息以及自己的客户端 ID 进行登录。此时,编辑器提示您登录并同意应用程序。
  8. 假设您成功登录并同意,编辑器完成登录。它重复对 MCP 服务器的初始化请求,这次在请求中包含授权令牌。此重新尝试在调试输出级别不可见,但可以在跟踪输出级别看到。
  9. MCP 服务器验证令牌并对初始化请求作出成功的响应。标准的 MCP 流从此处继续,最终导致发现在此示例中定义的 MCP 工具。

支持其他客户端

除了 Visual Studio Code 之外,Azure AI Foundry 中的代理也可以连接到配置了 Easy Auth 的 Function 托管 MCP 服务器。相关文档即将推出。

清理资源

当您不再使用服务器时,可以使用以下命令删除在 Azure 上创建的资源,以避免产生进一步的成本:

azd down

下一步

在其他语言中找到此示例

语言 (堆栈)仓库位置
C# (.NET)mcp-sdk-functions-hosting-dotnet
Nodemcp-sdk-functions-hosting-node

故障排除

以下是常见的几个问题。

  1. InternalServerError: 出现意外的 InternalServerError。请稍后再试。

    检查是否已注册 Microsoft.App 资源提供程序:

    az provider show -n Microsoft.App
    

    如果显示为未注册,请注册它:

    az provider register --namespace 'Microsoft.App'
    

    成功注册应显示:

    Namespace      注册策略    注册状态
    -------------  ----------  -------------
    Microsoft.App  注册所需    已注册
    

    然后再次运行 azd up

  2. 错误:执行步骤命令 'deploy --all' 时出错:获取目标资源:找不到资源:无法找到标记为 'azd-server-name: api' 的资源。请确保服务资源在您的基础设施配置中正确标记,并重新运行配置

    这是一个 已知的瞬时错误。尝试重新运行 azd up

  3. 确保您已安装最新版本的 Azure Functions 核心工具。

    您需要 版本 >=4.5.0。通过运行 func --version 检查。

  4. .vscode/mcp.json 必须位于根目录,以便 VS Code 检测 MCP 服务器注册

    如果您看不到服务器注册上方的 Start 按钮,可能是因为 .vscode/mcp.json 没有位于您的工作区文件夹的根目录。