sovereign-mcp-gateway
sovereign-mcp-gateway
Ein vorgeschalteter Proxy für Model Context Protocol-Server. Richten Sie Ihren MCP-Client auf das Gateway aus, statt auf Ihre Server. Es verbindet sich mit jedem von Ihnen aufgeführten Upstream, führt deren Tool-Kataloge zu einem zusammen und leitet jeden Aufruf durch eine Verifikationskette, bevor er den Server erreicht, der ihn ausführen würde.
pip install sovereign-mcp-gateway
sovereign-mcp-gateway --init # writes gateway.json from the servers you already run
sovereign-mcp-gateway --config gateway.json --check--init liest die MCP-Konfiguration, die Sie bereits haben (Claude Desktop, Claude Code, Cursor, VS Code oder Windsurf) und schreibt eine gateway.json, die genau diese Server proxyt, sodass der erste Lauf eine funktionierende Konfiguration erzeugt statt eines Konfigurationsfehlers. Der eigene Eintrag des Gateways wird nicht importiert, weil es sich sonst selbst proxyn würde.
Das Gateway ist selbst ein MCP-Server, sodass jeder Client, der MCP spricht, ohne Änderungen funktioniert.
Diese Basisinstallation ist ein funktionierendes Gateway. Vier optionale Extras fügen weitere Ebenen hinzu – siehe Installieren.
Was es verhindert
Ein Agent liest ein GitHub-Issue, dessen Text eine Anweisung enthält, die an das Modell gerichtet ist statt an Sie. Er lässt sich überzeugen und ruft git_commit auf.
Commits danach | injizierter Commit vorhanden | |
direkt an | 2 | ja |
durch das Gateway | 1 | nein |
Gleiches Tool, gleiche Argumente, gleicher Server. Der Unterschied ist, ob etwas in der Lage war, sich zu verweigern.
Lesen Sie den Walkthrough: Ihr Agent liest ein Issue – oder führen Sie ihn aus:
pip install "sovereign-mcp-gateway[all]" mcp-server-git
python examples/poisoned_issue.pyRelated MCP server: Agentrim MCP
Warum ein Proxy und keine Bibliothek
Eine Bibliothek muss von demjenigen übernommen werden, der den Server geschrieben hat. Ein Proxy schützt Server, die Sie nicht ändern können – und das sind die meisten, denn die nützlichen MCP-Server sind veröffentlichte Pakete, die jemand anderes pflegt.
Außerdem haben Sie so einen einzigen Ort für Richtlinien und eine einzige Audit-Spur über alle Server hinweg, die ein Agent erreichen kann – statt einer Pro-Server-Konfiguration, die niemand synchron hält.
Konfigurieren
Beginnen Sie mit dem, was Sie bereits ausführen
$ sovereign-mcp-gateway --init
Wrote gateway.json
imported 3 servers from Claude Desktop
/Users/you/Library/Application Support/Claude/claude_desktop_config.json
imported 1 server from VS Code (project)
upstreams: fetch, git, sqlite, time
skipped:
sovereign - this gateway - importing it would proxy itself
notion - no command, probably a remote/SSE server
git - already imported from another clientVier Dinge tut es nicht: sich selbst importieren, einen entfernten Server importieren, den es nicht als Unterprozess starten kann, eine vorhandene Datei ohne --force überschreiben oder eine deny_tools-Liste schreiben, die Sie nicht gewählt haben. Es schreibt die Datei, teilt Ihnen mit, was es übernommen und was es ausgelassen hat, und stoppt.
Geben Sie --config PATH zusammen mit --init an, um woanders als nach ./gateway.json zu schreiben.
Ersetzen Sie nach dem Ausführen diese Server in Ihrem Client durch einen einzigen Eintrag für das Gateway. Wenn beides bleibt, spricht Ihr Agent sowohl direkt mit ihnen als auch über den Proxy, und die Audit-Spur zeigt nur die Hälfte des Datenverkehrs.
{
"servers": {
"git": {"command": "mcp-server-git", "args": ["--repository", "/repo"]},
"sqlite": {"command": "mcp-server-sqlite", "args": ["--db-path", "/data.db"]}
},
"policy": {"deny_tools": ["git__git_reset"], "pii_policy": "warn"},
"audit": {"path": "gateway-audit.jsonl"}
}Prüfen Sie die Verkabelung, bevor ein Client sie je zu sehen bekommt:
sovereign-mcp-gateway --config gateway.json --checkSOVEREIGN GATEWAY - configuration check
upstreams: 2
layers: policy -> intent -> text-filter -> frozen-verify -> audit
EXPOSED AS UPSTREAM TOOL
git__git_status git.git_status
git__git_reset git.git_reset [DENIED]
sqlite__read_query sqlite.read_query
...
18 tools exposed.Die Kette
policy → intent → text-filter → frozen-verify → [ call executes ] → output-verify → logic-rules → auditEbene | Paket | Verweigert, wenn |
policy | — | das Tool auf einer Deny-Liste steht oder auf einer Allow-Liste fehlt |
intent |
| der Aufruf die Verhaltensuntergrenze nicht erfüllt |
text-filter |
| ein Argument eine Injektion trägt, in einer von 21 Sprachen oder sieben Kodierungen |
frozen-verify |
| der Aufruf von der beim Start eingefrorenen Tool-Definition abweicht |
output-verify |
| das Ergebnis Schema-, Täuschungs-, PII- oder Inhaltsprüfungen nicht besteht |
logic-rules |
| das Ergebnis inkonsistent mit von Ihnen konfigurierten Regeln ist |
audit |
| – zeichnet jeden Aufruf, erlaubt oder verweigert, in einem hash-verketteten Log auf |
Installieren
Die Basisinstallation ist ein funktionierendes Gateway, kein Stub:
pip install sovereign-mcp-gatewayDas ergibt policy → frozen-verify → audit, was bereits ein Tool verweigert, das kein Upstream bereitstellt, ein Argument mit falschem Typ, einen nicht deklarierten Parameter, ein Tool auf Ihrer Deny-Liste und Prompt-Injektion in einem Argument. Sonst ist nichts nötig.
Jedes Extra fügt eine Ebene hinzu:
Extra | Fügt hinzu | Sinnvoll, wenn |
|
| Ihre Agenten lesen Text von überall, das Sie nicht kontrollieren. Die Basisinstallation fängt |
|
| Sie wollen ein Sicherheitsnetz, das nicht davon abhängt, dass Sie das Schema jedes Tools korrekt haben |
|
| Sie können ausdrücken, wie ein korrektes Ergebnis aussieht. Tut nichts, bis Sie |
|
| Sie aktivieren N-Modell-Konsens mit einem gehosteten Provider |
Kombinieren Sie, was Sie wollen, oder nehmen Sie alles:
pip install "sovereign-mcp-gateway[text]" # one extra
pip install "sovereign-mcp-gateway[text,intent]" # several
pip install "sovereign-mcp-gateway[all]" # every layerAlle vier Extras sind kleine reine Python-Pakete – [all] fügt keine kompilierten Abhängigkeiten und keinen Dienst hinzu, der ausgeführt werden muss.
Eine Teilinstallation verschlechtert sich sichtbar. Das Gateway gibt seine aktiven Ebenen beim Start aus, sodass Sie immer sehen können, was tatsächlich läuft:
layers: policy -> frozen-verify -> audit # base
layers: policy -> intent -> text-filter -> frozen-verify -> audit # [all]Wenn eine Ebene nicht in dieser Zeile steht, läuft sie nicht – egal, was Sie glauben installiert zu haben.
Ende-zu-Ende verifiziert
Gegen mcp-server-git und mcp-server-sqlite, die als echte Upstreams laufen, gesteuert von einem echten MCP-Client:
Aufruf | Ergebnis |
| erlaubt |
| erlaubt – die Zeile ist wirklich in der Datenbank |
| verweigert: auf der Deny-Liste |
| verweigert: kein Upstream stellt es bereit |
| verweigert: falscher Typ für das eingefrorene Schema |
| verweigert: Textfilter |
| verweigert: ein Tool kann nicht über den Namensraum eines anderen Upstreams erreicht werden |
Danach enthält das Repository immer noch genau einen Commit und die Datenbank genau die Zeile, die sie enthalten sollte – geprüft durch direktes Öffnen, nicht durch Vertrauen auf den eigenen Bericht des Gateways. Elf Audit-Datensätze für zehn Aufrufe; das Ändern eines einzigen bricht die Kette.
Diese Fälle sind die Testsuite, kein Screenshot: pytest tests/ -v.
Ebene C: N-Modell-Konsens
Jede andere Ebene ist deterministisch und lokal. Ebene C ist die Ausnahme: Sie fragt mehrere unabhängige Modelle, dasselbe strukturierte Dokument aus dem Ergebnis eines Tools zu extrahieren, kanonisiert jede Antwort und vergleicht die SHA-256-Hashes. Übereinstimmung wird per Hash entschieden, nicht per Prosa.
Sie ist standardmäßig aus, weil sie die einzige Ebene ist, die pro Aufruf Geld und Latenz kostet, und die einzige, die Tool-Ausgaben an ein Modell sendet.
{
"servers": { "...": {} },
"consensus": {
"providers": [
{"type": "local", "model": "llama3.1:8b"},
{"type": "local", "model": "qwen2.5:7b", "base_url": "http://localhost:11434/v1"},
{"type": "openrouter", "model": "anthropic/claude-3.5-sonnet",
"api_key_env": "OPENROUTER_API_KEY"}
]
}
}Zwei Providertypen: local (jeder OpenAI-kompatible Endpunkt – Ollama, vLLM, LM Studio; base_url standardmäßig http://localhost:11434/v1) und openrouter (der Schlüssel wird aus der benannten Umgebungsvariable gelesen, nie in die Konfiguration geschrieben).
Drei Regeln, die das Gateway beim Start durchsetzt, statt sie zur Laufzeit zu entdecken:
Mindestens zwei Provider. Ein Modell kann nicht mit sich selbst uneins sein; ein Konsens aus einem meldet bei jedem Aufruf Übereinstimmung, was schlimmer ist als keine Ebene, weil es wie Verifikation aussieht.
Keine doppelten Modelle. Zwei Instanzen desselben Modells, die übereinstimmen, sind keine unabhängige Verifikation.
Ein fehlender API-Schlüssel verweigert den Start. Es fällt nicht auf einen Lauf ohne die Ebene zurück.
Alle Provider laufen mit temperature = 0, im Konstruktor erzwungen.
Prüfen Sie, dass Ihre Modelle übereinstimmen, bevor Sie der Ebene vertrauen
--check führt einen echten Konsens-Aufruf gegen Ihre konfigurierten Modelle aus und teilt Ihnen mit, was passiert ist. Das ist wichtiger, als es klingt:
LAYER C - probing the configured models with one real call
--------------------------------------------------------------
OK. The configured models produced identical documents.
Layer C will pass ordinary output rather than refusing it.Konsens vergleicht kanonische Hashes, sodass zwei Modelle, die beide semantisch richtig, aber strukturell unterschiedlich sind, nie übereinstimmen. Ein schwächeres Modell, das das Schema zurückspiegelt –
{"branch": {"type": "string", "value": "main"}} instead of {"branch": "main"}– weicht bei jedem Aufruf ab, für immer, und das Gateway verweigert alles mit einer Begründung, die korrekt lautet „die Modelle waren uneins". Denn das waren sie.
Die Sonde unterscheidet die drei Ergebnisse:
bedeutet | |
OK | die Modelle haben identische Dokumente erzeugt; die Ebene ist nutzbar |
MISMATCH | sie sind sich bei einem trivialen Dokument uneins und werden jeden Aufruf verweigern – ersetzen Sie ein Modell oder entfernen Sie den Abschnitt |
provider unreachable | nichts wurde verifiziert; ein Schlüssel, eine Modell-ID oder ein Endpunkt ist falsch |
Installieren Sie sovereign-mcp-gateway[consensus] oder [all] – die HTTP-Provider benötigen requests, von dem die Kernbibliothek bewusst nicht abhängt.
--check listet auch die aktiven Ebenen auf, sodass Sie es auf einen Blick bestätigen können:
layers: policy -> intent -> text-filter -> frozen-verify -> consensus -> auditWenn consensus in dieser Zeile fehlt, läuft es nicht, egal was die Konfiguration sagt.
Namensräume
Mit aktiviertem namespace (Standard) wird ein Tool als git__git_status bereitgestellt. Zwei Upstreams, die denselben Tool-Namen anbieten, können nicht kollidieren, sich nicht gegenseitig überschatten und nicht über den falschen Namensraum erreicht werden. Schalten Sie es nur aus, wenn Sie einen einzigen Upstream haben.
Richtlinie
"policy": {
"deny_tools": ["git__git_reset", "write_query"],
"allow_tools": null,
"pii_policy": "warn",
"fail_closed": true,
"rate_limit_interval": 0
}deny_toolspasst entweder auf den exponierten Namen (git__git_reset) oder den Upstream-Toolnamen (git_reset, auf jedem Upstream, der ihn hat).allow_toolsverweigert, wenn gesetzt, alles, was nicht aufgeführt ist.pii_policyist standardmäßig aufwarngesetzt, nicht aufblock. Echte Tools geben personenbezogene Daten als normale Ausgabe zurück – jedergit log-Eintrag enthält eine Autoren-E-Mail – und das Blockieren dieser Daten macht das Gateway unbrauchbar. Setzen Sieblock, wenn Ihre Tools niemals PII ausgeben sollen.fail_closedentscheidet, was passiert, wenn eine Ebene selbst einen Fehler verursacht. Standard: verweigern.rate_limit_intervalist0, was die eigene Interaktionsverzögerung der Verhaltensuntergrenze deaktiviert. Diese Verzögerung ist richtig für einen Agenten, der bewusste Schritte unternimmt, und falsch für einen Proxy, wo ein Schwall von Tool-Aufrufen normaler Verkehr ist.entropy_policyist standardmäßig aufwarngesetzt. Die Entropie-Heuristik des Textfilters sucht nach kodierten Nutzlasten, die in Prosa versteckt sind, aber Tool-Argumente sind routinemäßig strukturiert – Pfade, Bezeichner, Hashes – wo hohe Entropie normal ist. Ein temporärer Verzeichnispfad allein reichte aus, um einen legitimen Aufruf abzulehnen. Setzen Sieblock, wenn Ihre Argumente wirklich Prosa sind.
Was dies nicht tut
Es überprüft Aufrufe gegen eingefrorene Definitionen und inspiziert Argumente und Ergebnisse. Es liest nicht den Quellcode Ihrer Server, daher kann es keine Prüfung erkennen, die vorhanden ist, aufgerufen wird und stillschweigend nichts tut. Dafür ist immer noch jemand nötig, der die Implementierung liest.
Es kann auch nicht vor einem kompromittierten Upstream schützen, der korrekt aussehende Daten zurückgibt – der Layer-C-Konsens in sovereign-mcp befasst sich damit und erfordert Modellanbieter, die Sie selbst konfigurieren.
Lizenz
Business Source License 1.1 – siehe LICENSE.
Der Quellcode ist öffentlich. Sie dürfen ihn lesen, modifizieren, abgeleitete Werke erstellen und ihn kostenlos für Entwicklung, Evaluierung und jeden anderen Nicht-Produktionszweck verwenden.
Die Produktionsnutzung ist ebenfalls kostenlos für eine Einzelperson oder eine Organisation mit vier oder weniger Personen – das ist in der Lizenz als Additional Use Grant festgeschrieben, nicht nur hier erwähnt. Größere Organisationen benötigen eine kommerzielle Lizenz.
Jede Version wird an ihrem Change Date, vier Jahre nach Veröffentlichung, zu Apache 2.0.
Um es für die Produktion zu lizenzieren oder zu fragen, ob Ihre Nutzung eine benötigt: contact@sovereign-shield.net
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceCentralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.13 npmMIT
- AlicenseNot gradedqualityBmaintenanceA least-privilege enforcement proxy for MCP servers. It sits between MCP clients and upstream servers, enforcing tool policies, hiding denied tools, requiring human approval for risky actions, and providing a structured audit trail.MIT
- AlicenseNot gradedqualityAmaintenanceProvides a governance proxy layer for MCP servers, enforcing per-tool allowlists, human approval for write operations, quotas, secret redaction, and a hash-chained audit log of all calls.MIT
- AlicenseNot gradedqualityCmaintenanceProvides a security and context-control layer that multiplexes multiple MCP servers behind a single endpoint, scanning tool definitions and results, enforcing authorization, rate limiting, and audit logging, and dynamically retrieving tools to manage context window usage.MIT