Shared MCP Gateway
Shared MCP Gateway
Fasst mehrere gemeinsam genutzte MCP-Server in einem HTTP-Gateway zusammen und bietet eine stabile, beobachtbare und wiederverwendbare MCP-Zugriffsschicht, die von Clients wie Codex, OpenCode, Claude Code, OpenClaw usw. gemeinsam genutzt werden kann.
Gelöste Probleme
In Szenarien, in denen mehrere Clients und mehrere MCP-Server parallel verwendet werden, treten häufig folgende Probleme auf:
Jeder Client muss eine eigene MCP-Konfiguration pflegen, was zu redundanter Arbeit führt.
Die Konfiguration derselben Toolchain ist über verschiedene Clients hinweg inkonsistent, was dazu führt, dass sie in einem Client funktioniert und im anderen nicht.
Wenn ein nachgelagerter MCP-Server ausfällt, sind die Fehlerquellen verstreut, was eine einheitliche Protokollierung, Selbstprüfung und Fehlerisolierung erschwert.
Das Hinzufügen oder Ersetzen eines MCP-Servers erfordert die manuelle Anpassung mehrerer Konfigurationsdateien, was die Änderungskosten erhöht.
Das Ziel von shared-mcp-gateway ist es, diese gemeinsam genutzten Funktionen zentral zu verwalten:
Zentrale Registrierung: Verwaltung der nachgelagerten MCPs über
registry.toml/registry.compose.toml.Zentraler Zugriffspunkt: Aggregation mehrerer nachgelagerter Dienste über einen einzigen HTTP-MCP-Endpunkt.
Zentrales Betriebsmanagement: Einheitliche Gesundheitsprüfungen, strukturierte Protokollierung, Fehlerisolierung und Circuit-Breaking.
Zentrale Konfigurationsgenerierung: Automatische Erstellung von Zugriffskonfigurationsfragmenten für Codex / OpenCode / OpenClaw.
Related MCP server: MCPHubs
Funktionen
Das Projekt unterstützt derzeit:
Aggregation mehrerer stdio-basierter nachgelagerter MCP-Server.
Einheitliche Bereitstellung nachgelagerter Tools im Format
namespace.tool_name.Automatisches Hinzufügen von
caller-Kennungen für verschiedene Clients zur einfachen Protokollverfolgung.Bereitstellung einer
/healthz-Schnittstelle zur Gesundheitsprüfung, um verbundene Dienste, ausgefallene Dienste und den Status des Circuit-Breakers zu überwachen.Bereitstellung strukturierter
logfmt-Protokolle für die einfache Suche in Systemen wie grep, CLS, Loki usw.Minimale Isolierung bei Ausfällen nachgelagerter Dienste, um zu verhindern, dass ein einzelner MCP-Server die gesamte Erfahrung beeinträchtigt.
Generierung von Client-Konfigurationsdateien:
Codex:
generated/codex-mcp.tomlOpenCode:
generated/opencode-mcp.jsoncOpenClaw:
generated/openclaw-mcp.json
Konnektivitäts-, Tool- und Kapazitätsprüfungen über
scripts/self_check.py.
Anwendungsfälle
Direkt geeignet für folgende Szenarien:
Dieselben MCP-Funktionen müssen von mehreren KI-Clients wiederverwendet werden.
Trennung von "gemeinsam genutzten Funktionen" und "lokalen, host-spezifischen Funktionen".
Bedarf an einheitlicher Protokollierung, Selbstprüfung, Gesundheitsprüfung und Fehlerisolierung.
Wunsch, bei der Hinzufügung eines neuen gemeinsamen MCP nur eine einzige Registrierungskonfiguration ändern zu müssen.
Projektstruktur
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 的桥接Kernarbeitsweise
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"]Erläuterung des Anforderungsablaufs
Nachdem eine MCP-Anfrage das Shared Gateway erreicht hat, folgt sie diesem Pfad:
Der Client greift über
stdio_bridge.pyoder direkt über HTTP auf das Shared Gateway zu.RequestLoggingMiddlewareinjiziertcaller,request_idund den Kontext der Zugriffsprotokollierung.SharedMcpGatewaylokalisiert das Ziel basierend auf Toolname / Ressourcen-URI / Prompt-Name.Wenn das Ziel bereits durch den Circuit-Breaker blockiert ist, wird die Anfrage sofort abgelehnt, um eine Überlastung fehlerhafter Dienste zu vermeiden.
Wenn die Weiterleitung erlaubt ist, gelangt die Anfrage zu
DownstreamConnectionund greift über eine Single-Session-Sperre seriell auf den nachgelagerten MCP zu.Nach Abschluss des Aufrufs werden Metriken, Fehlerzähler und der Circuit-Breaker aktualisiert und mit heartbeat / healthz synchronisiert.
Empfohlene Aufteilung der Kernmodule:
shared_mcp_gateway/config.py: Registrierungs-Parsing und stark typisierte Konfigurationsobjekte.shared_mcp_gateway/gateway.py: Einheitliche Indizierung, Anforderungsweiterleitung, Fehlerisolierung, Gesundheitsprüfung, Heartbeat-Protokollierung.shared_mcp_gateway/stdio_bridge.py: Bereitstellung einer HTTP-Gateway-Brückenschicht für Clients, die nur stdio unterstützen.shared_mcp_gateway/render.py: Rendern der einheitlichen Registrierung in Client-spezifische Zugriffskonfigurationen.scripts/self_check.py: Konnektivitätsprüfung über Gesundheits-Schnittstellen und echte MCP-Aufrufe.
Sequenzdiagramm der Anfrage
Das folgende Diagramm hilft beim Verständnis des mentalen Modells beim Lesen des Codes:
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 响应
endEmpfehlungen zum Lesen des Codes
Um den Hauptablauf schnell zu verstehen, wird folgende Reihenfolge empfohlen:
shared_mcp_gateway/config.py: Verständnis der Registrierungsstruktur.shared_mcp_gateway/render.py: Verständnis der Generierung von Client-Zugriffskonfigurationen.shared_mcp_gateway/stdio_bridge.py: Verständnis der Anbindung von stdio-Clients an das HTTP-Gateway.shared_mcp_gateway/gateway.py: Fokus aufSharedMcpGateway,DownstreamConnection,RequestLoggingMiddleware.scripts/self_check.py: Verständnis der Überprüfung der "Live-Schnittstellen" und "echten Fähigkeiten" nach dem Deployment.
Erste Schritte
1. Abhängigkeiten installieren
cd /path/to/shared-mcp-gateway
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt2. Konfiguration vorbereiten
Sie können sich direkt an den Vorlagendateien orientieren:
templates/registry.template.tomltemplates/registry.compose.template.tomltemplates/docker-compose.template.yml
Die gängigste Vorgehensweise ist:
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.ymlErsetzen Sie dann die Pfade, Ports und Befehle für nachgelagerte Dienste in den Vorlagen durch Ihre tatsächliche Umgebung.
3. Lokaler Start
python3 shared_mcp_gateway/gateway.py --registry registry.toml --log-level INFONach dem Start sind folgende Endpunkte verfügbar:
MCP-Endpunkt:
http://127.0.0.1:8787/mcpGesundheitsprüfung:
http://127.0.0.1:8787/healthz
4. Start mit Docker Compose
docker compose up -d --build
docker compose ps
curl http://127.0.0.1:8787/healthzStoppen:
docker compose downKonfiguration: Kernkonfiguration
Die zentrale Konfigurationsdatei des Projekts ist registry.toml, die hauptsächlich aus fünf Teilen besteht:
1. Listener-Konfiguration
[listen]
host = "127.0.0.1"
port = 8787
path = "/mcp"Bedeutung:
host: Host-Adresse des Gatewaysport: Port des Gatewayspath: HTTP-Pfad für MCP
2. Gateway-Metadaten
[gateway]
name = "shared-gateway"
namespace_separator = "."
description = "Shared MCP gateway for Codex, OpenCode and OpenClaw."Bedeutung:
name: Name des nach außen exponierten Gatewaysnamespace_separator: Trennzeichen für Namespaces, standardmäßig.description: Beschreibung des Gateways
3. Konfiguration nachgelagerter MCP-Server
[[servers]]
key = "mysql-db"
enabled = true
namespace = "mysql_db"
command = "/bin/bash"
args = ["-lc", "cd /opt/mcps/mysql-connector && ./.venv/bin/python server.py"]Bedeutung:
key: Eindeutige Kennung des nachgelagerten Dienstesenabled: Aktiviert oder nichtnamespace: Namespace-Präfix für Toolnamencommand: Startbefehlargs: Startargumenteenv: Optional, zur Injektion von Umgebungsvariablen für diesen Dienst
4. Lokale Ausnahmen
[local_exceptions.openclaw]
keep_local = ["openspace"]
reason = "OpenSpace 强依赖宿主上下文,保留本地直连。"
endpoint = "http://127.0.0.1:8081/mcp"Zur Dokumentation, welche Funktionen nicht über das Shared Gateway laufen, sondern lokal direkt verbunden bleiben.
5. Metadaten für Client-Konfigurationspfade (optional)
[clients.codex]
config_path = "~/.codex/config.toml"Bedeutung:
clients.*dient hauptsächlich zur Dokumentation der Speicherorte der Client-Konfigurationsdateien.Das Projekt schreibt diese Pfade standardmäßig nicht automatisch zurück.
Es wird empfohlen, zuerst
scripts/render_client_configs.pyauszuführen und die Ergebnisse manuell in die Client-Konfigurationen zu kopieren.
Konfiguration: Beispiele
Beispiel 1: Konfiguration für den Host-Betrieb
Hier ist ein minimales Beispiel zur direkten Verwendung:
[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 纳管。"Beispiel 2: Ansatz für Docker Compose
Wenn Sie das Gateway einheitlich in einem Container betreiben möchten, orientieren Sie sich an folgendem Ansatz:
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:rwGeeignet für:
Zusammenführung mehrerer MCP-Laufzeitabhängigkeiten im selben Container-Kontext.
Sicherstellung stabiler Verzeichnisse für nachgelagerten Code durch Read-Only-Mounts.
Einheitliche Verwendung von
registry.compose.tomlinnerhalb des Containers.
Konfigurationsvorlagen
Um den Einstieg zu erleichtern, enthält das Projekt kopierbare Vorlagendateien:
1. Registrierungsvorlage
Datei: templates/registry.template.toml
Verwendung:
Bei der Initialisierung einer neuen Umgebung einfach kopieren und Pfade anpassen.
Geeignet als Startpunkt für den Betrieb auf dem Host.
Enthält die vollständige Struktur von
listen,gateway,servers,clientsundlocal_exceptions.
Empfohlene Vorgehensweise:
cp templates/registry.template.toml registry.local.toml2. Registrierungsvorlage für Container
Datei: templates/registry.compose.template.toml
Verwendung:
Bietet eine Vorlage mit Pfaden innerhalb des Containers für Docker / Compose-Szenarien.
Vermeidet die Übernahme absoluter Host-Pfade in die Container-Konfiguration.
Geeignet als kopierbarer Startpunkt für
registry.compose.toml.
Empfohlene Vorgehensweise:
cp templates/registry.compose.template.toml registry.compose.local.toml3. Compose-Vorlage
Datei: templates/docker-compose.template.yml
Verwendung:
Schnelle Vorbereitung der Compose-Orchestrierung auf neuen Maschinen oder Umgebungen.
Vermeidet die direkte Änderung der produktiven oder maschinenspezifischen
docker-compose.yml.Erleichtert die Anpassung von Mount-Pfaden und Umgebungsvariablen an eigene Standards.
Empfohlene Vorgehensweise:
cp templates/docker-compose.template.yml docker-compose.local.ymlBeispiele für die Client-Anbindung
Empfohlener Ablauf:
Starten Sie das shared-gateway und bestätigen Sie, dass
http://127.0.0.1:8787/healthzfunktioniert.Führen Sie
python3 scripts/render_client_configs.pyaus, um die Client-Konfigurationsfragmente für die aktuelle Umgebung zu generieren.Kopieren Sie bevorzugt die tatsächlichen Ergebnisse aus dem Verzeichnis
generated/, anstatt umgebungsspezifische Pfade manuell zu schreiben.
Codex-Anbindung
Es wird empfohlen, direkt generated/codex-mcp.toml zu verwenden. Die Struktur sieht in etwa so aus:
[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 = trueOpenCode-Anbindung
Es wird empfohlen, direkt generated/opencode-mcp.jsonc zu verwenden. Die Struktur sieht in etwa so aus:
{
"$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-Anbindung
OpenClaw kann direkt über HTTP MCP laufen. Es wird empfohlen, generated/openclaw-mcp.json zu verwenden:
{
"mcpServers": {
"shared-gateway": {
"url": "http://127.0.0.1:8787/mcp",
"transport": "streamable-http",
"connectionTimeoutMs": 10000,
"disabled": false
}
}
}Claude Code-Anbindung
Das Projekt unterstützt derzeit die Injektion von Caller-IDs für claude-code über stdio_bridge.py. Der Kernansatz besteht darin, die Bridge als lokalen stdio-MCP-Befehl zu verwenden:
python3 /absolute/path/to/shared_mcp_gateway/stdio_bridge.py --url http://127.0.0.1:8787/mcp --caller claude-codeWenn Ihre Client-Konfiguration benutzerdefinierte stdio-MCP-Befehle zulässt, können Sie diesen Bridge-Befehl einfach wiederverwenden.
Empfehlungen zur Konfigurationsumsetzung
Um Umgebungsprobleme zu minimieren, wird folgende Reihenfolge empfohlen:
Kopieren Sie zuerst die Vorlagendateien, ändern Sie nicht direkt die vorhandenen Beispiele im Projekt.
Stellen Sie sicher, dass jeder nachgelagerte MCP-Server einzeln gestartet werden kann.
Tragen Sie die nachgelagerten Dienste nacheinander in
registry.tomloderregistry.compose.tomlein.Überprüfen Sie nach dem Start des Gateways zuerst
/healthzund führen Sie dannscripts/self_check.pyaus.Führen Sie abschließend
scripts/render_client_configs.pyaus, um die Client-Konfigurationen zu synchronisieren.
Es wird empfohlen, drei Arten von Dateien zu unterscheiden:
registry.toml: Konfiguration für den Host-Betriebregistry.compose.toml: Konfiguration für den Container-Betriebtemplates/*.template.*: Vorlagen für die Initialisierung neuer Umgebungen
Häufige Befehle
Client-Konfiguration generieren
python3 scripts/render_client_configs.pyDieses Skript:
Liest
registry.tomlGeneriert einheitlich Konfigurationsfragmente für Codex / OpenCode / OpenClaw
Vermeidet Konfigurationsdrift beim manuellen Kopieren von Bridge-Startbefehlen
Die Ergebnisse befinden sich in:
generated/codex-mcp.tomlgenerated/opencode-mcp.jsoncgenerated/openclaw-mcp.json
Gesundheitsprüfung durchführen
python3 scripts/self_check.py
python3 scripts/self_check.py --jsonStandardmäßig werden zwei Arten von Prüfungen durchgeführt:
healthz: Überprüfung, ob das Gateway korrekt exponiert ist, ob nachgelagerte Dienste fehlen und ob der Circuit-Breaker ausgelöst wurde.gateway_tools: Verbindung zum Gateway als MCP-Client, um zu prüfen, ob wichtige Tools vorhanden sind, und Durchführung von Prüfungen ohne Nebenwirkungen.
Protokolle anzeigen
docker compose logs -f shared-mcp-gatewayAktuell angebundene Shared MCPs
mempalacemysql-dbobsidian-kbtencent-cls
Informationen zur Topologie finden Sie unter: /path/to/shared-mcp-gateway/docs/mcp-topology.md
Empfehlungen für die Zukunft
Wenn Sie dieses Projekt weiter ausbauen möchten, wird folgende Reihenfolge empfohlen:
Fügen Sie in
registry.tomlein neues[[servers]]hinzu.Überprüfen Sie lokal, ob dieser MCP unabhängig gestartet werden kann.
Überprüfen Sie nach dem Start des Gateways
/healthz.Führen Sie
scripts/self_check.pyaus, um zu sehen, ob die Kernfunktionen normal funktionieren.Führen Sie
scripts/render_client_configs.pyerneut aus, um die Client-Konfigurationen zu synchronisieren.
Wenn Sie aktuell Dokumentationen, Vorlagen oder Standardkonfigurationen in diesem Projekt ergänzen möchten, pflegen Sie bevorzugt:
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