MCP网关

MCP网关是一个通用的HTTP/SSE桥接器,通过HTTP暴露任何基于stdio的MCP服务器,无需代码更改即可配置运行不同的MCP服务器。

  • by ebAutomationAi
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 ebAutomationAi/MCP-Gateway

使用说明

MCP网关

通用HTTP/SSE网桥,通过HTTP公开任何基于stdio的MCP服务器。 通过环境变量配置要运行的MCP服务器——无需更改代码。

建筑学

HTTP/SSE client
      ↓
Express server (port 3001)
      ↓
spawn(MCP_COMMAND, MCP_ARGS)   ← stdio bridge
      ↓
Any MCP-compatible server (GitHub, Filesystem, …)

网关不知道或依赖于任何特定的MCP服务器。 交换 MCP_COMMAND/MCP_ARGS 指向另一台服务器——其他一切都不会改变。

需求

  • Docker和Docker Compose
  • 您要公开的MCP服务器所需的凭据(例如GitHub PAT)

快速开始

git clone https://github.com/ebAutomationAi/MCP-Gateway.git
cd MCP-Gateway
cp .env.example .env
# Edit .env: set MCP_COMMAND, MCP_ARGS, API_TOKEN, and any server-specific credentials
docker compose up -d
curl http://localhost:3001/health

配置

变量 必填 默认 描述
MCP_COMMAND 没有 npx 可执行文件启动
MCP_ARGS 是 -- 传递给的参数以空格分隔 MCP_COMMAND
API_TOKEN 没有 -- 身份验证的承载令牌。如果未设置,则禁用auth(仅限dev)
CORS_ORIGINS 没有 http://localhost:3000,http://localhost:3001 以逗号分隔的允许来源列表
PORT 没有 3001 网关监听的端口

中定义的任何其他变量 .env 通过以下方式自动转发到MCP子进程 ...process.env.

示例——GitHub MCP服务器

MCP_COMMAND=npx
MCP_ARGS=-y @modelcontextprotocol/server-github
GITHUB_PERSONAL_ACCESS_TOKEN=ghp_xxxxxxxxxxxx
API_TOKEN=your_secure_token   # openssl rand -hex 32

示例--文件系统MCP服务器

MCP_COMMAND=npx
MCP_ARGS=-y @modelcontextprotocol/server-filesystem /data

端点

方法 路径 身份验证 描述
GET /health 否 服务状态和活动会话计数
GET /sse 是 打开SSE流并启动MCP流程
POST /messages 是 向活动会话发送JSON-RPC消息
GET /sessions 是 列出活动会话
DELETE /sessions/:id 是 终止会话

所有经过身份验证的端点都需要 Authorization: Bearer <API_TOKEN>. 如果 API_TOKEN 如果未设置,则跳过身份验证。

用法

1.打开SSE连接

curl -N -H "Authorization: Bearer $API_TOKEN" http://localhost:3001/sse
# First event returns the session ID:
# event: session
# data: {"sessionId":"session-1234567890-abc123def"}

2.发送JSON-RPC消息

curl -X POST http://localhost:3001/messages \
  -H "Authorization: Bearer $API_TOKEN" \
  -H "x-session-id: session-1234567890-abc123def" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/list",
    "params": {},
    "id": 1
  }'
# {"status":"sent","sessionId":"session-1234567890-abc123def"}
# The MCP response arrives on the SSE stream.

Python客户端示例

import requests, json, sseclient  # pip install sseclient-py

BASE = "http://localhost:3001"
TOKEN = "your_api_token"
HEADERS = {"Authorization": f"Bearer {TOKEN}"}

r = requests.get(f"{BASE}/sse", headers=HEADERS, stream=True)
client = sseclient.SSEClient(r)

session_id = None
for event in client.events():
    if event.event == "session":
        session_id = json.loads(event.data)["sessionId"]
        break

requests.post(
    f"{BASE}/messages",
    headers={**HEADERS, "x-session-id": session_id, "Content-Type": "application/json"},
    json={"jsonrpc": "2.0", "method": "tools/list", "params": {}, "id": 1}
)

for event in client.events():
    print(json.loads(event.data))

发展

npm install
npm run dev          # node --watch index.js
npm test             # Jest + supertest
npm run test:coverage

与ngrok一起跑步(公开曝光)

# Requires NGROK_AUTHTOKEN in .env
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
# Inspect tunnel URL at http://localhost:4040

安全

  • 集 API_TOKEN 在生产中。生成方式 openssl rand -hex 32.
  • 集 CORS_ORIGINS 您的客户运行的确切来源。
  • 容器以内置方式运行 node 用户(uid 1000),而不是root。
  • 只能将ngrok用于开发和测试,而不能将其用作生产基础设施。

关键设计决策

MCP_COMMAND/MCP_ARGS 模式 --网关通过以下方式启动MCP进程 spawn() 仅使用环境变量。这使得网关服务器保持中立:从GitHub服务器切换到文件系统服务器(或任何其他兼容stdio的MCP服务器)不需要更改代码,也不需要重建映像。

无MCP SDK依赖 --网关使用换行符分隔的JSON通过stdio与MCP进程通信,这是MCP stdio传输所需的全部内容。这个 @modelcontextprotocol/sdk 该包在此处没有任何价值,已被删除。

ngrok在单独的Compose文件中 — docker-compose.yml 在任何环境中运行都是安全的。Ngrok开设了一条公共互联网隧道,可以通过以下方式选择加入 docker-compose.dev.yml.

非根容器 --Dockerfile以root身份安装依赖项,并将所有权转移给 chown -R node:node /app,然后切换到内置 node 用户之前 CMD这避免了 npm ci 以非root身份运行进程时出现权限错误。

故障排除

容器未启动

docker compose logs mcp-github
docker compose down && docker compose up -d --build

MCP_ARGS not set 错误 MCP_ARGS 是必需的。设置它 .env 在开始之前。

端口3001已在使用中 集 PORT=3002 在 .env 并更新中的端口映射 docker-compose.yml.

Ngrok隧道未连接

docker compose -f docker-compose.yml -f docker-compose.dev.yml logs ngrok-mcp

CI

在Node.js 18、20和22上对每个推送和拉取请求进行测试 main.

许可证

麻省理工学院