模型上下文协议服务器部署指南

该指南详细介绍了如何在AWS上部署支持OAuth 2.0认证的Model Context Protocol服务器,实现安全远程访问和标准兼容的认证流程。

  • by aws-solutions-library-samples
  • TypeScript
  • 本地部署
  • 155 星标
  • 更新于
在 GitHub 查看 aws-solutions-library-samples/guidance-for-deploying-model-context-protocol-servers-on-aws

使用说明

在AWS上部署模型上下文协议服务器的指南

目录

  1. 概述
  2. 先决条件
  3. 部署步骤
  4. 部署验证
  5. 运行指南
  6. 后续步骤
  7. 清理
  8. 常见问题解答、已知问题、其他注意事项和限制
  9. 修订
  10. 通知

概述

本指南演示了如何使用Amazon Cognito在AWS上部署具有安全身份验证的模型上下文协议(MCP)服务器,实现 2025-06-18 MCP规范 使用OAuth 2.0受保护资源元数据(RFC9728)。它使您能够托管可以远程访问的MCP服务器,同时通过符合标准的OAuth 2.0身份验证流程维护安全性。

该解决方案解决了几个关键挑战:

  • 在AWS基础架构上安全托管MCP服务器
  • 使用OAuth 2.0受保护资源元数据进行符合标准的身份验证(RFC9728)
  • 通过安全的StreamableHTTP传输远程访问MCP服务器
  • 用于并发客户端支持的无状态服务器架构
  • 使用AWS CDK进行可扩展和可维护的部署

建筑

该架构实现了:

  1. CloudFront分布 通过WAF保护实现全球内容交付
  2. 应用程序负载平衡器 用于流量分配和SSL终止
  3. ECS Fargate和Lambda 适用于容器化和无服务器MCP服务器
  4. AWS Cognito OAuth 2.0授权服务器功能
  5. OAuth 2.0受保护的资源元数据 符合标准的身份验证端点
  6. 流式HTTP传输 无状态请求处理
  7. 四栈CDK部署:VPC、安全、CloudFront WAF和MCP服务器堆栈

成本

您负责运行本指南时使用的AWS服务的费用。截至2025年8月,在美国东部(北弗吉尼亚州)地区使用默认设置运行本指南的成本约为每月194.18美元,用于处理中等流量水平。

我们建议创建一个 预算 通过 AWS成本资源管理器 以帮助管理成本。价格可能会发生变化。有关完整详细信息,请参阅本指南中使用的每项AWS服务的定价网页。

预估成本表

下表提供了在美国东部(北弗吉尼亚州)地区部署本指南一个月的默认参数的成本明细示例。

AWS服务 尺寸 成本[美元]
VPC(NAT网关) 1个NAT网关×730小时+100 GB数据处理 37.35美元
弹性负载平衡 中等流量的应用程序负载平衡器 16.83美元
亚马逊干邑 10500 MAU(50000免费等级以内) 0.00美元
CloudFront 2 TB数据传输+1500万个请求 87.96美元
WAF 2个Web ACL(云前端和区域) 10.00美元
云服务器(Fargate) 1个vCPU,2GB内存×730小时 36.04美元
秘密管理器 Cognito凭据的1个秘密 0.40美元
Lambda 自定义资源(最低使用量) 0.20美元
总计 194.18美元/月

先决条件

操作系统

这些部署说明经过优化,可用于 亚马逊Linux 2 AMI在另一个操作系统中部署可能需要额外的步骤。

所需工具

  1. AWS-CLI 已安装并配置
  2. Node.js v14或更高版本
  3. AWS CDK 安装:
    npm install -g aws-cdk
    

AWS CDK引导

如果您是第一次使用AWS CDK,请引导您的帐户:

cdk bootstrap

部署步骤

  1. 克隆存储库:

    git clone <repository-url>
    cd guidance-for-deploying-model-context-protocol-servers-on-aws
    cd source/cdk/ecs-and-lambda
    
  2. 安装依赖项:

    npm install
    
  3. 登录公共ECR:

    aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
    
  4. 部署堆栈:

    无域配置:

    cdk deploy --all
    

    或者使用域配置(单区域-us-east-1):

    cdk deploy --all --context cdnCertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/abc123 --context albCertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/abc123 --context customDomain=mcp-server.example.com
    

    或者使用多区域证书配置:

    cdk deploy --all --context cdnCertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/abc123 --context albCertificateArn=arn:aws:acm:eu-west-1:123456789012:certificate/def456 --context customDomain=mcp-server.example.com
    

    或者仅使用CloudFront HTTPS(ALB保持HTTP):

    cdk deploy --all --context cdnCertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/abc123 --context customDomain=mcp-server.example.com
    
  5. 更新MCP服务器:

    无域配置:

    cdk deploy MCP-Server
    

    或者使用域配置:

    cdk deploy MCP-Server --context cdnCertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/abc123 --context albCertificateArn=arn:aws:acm:us-east-1:123456789012:certificate/abc123 --context customDomain=mcp-server.example.com
    

部署验证

  1. 验证CloudFormation堆栈状态:

    • 打开AWS CloudFormation控制台
    • 检查所有堆栈是否显示“创建完成”
  2. 验证Cognito设置:

    • 打开亚马逊Cognito控制台
    • 验证用户池创建
    • 确认应用客户端配置
  3. 验证基础设施:

    • CloudFront分发已“部署”
    • 应用程序负载平衡器处于“活动”状态
    • ECS服务正在运行

运行指南

Cognito用户测试(仅限开发)

仅适用于开发和测试环境,您可以使用AWS CLI快速创建和管理用户:

