Shared MCP Gateway
Shared MCP Gateway
Унифицирует несколько общих MCP-серверов в единый HTTP-шлюз, предоставляя стабильный, наблюдаемый и повторно используемый уровень доступа MCP для совместного использования такими клиентами, как Codex, OpenCode, Claude Code, OpenClaw и другими.
Какие проблемы решает проект
В сценариях с использованием нескольких клиентов и нескольких MCP-серверов параллельно часто возникают следующие проблемы:
Каждый клиент требует отдельного обслуживания конфигурации MCP, что ведет к дублированию работы.
Конфигурация одного и того же набора инструментов в разных клиентах различается, что приводит к ситуациям, когда «в этом клиенте работает, а в том — нет».
При возникновении проблем с нижестоящим MCP-сервером точки отладки разбросаны, что затрудняет централизованное логирование, самодиагностику и обработку сбоев.
При добавлении или замене MCP-сервера необходимо вносить изменения в несколько конфигураций, что увеличивает затраты на сопровождение.
Цель shared-mcp-gateway — централизованное управление этими общими возможностями:
Единый реестр: централизованное управление нижестоящими MCP через
registry.toml/registry.compose.toml.Единая точка доступа: агрегация нескольких нижестоящих сервисов через одну HTTP MCP-конечную точку.
Единое управление эксплуатацией: унифицированные проверки работоспособности, структурированные логи, изоляция сбоев и минимальное отключение (circuit breaking).
Единая генерация конфигураций клиентов: автоматическое создание фрагментов конфигурации доступа для Codex / OpenCode / OpenClaw.
Related MCP server: mcp-uni
Возможности проекта
Текущая версия поддерживает:
Агрегацию нескольких нижестоящих MCP-серверов на базе stdio.
Унифицированное предоставление инструментов в формате
namespace.tool_name.Автоматическую маркировку
callerдля разных клиентов для удобства отслеживания логов.Интерфейс
/healthzдля проверки работоспособности, просмотра подключенных и неисправных сервисов, а также статуса отключения.Структурированные логи
logfmt, удобные для поиска через grep, CLS, Loki и другие системы.Минимальную изоляцию при сбоях нижестоящих сервисов, чтобы падение одного MCP-сервера не влияло на общую работу.
Генерацию файлов конфигурации клиентов:
Codex:
generated/codex-mcp.tomlOpenCode:
generated/opencode-mcp.jsoncOpenClaw:
generated/openclaw-mcp.json
Проверку связности, инструментов самодиагностики и ключевых возможностей через
scripts/self_check.py.
Сценарии использования
Подходит для следующих сценариев:
Один и тот же набор возможностей MCP должен использоваться несколькими AI-клиентами.
Необходимо разделить управление «общими возможностями» и «локальными специфическими возможностями хоста».
Требуется унификация логирования, самодиагностики, проверок работоспособности и изоляции сбоев.
Необходимо, чтобы при добавлении нового общего MCP требовалось изменить только один файл реестра.
Структура проекта
shared-mcp-gateway/
├── Dockerfile # 网关镜像构建文件
├── docker-compose.yml # 当前本地落地用 Compose 编排
├── registry.toml # 宿主机直跑配置
├── registry.compose.toml # 容器内运行配置
├── requirements.txt # Python 依赖
├── docs/
│ └── mcp-topology.md # 哪些 MCP 进入网关、哪些保留本地特例
├── generated/ # 自动生成的客户端配置文件
├── templates/ # 可复制的配置模板
│ ├── docker-compose.template.yml # Compose 配置模板
│ ├── registry.compose.template.toml # 容器内注册表模板
│ └── registry.template.toml # 宿主机注册表模板
├── scripts/
│ ├── render_client_configs.py # 生成客户端配置片段
│ └── self_check.py # 健康检查与关键工具自检
├── shared_mcp_gateway/
│ ├── config.py # 注册表解析
│ ├── gateway.py # HTTP MCP 聚合网关主程序
│ ├── logging_utils.py # 结构化日志输出
│ ├── render.py # 客户端配置渲染
│ └── stdio_bridge.py # stdio 客户端到 HTTP MCP 的桥接Основной принцип работы
flowchart LR
A["Codex / OpenCode / OpenClaw"] --> B["stdio_bridge / HTTP Client"]
B --> C["Shared MCP Gateway"]
C --> D["mempalace"]
C --> E["mysql-db"]
C --> F["obsidian-kb"]
C --> G["tencent-cls"]Описание цепочки выполнения
После того как запрос MCP поступает в общий шлюз, он проходит по следующему пути:
Клиент обращается к общему шлюзу через
stdio_bridge.pyили напрямую по HTTP.RequestLoggingMiddlewareвнедряетcaller,request_idи контекст логов запроса.SharedMcpGatewayопределяет целевой нижестоящий сервис на основе имени инструмента / URI ресурса / имени промпта.Если соответствующий сервис отключен (circuit breaker), запрос быстро отклоняется, чтобы избежать нагрузки на неисправный сервис.
Если пересылка разрешена, запрос поступает в
DownstreamConnection, где доступ к нижестоящему MCP осуществляется последовательно через блокировку сессии.После завершения вызова обновляются метрики, счетчик сбоев, состояние circuit breaker, и данные синхронизируются с heartbeat / healthz.
Рекомендуемое понимание обязанностей основных модулей:
shared_mcp_gateway/config.py: парсинг реестра и строго типизированные объекты конфигурации.shared_mcp_gateway/gateway.py: унифицированная индексация, пересылка запросов, изоляция сбоев, проверки работоспособности, логи heartbeat.shared_mcp_gateway/stdio_bridge.py: мост HTTP-шлюза для клиентов, поддерживающих только stdio.shared_mcp_gateway/render.py: рендеринг унифицированного реестра в конфигурации доступа для различных клиентов.scripts/self_check.py: проверка связности через интерфейс работоспособности и реальные вызовы MCP.
Диаграмма последовательности запросов
Эта диаграмма лучше всего помогает сформировать ментальную модель при чтении кода:
sequenceDiagram
participant Client as "MCP Client"
participant Bridge as "stdio_bridge / HTTP Client"
participant Middleware as "RequestLoggingMiddleware"
participant Gateway as "SharedMcpGateway"
participant Breaker as "CircuitBreaker"
participant Downstream as "DownstreamConnection"
participant Server as "Downstream MCP Server"
Client->>Bridge: 发起 list_tools / call_tool / read_resource
Bridge->>Middleware: HTTP 请求进入网关
Middleware->>Gateway: 注入 caller / request_id 后转发
Gateway->>Breaker: 检查目标下游是否允许访问
alt breaker open
Breaker-->>Gateway: reject
Gateway-->>Client: 快速失败 / 返回熔断提示
else breaker closed
Gateway->>Downstream: 按 namespace 路由请求
Downstream->>Server: 串行发起 MCP 调用
Server-->>Downstream: 返回结果或异常
Downstream-->>Gateway: 返回标准 MCP 响应
Gateway->>Gateway: 更新 metrics / failure streak / breaker
Gateway-->>Client: 返回聚合后的 MCP 响应
endРекомендации по чтению кода
Для быстрого понимания основного пути рекомендуется читать в следующем порядке:
shared_mcp_gateway/config.py: сначала поймите структуру реестра.shared_mcp_gateway/render.py: поймите, как генерируются конфигурации доступа клиентов.shared_mcp_gateway/stdio_bridge.py: поймите, как stdio-клиенты подключаются к HTTP-шлюзу.shared_mcp_gateway/gateway.py: сфокусируйтесь наSharedMcpGateway,DownstreamConnection,RequestLoggingMiddleware.scripts/self_check.py: поймите, как после запуска проверять «живучесть интерфейсов» и «доступность реальных возможностей».
Быстрый старт
1. Установка зависимостей
cd /path/to/shared-mcp-gateway
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt2. Подготовка конфигурации
Вы можете напрямую использовать файлы шаблонов:
templates/registry.template.tomltemplates/registry.compose.template.tomltemplates/docker-compose.template.yml
Наиболее распространенный подход:
cp templates/registry.template.toml registry.local.toml
cp templates/registry.compose.template.toml registry.compose.local.toml
cp templates/docker-compose.template.yml docker-compose.local.ymlЗатем замените пути, порты и команды запуска нижестоящих сервисов в шаблоне на свои реальные значения.
3. Локальный запуск
python3 shared_mcp_gateway/gateway.py --registry registry.toml --log-level INFOПосле запуска по умолчанию доступны:
MCP-конечная точка:
http://127.0.0.1:8787/mcpПроверка работоспособности:
http://127.0.0.1:8787/healthz
4. Запуск через Docker Compose
docker compose up -d --build
docker compose ps
curl http://127.0.0.1:8787/healthzОстановка:
docker compose downКак настроить: описание основных параметров
Основной файл конфигурации проекта — registry.toml, который содержит пять основных частей:
1. Конфигурация прослушивания
[listen]
host = "127.0.0.1"
port = 8787
path = "/mcp"Значение:
host: адрес прослушивания шлюзаport: порт прослушивания шлюзаpath: HTTP-путь MCP
2. Метаинформация шлюза
[gateway]
name = "shared-gateway"
namespace_separator = "."
description = "Shared MCP gateway for Codex, OpenCode and OpenClaw."Значение:
name: имя шлюза, предоставляемое внешним клиентамnamespace_separator: разделитель пространств имен, по умолчанию обычно используется.description: описание шлюза
3. Конфигурация нижестоящих MCP-серверов
[[servers]]
key = "mysql-db"
enabled = true
namespace = "mysql_db"
command = "/bin/bash"
args = ["-lc", "cd /opt/mcps/mysql-connector && ./.venv/bin/python server.py"]Значение:
key: уникальный идентификатор нижестоящего сервисаenabled: включен ли сервисnamespace: пространство имен префикса имени инструментаcommand: команда запускаargs: аргументы запускаenv: опционально, внедрение переменных окружения отдельно для этого сервиса
4. Описание локальных исключений
[local_exceptions.openclaw]
keep_local = ["openspace"]
reason = "OpenSpace 强依赖宿主上下文,保留本地直连。"
endpoint = "http://127.0.0.1:8081/mcp"Используется для записи того, какие возможности не проходят через общий шлюз, а остаются локальными прямыми подключениями.
5. Метаинформация путей конфигурации клиентов (опционально)
[clients.codex]
config_path = "~/.codex/config.toml"Значение:
clients.*в основном используется для записи расположения файлов конфигурации целевых клиентов.Текущий проект по умолчанию не записывает автоматически в эти пути.
Рекомендуется сначала запустить
scripts/render_client_configs.py, а затем скопировать полученные результаты в соответствующие конфигурации клиентов.
Как настроить: примеры
Пример 1: Конфигурация для прямого запуска на хосте
Ниже приведен минимальный пример, который можно использовать напрямую:
[listen]
host = "127.0.0.1"
port = 8787
path = "/mcp"
[gateway]
name = "shared-gateway"
namespace_separator = "."
description = "Shared MCP gateway for local development."
[[servers]]
key = "mempalace"
enabled = true
namespace = "mempalace"
command = "/opt/mempalace/.venv/bin/python"
args = ["-m", "mempalace.mcp_server"]
env = { PYTHONPATH = "/opt/mempalace" }
[[servers]]
key = "mysql-db"
enabled = true
namespace = "mysql_db"
command = "/bin/bash"
args = ["-lc", "cd /opt/mcps/mysql-connector && ./.venv/bin/python server.py"]
[local_exceptions.shared_gateway]
managed = ["mempalace", "mysql_db"]
reason = "共享能力统一由 shared-gateway 纳管。"Пример 2: Идея конфигурации Docker Compose
Если вы хотите запускать шлюз унифицированно внутри контейнера, можно использовать следующий подход:
services:
shared-mcp-gateway:
build:
context: .
dockerfile: Dockerfile
container_name: shared-mcp-gateway
restart: unless-stopped
ports:
- "127.0.0.1:8787:8787"
environment:
OBSIDIAN_VAULT_PATH: /workspace/openclaw-workspace
PYTHONPATH: /workspace/mempalace
volumes:
- /opt/mcps:/workspace/mcps:ro
- /opt/mempalace:/workspace/mempalace:ro
- /opt/openclaw-workspace:/workspace/openclaw-workspace:rw
- /opt/mempalace-data:/root/.mempalace:rwПодходит для:
Монтирования зависимостей среды выполнения нескольких MCP в один контекст контейнера.
Обеспечения стабильности каталогов кода нижестоящих сервисов через монтирование только для чтения.
Унифицированного использования
registry.compose.tomlвнутри контейнера.
Файлы шаблонов конфигурации
Для удобства внедрения проект содержит готовые к копированию файлы шаблонов:
1. Шаблон реестра
Файл: templates/registry.template.toml
Назначение:
При инициализации новой среды просто скопируйте и измените пути.
Подходит в качестве начальной конфигурации для прямого запуска на хосте.
Сохраняет полную структуру
listen,gateway,servers,clients,local_exceptions.
Рекомендуемый способ использования:
cp templates/registry.template.toml registry.local.toml2. Шаблон реестра внутри контейнера
Файл: templates/registry.compose.template.toml
Назначение:
Предоставляет версию реестра с путями внутри контейнера для сценариев Docker / Compose.
Позволяет избежать попадания абсолютных путей хоста в конфигурацию контейнера.
Подходит в качестве готовой к копированию отправной точки для
registry.compose.toml.
Рекомендуемый способ использования:
cp templates/registry.compose.template.toml registry.compose.local.toml3. Шаблон Compose
Файл: templates/docker-compose.template.yml
Назначение:
Быстрая подготовка оркестрации Compose на новой машине или в новой среде.
Позволяет избежать прямого изменения
docker-compose.yml, используемого в текущей рабочей среде.Удобно для приведения путей монтирования и переменных окружения к стандартам вашей команды.
Рекомендуемый способ использования:
cp templates/docker-compose.template.yml docker-compose.local.ymlПримеры подключения клиентов
Рекомендуемый процесс подключения:
Сначала запустите shared-gateway и убедитесь, что
http://127.0.0.1:8787/healthzработает нормально.Выполните
python3 scripts/render_client_configs.pyдля генерации фрагментов конфигурации клиента для текущей среды.В первую очередь копируйте фактические результаты из каталога
generated/, не пишите пути, зависящие от среды, вручную.
Пример подключения Codex
Рекомендуется использовать generated/codex-mcp.toml напрямую. Его структура примерно следующая:
[mcp_servers.shared-gateway]
command = "/bin/bash"
args = ["-lc", "python3 /absolute/path/to/shared_mcp_gateway/stdio_bridge.py --url http://127.0.0.1:8787/mcp --caller codex"]
enabled = trueПример подключения OpenCode
Рекомендуется использовать generated/opencode-mcp.jsonc напрямую. Его структура примерно следующая:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"shared-gateway": {
"type": "local",
"enabled": true,
"command": [
"/bin/bash",
"-lc",
"python3 /absolute/path/to/shared_mcp_gateway/stdio_bridge.py --url http://127.0.0.1:8787/mcp --caller opencode"
]
}
}
}Пример подключения OpenClaw
OpenClaw может работать напрямую через HTTP MCP, рекомендуется использовать generated/openclaw-mcp.json:
{
"mcpServers": {
"shared-gateway": {
"url": "http://127.0.0.1:8787/mcp",
"transport": "streamable-http",
"connectionTimeoutMs": 10000,
"disabled": false
}
}
}Идея подключения Claude Code
Текущий проект уже поддерживает внедрение идентификатора вызывающей стороны для claude-code через stdio_bridge.py. Основная идея заключается в использовании bridge в качестве локальной команды stdio MCP:
python3 /absolute/path/to/shared_mcp_gateway/stdio_bridge.py --url http://127.0.0.1:8787/mcp --caller claude-codeЕсли ваша система конфигурации клиента позволяет настраивать команду stdio MCP, просто повторно используйте эту команду bridge.
Рекомендации по внедрению конфигурации
Чтобы уменьшить количество проблем со средой, рекомендуется внедрять в следующем порядке:
Сначала скопируйте файлы шаблонов, не изменяйте готовые примеры внутри проекта напрямую.
Сначала убедитесь, что каждый нижестоящий MCP-сервер может быть запущен отдельно.
Затем по очереди вносите нижестоящие сервисы в
registry.tomlилиregistry.compose.toml.После запуска шлюза сначала проверьте
/healthz, затем выполнитеscripts/self_check.py.Наконец, выполните
scripts/render_client_configs.pyдля синхронизации конфигурации доступа клиентов.
Рекомендуется различать три типа файлов:
registry.toml: конфигурация для прямого запуска на хостеregistry.compose.toml: конфигурация для запуска внутри контейнераtemplates/*.template.*: шаблоны для инициализации новой среды
Часто используемые команды
Генерация конфигурации клиента
python3 scripts/render_client_configs.pyЭтот скрипт:
Читает
registry.tomlУнифицированно генерирует фрагменты конфигурации для Codex / OpenCode / OpenClaw
Позволяет избежать дрейфа конфигурации при ручном копировании команд запуска bridge
Результаты генерации находятся в:
generated/codex-mcp.tomlgenerated/opencode-mcp.jsoncgenerated/openclaw-mcp.json
Выполнение проверки работоспособности
python3 scripts/self_check.py
python3 scripts/self_check.py --jsonПо умолчанию выполняются два типа проверок:
healthz: проверка того, что шлюз работает нормально, нижестоящие сервисы на месте, а выключатель (circuit breaker) не сработал.gateway_tools: прямое подключение к шлюзу в качестве MCP-клиента, проверка наличия ключевых инструментов и выполнение проверки работоспособности без побочных эффектов.
Просмотр логов
docker compose logs -f shared-mcp-gatewayТекущие подключенные общие MCP
mempalacemysql-dbobsidian-kbtencent-cls
Описание топологии см. в: /path/to/shared-mcp-gateway/docs/mcp-topology.md
Дальнейшие рекомендации
Если вы хотите продолжить расширение этого проекта, рекомендуется действовать в следующем порядке:
Сначала добавьте новый
[[servers]]вregistry.toml.Локально проверьте, может ли этот MCP запуститься независимо.
После запуска шлюза проверьте
/healthz.Запустите
scripts/self_check.py, чтобы увидеть, работают ли ключевые возможности нормально.Повторно выполните
scripts/render_client_configs.pyдля синхронизации конфигурации клиента.
Если вы в данный момент занимаетесь дополнением документации, шаблонов или конфигураций по умолчанию в этом проекте, в первую очередь поддерживайте:
README.mdtemplates/registry.template.tomltemplates/registry.compose.template.tomltemplates/docker-compose.template.ymldocs/mcp-topology.md
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP Gateway: wrap any MCP server with cold-start retries, uptime SLA, and per-execution MPP billing.
Unified gateway hosting 5 Hive Civilization MCP servers (evaluator, trade, depin, compute-grid…
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Connect MCP clients to 2,000+ AI models without managing provider API keys.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA unified gateway and web dashboard that aggregates multiple MCP servers into a single Streamable HTTP endpoint. It supports stdio, SSE, and HTTP protocols, featuring optimized tool exposure modes to reduce token consumption for AI clients.5MIT
- AlicenseNot gradedqualityCmaintenanceA universal MCP server that acts as a unified gateway for dynamically connecting and managing multiple MCP servers via a single HTTP endpoint.7 npm6MIT
- FlicenseNot gradedqualityBmaintenanceSingle gateway that aggregates dozens of upstream MCP servers, enabling AI clients to connect once and access all tools.-
- FlicenseNot gradedqualityCmaintenanceA unified enterprise-grade gateway that lets LLM agents call multiple MCP servers through a single REST API, with built-in authentication, rate limiting, logging, and metrics.-