服务编排网关

MCP Gateway是一个用于管理多个MCP服务的统一接口,支持服务的懒启动、动态管理和工具调用。

  • by jfikrat
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 jfikrat/mcp-gateway

使用说明

MCP网关

服务编排层 模型上下文协议。通过一个统一的接口管理多个MCP服务——在所有服务中生成、监督和路由工具调用。

主要功能:延迟激活

默认情况下,服务在 懒惰模式 --进程生成并获取工具列表,但是 LLM上下文中没有注入任何工具模式这意味着您可以在数十个服务中拥有数百个工具,而无需令牌开销。

activate({name: "google-workspace"})     → 281 tools ready, 0 context tokens
tools({service: "google-workspace"})     → browse available tools
call({service: "...", tool: "...", args}) → call any tool directly

特性

  • 延迟激活 --使用0个上下文令牌生成服务,使用浏览 tools(),致电 call()
  • 服务编排 --生成、停止、重新启动子MCP服务
  • 按需工具浏览 — tools({service, filter}) 将工具描述作为对话文本返回(不是系统提示)
  • 直接路由 — call() 无需模式注册即可路由到子连接
  • 环境变量扩展 --使用 $VAR 或 ${VAR} 在secrets配置中
  • 动态管理 --在运行时添加/删除服务,而无需重新启动
  • 健康监测 --内置ping/健康检查
  • 任何命令 --支持 bun, node, npx, ssh,或任何可执行文件

快速开始

# Install
bun install

# Create your config from the example
cp gateway.config.example.json gateway.config.json

# Edit gateway.config.json with your services
# Then start the gateway
bun run start

配置

gateway.config.json 定义您的服务:

{
  "services": [
    {
      "name": "my-service",
      "command": "bun",
      "args": ["run", "/path/to/service/index.ts"],
      "env": { "API_KEY": "$MY_API_KEY" },
      "autoActivate": false
    }
  ]
}
字段 必填 默认 描述
name yes -- 唯一服务标识符
command yes -- 可执行文件运行(bun, node, npx, ssh, ...)
args 没有 [] 命令参数
env 没有 {} 环境变量(支持 $VAR 扩展)
autoActivate 没有 false 网关启动时自动启动
keepAlive 没有 false 永远在线:在崩溃时以指数级回退的方式重生;空闲时从不GC
groups no -- 用于完全模式激活的命名工具子集,例如。 {"gmail": ["send", "search"]}

环境变量

配置值支持 $VAR 和 ${VAR} 语法,解析自 process.env 加载时:

{
  "env": { "API_KEY": "$MY_SECRET_KEY" },
  "args": ["--config", "${HOME}/.config/my-service.json"]
}

这可以将秘密从配置文件中隐藏出来。通过MCP客户端配置传递它们(见下文)。

内置工具

一旦运行,网关就会公开这些管理工具:

工具 说明
services 列出所有服务的状态、模式(延迟/满)、工具计数、正常运行时间
activate 启动服务。默认懒惰(0个上下文标记)。集 lazy=false 用于完整模式注册
tools 列出活动服务的可用工具。支持 filter 用于关键字搜索
deactivate 停止服务并清理
restart 杀死并重新生成服务(保留懒惰/完全模式)
health Ping所有活动服务
add 动态注册新服务(坚持配置)
remove 从配置中删除服务
call 调用任何活动服务上的任何工具

工作流程

1. activate({name: "my-service"})                        → spawn process, 0 tokens
2. tools({service: "my-service"})                        → see all tools
3. tools({service: "my-service", filter: "search"})      → filter by keyword
4. call({service: "my-service", tool: "...", args: {}})   → call a tool
5. deactivate({name: "my-service"})                      → stop when done

全模式(可选)

如果你想将工具模式注入LLM上下文(传统的MCP行为):

activate({name: "my-service", lazy: false})              → register all schemas
activate({name: "my-service", lazy: false, groups: ["gmail", "drive"]})  → register specific groups

HTTP守护程序模式(始终打开,共享)

集 GATEWAY_HTTP_PORT 将网关作为长寿命的Streamable HTTP守护进程运行,而不是按客户端stdio运行:

GATEWAY_HTTP_PORT=8770 bun run start
  • 端点: http://127.0.0.1:8770/mcp (流式HTTP, Mcp-Session-Id 每个客户)
  • 健康: GET /health 返回带有会话计数和每个服务状态/pid的JSON
  • 共享流程,孤立视图:子服务只生成一次,并由每个连接的客户端共享;每个会话都有自己的工具注册表,因此一个代理的完全模式激活永远不会泄露到另一个代理中
  • GC会话:空闲时间超过TTL的会话会自动清除(客户端通常会退出而不发送DELETE)。调谐 GATEWAY_SESSION_TTL_MS (默认60分钟)和 GATEWAY_SESSION_SWEEP_MS (默认5分钟)
  • 安全引导: GATEWAY_NO_AUTOACTIVATE=1 跳跃 autoActivate 服务(例如,当有状态的单例已经在其他地方运行时)

systemd单元提供于 deploy/mcp-gateway.service.

将Claude代码(或任何MCP客户端)指向守护进程:

{
  "mcpServers": {
    "gateway": { "type": "http", "url": "http://127.0.0.1:8770/mcp" }
  }
}

使用Claude代码

添加到您的Claude Code MCP配置中(~/.claude/config.json 或项目设置)。 API密钥进入 env block——它们被传递给网关进程并在中扩展 gateway.config.json 通过 $VAR 语法:

{
  "mcpServers": {
    "gateway": {
      "command": "bun",
      "args": ["run", "/path/to/mcp-gateway/src/index.ts"],
      "env": {
        "GEMINI_API_KEY": "your-gemini-key",
        "EXA_API_KEY": "your-exa-key"
      }
    }
  }
}

许可证

麻省理工学院