无状态MCP服务器

一个在AWS Lambda和API Gateway上原生运行的无状态MCP服务器示例,无需额外的桥接组件或自定义传输。

  • by geoicons
  • JavaScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 geoicons/serverless-mcp

使用说明

AWS Lambda上的无状态MCP服务器

这是一个在AWS Lambda和API网关上本地运行的示例MCP服务器,没有任何额外的桥接组件或自定义传输。由于 流式HTTP v2025-03-26中引入的传输。

先决条件

  • AWS CLI(已配置凭据)
  • Node.js 20+
  • 纱线

说明

快速路径: 克隆→ yarn installall → 在本地运行服务器和客户端(可选)→ 部署方式 yarn buildall && yarn deploy 或推 main/qas/prod 通过GitHub Actions进行部署(在配置secrets之后)。

克隆项目

git clone <your-repo-url>
cd serverless-mcp

安装依赖项

从repo根目录(安装授权器、mcpserver和CDK):

yarn installall

或每个包裹:

(cd src/authorizer && yarn install)
(cd src/mcpserver && yarn install)
(cd cdk && yarn install)

在本地测试服务器

node src/mcpserver/index.js

服务器运行后,在单独的终端中运行客户端:

node src/mcpclient/index.js

使用CDK部署到AWS

从repo根目录:

yarn installall
yarn buildall
yarn deploy

这将部署 开发 默认堆栈(mcp-dev-stack).要从您的计算机部署另一个阶段或区域,请执行以下操作:

STAGE=qas REGION=ap-southeast-2 yarn deploy

或者从CDK软件包中: (cd cdk && yarn deploy) 安装deps后。

部署后,CDK将打印MCP端点。为客户端导出它:

export MCP_SERVER_ENDPOINT=<value from McpEndpoint output>

API网关端点可能需要大约一分钟的时间才能变为可用。

通过GitHub操作进行部署

部署使用可重用的工作流和基于分支的升级。每个环境(dev、qas、prod)都部署了一个带有前缀资源名称的单独堆栈(例如。 mcp-dev-stack, mcp-qas-stack, mcp-prod-stack).

触发器 工作流 环境
PR → main 开发人员检查 仅运行CDK synth(无部署)
推到 main 开发部署 dev
推到 qas QAS部署 qas
推到 prod 生产部署 prod

所有部署工作流也可以通过手动运行 workflow_dispatch (操作选项卡→ 选择工作流→ 运行工作流)。

所需机密(根据环境)

对于您使用的每种环境(dev, qas, prod),创造环境 设置→ 环境 并添加这些 秘密:

机密 描述
AWS_ACCESS_KEY_ID 部署用户/角色的IAM访问密钥
AWS_SECRET_ACCESS_KEY IAM密钥
MANAGEMENT_API_KEY 管理API密钥(由部署工作流使用;如果应用程序未使用,则设置为您选择的值)

区域

工作流使用 ap-southeast-2 默认情况下。要使用其他区域,请编辑 aws-region 呼叫者工作流中的输入(dev_deploy.yaml, qas_deploy.yaml, prod_deploy.yaml).

AWS权限

您使用其密钥的IAM用户或角色必须具有部署CDK堆栈的权限(CloudFormation、Lambda、API网关、IAM、用于CDK资产的S3)。跑 cdk bootstrap 一旦进入您的帐户/区域,就向部署用户授予CDK分配给部署角色的策略。

使用客户端测试远程MCP服务器

node src/mcpclient/index.js

观察响应(端点URL将与您的部署匹配):

Connecting ENDPOINT_URL=https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/mcp
connected
listTools response:  { tools: [ { name: 'ping', inputSchema: [Object] } ] }
callTool:ping response:  { ... }

有状态与无状态的考虑

MCP服务器可以在两种模式下运行——无状态和有状态。此仓库演示了无状态模式。

在无状态模式下,客户端不会与MCP服务器建立持久的SSE连接。这意味着客户端将不会收到来自服务器的主动通知。另一方面,无状态模式允许您水平扩展服务器。

授权演示

此示例包括一个简单的API网关令牌授权器(Lambda)。默认情况下 /mcp 路线用途 没有授权。要启用自定义授权器,请编辑 cdk/lib/stateless-mcp-stack.ts:set authorizationType 到 AuthorizationType.CUSTOM 并通过 authorizer: tokenAuthorizer 在 addMethod 电话。

请参阅中的传输初始化 src/mcpclient/index.js 关于如何添加自定义 Authorization 标题(例如。 Bearer good_access_token 演示授权人)。

成本因素

此示例在您的帐户(Lambda,API网关)中提供付费资源。完成后记得销毁堆栈:

cd cdk
yarn destroy

了解MCP

许可证

该项目根据 知识共享署名-非商业4.0国际许可 (CC×NC 4.0)。你可以用它 教育和非商业目的 只有。不允许商业使用。看 许可证 全文。