MCP Hub
MCP Hub
聚合多个 MCP 服务器,统一暴露为一个标准 MCP 接口,供其他 Agent(如 Claude Code、Cursor 等)集成。
功能特性
多 MCP 聚合:连接多个下游 MCP 服务器,将所有工具统一暴露
工具命名空间:自动前缀隔离,
server_id_tool_name格式双传输支持:同时支持 stdio 和 HTTP (Streamable HTTP) 两种传输方式
热管理:注册/启用/禁用下游服务器后自动热重载,无需重启网关
管理 API:RESTful HTTP API 管理所有下游服务器
SQLite 持久化:服务器配置持久存储,零外部依赖
自省工具:内置
gateway__list_servers和gateway__list_all_tools
安装
前提条件
Python >= 3.10
Node.js >= 16(如需运行 npm MCP 包)
安装步骤
# 克隆或进入项目目录
cd mcp_demo
# 安装(开发模式)
pip install -e .依赖
fastmcp >= 2.0 # MCP 框架
pydantic >= 2.0 # 数据模型校验
typer # CLI 命令行
uvicorn # HTTP 服务器
starlette # HTTP 管理 API
aiosqlite # SQLite 存储
httpx # HTTP 客户端快速开始
1. 注册下游 MCP 服务器
# 注册本地 Python MCP 服务器
mcp-gateway register \
--server-id math \
--display-name "Math Server" \
--command python \
--args "examples/downstream_servers/math_server.py"
# 注册天气服务器
mcp-gateway register \
--server-id weather \
--display-name "Weather Server" \
--command python \
--args "examples/downstream_servers/weather_server.py"
# 注册 bing-search(Windows 需要 cmd /c 包装)
mcp-gateway register \
--server-id bing \
--display-name "Bing Search" \
--command cmd \
--args "/c,npx,-y,bing-cn-mcp"
# 注册 HTTP 类型的 MCP 服务器
mcp-gateway register \
--server-id remote-api \
--display-name "Remote API" \
--transport http \
--url "https://api.example.com/mcp"2. 查看已注册的服务器
# 基本列表
mcp-gateway list
# 显示连接状态和工具
mcp-gateway list --status --tools
# JSON 格式输出
mcp-gateway list --json3. 启动网关
# stdio 模式(供 Claude Code 等 Agent 以子进程方式集成)
mcp-gateway serve
# HTTP 模式(供远程 Agent 连接)
mcp-gateway serve --transport http --port 8000
# 完整参数
mcp-gateway serve \
--transport http \
--host 0.0.0.0 \
--port 8000 \
--path /mcp \
--management-port 9000 \
--store gateway.dbCLI 命令参考
命令 | 说明 |
| 启动网关服务器 |
| 注册新的下游 MCP 服务器(自动通知运行中网关热重载) |
| 列出所有已注册的服务器 |
| 启用服务器(自动通知运行中网关热重载) |
| 禁用服务器(自动通知运行中网关热重载) |
| 永久移除服务器(自动通知运行中网关热重载) |
| 检查服务器健康状态 |
| 手动重载配置提示 |
| 导出服务器配置 |
| 从 JSON 文件导入配置(自动通知运行中网关热重载) |
serve 参数
参数 | 默认值 | 说明 |
|
| 传输类型: |
|
| HTTP 监听地址 |
|
| HTTP 端口 |
|
| MCP 协议的 HTTP 路径 |
|
| 管理 API 端口 |
| — | 禁用管理 API |
|
| SQLite 数据库路径 |
|
| 网关名称 |
|
| 日志级别 |
register 参数
参数 | 说明 |
| 唯一服务器标识(必填) |
| 可读名称 |
|
|
| stdio 模式的启动命令 |
| 逗号分隔的命令参数 |
| HTTP 模式的服务器 URL |
| 管理 API 端口,用于自动热重载(默认 9000) |
| 注册后不立即连接 |
| 逗号分隔的标签 |
| 存储路径 |
注意:
register、enable、disable、remove、import-config命令执行后会自动通知运行中的网关热重载(通过管理 API)。如果网关未运行,重载请求会静默失败,不影响命令执行。
HTTP 管理 API
管理 API 运行在独立端口(默认 9000)。
端点列表
GET /api/v1/servers 列出所有服务器
POST /api/v1/servers 注册新服务器
GET /api/v1/servers/{server_id} 获取服务器详情
PUT /api/v1/servers/{server_id} 更新服务器配置
DELETE /api/v1/servers/{server_id} 删除服务器
POST /api/v1/servers/{server_id}/enable 启用服务器
POST /api/v1/servers/{server_id}/disable 禁用服务器
GET /api/v1/servers/{server_id}/health 健康检查
GET /api/v1/tools 查看所有聚合工具
GET /api/v1/gateway/status 网关状态概览
POST /api/v1/gateway/reload 热重载配置
GET /api/v1/gateway/export 导出配置
POST /api/v1/gateway/import 导入配置使用示例
# 注册服务器
curl -X POST http://localhost:9000/api/v1/servers \
-H "Content-Type: application/json" \
-d '{
"server_id": "weather",
"display_name": "Weather Service",
"transport": "stdio",
"stdio_config": {"command": "python", "args": ["weather_server.py"]}
}'
# 查看所有服务器
curl http://localhost:9000/api/v1/servers
# 查看聚合工具
curl http://localhost:9000/api/v1/tools
# 查看网关状态
curl http://localhost:9000/api/v1/gateway/status
# 启用/禁用
curl -X POST http://localhost:9000/api/v1/servers/weather/enable
curl -X POST http://localhost:9000/api/v1/servers/weather/disable
# 热重载
curl -X POST http://localhost:9000/api/v1/gateway/reload供其他 Agent 集成
Claude Code 集成
在项目根目录创建 .mcp.json:
{
"mcpServers": {
"gateway": {
"command": "python",
"args": ["-m", "mcp_gateway", "serve", "--transport", "stdio"]
}
}
}或使用全局 CLI 命令:
claude mcp add gateway -s project -- python -m mcp_gateway serve --transport stdio自定义 Agent 集成
# 通过 stdio
from fastmcp import Client
from fastmcp.client.transports import StdioTransport
async with Client(StdioTransport(
command="python",
args=["-m", "mcp_gateway", "serve", "--transport", "stdio"],
)) as client:
# 列出所有工具(含命名空间前缀)
tools = await client.list_tools()
for tool in tools:
print(tool.name) # 如: math__add, weather__get_forecast
# 调用代理工具
result = await client.call_tool("math__add", {"a": 3, "b": 5})
print(result)# 通过 HTTP
from fastmcp import Client
async with Client("http://localhost:8000/mcp") as client:
tools = await client.list_tools()
result = await client.call_tool("weather__get_current", {"city": "Beijing"})
print(result)远程 Agent 集成
作为标准 MCP HTTP 服务器,任何支持 MCP Streamable HTTP 协议的 Agent 都可以连接:
{
"mcpServers": {
"gateway": {
"type": "http",
"url": "http://gateway-host:8000/mcp"
}
}
}工具命名规则
所有下游服务器的工具自动添加 server_id_ 前缀:
下游服务器 | 原始工具名 | 网关中的名称 |
math |
|
|
math |
|
|
weather |
|
|
bing |
|
|
bing |
|
|
网关自省工具使用双下划线 gateway__ 前缀(不被 mount 改写):
工具名 | 功能 |
| 列出所有服务器及连接状态 |
| 列出所有聚合的工具 |
项目架构
外部 Agent (Claude Code / Cursor / 其他)
│
┌────┴────┐
stdio HTTP (streamable-http)
└────┬────┘
▼
┌──────────────────┐
│ GatewayServer │ ← 统一的 FastMCP 实例
│ (FastMCP) │
└────┬────┬─────────┘
│ │
┌────▼─┐ ┌▼────────────┐
│Proxy │ │Management │
│Manager│ │API │
└──┬──┬─┘ └─────────────┘
│ │
┌───▼┐ ┌▼────┐
│MCP A│ │MCP B│ ...
└────┘ └─────┘配置导入/导出
# 导出当前配置
mcp-gateway export-config --output servers.json
# 从 JSON 文件导入
mcp-gateway import-config servers.json
# 示例配置文件格式 (examples/config.yaml)示例配置 (examples/config.yaml):
{
"mcpServers": {
"math": {
"command": "python",
"args": ["examples/downstream_servers/math_server.py"]
},
"weather": {
"command": "python",
"args": ["examples/downstream_servers/weather_server.py"]
},
"bing-search": {
"command": "cmd",
"args": ["/c", "npx", "-y", "bing-cn-mcp"]
}
}
}注意事项
Windows stdio:Windows 下注册 npm 类 MCP 需使用
cmd命令:--command cmd --args "/c,npx,-y,<package-name>"网络环境:HTTP 类型的下游服务器需要可访问的网络连接
端口冲突:默认 MCP 端口 8000,管理端口 9000,确保未被占用
无 unmount:FastMCP 暂不支持运行时 unmount,禁用/删除服务器后建议重启网关获得干净状态
单机设计:SQLite 适合单机部署,如需集群可通过
AbstractStore接口扩展 PostgreSQL 等