返回市场
远程-mcp-api管理-功能-python

远程-mcp-api管理-功能-python

作者:Azure-Samples110 星标更新:2025-10-03

项目介绍

使用 Azure API 管理器安全地远程部署 MCP 服务器(实验性)

图示

Azure API 管理器充当 MCP 服务器的 AI 网关

此示例实现了最新的 MCP 授权规范

这是一个序列图,用于理解流程。

将远程 MCP 服务器部署到 Azure

  1. 注册 Microsoft.App 资源提供程序。

    • 如果您使用的是 Azure CLI,请运行 az provider register --namespace Microsoft.App --wait
    • 如果您使用的是 Azure PowerShell,请运行 Register-AzResourceProvider -ProviderNamespace Microsoft.App。然后在一段时间后运行 (Get-AzResourceProvider -ProviderNamespace Microsoft.App).RegistrationState 来检查注册是否完成。
  2. 运行此 azd 命令以配置 API 管理服务、函数应用(含代码)以及所有其他所需的 Azure 资源

    azd up
    

使用 MCP 检查器进行测试

  1. 在一个新的终端窗口中,安装并运行 MCP 检查器

    npx @modelcontextprotocol/inspector
    
  2. 使用 CTRL+点击从应用程序显示的 URL 加载 MCP 检查器 Web 应用(例如 http://127.0.0.1:6274/#resources)

  3. 设置传输类型为 SSE

  4. 设置 URL 为您正在运行的 API 管理器 SSE 终点,该终点在 azd up 后显示,并连接

    https://<apim-servicename-from-azd-output>.azure-api.net/mcp/sse
    
  5. 列出工具。点击一个工具并运行工具

技术架构概述

此解决方案在 Azure 上部署了一个安全的 MCP(模型上下文协议)服务器基础设施。架构实现了一个多层安全模型,其中 Azure API 管理器作为智能网关处理身份验证、授权和请求路由。

概览图

部署的 Azure 资源

基础结构配置了以下 Azure 资源:

核心网关基础设施

  • Azure API 管理器 (APIM) - 中央安全网关,暴露 OAuth 和 MCP API
    • SKU:BasicV2(可配置)
    • 身份:系统分配和用户分配的托管标识
    • 用途:处理身份验证流、请求验证和到后端服务的安全代理

后端计算

  • Azure 函数应用 - 托管 MCP 服务器实现
    • 运行时:Python 3.11,在 Flex 消费计划上
    • 认证:具有托管标识集成的功能级认证
    • 用途:执行 MCP 工具和操作(在此示例中为片段管理)

存储和数据

  • Azure 存储帐户 - 提供多种存储功能
    • 功能托管:存储函数应用部署包
    • 应用程序数据:用于片段存储的 Blob 容器
    • 安全性:配置有托管标识访问和可选的私有终结点

安全性和身份

  • 用户分配的托管标识 - 使服务到服务的身份验证安全

    • 用途:允许函数应用在不使用密钥的情况下访问存储和应用程序洞察
    • 权限:存储 Blob 数据拥有者、存储队列数据贡献者、监控指标发布者
  • Entra ID 应用程序注册 - OAuth2/OpenID Connect 客户端用于认证

    • 用途:根据 MCP 规范启用第三方授权流
    • 配置:启用 PKCE 的公共客户端,带有自定义重定向 URI

监控和可观测性

  • 应用程序洞察 - 提供遥测和监控
  • 日志分析工作区 - 集中式日志记录和分析

可选网络安全性

  • 虚拟网络 (VNet) - 当 vnetEnabled 为真时
    • 私有终结点:安全连接到存储帐户
    • 网络隔离:函数和存储通过私有网络通信

为什么选择这些资源?

Azure API 管理器作为安全边界,实现:

  • 根据 MCP 规范的 OAuth 2.0/PKCE 认证流
  • 会话密钥加密/解密以安全访问 API
  • 请求验证和标头注入
  • 速率限制和节流能力
  • 集中的策略管理

Azure 函数提供:

  • 无服务器、按需付费的计算模型
  • 与 Azure 服务的原生集成
  • 基于需求的自动扩展
  • 内置的监控和诊断

托管标识消除了对:

  • 服务凭证管理的需求
  • 密钥轮换过程
  • 凭证暴露风险

Azure API 管理器配置详情

APIM 实例配置有两个主要 API,它们协同工作以实现 MCP 授权规范:

OAuth API (/oauth/*)

此 API 实现了 MCP 规范所需的所有 OAuth 2.0 授权服务器功能:

终点和操作

授权端点 (GET /authorize)

  • 用途:启动 OAuth 2.0/PKCE 流程
  • 策略逻辑
    1. 从 MCP 客户端请求中提取 PKCE 参数
    2. 检查现有用户同意(通过 cookie)
    3. 如果未授予同意,则重定向到同意页面
    4. 为 Entra ID 通信生成新的 PKCE 参数
    5. 将身份验证状态存储在 APIM 缓存中
    6. 重定向用户到 Entra ID 进行身份验证

同意管理 (GET/POST /consent)

  • 用途:处理 MCP 客户端访问的用户同意
  • 特性:通过安全 cookie 持久化同意

OAuth 元数据端点 (GET /.well-known/oauth-authorization-server)

  • 用途:根据 RFC 8414 发布 OAuth 服务器配置
  • 返回:关于支持的端点、流程和功能的 JSON 元数据

客户端注册 (POST /register)

  • 用途:支持动态客户端注册,符合 MCP 规范

令牌端点 (POST /token)

  • 用途:交换授权码以获取访问令牌
  • 策略逻辑
    1. 验证来自 MCP 客户端的授权码和 PKCE 验证器
    2. 交换 Entra ID 授权码以获取访问令牌
    3. 为 MCP API 访问生成加密的会话密钥
    4. 将访问令牌与会话密钥映射缓存
    5. 返回加密的会话密钥给 MCP 客户端

命名值和配置

OAuth API 使用多个 APIM 命名值进行配置:

  • McpClientId - 注册的 Entra ID 应用程序客户端 ID
  • EntraIDFicClientId - 用于令牌交换的服务标识客户端 ID
  • APIMGatewayURL - 回调和元数据端点的基础 URL
  • OAuthScopes - 请求的 OAuth 范围(openid + Microsoft Graph)
  • EncryptionKey / EncryptionIV - 用于会话密钥加密

MCP API (/mcp/*)

此 API 提供实际的 MCP 协议端点,并实施安全措施:

终点和操作

服务器发送事件端点 (GET /sse)

  • 用途:建立 MCP 协议的实时通信通道
  • 安全性:需要有效的加密会话令牌

消息端点 (POST /message)

  • 用途:处理 MCP 协议消息和工具调用
  • 安全性:需要有效的加密会话令牌

安全策略实现

MCP API 对所有操作应用全面的安全策略:

  1. 授权标头验证

    <check-header name="Authorization" failed-check-httpcode="401" 
                  failed-check-error-message="Not authorized" ignore-case="false" />
    
  2. 会话密钥解密

    • 从授权标头中提取加密的会话密钥
    • 使用存储的密钥和 IV 通过 AES 解密
    • 验证令牌格式和结构
  3. 令牌缓存查找

    <cache-lookup-value key="@($"EntraToken-{context.Variables.GetValueOrDefault("decryptedSessionKey")}")" 
                        variable-name="accessToken" />
    
  4. 访问令牌验证

    • 验证缓存的访问令牌是否存在且有效
    • 如果无效,则返回 401 并附带正确的 WWW-Authenticate 标头
  5. 后端认证

    <set-header name="x-functions-key" exists-action="override">
        <value>{{function-host-key}}</value>
    </set-header>
    

安全模型

解决方案实现了一个复杂的多层安全模型:

第 1 层:OAuth 2.0/PKCE 认证

  • MCP 客户端必须完成与 Entra ID 的完整 OAuth 流程
  • PKCE 防止授权码拦截攻击
  • 用户同意管理,带有持久偏好设置

第 2 层:会话密钥加密

  • 访问令牌从未暴露给 MCP 客户端
  • 加密的会话密钥提供时间限定的访问
  • 在 APIM 中使用 AES 加密和安全密钥管理

第 3 层:功能级安全

  • 功能主机密钥保护对 Azure 函数的直接访问
  • 托管标识确保安全的服务到服务通信
  • 通过 VNet 集成可用的网络隔离

第 4 层:Azure 平台安全

  • 所有流量在传输过程中加密(TLS)
  • 通过托管标识访问存储
  • 通过应用程序洞察进行审计日志记录

这种分层方法确保即使一个安全边界被破坏,多个额外的保护仍然存在。