使用说明
MCP服务器游乐场
一个使用TypeScript和Streamable HTTP传输构建的模型上下文协议(MCP)服务器的游乐场,带有用于Auth0等第三方授权服务器的OAuth代理。
特性
- 符合MCP 2025-06-18标准:完全符合最新的MCP规范,包括SSE可恢复性、工具注释和结构化内容。
- MCP服务器实现:基于HTTP的流式传输使用
@modelcontextprotocol/sdkHTTP传输、会话管理和工具执行。 - SSE可恢复性:客户端可以重新连接
Last-Event-IDheader用于在连接中断后恢复接收事件,由EventStore提供支持。 - OAuth身份验证/第三方授权:使用RFC 8707资源指示器和RFC 9728授权发现为MCP客户端实现OAuth服务器,委托给Auth0。
- 存储:使用EventStore进行可插拔存储抽象(内存/Valkey),用于SSE事件持久化和重放。
- 会话管理:通过使用分布式部署的初始请求的回放来支持有状态会话。
- 安全:严格的源验证以防止DNS重新绑定攻击,WWW-Authenticate标头用于授权发现。
- 工具:
aws-ecs:使用AWS ECS、cloudwatch日志和Bedrock调查ECS服务、任务和cloudwatch日志aws-s3:获取S3存储桶和对象的列表system-time:通过时区支持以各种格式获取当前系统时间echo:通过转换、重复来回复消息streaming:通过实时更新模拟实时流数据project:在当前项目目录中查找关键字
- 资源:
echo://documentation:回声工具的文档(静态资源)echo://result/{resultId}:访问回显操作结果(资源模板)
- 提示:
echo
文档
- 架构概述 -系统设计、数据流和图表
- 环境变量 -配置选项
- 工具文档 (在每个工具目录中):
- 资源文档: src/resources/README.md -MCP资源概述
为什么这个项目存在?
- 模型上下文协议规范 需要动态应用程序注册 因为它为MCP客户端提供了一种标准化的方式,可以在没有用户交互的情况下自动向新服务器注册并获取OAuth客户端ID。这种机制的主要原因是MCP客户端无法提前知道所有可能的服务,手动注册会给用户带来巨大的工作量,而且不可扩展。如果不支持动态应用程序注册,那么MCP客户端需要向服务器提供OAuth客户端ID和密钥,这既不安全也不可扩展。
- 但是,启用动态应用程序注册(如果支持)将成为 安全风险 因为端点是任何人都可以创建OAuth客户端的公共端点。它很容易被滥用,例如被不想要的客户端注册淹没。因此,Auth0已禁用动态应用程序注册
- 因此,该项目提供了一种通过使用OAuth代理为MCP服务器启用动态应用程序注册的方法,但将授权委托给Auth0、Github、Google等第三方授权服务器。
端点
| 端点 | 描述 |
|---|---|
| GET/ping | ping服务器 |
| POST/mcp | mcp协议请求与身份验证 |
| DELETE/mcp | 会话终止 |
| GET/.nearned/oauth授权服务器 | oauth授权服务器元数据 |
| GET/.wearned/oauth保护的资源 | oauth保护的资源元数据 |
| POST/oauth/register | 注册新的MCP客户端 |
| GET/oauth/authority | 处理授权请求 |
| POST/oauth/token | 处理令牌请求 |
| POST/oauth/revoke | 处理令牌吊销 |
| GET/oauth/stats | 获取oauth服务统计信息 |
| GET/oauth/auth0回调 | 处理auth0回调 |
入门指南
安装
-
克隆存储库:
git clone <your-repo> cd mcp-server-playground -
安装Bun(如果尚未安装):
curl -fsSL https://bun.sh/install | bash -
安装依赖项:
bun install -
设置环境变量:
cp .env.example .env -
设置MCP服务器以进行本地开发
bun run dev:setup
Helm 图表
helm repo add chrisleekr https://chrisleekr.github.io/helm-charts/
helm repo update
helm install mcp-server-playground chrisleekr/mcp-server-playground
为Cursor设置MCP服务器
-
为本地构建创建MCP配置文件
创建
.cursor/mcp.json项目目录中的文件(用于项目特定的设置)或~/.cursor/mcp.json在您的主目录中(用于全局设置):{ "mcpServers": { "mcp-server-playground-cursor": { "type": "http", "url": "http://localhost:3000/mcp" } } }
使用MCP检查器测试服务器
-
复制
mcp-config.example.json到mcp-config.json -
编辑
mcp-config.json指向正确的MCP服务器 -
运行检查器
docker compose up -d # Then run the inspector bunx @modelcontextprotocol/inspector -y --config ./mcp-config.json --server mcp-server-playground-inspector或
docker compose up -d bun run test:inspector
设置Auth0以进行授权
-
在Auth0中创建新应用程序
- 首选 Auth0仪表板
- 点击“应用程序”
- 点击“创建应用程序”
- 名称:MCP服务器游乐场
- 应用程序类型:常规Web应用程序
- 点击“创建”
-
设置应用程序
- 点击“设置”
- 设置以下设置:
- 允许的回调URL:
http://localhost:3000/oauth/auth0-callback - 允许的网络来源:
http://localhost:3000
- 允许的回调URL:
-
创建新的API
- 点击“API”
- 点击“创建API”
- 名称:MCP服务器游乐场
- 标识符:
urn:mcp-server-playground - JSON Web令牌(JWT)配置文件:Auth0
- JSON Web令牌(JWT)签名算法:RS256
- 点击“创建”
如何与多个MCP服务器实例进行有状态会话?
当MCP服务器部署为集群时,由于设计上没有在实例之间共享传输,因此无法使其具有多个MCP服务器实例的状态。
为了使其真正有状态,我使用Valkey将会话id与初始请求一起存储。
当请求进入备用MCP服务器实例时,它将检查会话id是否在Valkey中。如果是,它将重放初始请求并将传输连接到服务器。
灵感来自 https://github.com/modelcontextprotocol/modelcontextprotocol/discussions/102
看 架构-有状态会话管理 查看详细的序列图。
待办事项
- []流媒体无法按预期工作。它返回最终结果,而不是流式传输数据。
截图
| 元数据发现 | 客户端注册 | 准备授权 |
|---|---|---|
| 第三方服务器授权 | 请求授权并获取授权码 | 令牌请求和身份验证完成 |
|---|---|---|