Gateway
HTTP-SSEReverse proxy gateway for managing and unifying multiple MCP servers through single entry point
Reverse proxy gateway for managing and unifying multiple MCP servers through single entry point
MCP 网关是一个反向代理服务器,它将来自客户端的请求转发到 MCP 服务器,或通过统一入口使用网关下的所有 MCP 服务器。
构建 Docker 镜像
docker build -t mcp-gateway .
运行自行构建的 Docker 容器
docker run -d --name mcp-gateway -p 8080:8080 mcp-gateway
支持:uvx, npx 或 SSE URL
POST /deploy HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "mcpServers": { "time": { "url": "http://mcp-server:8080", // url 和 command 二选一 "command": "uvx", // url 和 command 二选一 "args": ["mcp-server-time", "--local-timezone=America/New_York"], // 可选,command 的参数 "env": { // 可选,环境变量 "KEY1": "VALUE1", "KEY2": "VALUE2" } } } }
GET /{mcp-server-name}/sse HTTP/1.1 Host: localhost:8080
POST /{mcp-server-name}/message HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "method": "tools/call", "params": { "name": "get_current_time", "arguments": { "timezone": "Asia/Seoul" } }, "jsonrpc": "2.0", "id": 2 }
网关和直连MCP的区别在于,只需要与网关交互,网关会自动将请求转发到对应的MCP服务器。在call 时,需要在method前面添加 mcpServerName 内容,标识该请求来自哪个 MCP 服务器。
GET /sse HTTP/1.1 Host: localhost:8080
这里 sse 是整个网关下所有的 MCP 服务器的 SSE 流。
当客户端订阅 sse 时,网关会为每个 MCP 服务器创建一个 SSE 连接,并将所有 MCP 服务器的 SSE 流合并到一起。
在响应的所有tools/call 的结果中,会在method前面添加 mcpServerName 内容,标识该结果来自哪个 MCP 服务器。
POST /message HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "method": "tools/call", "params": { "name": "{mcp-server-name}-get_current_time", "arguments": { "timezone": "Asia/Seoul" } }, "jsonrpc": "2.0", "id": 2 }
获取网关下所有工具
POST /message HTTP/1.1 Host: localhost:8080 Content-Type: application/json { "method": "tools/list", "jsonrpc": "2.0", "id": 1 } # SSE 响应 message event { "jsonrpc": "2.0", "id": 1, "result": { "tools": [ { "name": "{mcpServerName}-get_current_time", "description": "Get current time in a specific timezones", "inputSchema": { "type": "object", "properties": { "timezone": { "type": "string", "description": "IANA timezone name (e.g., 'America/New_York', 'Europe/London'). Use 'America/New_York' as local timezone if no timezone provided by the user." } }, "required": [ "timezone" ] } }, { "name": "{mcpServerName}-convert_time", "description": "Convert time between timezones", "inputSchema": { "type": "object", "properties": { "source_timezone": { "type": "string", "description": "Source IANA timezone name (e.g., 'America/New_York', 'Europe/London'). Use 'America/New_York' as local timezone if no source timezone provided by the user." }, "time": { "type": "string", "description": "Time to convert in 24-hour format (HH:MM)" }, "target_timezone": { "type": "string", "description": "Target IANA timezone name (e.g., 'Asia/Tokyo', 'America/San_Francisco'). Use 'America/New_York' as local timezone if no target timezone provided by the user." } }, "required": [ "source_timezone", "time", "target_timezone" ] } } ] } }