
Puerta de enlace de seguridad para servidores MCP con aplicación de políticas por herramienta, recibos de auditoría firmados con Ed25519 y registro en modo sombra. Admite motores de políticas externos Cedar, OPA y Cerbos para el control de acceso de agentes de IA.
⚠️ Este repositorio se ha movido. El desarrollo activo continúa en ScopeBlind/scopeblind-gateway.
Este fork personal podría estar detrás del repositorio canónico. Por favor, usa el repo de la organización para issues, pull requests y el código más reciente.
Puerta de enlace de seguridad para servidores MCP. Registro en modo sombra por defecto, políticas por herramienta, recibos Ed25519 locales opcionales y salida de auditoría amigable para verificación.
Ruta actual de CLI: envuelve cualquier servidor MCP stdio como un proxy transparente. En modo sombra registra cada solicitud tools/call y permite todo. Añade un archivo de política para aplicar reglas por herramienta. Ejecuta protect-mcp init para generar claves de firma locales y configuración para que la puerta de enlace también pueda emitir recibos firmados.
# Wrap an existing OpenClaw / MCP config into a usable pack
npx @scopeblind/passport wrap --runtime openclaw --config ./openclaw.json --policy email-safe
# Shadow mode — log every tool call, enforce nothing
npx protect-mcp -- node my-server.js
# Generate keys + config template for local signing
npx protect-mcp init
# Shadow mode with local signing enabled
npx protect-mcp --policy protect-mcp.json -- node my-server.js
# Enforce mode
npx protect-mcp --policy protect-mcp.json --enforce -- node my-server.js
# Export an offline-verifiable audit bundle
npx protect-mcp bundle --output audit.json
protect-mcp se sitúa entre tu cliente MCP y el servidor como un proxy stdio:
MCP Client ←stdin/stdout→ protect-mcp ←stdin/stdout→ your MCP server
Intercepta las solicitudes JSON-RPC tools/call y:
block, rate_limit y min_tierTodos los demás mensajes MCP (initialize, tools/list, notificaciones) pasan de forma transparente.
stderr con [PROTECT_MCP]signing.key_path, persistidos en .protect-mcp-receipts.jsonl, y expuestos en http://127.0.0.1:9876/receiptsnpx @veritasacta/verifyEstos son importantes antes de implementar esto o hablar con usuarios:
npx protect-mcp -- .... Esa ruta registra decisiones en modo sombra. Para firma local, ejecuta npx protect-mcp init y luego inicia la puerta de enlace con el archivo de política generado.unknown por defecto a menos que una integración host llame a la API de admisión programáticamente.{
"default_tier": "unknown",
"tools": {
"dangerous_tool": { "block": true },
"admin_tool": { "min_tier": "signed-known", "rate_limit": "5/hour" },
"read_tool": { "require": "any", "rate_limit": "100/hour" },
"*": { "rate_limit": "500/hour" }
},
"signing": {
"key_path": "./keys/gateway.json",
"issuer": "protect-mcp",
"enabled": true
},
"credentials": {
"internal_api": {
"inject": "env",
"name": "INTERNAL_API_KEY",
"value_env": "INTERNAL_API_KEY"
}
}
}
Los nombres de herramientas coinciden exactamente, con "*" como comodín de respaldo.
Añadir a claude_desktop_config.json:
{
"mcpServers": {
"my-protected-server": {
"command": "npx",
"args": [
"-y", "protect-mcp",
"--policy", "/path/to/protect-mcp.json",
"--enforce",
"--", "node", "my-server.js"
]
}
}
}
Mismo patrón — reemplaza el comando del servidor con protect-mcp envolviéndolo.
protect-mcp [options] -- <command> [args...]
protect-mcp init
Commands:
init Generar par de claves Ed25519 + plantilla de configuración
status Muestra estadísticas de decisiones y identidad local de passport
digest Generar un resumen local legible por humanos
receipts Mostrar recibos firmados persistidos recientemente
bundle Exportar un paquete de auditoría verificable offline
Options:
--policy <path> Archivo JSON de política/configuración
--slug <slug> Identificador de servicio para registros/recibos
--enforce Habilitar modo de aplicación (por defecto: sombra)
--verbose Habilitar registro de depuración
--help Mostrar ayuda
La librería también expone las primitivas que aún no están integradas en la ruta CLI por defecto:
import {
ProtectGateway,
loadPolicy,
evaluateTier,
meetsMinTier,
resolveCredential,
initSigning,
signDecision,
queryExternalPDP,
buildDecisionContext,
createAuditBundle,
} from 'protect-mcp';
Úsalas si quieres añadir:
Cada llamada a herramienta emite JSON estructurado a stderr:
[PROTECT_MCP] {"v":2,"tool":"read_file","decision":"allow","reason_code":"observe_mode","policy_digest":"none","mode":"shadow","timestamp":1710000000}
Cuando la firma está configurada, le sigue un recibo firmado:
[PROTECT_MCP_RECEIPT] {"v":2,"type":"decision_receipt","algorithm":"ed25519","kid":"...","issuer":"protect-mcp","issued_at":"2026-03-22T00:00:00Z","payload":{"tool":"read_file","decision":"allow","policy_digest":"...","mode":"shadow","request_id":"..."},"signature":"..."}
Verificar con la CLI: npx @veritasacta/verify receipt.json
Verificar en el navegador: scopeblind.com/verify
El paquete exporta un helper para paquetes de auditoría autocontenidos:
{
"format": "scopeblind:audit-bundle",
"version": 1,
"tenant": "my-service",
"receipts": ["..."],
"verification": {
"algorithm": "ed25519",
"signing_keys": ["..."]
}
}
Usa createAuditBundle() alrededor de tus propios recibos firmados recolectados.
Incluidos con protect-mcp — cada uno previene un ataque real:
npx protect-mcp --policy node_modules/protect-mcp/policies/clinejection.json -- node server.js
Mapeo completo del OWASP Agentic Top 10: scopeblind.com/docs/owasp
Soporta OPA, Cerbos, Cedar (AWS AgentCore) y endpoints HTTP genéricos:
{
"policy_engine": "hybrid",
"external": {
"endpoint": "http://localhost:8181/v1/data/mcp/allow",
"format": "cedar",
"timeout_ms": 200,
"fallback": "deny"
}
}
npx @veritasacta/verify --self-testMIT — libre de usar, modificar, distribuir y construir sobre ello sin restricciones.
scopeblind.com · npm · GitHub · IETF Draft
| Campo | Valores | Descripción |
|---|
block | true | Bloquear explícitamente esta herramienta |
require | "any", "none" | Requisito básico de acceso |
min_tier | "unknown", "signed-known", "evidenced", "privileged" | Nivel mínimo requerido si tu host establece el estado de admisión |
rate_limit | "N/unit" | Límite de tasa (ej. "5/hour", "100/day") |
| Política | Incidente | Categorías OWASP |
|---|
clinejection.json | CVE-2025-6514: Secuestro de proxy OAuth de MCP (437K entornos) | A01, A03 |
terraform-destroy.json | Agente Terraform autónomo destruye producción | A05, A06 |
github-mcp-hijack.json | Inyección de prompt a través de un issue de GitHub manipulado | A01, A02, A03 |
data-exfiltration.json | Robo de datos del agente mediante abuso de herramientas salientes | A02, A04 |
financial-safe.json | Transacción financiera no autorizada | A05, A06 |