# Create test user
aws cognito-idp admin-create-user --user-pool-id YOUR_USER_POOL_ID --username test@example.com

# Set permanent password (bypass temporary)
aws cognito-idp admin-set-user-password --user-pool-id YOUR_USER_POOL_ID --username test@example.com --password "TestPass123!" --permanent

使用示例Python MCP客户端进行测试

该部署包括一个示例Python MCP客户端,该客户端演示了与部署的服务器进行OAuth 2.0保护资源身份验证。此客户端使用StreamableHTTP传输实现了2025-06-18 MCP规范。

注: 此客户端是 简单的身份验证客户端示例 来自官方MCP Python SDK。

为什么要使用Python客户端?

附带的Python客户端(source/sample-clients/simple-auth-client-python/)演示:

  • OAuth 2.0受保护的资源元数据 (RFC9728)身份验证流程
  • 流式HTTP传输 沟通
  • 交互式CLI界面 用于测试MCP工具
  • 符合标准的实施 2025-06-18 MCP规范

重要提示: 此实现确实 **不支持动态客户端注册(DCR)**客户端凭据必须在AWS Cognito中预先配置,并通过环境变量提供。

使用Python客户端

  1. 导航到客户端目录:

    cd source/sample-clients/simple-auth-client-python
    
  2. 使用uv安装依赖项:

    pip install uv
    uv sync --reinstall
    
  3. 设置环境变量:

    export MCP_SERVER_URL="https://<your-cloudfront-endpoint>/weather-nodejs/mcp"
    export OAUTH_CLIENT_ID="<your-cognito-client-id>"
    export OAUTH_CLIENT_SECRET="<your-cognito-client-secret>"
    
  4. 运行客户端:

    uv run python -m mcp_simple_auth_client.main
    
  5. 测试可用端点:

    • ECS远程服务器: https://<your-cloudfront-endpoint>/weather-nodejs/mcp
    • Lambda服务器: https://<your-cloudfront-endpoint>/weather-nodejs-lambda/mcp

客户端将自动处理OAuth流,打开浏览器进行身份验证,并提供交互式CLI来测试MCP工具。

后续步骤

  1. 实施额外的MCP服务器:

    • 向ECS添加新的服务器容器
    • 为新服务器配置OAuth流
    • 更新新端点的客户端配置
  2. 优化成本:

    • 监控使用模式
    • 考虑为稳定的工作负载预留容量
    • 实施缓存策略
  3. 增强安全性:

    • 在Cognito中启用MFA
    • 实施其他WAF规则
    • 设置监控和警报

清理

  1. 删除已部署的资源:

    cdk destroy --all
    
  2. 手动清理步骤:

    • 清空所有已创建的S3存储桶
    • 删除Cognito用户池(如果不需要)
    • 删除CloudWatch日志组
    • 删除secrets Manager中创建的所有机密

常见问题解答、已知问题、其他注意事项和限制

已知问题

  1. 在某些情况下,令牌刷新可能需要重新验证
  2. CloudFront缓存失效可能需要5分钟
  3. Fargate集装箱的初始冷启动延迟

其他注意事项

  • 符合OAuth 2.0标准:实现RFC9728受保护资源元数据规范
  • 无状态架构:每个请求都会为并发客户端支持创建新的服务器实例
  • 创建公共端点 用于OAuth保护资源元数据发现
  • CloudFront分布 部署可能需要15-20分钟
  • 四栈部署:VPC、安全、CloudFront WAF和MCP服务器堆栈

有关详细信息,请参阅这些附加文档文件:

局限性

  1. 无动态客户端注册(DCR):客户端凭据必须在AWS Cognito中预先配置
  2. 区域可用性 取决于AWS Cognito支持
  3. 多地区证书要求:
    • CloudFront证书(cdnCertificateArn)必须在美国东部-1
    • ALB证书(albCertificateArn)必须位于部署区域内
    • 两个证书必须覆盖相同的自定义域
  4. 仅限CloudFront WAF:AWS WAF是为CloudFront分发配置的,而不是直接为ALB配置的
  5. 仅支持流式HTTP传输:此实现中不支持SSE传输(已弃用)
  6. 一些MCP客户端 可能不支持远程连接或OAuth流

如有任何反馈、问题或建议,请使用此仓库下的问题选项卡。

修订

[2.0.0] - 2025-08-25

  • 突破性变化:迁移到2025-06-18 MCP规范
  • 实现OAuth 2.0受保护的资源元数据(RFC9728)
  • 将SSE传输替换为StreamableHTTP传输
  • 添加无状态服务器架构以支持并发客户端
  • 删除动态客户端注册(DCR)-客户端必须预先配置
  • 重组项目以 source/cdk/ecs-and-lambda/ 为了更好的组织
  • 使用交互式CLI添加示例Python MCP客户端
  • 实施四栈CDK部署(VPC、安全、CloudFront WAF、MCP服务器)
  • 添加基于Lambda的MCP服务器部署选项
  • 删除DynamoDB令牌存储-现在使用无状态身份验证

[1.0.0] - 2025-05-06

  • 初始版本
  • 基本OAuth流实现
  • 支持天气样本服务器

通知

客户有责任对本指南中的信息进行独立评估。本指南:(a)仅供参考,(b)代表AWS当前的产品和做法,如有更改,恕不另行通知,(c)不构成AWS及其附属公司、供应商或许可方的任何承诺或保证。AWS产品或服务“按原样”提供,不附带任何明示或暗示的保证、陈述或条件。AWS对其客户的责任和义务由AWS协议控制,本指南不是AWS与其客户之间任何协议的一部分,也不修改任何协议。