多路复用网关服务

MCP Gateway是一个自托管的多路复用网关,可将多个上游MCP服务器聚合为单一端点,为AI客户端提供统一的工具访问控制。

  • by AshrafMd-1
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 AshrafMd-1/mcp-router

使用说明

MCP网关[alpha]

一种自托管网关,将多个上游MCP服务器多路复用到一个端点中。AI客户端(Claude、Cursor等)连接一次,即可访问管理员授予他们的任何工具。

AI Client (Claude/Cursor)
        │  Bearer token
        ▼
  ┌─────────────┐       allowlist policy
  │ MCP Gateway │──────────────────────────────┐
  └─────────────┘                              │
     │         │          │                    │
     ▼         ▼          ▼                    ▼
   Linear   Granola    local CLI          tool catalog
   (OAuth)  (OAuth)    (STDIO)            (per client)

特性

连接器类型

类型 身份验证 示例
HTTP-OAuth URL OAuth 2.0+PKCE,自动发现(RFC 9728),动态客户端注册 Figma,GitHub,Atlan
HTTP-JSON配置 API密钥/自定义头 任何HTTP MCP服务器
STDIO 环境变量/无 本地CLI工具, npx 服务器

按客户端访问控制

  • 创建命名客户端,分配连接器子集,然后分配特定工具(支持glob模式: github.*, figma.get_*)
  • 为每个客户发行多个承载令牌;单独撤销或轮换
  • 工具名称显示为 connector__tool 因此,连接器之间不会发生碰撞

OAuth支持

  • 通过自动发现授权服务器 /.well-known/oauth-protected-resource → /.well-known/oauth-authorization-server 链(RFC 9728)
  • 在提供商支持的情况下进行动态客户端注册;回退到手动配置 clientId/clientSecret
  • PKCE(S256)在每次授权请求上
  • 透明令牌刷新打开 401 -每个连接器一次并发刷新(锁定可防止重复的授权请求)
  • auth_failed guard:一旦知道刷新令牌过期,所有进一步的调用都会立即被拒绝,并显示一个结构化错误 /admin/connectors/:id/oauth/start

存储和安全

  • PostgreSQL启动时自动迁移(AUTO_MIGRATE=true)
  • 使用AES-GCM在静止时加密的连接器凭据(OAuth令牌、API密钥(ENCRYPTION_KEY)
  • 管理会话存储在服务器端;默认情况下寿命较短(ADMIN_SESSION_HOURS)
  • sanitizeConfig 条带 token, secret,以及 password 将连接器配置返回给浏览器之前的字段

管理用户界面

  • Vanilla JS单页应用程序 /admin/
  • 连接器视图:创建/编辑/删除、OAuth流、健康检查、工具发现
  • 客户端视图:创建/编辑/删除、访问策略(连接器选择+工具分配列表)、令牌管理(发布/撤销/轮换)

MCP协议

  • 协议版本 2025-06-18
  • 代理 tools/list, tools/call, resources/list, resources/read, prompts/list, prompts/get
  • 所有下游错误均已标准化为键入的MCP错误代码(UPSTREAM_UNAUTHORIZED, UPSTREAM_TIMEOUT, UPSTREAM_UNAVAILABLE等等)
  • SSE和纯JSON响应体都已处理

技术栈

  • Node.js 22+TypeScript(ESM)
  • 禁食5
  • PostgreSQL 16
  • Vitest

环境

复制 .env.example 到 .env 并填写:

变量 必填 默认 备注
ADMIN_TOKEN yes - 管理员UI的密码
DATABASE_URL 是 - postgres://user:pass@host:5432/db
ENCRYPTION_KEY 是 - 64字符十六进制或32字节base64(AES-GCM密钥)
HOST 没有 0.0.0.0 绑定地址
PORT 没有 3000 监听端口
AUTO_MIGRATE 没有 true 启动时运行数据库迁移
ADMIN_SESSION_HOURS 没有 24 管理员会话生存期

生成密钥:

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Docker快速入门

cp .env.example .env
# Edit .env - set ADMIN_TOKEN and ENCRYPTION_KEY at minimum
docker compose up --build

终点:

路径 目的
http://localhost:3000/admin/ 管理UI
http://localhost:3000/mcp MCP端点(用于客户端)
http://localhost:3000/health 健康检查

在本地运行

npm install
npm run dev        # tsx watch - auto-restarts on change

构建和启动:

npm run build
npm start

MCP客户端设置

在管理UI中发出令牌后,将其添加到您的客户端配置中:

{
  "mcpServers": {
    "gateway": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://127.0.0.1:3000/mcp",
        "--header",
        "Authorization: Bearer <CLIENT_TOKEN>"
      ]
    }
  }
}

