Getting Started with Remote MCP Servers using Azure Functions (.NET/C#)
这是一个快速启动模板,可用于轻松构建和部署自定义远程 MCP 服务器到云端,使用 Azure Functions。 您可以在本地机器上克隆/还原/运行并进行调试,然后使用 `azd up` 命令在几分钟内将其部署到云端。 MCP 服务器在设计上是安全的,因为它使用了...
Azure-Samples
README
使用 Azure Functions (.NET/C#) 搭建远程 MCP 服务器入门
这是一个快速入门模板,可用于轻松构建和部署自定义远程 MCP 服务器到云端,使用 Azure Functions。你可以在本地机器上克隆/还原/运行并进行调试,然后使用 azd up
命令在几分钟内将其部署到云端。MCP 服务器在设计上通过密钥和 HTTPS 进行保护,并允许使用 EasyAuth 和/或 API 管理进行更多 OAuth 选项,以及使用 VNET 进行网络隔离。
如果你正在寻找其他语言的示例,请查看 Node.js/TypeScript 和 Python 示例。
前提条件
- .NET 8 SDK
- Azure Functions Core Tools
- Azure Developer CLI
- 若要使用 Visual Studio 在本地运行和调试:
- Visual Studio 2022。
- 确保在安装过程中选择 Azure 开发 工作负载。
- 若要使用 Visual Studio Code 在本地运行和调试:
以下是使用 Azure Functions 的远程 MCP 服务器的架构图:
准备本地环境
此特定示例需要 Azure 存储模拟器,因为我们将从 Blob 存储中保存和获取代码片段。
-
启动 Azurite
docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \ mcr.microsoft.com/azure-storage/azurite
注意 如果你使用来自 VS Code 扩展的 Azurite,则需要立即运行
Azurite: Start
,否则会看到错误。
从终端在本地运行 MCP 服务器
-
从
src
文件夹中,运行以下命令以在本地启动 Functions 主机:cd src func start
请注意,默认情况下,这将使用 webhooks 路由:/runtime/webhooks/mcp/sse
。稍后,我们将在 Azure 中使用它来设置客户端/主机调用的密钥:/runtime/webhooks/mcp/sse?code=<system_key>
从客户端/主机中使用 MCP 服务器
VS Code - Copilot 编辑
-
从命令面板 添加 MCP 服务器,并将 URL 添加到正在运行的 Function app 的 SSE 终结点:
http://0.0.0.0:7071/runtime/webhooks/mcp/sse
-
从命令面板 列出 MCP 服务器 并启动服务器
-
在 Copilot 聊天代理模式下,输入提示以触发该工具,例如,选择一些代码并输入以下提示
Say Hello
Save this snippet as snippet1
Retrieve snippet1 and apply to NewFile.cs
-
当提示运行该工具时,单击 继续 表示同意
-
完成后,在终端窗口中按 Ctrl+C 停止
func.exe
主机进程。
MCP Inspector
-
在新的终端窗口中,安装并运行 MCP Inspector
npx @modelcontextprotocol/inspector node build/index.js
-
按住 CTRL 键并单击以从应用程序显示的 URL 加载 MCP Inspector Web 应用程序(例如 http://0.0.0.0:5173/#resources)
-
将传输类型设置为
SSE
-
将 URL 设置为正在运行的 Function app 的 SSE 终结点并连接:
http://0.0.0.0:7071/runtime/webhooks/mcp/sse
-
列出工具。单击一个工具并运行工具。
部署到 Azure 以进行远程 MCP
运行此 azd 命令以预配函数应用以及任何必需的 Azure 资源,并部署你的代码:
azd up
你可以选择在此示例中使用 VNet。为此,请在 azd up
之前执行以下操作
azd env set VNET_ENABLED true
此外,API 管理 可用于增强 MCP 服务器的安全性和策略,并且 应用服务内置身份验证 可用于设置你喜欢的 OAuth 提供程序,包括 Entra。
从客户端连接到你的函数应用
你的客户端需要一个密钥才能调用新的托管 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,你可以将密钥包含在 URL 中:https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<your-mcp-extension-system-key>
。
对于 VS Code 中的 GitHub Copilot,你应该改为在 mcp.json
中将密钥设置为 x-functions-key
标头,并且你只需使用 https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse
作为 URL。以下示例使用输入,并在你从 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 资源并将代码更新部署到你的函数应用。
[!NOTE] 已部署的代码文件始终会被最新的部署包覆盖。
清理资源
完成函数应用和相关资源的使用后,你可以使用以下命令从 Azure 中删除函数应用及其相关资源,以避免产生任何进一步的费用:
azd down
源代码
GetSnippet
和 SaveSnippet
终结点的函数代码在 SnippetsTool.cs
中定义。应用于异步 Run
方法的 McpToolsTrigger
属性将代码函数公开为 MCP 服务器。
这显示了一些 MCP 服务器示例的代码(获取字符串、获取对象、保存对象):
[Function(nameof(SayHello))]
public string SayHello(
[McpToolTrigger(HelloToolName, HelloToolDescription)] ToolInvocationContext context
)
{
logger.LogInformation("Saying hello");
return "Hello I am MCP Tool!";
}
[Function(nameof(GetSnippet))]
public object GetSnippet(
[McpToolTrigger(GetSnippetToolName, GetSnippetToolDescription)] ToolInvocationContext context,
[BlobInput(BlobPath)] string snippetContent)
{
return snippetContent;
}
[Function(nameof(SaveSnippet))]
[BlobOutput(BlobPath)]
public string SaveSnippet(
[McpToolTrigger(SaveSnippetToolName, SaveSnippetToolDescription)] ToolInvocationContext context,
[McpToolProperty(SnippetNamePropertyName, PropertyType, SnippetNamePropertyDescription)] string name,
[McpToolProperty(SnippetPropertyName, PropertyType, SnippetPropertyDescription)] string snippet)
{
return snippet;
}
下一步
- 将 API 管理 添加到你的 MCP 服务器
- 将 EasyAuth 添加到你的 MCP 服务器
- 使用 VNET_ENABLED=true 标志启用 VNET
- 了解有关 Microsoft 的相关 MCP 工作 的更多信息
推荐服务器
contentful-mcp
在你的 Contentful Space 中更新、创建、删除内容、内容模型和资源。

Supabase MCP Server
一个模型上下文协议(MCP)服务器,它提供对 Supabase 管理 API 的编程访问。该服务器允许 AI 模型和其他客户端通过标准化的接口来管理 Supabase 项目和组织。

Azure MCP Server
通过 Claude Desktop 实现与 Azure 服务的自然语言交互,支持资源管理、订阅处理和租户选择,并提供安全身份验证。

Settlemint
利用 SettleMint 的模型上下文协议服务器,无缝地与企业区块链基础设施交互。通过人工智能驱动的助手构建、部署和管理智能合约,从而简化您的区块链开发工作流程,实现最高的效率。

Brev
在云端运行、构建、训练和部署机器学习模型。

Story Protocol SDK MCP
这个服务器提供 MCP(模型上下文协议)工具,用于与 Story 的 Python SDK 交互。 功能: * 获取许可条款 * 使用 PIL 条款铸造和注册 IP 资产 * 铸造许可代币 * 向钱包发送 $IP * 通过 Pinata [外部] 上传图像到 ipfs * 通过 Pinata [外部] 上传 IP 和 NFT 元数据

Tembo MCP Server
一个 MCP 服务器,它使 Claude 能够与 Tembo Cloud 平台 API 交互,从而允许用户通过自然语言管理 Tembo Cloud 资源。

Workers MCP
一个连接 Claude Desktop 和其他 MCP 客户端到 Cloudflare Workers 的软件包,从而可以通过模型上下文协议,使用自然语言访问自定义功能。

Appwrite MCP Server
一个模型上下文协议服务器,允许 AI 助手与 Appwrite 的 API 交互,从而提供管理 Appwrite 项目中数据库、用户、函数、团队和其他资源的工具。
MCP2Lambda
通过 MCP 协议,人工智能模型能够与 AWS Lambda 函数交互,从而在安全的环境中访问私有资源、实时数据和自定义计算。