
Passerelle de sécurité pour serveurs MCP avec application de politiques par outil, reçus d'audit signés Ed25519 et journalisation en mode furtif. Prend en charge les moteurs de politiques externes Cedar, OPA et Cerbos pour le contrôle d'accès des agents IA.
⚠️ Ce dépôt a été déplacé. Le développement actif continue sur ScopeBlind/scopeblind-gateway.
Ce fork personnel peut être en retard par rapport au dépôt canonique. Veuillez utiliser le dépôt de l'organisation pour les problèmes, les pull requests et le code le plus récent.
Passerelle de sécurité pour les serveurs MCP. Enregistrements en mode shadow par défaut, politiques par outil, reçus Ed25519 locaux optionnels et sortie d'audit adaptée à la vérification.
Chemin CLI actuel : enveloppez n'importe quel serveur MCP stdio en tant que proxy transparent. En mode shadow, il enregistre chaque requête tools/call et autorise tout. Ajoutez un fichier de politique pour appliquer des règles par outil. Exécutez protect-mcp init pour générer des clés de signature locales et une configuration afin que la passerelle puisse également émettre des reçus signés.
# 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 situe entre votre client MCP et votre serveur en tant que proxy stdio :
Client MCP ←stdin/stdout→ protect-mcp ←stdin/stdout→ votre serveur MCP
Il intercepte les requêtes JSON-RPC tools/call et :
block, rate_limit et min_tierTous les autres messages MCP (initialize, tools/list, notifications) transitent de manière transparente.
stderr avec [PROTECT_MCP]signing.key_path, persistés dans .protect-mcp-receipts.jsonl et exposés sur http://127.0.0.1:9876/receiptsnpx @veritasacta/verifyCe sont des points importants avant de déployer ou d'en parler aux utilisateurs :
npx protect-mcp -- .... Ce chemin enregistre les décisions en mode shadow. Pour la signature locale, exécutez npx protect-mcp init puis démarrez la passerelle avec le fichier de politique généré.unknown sauf si une intégration hôte appelle l'API d'admission de manière programmatique.{
"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"
}
}
}
Les noms d'outils correspondent exactement, avec "*" comme joker de repli.
Ajoutez à 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"
]
}
}
}
Même motif — remplacez la commande du serveur par protect-mcp qui l'enveloppe.
protect-mcp [options] -- <command> [args...]
protect-mcp init
Commands:
init Generate Ed25519 keypair + config template
status Show decision stats and local passport identity
digest Generate a local human-readable summary
receipts Show recent persisted signed receipts
bundle Export an offline-verifiable audit bundle
Options:
--policy <path> Policy/config JSON file
--slug <slug> Service identifier for logs/receipts
--enforce Enable enforcement mode (default: shadow)
--verbose Enable debug logging
--help Show help
La bibliothèque expose également les primitives qui ne sont pas encore câblées dans le chemin CLI par défaut :
import {
ProtectGateway,
loadPolicy,
evaluateTier,
meetsMinTier,
resolveCredential,
initSigning,
signDecision,
queryExternalPDP,
buildDecisionContext,
createAuditBundle,
} from 'protect-mcp';
Utilisez-les si vous souhaitez ajouter :
Chaque appel d'outil émet du JSON structuré sur stderr :
[PROTECT_MCP] {"v":2,"tool":"read_file","decision":"allow","reason_code":"observe_mode","policy_digest":"none","mode":"shadow","timestamp":1710000000}
Lorsque la signature est configurée, un reçu signé suit :
[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":"..."}
Vérifiez avec le CLI : npx @veritasacta/verify receipt.json
Vérifiez dans le navigateur : scopeblind.com/verify
Le paquet exporte un assistant pour les bundles d'audit autonomes :
{
"format": "scopeblind:audit-bundle",
"version": 1,
"tenant": "my-service",
"receipts": ["..."],
"verification": {
"algorithm": "ed25519",
"signing_keys": ["..."]
}
}
Utilisez createAuditBundle() autour de vos propres reçus signés collectés.
Livrés avec protect-mcp — chacun empêche une attaque réelle :
npx protect-mcp --policy node_modules/protect-mcp/policies/clinejection.json -- node server.js
Mapping complet OWASP Agentic Top 10 : scopeblind.com/docs/owasp
Prend en charge OPA, Cerbos, Cedar (AWS AgentCore) et les points de terminaison HTTP génériques :
{
"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 d'utilisation, de modification, de distribution et de construction sans restriction.
scopeblind.com · npm · GitHub · IETF Draft
| Champ | Valeurs | Description |
|---|
block | true | Bloquer explicitement cet outil |
require | "any", "none" | Exigence d'accès de base |
min_tier | "unknown", "signed-known", "evidenced", "privileged" | Niveau minimum requis si votre hôte définit l'état d'admission |
rate_limit | "N/unit" | Limite de débit (par exemple "5/hour", "100/day") |
| Politique | Incident | Catégories OWASP |
|---|
clinejection.json | CVE-2025-6514 : Détournement du proxy OAuth MCP (437K environnements) | A01, A03 |
terraform-destroy.json | Agent Terraform autonome détruisant la production | A05, A06 |
github-mcp-hijack.json | Injection de prompt via un problème GitHub conçu | A01, A02, A03 |
data-exfiltration.json | Vol de données par agent via abus d'outil sortant | A02, A04 |
financial-safe.json | Transaction financière non autorisée | A05, A06 |