远程MCP天气服务器

一个基于Azure Functions和.NET构建的远程模型上下文协议(MCP)服务器,通过Open-Meteo API提供实时天气数据。

  • by jpad5
  • Bicep
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 jpad5/mcp-remote-server-azure-func

使用说明

远程MCP天气服务器——Azure函数(.NET)

遥控器 模型上下文协议(MCP) 服务器构建于 Azure 函数 和 .NET 10 它展示了一个由免费软件驱动的天气工具 开放气象API。不需要API密钥。

使用此模板可以快速构建、调试和将您自己的远程MCP服务器部署到Azure。服务器通过HTTPS和功能密钥的设计进行保护,并支持通过VNET进行可选的网络隔离。

📚 基于远程MCP功能集合 --该项目是 Azure示例/远程mcp函数 该仓库提供快速入门模板,用于在Azure Functions上跨多种语言(Python、TypeScript、C#、Java)构建远程MCP服务器。访问 回购概述 查看完整目录和其他资源。

背景——为什么在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(自托管)
包裹 Microsoft.Azure.Functions.Worker.Extensions.Mcp ModelContextProtocol (官方C#SDK)
如何定义工具 声明性-- [McpToolTrigger] 函数的属性 程序化--在MCP SDK服务器构建器中注册工具
协议处理 完全由Azure Functions主机管理 您可以配置和管理MCP服务器生命周期
运输 内置SSE+流式HTTP /runtime/webhooks/mcp 您可以在代码中设置传输(SSE、stdio等)
代码行数 最小——只需编写工具逻辑 更多设置——服务器初始化、DI、传输配置
灵活性 基于公约;非常适合标准工具 完全控制服务器行为、中间件和资源
最佳 快速开发、标准工具模式、熟悉Azure Functions的团队 自定义MCP功能、复杂的服务器逻辑、非Functions托管
示例仓库 C · python · TypeScript · Java C · python · TypeScript

为什么这个项目使用MCP扩展

该项目使用 MCP扩展 方法是因为:

  1. 最小样板 --单身 [McpToolTrigger] 属性将任何函数转换为MCP工具。不需要服务器设置、传输配置或协议管道。
  2. 原生函数体验 --遵循与HTTP触发器、定时器触发器等相同的触发器/绑定模式。如果你了解Azure Functions,那么你已经知道如何构建MCP工具。
  3. 生产就绪的基础设施 --该扩展管理会话、传输协商和 /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" --> API

Azure部署

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

先决条件

要求 安装
.净10 SDK 下载
Azure功能核心工具v4 安装
Azure开发者命令行界面(azd) 安装 (v1.23+)
Node.js(适用于Azurite) 下载
Azure订阅 免费账户

项目结构

├── 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

快速入门--本地运行

  1. 安装Azurite (本地存储模拟器):

    npm install -g azurite
    
  2. 开始Azurite 在单独的终端中:

    azurite --silent
    
  3. 启动Functions主机:

    cd src
    func start
    
  4. MCP服务器现在运行在:

    传输 URL
    上海证券交易所 http://localhost:7071/runtime/webhooks/mcp/sse
    流式HTTP http://localhost:7071/runtime/webhooks/mcp
  5. 从VS代码连接:The .vscode/mcp.json 已预先配置--打开Copilot Chat并询问以下内容 “西雅图的天气怎么样?”.

部署到Azure

  1. 登录:

    azd auth login
    
  2. 提供和部署 (创建所有资源并部署代码):

    azd up
    

    系统将提示您输入环境名称和Azure区域。部署大约需要3-5分钟。

  3. 获取已部署的端点:

    azd env get-values
    

    寻找 AZURE_FUNCTION_NAME --您的远程MCP端点将是:

    https://<AZURE_FUNCTION_NAME>.azurewebsites.net/runtime/webhooks/mcp
    
  4. 检索功能键 (远程访问需要):

    az functionapp keys list -n <AZURE_FUNCTION_NAME> -g <RESOURCE_GROUP> --query "systemKeys.mcp_extension" -o tsv
    

    将其作为查询参数附加: ?code=<KEY>.

连接MCP客户端

VS代码--本地

已在中配置 .vscode/mcp.json.快跑 func start 并使用Copilot聊天。

VS代码--远程(Azure)

向添加新条目 .vscode/mcp.json:

{
  "servers": {
    "remote-mcp-weather": {
      "type": "http",
      "url": "https://<FUNCTION_APP>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<MCP_EXTENSION_KEY>"
    }
  }
}

克劳德桌面版

添加到您的 claude_desktop_config.json:

{
  "mcpServers": {
    "weather": {
      "type": "sse",
      "url": "https://<FUNCTION_APP>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<MCP_EXTENSION_KEY>"
    }
  }
}

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.