在AWS上部署模型上下文协议服务器的指南
目录
- 成本
- 操作系统
概述
本指南演示了如何使用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进行可扩展和可维护的部署
建筑
该架构实现了:
- CloudFront分布 通过WAF保护实现全球内容交付
- 应用程序负载平衡器 用于流量分配和SSL终止
- ECS Fargate和Lambda 适用于容器化和无服务器MCP服务器
- AWS Cognito OAuth 2.0授权服务器功能
- OAuth 2.0受保护的资源元数据 符合标准的身份验证端点
- 流式HTTP传输 无状态请求处理
- 四栈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在另一个操作系统中部署可能需要额外的步骤。
所需工具
npm install -g aws-cdkAWS CDK引导
如果您是第一次使用AWS CDK,请引导您的帐户:
cdk bootstrap部署步骤
- 克隆存储库:
git clone
cd guidance-for-deploying-model-context-protocol-servers-on-aws
cd source/cdk/ecs-and-lambda- 安装依赖项:
npm install- 登录公共ECR:
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws- 部署堆栈:
无域配置:
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- 更新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部署验证
- 验证CloudFormation堆栈状态:
- 打开AWS CloudFormation控制台 - 检查所有堆栈是否显示“创建完成”
- 验证Cognito设置:
- 打开亚马逊Cognito控制台 - 验证用户池创建 - 确认应用客户端配置
- 验证基础设施:
- 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客户端
- 导航到客户端目录:
cd source/sample-clients/simple-auth-client-python- 使用uv安装依赖项:
pip install uv
uv sync --reinstall- 设置环境变量:
export MCP_SERVER_URL="https:///weather-nodejs/mcp"
export OAUTH_CLIENT_ID=""
export OAUTH_CLIENT_SECRET=""- 运行客户端:
uv run python -m mcp_simple_auth_client.main- 测试可用端点:
- ECS远程服务器: https:///weather-nodejs/mcp - Lambda服务器: https:///weather-nodejs-lambda/mcp
客户端将自动处理OAuth流,打开浏览器进行身份验证,并提供交互式CLI来测试MCP工具。
后续步骤
- 实施额外的MCP服务器:
- 向ECS添加新的服务器容器 - 为新服务器配置OAuth流 - 更新新端点的客户端配置
- 优化成本:
- 监控使用模式 - 考虑为稳定的工作负载预留容量 - 实施缓存策略
- 增强安全性:
- 在Cognito中启用MFA - 实施其他WAF规则 - 设置监控和警报
清理
- 删除已部署的资源:
cdk destroy --all- 手动清理步骤:
- 清空所有已创建的S3存储桶 - 删除Cognito用户池(如果不需要) - 删除CloudWatch日志组 - 删除secrets Manager中创建的所有机密
常见问题解答、已知问题、其他注意事项和限制
已知问题
- 在某些情况下,令牌刷新可能需要重新验证
- CloudFront缓存失效可能需要5分钟
- Fargate集装箱的初始冷启动延迟
其他注意事项
- 符合OAuth 2.0标准:实现RFC9728受保护资源元数据规范
- 无状态架构:每个请求都会为并发客户端支持创建新的服务器实例
- 创建公共端点 用于OAuth保护资源元数据发现
- CloudFront分布 部署可能需要15-20分钟
- 四栈部署:VPC、安全、CloudFront WAF和MCP服务器堆栈
有关详细信息,请参阅这些附加文档文件:
局限性
- 无动态客户端注册(DCR):客户端凭据必须在AWS Cognito中预先配置
- 区域可用性 取决于AWS Cognito支持
- 多地区证书要求:
- CloudFront证书(cdnCertificateArn)必须在美国东部-1 - ALB证书(albCertificateArn)必须位于部署区域内 - 两个证书必须覆盖相同的自定义域
- 仅限CloudFront WAF:AWS WAF是为CloudFront分发配置的,而不是直接为ALB配置的
- 仅支持流式HTTP传输:此实现中不支持SSE传输(已弃用)
- 一些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与其客户之间任何协议的一部分,也不修改任何协议。
