返回市场
MCP服务器基础模板

MCP服务器基础模板

作者:chrisleekr6 星标更新:2025-11-20

项目介绍

MCP Server Playground

使用TypeScript构建的Model Context Protocol (MCP)服务器游乐场,采用可流式传输的HTTP传输,并通过OAuth代理支持第三方授权服务器(如Auth0)。

特性

  • MCP服务器实现:基于HTTP的流式传输,使用@modelcontextprotocol/sdk,包括HTTP传输、会话管理和工具执行。
  • OAuth认证/第三方授权:实现一个OAuth服务器,用于处理MCP客户端与第三方授权服务器(如Auth0)之间的授权,提供MCP服务器的动态应用注册。
  • 存储:为MCP服务器提供存储,保存OAuth会话、令牌等数据。
  • 会话管理:通过重放初始请求来支持有状态会话。
  • 工具:
    • aws-ecs:使用AWS ECS、Cloudwatch Logs和Bedrock调查ECS服务、任务和云日志。
    • aws-s3:获取S3桶和对象列表。
    • system-time:以多种格式获取当前系统时间,支持时区。
    • echo:回显消息并进行转换和重复。
    • streaming:模拟实时流数据更新。
    • project:在当前项目目录中查找关键词。
  • 提示:echo

为什么存在这个项目?

  • Model Context Protocol规范要求动态应用注册,因为它为MCP客户端提供了一种标准化的方式,自动注册到新服务器并获得OAuth客户端ID,无需用户交互。主要原因是MCP客户端无法提前知道所有可能的服务,手动注册会给用户带来大量工作且不具备扩展性。如果不支持动态应用注册,则MCP客户端需要向服务器提供OAuth客户端ID和密钥,这既不安全也不具备扩展性。
  • 然而,启用动态应用注册(如果支持的话)成为了一个安全风险,因为该端点是一个公共端点,任何人都可以创建OAuth客户端。它很容易被滥用,例如通过大量的不需要的客户端注册。因此,Auth0已禁用了动态应用注册。
  • 因此,该项目通过使用OAuth代理来启用MCP服务器的动态应用注册,但将授权委托给第三方授权服务器,如Auth0、GitHub、Google等。

端点

端点描述
GET /ping检测服务器
POST /mcp带认证的MCP协议请求
DELETE /mcp会话终止
GET /.well-known/oauth-authorization-serverOAuth授权服务器元数据
GET /.well-known/oauth-protected-resourceOAuth受保护资源元数据
POST /oauth/register注册新的MCP客户端
GET /oauth/authorize处理授权请求
POST /oauth/token处理令牌请求
POST /oauth/revoke处理令牌撤销
GET /oauth/stats获取OAuth服务统计信息
GET /oauth/auth0-callback处理Auth0回调

快速开始

安装

  1. 克隆仓库:

    git clone <your-repo>
    cd mcp-server-playground
    
  2. 安装依赖:

    npm install
    
  3. 设置环境变量:

    cp .env.example .env
    
  4. 配置本地开发的MCP服务器

    npm run dev:setup
    

Helm Chart

helm repo add chrisleekr https://chrisleekr.github.io/helm-charts/
helm repo update
helm install mcp-server-playground chrisleekr/mcp-server-playground

配置MCP服务器以供Cursor使用

  1. 创建本地构建的MCP配置文件

    在项目目录中创建一个.cursor/mcp.json文件(针对项目特定设置),或在主目录中创建一个~/.cursor/mcp.json文件(针对全局设置):

    {
      "mcpServers": {
        "mcp-server-playground-cursor": {
          "type": "http",
          "url": "http://localhost:3000/mcp"
        }
      }
    }
    

使用npx @modelcontextprotocol/inspector测试MCP服务器

  1. mcp-config.example.json复制为mcp-config.json

  2. 编辑mcp-config.json指向正确的MCP服务器

  3. 运行检查器

    npm run docker:run
    
    # 然后运行检查器
    npx @modelcontextprotocol/inspector -y --config ./mcp-config.json --server mcp-server-playground-cursor
    

    或者

    npm run test:inspector
    

配置Auth0进行授权

  1. 在Auth0中创建一个新的应用程序

    • 访问Auth0仪表板
    • 点击“应用程序”
    • 点击“创建应用程序”
      • 名称:MCP Server Boilerplate
      • 应用类型:常规Web应用程序
    • 点击“创建”
  2. 配置应用程序

    • 点击“设置”
    • 设置以下选项:
      • 允许的回调URL:http://localhost:3000/oauth/auth0-callback
      • 允许的Web来源:http://localhost:3000
  3. 创建一个新的API

    • 点击“API”
    • 点击“创建API”
      • 名称:MCP Server Boilerplate
      • 标识符:urn:mcp-server-playground
      • JSON Web Token (JWT)配置文件:Auth0
      • JSON Web Token (JWT)签名算法:RS256
    • 点击“创建”

如何在多个MCP服务器实例之间实现有状态会话?

当MCP服务器作为集群部署时,由于设计原因,传输不会在实例之间共享,因此无法使多个MCP服务器实例具有状态。

为了真正实现有状态,我使用Valkey存储初始请求中的会话ID。

当请求到达另一个MCP服务器实例时,它会检查Valkey中是否存在该会话ID。如果存在,它将重放初始请求并将传输连接到服务器。

灵感来自https://github.com/modelcontextprotocol/modelcontextprotocol/discussions/102

下图展示了有状态会话管理的流程。

<img width="681" height="882" alt="Image" src="https://github.com/user-attachments/assets/7f56339e-2665-47cb-a882-69d3c7096b47" />

待办事项

  • 流式传输未按预期工作。它返回最终结果而不是流式传输数据。

截图

元数据发现客户端注册准备授权
Metadata DiscoveryClient RegistrationPreparing Authorization
第三方服务器授权请求授权并获取授权代码令牌请求和认证完成
Request Authorization and acquire authorization codeToken RequestAuthentication Complete

参考资料