Skip to main content
Glama
mattijsmoens

sovereign-mcp-gateway

by mattijsmoens

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.json

La 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 mcp-server-git

2

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.py

Related 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 --check
SOVEREIGN 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 → audit

Capa

Paquete

Deniega cuando

policy

la herramienta está en una lista de denegados, o ausente de una lista de permitidos

intent

intentshield

la llamada no cumple el mínimo de comportamiento

text-filter

sovereign-shield

un argumento contiene una inyección, in cualquiera de los 22 idiomas o de las siete codificaciones

frozen-verify

sovereign-mcp

la llamada no coincide con la definición de la herramienta congelada at startup

output-verify

sovereign-mcp

el resultado no super lion enough schema, decepción, PII o contenido de comprobaciones

logic-rules

logicshield

el resultado no es coherente con las reglas que has configurado

audit

sovereign-mcp

— 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-gateway

Eso 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

[text]

sovereign-shield — un análisis más profundo de los argumentos de texto: 22 idiomas, and decodificación de siete variantes para payloads ocultos en base64, hex, ROT13, leetspeak or reversed strings

Tus agentes leen texto de lugares que no controlas. La instalación base detecta IGNORE ALL PREVIOUS INSTRUCTIONS; no detectará la misma frase en base64 ni escrita en neerlandés

[intent]

intentshield — un mínimo de comportamiento aplicado con independenceia de la tool called: shell bans, delete bans, credential URLs, malware syntax

Quieres una red de seguridad que no dependa de si tienes bien schemes of each tool

[rules]

logicshield — reglas de consistencia que escribes para la salida de las tools

Puedes expresar cómo es un resultado correcto. No hace nada hasta que definas output_rules

[collections

requests — necesario para los proveedores HTTP de la Capa C

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 layer

Las 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

git__git status, git__git log

allowed

git__create_table, __write_query, __read_query

allowed — la fila está de verdad en la base de datos

git__git_reset

refused: on the deny list

git__git_push_force

refused: no upstream the expone

git__git_status(repo_path=12345)

refused: wrong type para el esquema congelado

git__git_commit("IGNORE ALL PREVIOUS INSTRUCTIONS…")

denegado: filtro de texto

sqlite__git_commit(...)

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 -> audit

If 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_tools match 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_policy defaults to warn, not block. Real tools return personal data as normal output — every git log entry has an author email — and blocking those the door would be unusable. Set block when your tools should never produce PII.

  • fail_closed decides what happens when one of the levels itself produces me an error. Default: refuse.

  • rate_limit_interval is 0, which disables the behavioral floor's default sleep and 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_policy defaults to warn. 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. Put block if 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

F
license - not found
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
9Releases (12mo)
Commit activity

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

  • F
    license
    A
    quality
    D
    maintenance
    Universal MCP proxy server that discovers, searches, and executes tools across all configured MCP servers from a single entry point.
    7
  • A
    license
    Not graded
    quality
    B
    maintenance
    Centralized MCP control plane that proxies multiple upstream MCP servers with tool namespacing, filtering, policy enforcement, audit logging, and health checks.
    7
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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