远程MCP天气服务器——Azure函数(.NET)
](https://codespaces.new/Azure-Samples/remote-mcp-functions) 
遥控器 模型上下文协议(MCP) 服务器构建于 Azure 函数 和 .NET 10 它展示了一个由免费软件驱动的天气工具 开放气象API。不需要API密钥。
使用此模板可以快速构建、调试和将您自己的远程MCP服务器部署到Azure。服务器通过HTTPS和功能密钥的设计进行保护,并支持通过VNET进行可选的网络隔离。
背景——为什么在Azure函数上使用远程MCP?
这 模型上下文协议(MCP) 使AI助手能够安全地调用外部工具并访问数据。虽然MCP服务器经常运行 本地 (通过 stdio),运行它们 远程地 解锁关键优势:
- 共享访问 --单个部署的MCP服务器可以为多个客户端和用户提供服务。
- 服务器端机密 -API密钥、数据库连接和凭据保留在服务器上,从不向客户端公开。
- 集中更新 --更新工具逻辑一次;所有连接的客户端都会立即收到更改。
- 企业安全 -利用Azure网络(VNET、专用端点)、托管身份和API管理/入口ID进行身份验证。
- 可扩展性 --Azure Functions Flex Consumption计划可自动扩展到零和多达100个实例。
这 远程mcp功能 该集合演示了如何使用两种方法构建这些远程服务器: Azure功能的MCP扩展 和 自托管MCP SDK服务器。此项目使用 MCP扩展 方法。
解决方案设计——MCP扩展与MCP SDK
在Azure Functions上托管MCP服务器有两种不同的方法。了解权衡有助于您为您的场景选择合适的方案。
flowchart TB
subgraph ExtApproach["MCP Extension for Azure Functions"]
direction TB
E1["Your code: tool logic only(McpToolTrigger attribute)"]
E2["MCP protocol handling: managed by Functions host"]
E3["Transport: built-in SSE + Streamable HTTP"]
E1 --> E2 --> E3
end
subgraph SDKApproach["Self-hosted MCP SDK"]
direction TB
S1["Your code: tool logic + server setup (MCP SDK)"]
S2["MCP protocol handling: your responsibility"]
S3["Transport: configured in your SDK setup"]
S1 --> S2 --> S3
end
ExtApproach -.- note1["✅ This project uses this approach"]
style note1 fill:#d4edda,stroke:#28a745,color:#155724
style ExtApproach fill:#e7f3ff,stroke:#0078d4
style SDKApproach fill:#fff3e0,stroke:#f57c00比较
| MCP扩展 (本项目) | MCP SDK(自托管) | |
|---|---|---|
| 如何定义工具 | 声明性-- [McpToolTrigger] 函数的属性 | 程序化--在MCP SDK服务器构建器中注册工具 |
| 协议处理 | 完全由Azure Functions主机管理 | 您可以配置和管理MCP服务器生命周期 |
| 运输 | 内置SSE+流式HTTP /runtime/webhooks/mcp | 您可以在代码中设置传输(SSE、stdio等) |
| 代码行数 | 最小——只需编写工具逻辑 | 更多设置——服务器初始化、DI、传输配置 |
| 灵活性 | 基于公约;非常适合标准工具 | 完全控制服务器行为、中间件和资源 |
| 最佳 | 快速开发、标准工具模式、熟悉Azure Functions的团队 | 自定义MCP功能、复杂的服务器逻辑、非Functions托管 |
为什么这个项目使用MCP扩展
该项目使用 MCP扩展 方法是因为:
- 最小样板 --单身
[McpToolTrigger]属性将任何函数转换为MCP工具。不需要服务器设置、传输配置或协议管道。 - 原生函数体验 --遵循与HTTP触发器、定时器触发器等相同的触发器/绑定模式。如果你了解Azure Functions,那么你已经知道如何构建MCP工具。
- 生产就绪的基础设施 --该扩展管理会话、传输协商和
/runtime/webhooks/mcp端点是自动的,所以您可以专注于工具逻辑。
特性
- MCP工具--
GetWeather:返回任何城市名称或邮政编码的当前天气状况(温度、湿度、风、条件)。 - 与当地人一起建造 Azure功能MCP扩展 (
McpToolTrigger). - 用途 开放天气 地理编码+天气API-- 不需要API密钥.
- 部署在 Azure函数灵活消费 规划经济高效的无服务器扩展。
- 基础设施即代码 Bicep 通过以下方式进行一次指挥部署 Azure开发者命令行界面 (
azd up). - 预配置的VS Code MCP客户端配置,用于本地开发。
建筑
flowchart LR
Client["🖥️ MCP Client\n(VS Code, Claude, etc.)"]
Functions["⚡ Azure Functions Host\n(.NET Isolated Worker)"]
Tool["🌤️ GetWeather Tool\n(McpToolTrigger)"]
API["🌍 Open-Meteo API\n(geocoding + weather)"]
Client -- "MCP (SSE / HTTP)\nJSON-RPC request" --> Functions
Functions -- "JSON-RPC response" --> Client
Functions --> Tool
Tool -- "HTTP GET" --> APIAzure部署
flowchart TB
subgraph Azure["☁️ Azure Subscription"]
RG["📦 Resource Group"]
subgraph RG
ASP["📋 App Service Plan\n(Flex Consumption FC1)"]
FA["⚡ Function App\n(dotnet-isolated v10)"]
MI["🔑 Managed Identity"]
SA["💾 Storage Account"]
AI["📊 Application Insights"]
LA["📝 Log Analytics"]
VNET["🔒 Virtual Network\n(optional)"]
end
end
ASP --> FA
MI --> FA
MI --> SA
MI --> AI
FA --> SA
FA --> AI
AI --> LA
VNET -.-> FA
VNET -.-> SA先决条件
项目结构
├── azure.yaml # Azure Developer CLI configuration
├── infra/ # Bicep infrastructure-as-code
│ ├── main.bicep # Main deployment (subscription scope)
│ ├── main.parameters.json # Deployment parameters
│ ├── abbreviations.json # Resource naming abbreviations
│ └── app/
│ ├── api.bicep # Function App (Flex Consumption)
│ ├── rbac.bicep # Managed identity role assignments
│ ├── vnet.bicep # Virtual network (optional)
│ └── storage-PrivateEndpoint.bicep
├── src/
│ ├── McpWeatherServer.csproj # .NET project file
│ ├── Program.cs # Functions host entry point
│ ├── WeatherFunction.cs # MCP tool definition
│ ├── WeatherService.cs # Open-Meteo API client
│ ├── host.json # Functions host configuration
│ └── local.settings.json # Local dev settings
└── .vscode/
└── mcp.json # VS Code MCP client configuration快速入门--本地运行
- 安装Azurite (本地存储模拟器):
npm install -g azurite- 开始Azurite 在单独的终端中:
azurite --silent- 启动Functions主机:
cd src
func start- MCP服务器现在运行在:
| 传输 | URL |
|---|---|
上海证券交易所 http://localhost:7071/runtime/webhooks/mcp/sse | |
| 流式HTTP | http://localhost:7071/runtime/webhooks/mcp |
- 从VS代码连接:The
.vscode/mcp.json已预先配置--打开Copilot Chat并询问以下内容 _“西雅图的天气怎么样?”_.
部署到Azure
- 登录:
azd auth login- 提供和部署 (创建所有资源并部署代码):
azd up系统将提示您输入环境名称和Azure区域。部署大约需要3-5分钟。
- 获取已部署的端点:
azd env get-values寻找 AZURE_FUNCTION_NAME --您的远程MCP端点将是:
https://.azurewebsites.net/runtime/webhooks/mcp- 检索功能键 (远程访问需要):
az functionapp keys list -n -g --query "systemKeys.mcp_extension" -o tsv将其作为查询参数附加: ?code=.
连接MCP客户端
VS代码--本地
已在中配置 .vscode/mcp.json.快跑 func start 并使用Copilot聊天。
VS代码--远程(Azure)
向添加新条目 .vscode/mcp.json:
{
"servers": {
"remote-mcp-weather": {
"type": "http",
"url": "https://.azurewebsites.net/runtime/webhooks/mcp/sse?code="
}
}
}克劳德桌面版
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"weather": {
"type": "sse",
"url": "https://.azurewebsites.net/runtime/webhooks/mcp/sse?code="
}
}
}MCP工具
GetWeather
返回给定位置的当前天气状况。
| 参数 | 类型 | 说明 |
|---|---|---|
location | string | 城市名称或邮政编码(例如。, Seattle, 94568, New York) |
示例响应:
{
"Location": "Dublin, California, United States",
"Condition": "Clear sky",
"TemperatureC": 16,
"TemperatureF": 62,
"HumidityPercent": 64,
"WindKph": 22,
"Wind": "22 km/h WNW",
"ReportedAtUtc": "2026-03-05 05:15:00Z",
"Source": "open-meteo"
}Azure资源
与一起部署时 azd up,将创建以下资源:
| 资源 | 目的 |
|---|---|
| Azure 函数 (灵活消费FC1) | 托管MCP服务器 |
| 存储帐户 | 功能应用程序状态和部署包 |
| 应用洞察 | 监测和记录 |
| 日志分析工作区 | 集中式日志 |
| 用户分配的托管身份 | 安全访问存储和监控 |
| 虚拟网络 (可选) | 具有专用端点的网络隔离 |
成本
弹性消费计划仅按实际执行时间收费。对于开发和低流量场景,成本很低。看 Azure功能定价 了解详情。
清理
要删除所有Azure资源,请执行以下操作:
azd down贡献
许可证
此项目根据MIT许可证获得许可——请参阅 许可证.md.