管理员演练

  1. 打开 /admin/ 并使用登录 ADMIN_TOKEN
  2. 连接器 → 创建连接器
    • OAuth URL:粘贴MCP服务器URL;点击“连接OAuth”进入浏览器OAuth
    • JSON配置(HTTP):粘贴URL+neneneba API键或标头
    • JSON配置(STDIO):粘贴 {"command": "npx", "args": ["-y", "some-mcp-server"]}
  3. 点击 发现工具 填充工具目录
  4. 客户 → 创建客户端
  5. 打开客户端→ 访问 tab → 选择连接器并检查工具以允许
  6. 代币 tab → 发行令牌(显示一次-复制它)
  7. 将令牌粘贴到您的AI客户端配置中

api参考

管理端点(需要会话cookie)

方法 路径 描述
POST /admin/login 登录,设置 mgw_admin_session 饼干
POST /admin/logout 无效会话
GET /admin/connectors 列出连接器
POST /admin/connectors 创建连接器
PUT /admin/connectors/:id 更新连接器
DELETE /admin/connectors/:id 删除连接器(使用时被阻止)
POST /admin/connectors/:id/discover 刷新工具目录
GET /admin/connectors/:id/health 实时健康检查
POST /admin/connectors/:id/oauth/start 启动OAuth流程
GET /admin/oauth/callback OAuth重定向回调
GET /admin/tool-catalog?connectorId= 列出连接器工具
GET /admin/clients 列出客户
POST /admin/clients 创建客户端
PUT /admin/clients/:id 更新客户端
DELETE /admin/clients/:id 删除客户端
GET /admin/clients/:id/policy 获取访问策略
PUT /admin/clients/:id/policy 更新访问策略
GET /admin/clients/:id/tokens 列出令牌
POST /admin/clients/:id/tokens 发行新代币
DELETE /admin/clients/:id/tokens/:tokenId 撤销令牌
POST /admin/tokens/:id/rotate 旋转令牌

MCP端点

POST /mcp -承载令牌身份验证。接受JSON-RPC 2.0。

支持的方法: initialize, tools/list, tools/call, resources/list, resources/read, prompts/list, prompts/get

测试

npm test

单元测试包括策略评估和错误映射。

已知问题和计划工作

关键的

  • OAuth稳定性(Figma、GitHub、Atlan) -仍然观察到这些提供程序的身份验证失败。调查正在进行中;可能的范围或受众参数不匹配。
  • 在初始保存之前发放令牌 -在创建客户端后(在第一次保存完成之前)立即发出令牌可能会失败。UI中需要一个守卫等待客户端记录得到确认。

高

  • 统一工具过滤 -DB模式同时存储 allowedTools 和 deniedTools,但政策评估者只强制执行同位语。目标:一个单一的列表,其中每个工具要么 允许 或 隐藏,完全消除了丹尼主义的概念。
  • OAuth连接器的原始配置文本区域 -高级覆盖(resource, audience, scope, clientId)仅适用于JSON配置连接器。OAuth URL连接器需要相同的原始配置面板。
  • 所有连接器类型的工具列表 -管理UI中不会显示所有连接器类型的工具列表视图。

UI/UX

  • 访问标签处于活动状态 -目前的“一切绿色”芯片样式使得很难分辨哪个标签是活动的。需要更好的视觉对比度。
  • 工具描述工具提示 -工具标签应在悬停时显示完整描述。
  • 全局加载状态 -API请求缺少一致的加载指标;用户可以在获取过程中与过时的数据进行交互。
  • 重新打开时未显示API密钥 -使用API密钥保存连接器时,重新打开它会显示一个空字段,因为凭据在发送到浏览器之前会被编辑。UI应指示存储了密钥并允许替换它。
  • 增强的错误消息 -UI上的错误显示需要更多可操作的副本来帮助排除故障。