使用说明
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_failedguard:一旦知道刷新令牌过期,所有进一步的调用都会立即被拒绝,并显示一个结构化错误/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>"
]
}
}
}
管理员演练
- 打开
/admin/并使用登录ADMIN_TOKEN - 连接器 → 创建连接器
- OAuth URL:粘贴MCP服务器URL;点击“连接OAuth”进入浏览器OAuth
- JSON配置(HTTP):粘贴URL+neneneba API键或标头
- JSON配置(STDIO):粘贴
{"command": "npx", "args": ["-y", "some-mcp-server"]}
- 点击 发现工具 填充工具目录
- 客户 → 创建客户端
- 打开客户端→ 访问 tab → 选择连接器并检查工具以允许
- 代币 tab → 发行令牌(显示一次-复制它)
- 将令牌粘贴到您的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上的错误显示需要更多可操作的副本来帮助排除故障。
