本指南演示了如何在AWS上使用Amazon Cognito进行安全认证来部署模型上下文协议(MCP)服务器,并实现2025-06-18 MCP规范,采用OAuth 2.0受保护资源元数据(RFC9728)。它使您能够托管可以远程访问的MCP服务器,同时通过符合标准的OAuth 2.0认证流程维持安全性。
该解决方案解决了以下几个关键挑战:

架构实现了以下内容:
您需承担运行此指南时所使用的AWS服务的成本。截至2025年8月,在美国东部(弗吉尼亚北部)区域使用默认设置运行此指南的成本约为每月194.18美元,用于处理中等流量水平。
我们建议通过AWS Cost Explorer创建一个预算,以帮助管理成本。价格可能会发生变化。有关详细信息,请参阅此指南中使用的所有AWS服务的定价网页。
下表提供了一个示例成本分解,用于在美国东部(弗吉尼亚北部)区域使用默认参数部署此指南一个月的成本。
| AWS服务 | 维度 | 成本 [USD] |
|---|---|---|
| VPC (NAT网关) | 1个NAT网关 × 730小时 + 100GB数据处理量 | 37.35 |
| 弹性负载均衡 | 应用负载均衡器,中等流量 | 16.83 |
| Amazon Cognito | 10,500 MAU(在50,000免费层级内) | 0.00 |
| CloudFront | 2TB数据传输 + 15M请求 | 87.96 |
| WAF | 2个Web ACL(CloudFront和区域) | 10.00 |
| ECS (Fargate) | 1个vCPU,2GB内存 × 730小时 | 36.04 |
| 密钥管理服务 | 1个Cognito凭证密钥 | 0.40 |
| Lambda | 自定义资源(最小使用量) | 0.20 |
| 总计 | 194.18/月 |
这些部署说明优化了在Amazon Linux 2 AMI上的工作。在其他操作系统上部署可能需要额外步骤。
如果您是第一次使用AWS CDK,请引导您的账户:
cdk bootstrap
克隆仓库:
git clone <repository-url>
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堆栈状态:
验证Cognito设置:
验证基础设施:
仅在开发和测试环境中,您可以快速创建和管理用户:
# 创建测试用户
aws cognito-idp admin-create-user --user-pool-id YOUR_USER_POOL_ID --username test@example.com
# 设置永久密码(绕过临时密码)
aws cognito-idp admin-set-user-password --user-pool-id YOUR_USER_POOL_ID --username test@example.com --password "TestPass123!" --permanent
部署包括一个示例Python MCP客户端,演示与已部署服务器的OAuth 2.0受保护资源认证。此客户端实现了2025-06-18 MCP规范,并使用StreamableHTTP传输。
注意:此客户端是官方MCP Python SDK中的simple-auth-client示例的修改版。
包含的Python客户端(source/sample-clients/simple-auth-client-python/)演示了:
重要:此实现不支持动态客户端注册(DCR)。客户端凭证必须预先配置在AWS Cognito中并通过环境变量提供。
导航到客户端目录:
cd source/sample-clients/simple-auth-client-python
使用uv安装依赖项:
pip install uv
uv sync --reinstall
设置环境变量:
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>"
运行客户端:
uv run python -m mcp_simple_auth_client.main
测试可用端点:
https://<your-cloudfront-endpoint>/weather-nodejs/mcphttps://<your-cloudfront-endpoint>/weather-nodejs-lambda/mcp客户端将自动处理OAuth流程,打开浏览器进行身份验证,并提供交互式CLI来测试MCP工具。
实现额外的MCP服务器:
优化成本:
提高安全性:
移除已部署的资源:
cdk destroy --all
手动清理步骤:
详细信息请参考以下附加文档文件:
cdnCertificateArn)必须位于us-east-1albCertificateArn)必须位于部署区域对于任何反馈、问题或建议,请使用此仓库下的问题标签。
source/cdk/ecs-and-lambda/以提高组织性客户负责对本指南中的信息进行独立评估。本指南:(a)仅用于信息目的,(b)代表AWS当前的产品和服务,这些产品和服务可能会随时更改,无需另行通知,(c)不构成AWS及其附属公司、供应商或许可方的任何承诺或保证。AWS产品或服务按原样提供,没有任何形式的明示或暗示的担保、陈述或条件。AWS与其客户的责任和义务由AWS协议控制,本指南不是任何AWS与其客户之间的协议的一部分,也不修改任何此类协议。