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: MCPHubs
Возможности проекта
Текущая версия поддерживает:
Агрегацию нескольких нижестоящих 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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceA unified gateway and dashboard that aggregates multiple MCP servers into a single endpoint for streamlined management by AI clients. It features a centralized YAML configuration, a web-based monitoring dashboard, and hot-reload support for managing filesystem, GitHub, and database tools.
- 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 gradedqualityDmaintenanceMCPGate aggregates multiple MCP servers into a single unified endpoint, enabling centralized tool management with granular filtering, automatic namespacing, and observability. Features a real-time web dashboard and optional PostgreSQL-backed audit trails for monitoring and controlling AI tool access across local and remote deployments.17Apache 2.0
- AlicenseNot gradedqualityCmaintenanceA universal MCP server that acts as a unified gateway for dynamically connecting and managing multiple MCP servers via a single HTTP endpoint.106MIT
Related MCP Connectors
MCP Hub: AI service discovery, per-user OAuth, and multi-service workflow orchestration
Hosted MCP server for LLM cost estimation, model comparison, and budget-aware routing.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/xfn-jjw/shared-mcp-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server