sovereign-mcp-gateway
sovereign-mcp-gateway
Un proxy de control de acceso para servidores Model Context Protocol. Apunta tu cliente MCP a la puerta de enlace en lugar de a tus servidores. Se conecta a cada upstream que listes, fusiona sus catálogos de herramientas en uno solo y hace pasar cada llamada por una cadena de verificación antes de que llegue al servidor que la ejecutaría.
pip install sovereign-mcp-gateway
sovereign-mcp-gateway --config gateway.jsonLa puerta de enlace es en sí misma un servidor MCP, por lo que cualquier cliente que hable MCP funciona sin cambios.
Esa instalación base es una puerta de enlace funcional. Cuatro extras opcionales añaden más capas encima — consulte Instalación.
Lo que bloquea
Un agente lee la incidencia GitHub Github issue cuyo cuerpo contiene una instrucción dirigida al modelo, no al usuario. Resulta persuadido y llama a git_commit.
commits posteriores | commit inyectado presente | |
directo a | 2 | sí |
a través de la puerta de enlace | 1 | no |
La misma herramienta, los mismos argumentos, el mismo servidor. La diferencia es si hay algo en condiciones de rechazar.
He walkthrough: Tu agente lee una incidencia — o nos lo contexto:
pip install "sovereign-mcp-gateway[all]" mcp-server-git
python examples/poisoned_issue.pyRelated MCP server: Mavryn
Por qué un proxy y no una biblioteca
Una biblioteca tiene que ser adoptada por quien haya escrito el servidor. Un proxy protege servidores que no puedes modificar, que es la mayoría, porque los servidores MCP útiles son paquetes publicados que mantiene otra persona.
Además te da un lugar único para definir la política y un rastro de auditoría en todos los servidores que puede alcanzar un agente, en lugar de configuración por servidor que nobody mantiene sincronizada.
Configuración
{
"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"}
}Comprueba el cableado antes de que un cliente llegue a ello:
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.La cadena
policy → intent → text-filter → frozen-verify → [ call executes ] → output-verify → logic-rules → auditCapa | Paquete | Deniega cuando |
policy | — | la herramienta está en una lista de denegados, o ausente de una lista de permitidos |
intent |
| la llamada no cumple el mínimo de comportamiento |
text-filter |
| un argumento contiene una inyección, in cualquiera de los 22 idiomas o de las siete codificaciones |
frozen-verify |
| la llamada no coincide con la definición de la herramienta congelada at startup |
output-verify |
| el resultado no super lion enough schema, decepción, PII o contenido de comprobaciones |
logic-rules |
| el resultado no es coherente con las reglas que has configurado |
audit |
| — registra cada llamada, permitida o denegada, en un registro encadenado con hashes |
Instalación
La instalación base es una puerta de enlace funcional, no un stub:
pip install sovereign-mcp-gatewayEso te da policy → frozen-verify → audit, que ya rechaza una herramienta que ningún upstream expone, un argumento con tipo equivocado, un parámetro no declarado, una herramienta en tu lista de denegados y una inyección de instrucciones en una argumento. Nada más necesita.
Cada extra añade una capa por encima:
Extra | Añade | Resultado útil |
|
| Tus agentes leen texto de lugares que no controlas. La instalación base detecta |
|
| Quieres una red de seguridad que no dependa de si tienes bien schemes of each tool |
|
| Puedes expresar cómo es un resultado correcto. No hace nada hasta que definas |
|
| Estás activando N-model consensus with a hosted provider |
Combina lo que tu quieras, o tómalo todo:
pip install "sovereign-mcp-gateway[text]" # one extra
pip install "sovereign-mcp-gateway[text,intent]" # several
pip install "sovereign-mcp-gateway[all]" # every layerLas cuatro extras son paquetes pequeños de Python puro — [all] no añade dependencias compiladas ni ningún servicio que tengas que ejecutar.
Una instalación parcial se degrada de forma visible. La puerta de enlace en los arranque imprime sus capas activas, por lo que siempre puedes ver qué está en ejecución:
layers: policy -> frozen-verify -> audit # base
layers: policy -> intent -> text-filter -> frozen-verify -> audit # [all]If one of bottom not on that line, it is not running no sabemos how much you mention.
Verificado de extremo a extremo
Contra mcp-server-git y mcp-server-sqlite ejecutándose como upstreams reales, cuando by real cliente MCP:
Llamada | Resultado |
| allowed |
| allowed — la fila está de verdad en la base de datos |
| refused: on the deny list |
| refused: no upstream the expone |
| refused: wrong type para el esquema congelado |
| denegado: filtro de texto |
| denegadas: una herramienta no puede alcanzarse a través del namespace de otro upstream |
Después el repositorio aún contiene un commit y la base de datos exactamente la fila que debe — comprobado abriéndolos directamente, no fiándote del informe de la puerta de enlace. Once registros de auditoría aceptan 10 llamadas; si editas cualquier de ellos, la cadena se rompe.
Esos ls cases are the test suite, not a screenshot: pytest tests/ -v.
Capa C: consenso between N models
Todas las demás capas son deterministicas and locales. Layer C is the exception: it asks several independent models to extract the same structured document from a tool result, canonicalizes each answer, and compares the SHA-256 hashes of those documents. The agreed that is decided by hash, not by prose.
Se queda desactivada salvo que se configure, porque es la única capa que cuesta dinero y hace encolar latencia en cada llamada, and the only one that sends tool output to a model.
{
"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"}
]
}
}Dos tipos de proveedor: local (cualquier endpoint compatible con OpenAI — Ollama, vLLM, LM Studio; base_url predeterminado: http://localhost:11434/v1) y openrouter (la clave se lee de la variable de entorno dada, nunca se escribe en la configuración).
La puerta de enlace impone estas tres reglas al inicio, en lugar de descubrirlo en runtime:
Al menos dos proveedores. Un modelo no puede discrepar consigo mismo; un consenso de un solo modelo dice que hay acuerdo en todas las llamadas, lo que es peor que no tener capa, porque parece verificación.
No should be duplicate models. Dos instantes del mismo modelo coincidiendo no es verificación inefficient.
Una clave API desaparecida noja ardía en arrancar. No hace fallback a embryos of without the layer nohup.
Todos los proveedores are called with temperature = 0, fijado en el constructor.
Comprueba que sus modelos se conforme or entrusted to the layer
--check does one real coherence call with your configured models and tells you what happened. Esto importa más de lo que sound:
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.The consensus compares canonical hashes, so two models that both know the right semánticamente but structurally different never coincide. A weaker model that anchors the schema back —
{"branch": {"type": "string", "value": "main"}} instead of {"branch": "main"}— no takes on in every call, forever, and the gateway refuses everything with a reason that correctly says "there were disagreements among the models". And it is true that they did disagree.
La prueba distingue tres salidas:
Significado | |
OK | producen los modelos resultado idéntico; la capa es usable |
MISMATCH | if they disagree even in a trivial document and be refused every call: cambia un modelo o remove the section |
provider inaccesible it means | no verify anynada; un API key, un model ID, o un endpoint incorrecto |
Install sovereign-mcp-gateway[consensus] or [all]; los proveedores HTTP tienen requests, del que la biblioteca core se mantiene abiertamente desencadena.
--check también lista las layers active, so you can confirm at a glance:
layers: policy -> intent -> text-filter -> frozen-verify -> consensus -> auditIf consensus doesn't appear on that line, it's not pulled up, whatever you say the config.
Espacios de nombres
With namespace activated (which is the default) a tool is exposed as git__git_status. Two upstreams that offer the same tool name cannot collide, go shadow each other, or get hit from the wrong namespace. Turn it off only if you have a single upstream.
Política
"policy": {
"deny_tools": ["git__git_reset", "write_query"],
"allow_tools": null,
"pii_policy": "warn",
"fail_closed": true,
"rate_limit_interval": 0
}deny_toolsmatch either the exposed name (git__git_reset) or the upstream tool name (git_reset, in every upstream that has it).allow_tools, when set, rejects anything not listed.pii_policydefaults towarn, notblock. Real tools return personal data as normal output — everygit logentry has an author email — and blocking those the door would be unusable. Setblockwhen your tools should never produce PII.fail_closeddecides what happens when one of the levels itself produces me an error. Default: refuse.rate_limit_intervalis0, which disables the behavioral floor's defaultsleepand delays between interactions. Esta delay is correct for an agent that steps deliberately, and wrong for a puerta de enlace, where a burst of tool calls is normal traffic.entropy_policydefaults towarn. The text drop heurística cantería it seeks payloads encoded hidden in prosa. But tool arguments are common structures (paths, identifiers, hashes) where high entropy is normal. Un simple path to a database folder sufficed to get one call real refused. Putblockif your arguments really are prose.
The it does not happen
It verifies calls against frozen tools definitions and inspects arguments and results. It does not read your servers' code so you cannot see a cheque that exists, is called, and silently helps nothing. Esa subsequent реви staill someone who went through and read the implementation.
Tampoco puede proteger contra un upstream comprometido que devuelva datos aparentemente correctos — el consenso de Layer C en sovereign-mcp aborda eso, y requiere proveedores de modelos que configures tú mismo.
Licencia
Business Source License 1.1 — ver LICENSE.
El código fuente es público. Puedes leerlo, modificarlo, crear obras derivadas y usarlo para desarrollo, evaluación y cualquier otro propósito no productivo sin coste alguno.
El uso en producción también es gratuito para un individuo o una organización de cuatro o menos personas — eso está escrito en la licencia como una Additional Use Grant, no solo declarado aquí. Las organizaciones más grandes necesitan una licencia comercial.
Cada versión se convierte a Apache 2.0 en su Change Date, cuatro años después de la publicación.
Para licenciarlo para producción, o para preguntar si tu uso necesita una: contact@sovereign-shield.net
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 gradedqualityBmaintenanceCentralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.7MIT
- AlicenseNot gradedqualityCmaintenanceAuthenticating reverse proxy for MCP servers providing credential isolation, OAuth2 token management, and composite tool aggregation.BSD Zero Clause
- 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
Related MCP Connectors
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.
Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.
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/mattijsmoens/sovereign-mcp-gateway'
If you have feedback or need assistance with the MCP directory API, please join our Discord server