返回市场
部署模型上下文协议服务器到AWS指南

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

作者:aws-solutions-library-samples131 星标更新:2025-11-18

项目介绍

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

目录

  1. 概述
  2. 前提条件
  3. 部署步骤
  4. 部署验证
  5. 运行指南
  6. 下一步
  7. 清理
  8. 常见问题、已知问题、额外考虑事项及限制
  9. 修订记录
  10. 通知

概述

本指南演示了如何在AWS上使用Amazon Cognito进行安全认证来部署模型上下文协议(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. StreamableHTTP传输:无状态请求处理
  7. 四层CDK部署:VPC、安全、CloudFront WAF和MCP服务器层

成本

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

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

预估成本表

下表提供了一个示例成本分解,用于在美国东部(弗吉尼亚北部)区域使用默认参数部署此指南一个月的成本。

AWS服务维度成本 [USD]
VPC (NAT网关)1个NAT网关 × 730小时 + 100GB数据处理量37.35
弹性负载均衡应用负载均衡器,中等流量16.83
Amazon Cognito10,500 MAU(在50,000免费层级内)0.00
CloudFront2TB数据传输 + 15M请求87.96
WAF2个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上的工作。在其他操作系统上部署可能需要额外步骤。

必要工具

  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控制台
    • 确认所有堆栈显示“CREATE_COMPLETE”
  2. 验证Cognito设置:

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

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

运行指南

使用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客户端测试

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

注意:此客户端是官方MCP Python SDK中的simple-auth-client示例的修改版。

为什么使用Python客户端?

包含的Python客户端(source/sample-clients/simple-auth-client-python/)演示了:

  • OAuth 2.0受保护资源元数据(RFC9728)认证流程
  • StreamableHTTP传输通信
  • 交互式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 Fargate服务器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)必须位于us-east-1
    • ALB证书(albCertificateArn)必须位于部署区域
    • 两个证书都必须覆盖相同的自定义域
  4. 仅CloudFront WAF:AWS WAF配置为CloudFront分布,而不是直接配置为ALB
  5. 仅支持StreamableHTTP传输:不支持SSE传输(已弃用)
  6. 某些MCP客户端可能不支持远程连接或OAuth流程

对于任何反馈、问题或建议,请使用此仓库下的问题标签。

修订记录

[2.0.0] - 2025-08-25

  • 重大变更:迁移到2025-06-18 MCP规范
  • 实现OAuth 2.0受保护资源元数据(RFC9728)
  • 用StreamableHTTP传输替换SSE传输
  • 添加无状态服务器架构以支持并发客户端
  • 移除动态客户端注册(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与其客户之间的协议的一部分,也不修改任何此类协议。