使用说明
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.
许可证
麻省理工学院
