hooks — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited hooks (Hook) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Enterprise security gateway for MCP servers and Claude Code hooks. Signed receipts, Cedar policies, and swarm-aware audit trails.
Integrated into [Microsoft Agent Governance Toolkit](https://github.com/microsoft/agent-governance-toolkit) (Tutorial 33 merged; sb-runtime integration PR #1202 open) | [IETF Internet-Draft](https://datatracker.ietf.org/doc/draft-farley-acta-signed-receipts/) (draft-02 pending) | [AGT Integration Profile](https://github.com/VeritasActa/agt-integration-profile) | [Live demo: acta.today/wiki](https://acta.today/wiki)
Two commands. Every tool call is receipted.
# 1. Generate hooks, keys, Cedar policy, and /verify-receipt skill
npx protect-mcp init-hooks
# 2. Start the hook server
npx protect-mcp serveOpen Claude Code in the same project. Every tool call is now intercepted, evaluated, and signed.
init-hooks creates| File | Purpose |
|---|---|
.claude/settings.json | Hook config (PreToolUse, PostToolUse, + 9 lifecycle events) |
keys/gateway.json | Ed25519 signing keypair (auto-gitignored) |
policies/agent.cedar | Starter Cedar policy — customize to your needs |
protect-mcp.json | JSON policy with signing + rate limits |
.claude/skills/verify-receipt/SKILL.md | /verify-receipt skill for Claude Code |
Claude Code → POST /hook → protect-mcp (Cedar + sign) → response
↓
.protect-mcp-log.jsonl
.protect-mcp-receipts.jsonl| Method | Path | Description |
|---|---|---|
| POST | /hook | Claude Code hook endpoint |
| GET | /health | Server status, policy info, signer info |
| GET | /receipts | Recent signed receipts |
| GET | /receipts/latest | Most recent receipt |
| GET | /suggestions | Auto-generated Cedar policy fix suggestions |
| GET | /alerts | Config tamper detection alerts |
# Inside Claude Code:
/verify-receipt
# From terminal:
curl http://127.0.0.1:9377/receipts/latest | jq .
npx protect-mcp receipts
# Check policy suggestions:
curl http://127.0.0.1:9377/suggestions | jq .Wrap any stdio MCP server as a transparent proxy:
# Shadow mode — log every tool call, enforce nothing
npx protect-mcp -- node my-server.js
# Enforce mode with policy
npx protect-mcp --policy protect-mcp.json --enforce -- node my-server.js
# Generate keys + config template
npx protect-mcp initprotect-mcp evaluates every tool call against a policy (JSON, Cedar, or external PDP), signs the decision as an Ed25519 receipt, and logs the result.
Two integration modes:
| Mode | Transport | Use Case |
|---|---|---|
| Hook Server | HTTP (npx protect-mcp serve) | Claude Code, agent swarms |
| Stdio Proxy | stdin/stdout (npx protect-mcp -- ...) | Claude Desktop, Cursor, any MCP client |
Three policy engines:
| Engine | Config | Notes |
|---|---|---|
| JSON | --policy policy.json | Simple per-tool rules |
| Cedar | --cedar ./policies/ | Local WASM evaluation via @cedar-policy/cedar-wasm |
| External PDP | policy_engine: "external" | OPA, Cerbos, or any HTTP PDP |
In multi-agent sessions, protect-mcp automatically tracks the swarm topology.
11 hook events handled:
| Event | Type | Description |
|---|---|---|
PreToolUse | Sync | Cedar/policy evaluation before tool execution |
PostToolUse | Async | Receipt signing after tool execution |
SubagentStart / SubagentStop | Lifecycle | Worker agent spawn/completion |
TaskCreated / TaskCompleted | Lifecycle | Coordinator task assignment |
SessionStart / SessionEnd | Lifecycle | Session lifecycle with sandbox detection |
TeammateIdle | Lifecycle | Agent utilization monitoring |
ConfigChange | Security | Tamper detection for .claude/settings.json |
Stop | Lifecycle | Finalization + policy suggestion summary |
Each receipt includes:
swarm.agent_id, swarm.agent_type, swarm.team_nametiming.tool_duration_ms, timing.hook_latency_mspayload_digest (SHA-256 hash for payloads >1KB)deny_iteration (retry count after denial)sandbox_state (enabled/disabled/unavailable)otel_trace_id and otel_span_id{
"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
}
}Cedar deny decisions are authoritative — they cannot be overridden.
// Allow read-only tools
permit(
principal,
action == Action::"MCP::Tool::call",
resource == Tool::"Read"
);
// Block destructive tools
forbid(
principal,
action == Action::"MCP::Tool::call",
resource == Tool::"delete_file"
);When a tool is denied, protect-mcp auto-suggests the minimal Cedar permit() rule via GET /suggestions.
Each prevents a real attack:
| Policy | Incident | OWASP |
|---|---|---|
clinejection.json | CVE-2025-6514: MCP OAuth proxy hijack (437K environments) | A01, A03 |
terraform-destroy.json | Autonomous Terraform agent destroys production | A05, A06 |
github-mcp-hijack.json | Prompt injection via crafted GitHub issue | A01, A02, A03 |
data-exfiltration.json | Agent data theft via outbound tool abuse | A02, A04 |
financial-safe.json | Unauthorized financial transaction | A05, A06 |
Cedar equivalents available in policies/cedar/.
{
"mcpServers": {
"my-protected-server": {
"command": "npx",
"args": [
"-y", "protect-mcp",
"--policy", "/path/to/protect-mcp.json",
"--enforce",
"--", "node", "my-server.js"
]
}
}
}Same pattern — replace the server command with protect-mcp wrapping it.
Commands:
serve Start HTTP hook server for Claude Code (port 9377)
init-hooks Generate Claude Code hook config + skill + sample Cedar policy
quickstart Zero-config onboarding: init + demo + show receipts
init Generate Ed25519 keypair + config template
demo Start a demo server wrapped with protect-mcp
doctor Check your setup: keys, policies, verifier, connectivity
trace <id> Visualize the receipt DAG from a given receipt_id
status Show tool call statistics from the decision log
digest Generate a human-readable summary of agent activity
receipts Show recent persisted signed receipts
bundle Export an offline-verifiable audit bundle
simulate Dry-run a policy against recorded tool calls
report Generate a compliance report from an audit bundle
Options:
--policy <path> Policy/config JSON file
--cedar <dir> Cedar policy directory
--enforce Enable enforcement mode (default: shadow)
--port <port> HTTP server port (default: 9377 for serve)
--verbose Enable debug loggingEvery tool call emits structured JSON to stderr:
[PROTECT_MCP] {"v":2,"tool":"read_file","decision":"allow","reason_code":"cedar_allow","policy_digest":"a1b2c3...","mode":"enforce","hook_event":"PreToolUse","timing":{"hook_latency_ms":1},"otel_trace_id":"..."}When signing is configured, a signed receipt is persisted to .protect-mcp-receipts.jsonl.
npx protect-mcp bundle --output audit.jsonSelf-contained offline-verifiable bundle with receipts + signing keys. Verify with npx @veritasacta/verify.
protect-mcp's receipt signing powers the world's first verified multi-model knowledge base at acta.today/wiki.
Every Knowledge Unit is produced by 4 frontier models deliberating in 3 adversarial rounds, with Ed25519 receipts on every model response. The current roster:
| Model | Provider | Origin |
|---|---|---|
| Claude Opus 4.6 | Anthropic | US |
| GPT-5.4 | OpenAI | US |
| Grok 4.20 | xAI | US |
| Gemini 3.1 Pro | US | |
| DeepSeek V3.2 | DeepSeek | CN |
| MiniMax M2.7 | MiniMax | CN |
| Kimi K2.5 | Moonshot | CN |
| Qwen 2.5 72B | Alibaba | CN |
Every KU is independently verifiable: npx @veritasacta/verify receipt.json
| Project | Stars | Integration | Status |
|---|---|---|---|
| Microsoft Agent Governance Toolkit | 600+ | Cedar policy bridge + receipt signing | Merged (PR #667) |
| Mission Control | 3,700+ | Ed25519 receipt signing for MCP audit pipeline | PR #556 submitted |
| Assay | — | Signed receipts as evidence source | Active discussion (#1029) |
| Hermes Agent | 24,500+ | Cryptographic audit trail for skill execution | Issue #5041 |
| DeerFlow | 57,600+ | Cryptographic integrity for persistence layer | Discussion #1855 |
| Pro-Workflow | 1,500+ | MCP config recommendation | PR #41 |
| Zeroshot | 1,400+ | Cryptographic receipts for validator verdicts | Issue #464 |
protect-mcp receipts are offline-verifiable and tamper-evident via @veritasacta/verify:
--key / --jwks / --trust-anchor)What this does not provide: issuer-blind / unlinkable verification in the VOPRF sense. The Ed25519 signature identifies the signer. If you need verification where the verifier cannot link multiple presentations to the same signer (privacy-preserving metered authorization, anonymous credentials, unlinkable rate limiting), that's a separate primitive with its own stack:
protect-mcp doesn't require VOPRF for decision auditability — the Ed25519 receipts cover that. The VOPRF product solves a different problem (privacy-preserving verification at scale) for teams that need it.
npx @veritasacta/verify --self-test| Repository | Description |
|---|---|
| VeritasActa/Acta | Open protocol for contestable public records (Apache-2.0) |
| VeritasActa/drafts | IETF Internet-Draft source files |
| ScopeBlind/examples | Integration examples: Claude Code hooks, Express API, MCP server signing |
| @veritasacta/verify | Offline receipt verifier (Apache-2.0) |
| @scopeblind/passport | Agent identity SDK (Apache-2.0) |
| protect-mcp-adk | Google ADK receipt signing plugin (MIT, Python) |
Issues and pull requests are welcome. Please open an issue first for significant changes.
policies/cedar/ directoryMIT — free to use, modify, distribute, and build upon without restriction.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.