Was das MCP-Gateway leistet
GoModel kann zwischen Ihren Agent-Clients (Claude Code, Claude Desktop, Cursor, VS Code, …) und den MCP-Servern (Model Context Protocol) stehen, die diese nutzen — genauso, wie es bereits zwischen Ihren Anwendungen und den Modell-Providern steht:- Ein Endpunkt, ein Key. Clients verbinden sich mit
https://your-gateway/mcpüber einen GoModel-API-Key. Sie halten nie Zugangsdaten für die Upstream-MCP-Server; das Gateway fügt die Header jedes Servers selbst ein. - Aggregation mit Namespaces. Tools und Prompts aller konfigurierten Server
erscheinen in einem gemeinsamen Katalog als
{slug}_{name}(zum Beispielgithub_create_issue), in einer stabilen, deterministischen Reihenfolge. - Discovery nach dem Least-Privilege-Prinzip. Ein Server kann auf
user_pathsbeschränkt und mitdisallowed_user_pathsfür Teilbereiche ausgenommen werden; Aufrufer, für die er verborgen ist, erhalten nicht nur Fehler — die Tools erscheinen in ihremtools/listüberhaupt nicht. Filter auf Betreiberebene,allowed_tools/disallowed_tools, stutzen umfangreiche Server zurecht, was den Agent-Kontext klein hält. - Observability. Jeder Tool-Aufruf wird zu einem Nutzungseintrag (Server, Tool,
Dauer, Größen, Fehler-Flag, Labels, User-Path), und MCP-Requests erscheinen im
Audit-Log und im Request-Log wie jeder andere Modell-Traffic — gekennzeichnet mit
der JSON-RPC-Methode und bei Aufrufen mit dem Tool- oder Prompt-Namen, sodass eine
tools/call-Zeilegithub_create_issuelautet und nicht nur einen Pfad zeigt. MitLOGGING_LOG_BODIES=truewerden die JSON-RPC-Request- und -Response-Frames ebenfalls im Audit-Eintrag erfasst (einschließlich Tool-Argumenten und -Ergebnissen), mit derselben Obergrenze von 1 MB wie bei anderen Endpunkten. Rate-Limits und Budgets pro User-Path gelten auch für MCP-Requests.
Einen Client verbinden
Richten Sie einen beliebigen MCP-Client mit Streamable HTTP auf das Gateway aus und übergeben Sie Ihren GoModel-Key als Bearer-Token:/mcp— alles, was der User-Path des Keys sehen darf, mit Namespaces./mcp/{slug}— ein einzelner Server mit seinen ursprünglichen Tool-Namen./mcp/{name}— ein virtueller Server: eine benannte Teilmenge von Servern, mit Namespaces.- Header
X-MCP-Servers: github,jira— eine kommagetrennte Teilmenge auf/mcp.
Server zu virtuellen Servern gruppieren
Ein virtueller Server stellt eine feste Teilmenge Ihrer MCP-Server unter einer eigenen URL bereit. Verwenden Sie einen für Clients, die nur eine URL und keine benutzerdefinierten Header akzeptieren, oder um jedem Team oder Agent eine kuratierte Auswahl bereitzustellen. Erstellen Sie einen auf der Seite MCP Servers über Add Virtual Server: Wählen Sie einen Namen, die zugehörigen Server und optional den Modus der Tool-Liste. Änderungen werden sofort wirksam. Um virtuelle Server als Code zu verwalten, deklarieren Sie sie stattdessen in der Konfiguration:https://your-gateway/mcp/coding und sehen die Tools mit
Namespaces wie auf /mcp (github_create_issue). Dieselbe Map funktioniert als JSON
in MCP_VIRTUAL_SERVERS.
- Er schränkt nur ein. Jedes Mitglied behält seine
user_pathsund Tool-Filter; ein Key, dergithubnicht sehen kann, sieht ihn also auch übercodingnicht.X-MCP-Serversschränkt einen virtuellen Server weiter ein. - Namen teilen sich
/mcp/{name}mit Server-Slugs. Der Start schlägt fehl, wenn ein virtueller Server in der Konfiguration nach einem Server in der Konfiguration benannt ist, und das Dashboard lehnt einen neuen Server oder virtuellen Server ab, dessen Name bereits von der jeweils anderen Art verwendet wird. Haben ein Server und ein virtueller Server dennoch denselben Namen (zum Beispiel, weil die Konfiguration nach einem Dashboard-Eintrag hinzugefügt wurde), behält der Server die URL, und der virtuelle Server wird nicht bereitgestellt; Log und Dashboard weisen darauf hin. - Konfigurationseinträge haben Vorrang. Ein in der Konfiguration deklarierter virtueller Server verdeckt einen gleichnamigen aus dem Dashboard und ist im Dashboard schreibgeschützt.
- Fehlende Mitglieder werden übersprungen. Das Dashboard bietet nur vorhandene Server an, aber ein später gelöschtes Mitglied oder eines, das in der Konfiguration genannt wird, bevor es existiert, wird mit einer Warnung übersprungen und auf der Seite MCP Servers markiert.
CACHE_REFRESH_INTERVAL, Standard
1 Stunde) oder bei einer Laufzeitaktualisierung aus dem Dashboard. Im Dashboard
hinzugefügte MCP-Server werden auf dieselbe Weise verteilt.
Tools suchen statt auflisten
Jedes Tool intools/list wird in jedem Turn an das Modell gesendet. Bei einigen
großen Servern können das Zehntausende von Tokens sein. Die Such-Discovery ersetzt
die Liste durch zwei Tools:
search_toolsnimmt Schlüsselwörter (oder einen exakten Tool-Namen) entgegen und gibt die passenden Tools mit ihren Beschreibungen und Input-Schemas zurück.call_toolführt ein gefundenes Tool übernamemit seinenargumentsaus.
call_tool sieht für den
Client jeder Aufruf wie dasselbe Tool aus.
Suchergebnisse und Aufrufe berücksichtigen User-Paths und Tool-Filter. Fehler, etwa
ein unbekannter Name oder ein nicht erreichbarer Server, kommen als Tool-Fehler
zurück, die das Modell lesen und auf die es reagieren kann. Nutzungseinträge und das
Request-Log erfassen den echten Tool-Namen, nicht call_tool. Ist der Katalog nur
wegen Tools groß, die niemand verwendet, ist es einfacher, ihn mit
Tool-Filtern oder X-MCP-Servers zu
verkleinern – die Tools bleiben dann direkt aufgelistet.
Server deklarieren
Server lassen sich im Dashboard verwalten (Seite MCP Servers) oder als Infrastructure-as-Code deklarieren — deklarative Einträge überschreiben Dashboard-Zeilen mit demselben Slug und sind dort schreibgeschützt:
Einen Server über das Dashboard hinzufügen
Öffnen Sie MCP Servers und klicken Sie auf Add MCP Server. Füllen Sie aus:- Name — für Menschen gedacht; Sie können ihn später umbenennen.
- Transport —
http(Streamable HTTP, Standard) odersse(Legacy). - URL — der Upstream-MCP-Endpunkt.
- Headers — Upstream-Zugangsdaten (zum Beispiel
Authorization: Bearer …); gespeicherte Werte werden danach geschwärzt angezeigt. - Tools — aktivieren Sie die Tools, die Clients verwenden dürfen; siehe Festlegen, welche Tools ein Server bereitstellt.
- Optional user paths und excluded user paths unter Advanced; siehe Einschränken, wer einen Server sieht.
config.yaml
oder MCP_SERVERS werden hier schreibgeschützt angezeigt.
Im Dashboard verwaltete Server haben zwei Bezeichner:
- Name ist für Menschen gedacht, akzeptiert Unicode und kann später bearbeitet werden.
- Slug wird standardmäßig aus dem Namen abgeleitet. Er besteht aus ASCII-
Kleinbuchstaben, Ziffern, Bindestrichen und Unterstrichen und kann beim Erstellen
des Servers angepasst werden. Nach dem Erstellen ist er unveränderlich, weil er in
/mcp/{slug},X-MCP-Serversund in den aggregierten Tool-Namen verwendet wird.
mcp.servers der Slug und wird im
Dashboard auch als Name angezeigt.
MCP_SERVERS (ein JSON-Objekt, das pro Name über die
YAML-Werte gelegt wird):
Ungültige Deklarationen (fehlerhafter Slug, fehlende
url/command, unbekannter
Transport) brechen den Start mit einem eindeutigen Fehler ab, statt den Server
stillschweigend zu verwerfen.
stdio-Server mit Docker betreiben
Das offizielle Image enthält nur die GoModel-Binärdatei — keine Shell, kein Node und kein Python —, daher könnennpx- und uvx-Befehle darin nicht starten.
stdio-Server, die als statische Binärdatei ausgeliefert werden, funktionieren: Hängen
Sie die Binärdatei ein und richten Sie command darauf aus.
Für alles andere betreiben Sie den stdio-Server in einem eigenen Container hinter
einer stdio-zu-HTTP-Bridge wie
supergateway und deklarieren ihn als
regulären http-Server:
Zustand und Lebenszyklus
Das Dashboard zeigt jeden Server als connected, degraded, connecting oder disabled an, mit der Anzahl der Tools und dem letzten Fehler; die Seite Overview fasst den Zustand der MCP-Server zusammen, sobald Server konfiguriert sind. Ein Server, dessen Auflistung fehlschlägt, behält seinen bisherigen Katalog (als degraded markiert) und wird alle 60 Sekunden erneut geprüft; funktionierende Kataloge werden alle 5 Minuten neu aufgelistet und sofort aktualisiert, wenn der Upstream einelist_changed-Benachrichtigung sendet. Reconnect im Dashboard
(oder POST /admin/mcp-servers/{slug}/reconnect) erzwingt einen erneuten
Verbindungsaufbau.
Ein im Dashboard gespeicherter Server startet als connecting: Der erste
Verbindungsaufbau läuft im Hintergrund, sodass das Speichern nie auf Upstream-IO
wartet. Das Dashboard prüft alle paar Sekunden erneut, bis die Zeile auf connected
oder degraded steht; ein Neuladen der Seite ist nicht nötig.
Ein letzter Fehler no MCP endpoint at that path bedeutet, dass die URL den
Handshake mit HTTP 404 beantwortet hat: Dort lauscht etwas, aber kein MCP-Endpunkt
unter diesem Pfad. Server stellen ihren Endpunkt unter unterschiedlichen Pfaden
bereit, daher muss url den Pfad enthalten — zum Beispiel
http://localhost:18080/http für mcp-devtools oder http://localhost:3000/v2/mcp
für selbst gehostetes Firecrawl. Ein letzter Fehler mit HTTP 405 bedeutet, dass der
Pfad existiert, die Handshake-Methode aber ablehnt; so antwortet ein
Streamable-HTTP-Endpunkt, wenn transport auf sse steht (und ein SSE-Endpunkt,
wenn er auf http steht): Korrigieren Sie zuerst transport, dann den Pfad.
Zustandslose Server (ohne Mcp-Session-Id) benötigen keine zusätzliche
Konfiguration.
Ein letzter Fehler mit x509: certificate signed by unknown authority bedeutet, dass
das TLS-Zertifikat des Servers von einer CA ausgestellt wurde, der der Container
nicht vertraut. Siehe
Private CA-Zertifikate.
Festlegen, welche Tools ein Server bereitstellt
Standardmäßig wird jedes Tool bereitgestellt, das ein Server meldet. Reduzieren Sie die Tools eines Servers, um den Agent-Kontext klein zu halten und riskante Tools, etwa zum Löschen oder Mergen, von Clients fernzuhalten. Bearbeiten Sie dazu im Dashboard einen Server und nutzen Sie dessen Abschnitt Tools. Er listet jedes vom Server gemeldete Tool mit einer Checkbox auf, dazu ein Filterfeld sowie Expose all / Exclude all für die gefilterten Zeilen. Tools, die der Server alsread-only oder destructive annotiert, tragen ein Badge. Diese
Hinweise stammen vom Upstream; GoModel überprüft sie nicht.
Tools the server adds later steuert, was passiert, wenn der Upstream wächst:
Wählen Sie Keep hidden für Server, die Sie nicht kontrollieren, damit ein neues
Tool Clients nie ohne Prüfung erreicht.
Sie können ein Tool auch über seinen Namen hinzufügen, zum Beispiel bevor sich der
Server zum ersten Mal verbindet. Namen, die der Server nicht meldet, bleiben in der
Liste und sind mit Not reported by the server markiert, sodass Tippfehler und
entfernte Tools sichtbar bleiben.
Änderungen an Tool-Filtern werden sofort wirksam, ohne die Verbindung zum Server neu
aufzubauen. Die Änderung gilt auch für bereits offene MCP-Sessions: Ein
ausgeschlossenes Tool schlägt mit einem Fehler fehl, selbst für einen Client, der es
vor der Änderung aufgelistet hat.
In der
config.yaml verwenden dieselben Filter die ursprünglichen Tool-Namen ohne
Präfix:
Einschränken, wer einen Server sieht
user_paths listet auf, wer einen Server sehen darf; disallowed_user_paths nimmt
Aufrufer aus. Beide gleichen Teilbäume ab, sodass /contractors auch
/contractors/acme abdeckt, und ein Ausschluss hat Vorrang vor einem erlaubten Pfad.
Der User-Path des Aufrufers stammt aus seinem API-Key, sofern der Key einen hat.
Andernfalls – auch mit dem Master-Key – stammt er aus dem Header
X-GoModel-User-Path (oder dem über USER_PATH_HEADER benannten Header); so können
Sie schnell prüfen, was ein bestimmter Teilbaum sieht.
Verborgene Server fehlen in tools/list, und /mcp/{slug} gibt für sie 404 zurück.
Wie bei Tool-Filtern werden Änderungen an der Sichtbarkeit ohne neuen
Verbindungsaufbau zum Server wirksam und bei jedem Aufruf geprüft; sie erreichen
daher auch bereits offene MCP-Sessions.
Den Katalog eines Servers einsehen
Der Katalog-Inspektor im Dashboard (oderGET /admin/mcp-servers/{slug}/catalog)
listet auf, was ein Server aktuell über das Gateway bereitstellt: Tools, Prompts,
Ressourcen und Ressourcen-Templates mit ihren Beschreibungen, nach Anwendung Ihrer
allowed_tools- / disallowed_tools-Filter. Tools, die der Server meldet, die aber
durch die Filter verborgen werden, sind separat unter excluded_tools aufgeführt.
Die Namen sind die ursprünglichen Upstream-Namen; der aggregierte Endpunkt /mcp
stellt sie als {slug}_{name} bereit.
Sicherheitshinweise
- Grenze für Zugangsdaten. Die MCP-Spezifikation verbietet das Durchreichen von Tokens; GoModel terminiert das Bearer-Token des Clients und fügt serverspezifische Zugangsdaten aus der Konfiguration ein. Client-Keys erreichen nie einen Upstream, und konfigurierte Upstream-Header werden bei Cross-Origin- Weiterleitungen nicht mitgesendet.
- Browser-Origins werden standardmäßig abgelehnt. MCP-Clients sind keine
Webseiten; daher lehnt
/mcpjeden Request mit Browser-Fetch-Metadaten (OriginoderSec-Fetch-Site) ab, sofern er nicht von einem Origin stammt, der inmcp.allowed_origins(MCP_ALLOWED_ORIGINS) aufgeführt ist. Schreiben Sie Einträge so, wie ein Browser sie serialisiert —https://console.example.com, ohne abschließenden Schrägstrich, Standardports optional. Ein Origin auf der Allowlist erhält eine vollständige Session, einschließlich desGET-Benachrichtigungsstreams, den Browser ohneOrigin-Header senden. Genau das blockiert browserbasiertes DNS Rebinding: Rebinding ändert nur, zu welcher Adresse ein Hostname aufgelöst wird;OriginundHosteiner umgebundenen Seite stimmen also weiterhin überein, und der Browser meldet weiterhinSec-Fetch-Site: same-origin— ein Vergleich beweist nichts, und nur eine explizite Allowlist unterscheidet Ihren Origin von dem eines Angreifers. Setzen Sieallowed_originsnur, wenn Sie einen MCP-Web-Client von einem bekannten Origin ausliefern;"*"vertraut jedem Origin, deaktiviert die Schutzmaßnahme und erzeugt beim Start eine Warnung. - stdio ist nur deklarativ möglich. stdio-Server starten Subprozesse auf dem
Gateway-Host und können daher nur in der
config.yaml/MCP_SERVERSdeklariert werden. Admin API und Dashboard lehnen sie ab — ein Dashboard-Login darf niemals gleichbedeutend mit Codeausführung auf dem Gateway sein. - stdio-Subprozesse erhalten eine minimale Umgebung. Nur
PATH,HOME,TMPDIR,USERundLANGwerden vererbt — niemals die Provider-API-Keys oder der Master-Key des Gateways. Übergeben Sie alles Weitere explizit über dieenv:-Map des Servers (Werte unterstützen${VAR}). - Im Dashboard verwaltete Zugangsdaten liegen in der Gateway-Datenbank. Header
von Servern, die über die Admin-Oberfläche erstellt wurden, werden im
konfigurierten Storage-Backend gespeichert (sie werden nur auf API-/UI-Ebene
geschwärzt). Wenn Ihr Bedrohungsmodell Secrets in der Datenbank ausschließt,
deklarieren Sie diese Server stattdessen in der
config.yaml/MCP_SERVERS—${ENV}-Referenzen halten das Secret in der Umgebung, und deklarative Server berühren den Speicher nie. - Remote-URLs sind serverseitiger ausgehender Traffic. Im Dashboard verwaltete HTTP/SSE-Server unterstützen bewusst private und Loopback-Endpunkte. Schützen Sie den Admin-Schreibzugriff und setzen Sie die Egress-Richtlinie Ihres Deployments durch, damit nicht vertrauenswürdige Betreiber das Gateway nicht nutzen können, um interne Dienste auszuspähen.
- Sessions sind keine Authentifizierung. Jeder Request wird per Bearer-Token authentifiziert, und eine Session ist zusätzlich an die Identität des verwalteten Auth-Keys, den User-Path und den festgelegten Endpunkt gebunden, die sie initialisiert haben; wer eine geleakte Session-ID unter einer anderen Identität verwendet, erhält 404.
- Geheime Header-Werte werden in der Admin API und im Dashboard geschwärzt (
***) angezeigt; das Speichern eines Formulars mit***behält das gespeicherte Secret bei.
Protokollabdeckung
Tools, Prompts, Ressourcen und Ressourcen-Templates werden aggregiert und weitergeleitet. Gültige Schemas und alle Ergebnisse bleiben unverändert; fehlerhafte Tool-Schemas werden zu sicheren Objekt-Schemas normalisiert, statt nachgelagerte Sessions abstürzen zu lassen. Upstream-instructions werden in die
initialize-Response des Gateways zusammengeführt. Vom Server initiierte Features
(Sampling, Elicitation, Roots) und Ressourcen-Abonnements werden in dieser Version
nicht ausgehandelt, was nachgelagerte Clients transparent handhaben.