此仓库包含了在 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>最近,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.json,local.settings.json 和 infra。Azure Functions 只需要前两个 JSON 文件。infra 目录不是必需的,但它对于配置 Azure 资源非常方便。
您的项目不太可能有相同名称的文件和目录,但如果确实如此,您需要重命名它们以避免被覆盖。
一旦完成了必要的重命名,请按照以下步骤操作:
azd init --template self-hosted-mcp-scaffold-python。/your/mcp/project/folder 中的应用程序吗?选择“是”。host.json 中:
arguments 的值,例如 weather.pyport 值与 MCP 服务器使用的端口一致更多关于 模板 的细节。
克隆仓库并在 Visual Studio Code 中打开示例
git clone https://github.com/Azure-Samples/mcp-sdk-functions-hosting-python.git
uv run func start 创建虚拟环境,安装依赖项并启动本地服务器Ctrl+Command+I / Ctrl+Alt+I),然后在问题窗口中切换到 Agent 模式。[!NOTE] 当服务器本地启动时,Azure Functions 主机会首先 ping 根 (
/) 以确保应用程序正在运行。由于根未实现,会返回 404 错误。MCP SDK 的信息日志默认写入 stderr,这就是为什么它们在 Azure Functions 中显示为红色的原因。
在部署之前,您需要注册 Microsoft.App 资源提供程序:
az provider register --namespace 'Microsoft.App'
等待几秒钟直到注册完成。您可以使用以下命令检查状态:
az provider show -n Microsoft.App
此示例使用 Visual Studio Code 作为主要客户端。将其配置为允许的客户端应用程序:
azd env set PRE_AUTHORIZED_CLIENT_IDS aebc6443-996d-45c2-90f0-388ff96faa56
如果您的组织需要,指定服务管理参考。如果您不是 Microsoft 员工并且不知道是否需要设置此选项,可以跳过此步骤。但是,如果因为缺少服务管理参考而导致配置失败,您可能需要重新访问此步骤。使用 Microsoft 租户的 Microsoft 员工必须提供服务管理参考(您的服务树 ID)。没有这个,您将无法创建 Entra 应用注册,配置也会失败。
azd env set SERVICE_MANAGEMENT_REFERENCE <service-management-reference>
在根目录下运行 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/
[!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 服务器授权时,您应该看到以下事件序列:
除了 Visual Studio Code 之外,Azure AI Foundry 中的代理也可以连接到配置了 Easy Auth 的 Function 托管 MCP 服务器。相关文档即将推出。
当您不再使用服务器时,可以使用以下命令删除在 Azure 上创建的资源,以避免产生进一步的成本:
azd down
| 语言 (堆栈) | 仓库位置 |
|---|---|
| C# (.NET) | mcp-sdk-functions-hosting-dotnet |
| Node | mcp-sdk-functions-hosting-node |
以下是常见的几个问题。
InternalServerError: 出现意外的 InternalServerError。请稍后再试。
检查是否已注册 Microsoft.App 资源提供程序:
az provider show -n Microsoft.App
如果显示为未注册,请注册它:
az provider register --namespace 'Microsoft.App'
成功注册应显示:
Namespace 注册策略 注册状态
------------- ---------- -------------
Microsoft.App 注册所需 已注册
然后再次运行 azd up。
错误:执行步骤命令 'deploy --all' 时出错:获取目标资源:找不到资源:无法找到标记为 'azd-server-name: api' 的资源。请确保服务资源在您的基础设施配置中正确标记,并重新运行配置
这是一个 已知的瞬时错误。尝试重新运行 azd up。
确保您已安装最新版本的 Azure Functions 核心工具。
您需要 版本 >=4.5.0。通过运行 func --version 检查。
.vscode/mcp.json 必须位于根目录,以便 VS Code 检测 MCP 服务器注册
如果您看不到服务器注册上方的 Start 按钮,可能是因为 .vscode/mcp.json 没有位于您的工作区文件夹的根目录。