PluginBench
Skill
Fail
Audit score 45

protect-mcp-setup

wshobson/agents

Cryptographic policy enforcement and Ed25519-signed receipts for every Claude Code tool call.

What is protect-mcp-setup?

Protect-mcp adds Cedar policy evaluation and tamper-evident signed receipts to Claude Code tool execution. Use it when you need compliance-ready audit trails, policy-gated tool access, or offline-verifiable evidence of agent decisions.

  • Evaluate every tool call against Cedar authorization policies before execution
  • Generate Ed25519-signed receipts for each tool invocation with inputs, outputs, and decisions
  • Hash-chain receipts for tamper detection and audit trail integrity
  • Enable offline verification of receipts without server or account requirements
  • Block tool execution when Cedar policy returns deny (exit code 2)
  • Support read-only and destructive tool restrictions via policy rules

How to install protect-mcp-setup

npx skills add https://github.com/wshobson/agents --skill protect-mcp-setup
Prerequisites
  • Node.js and npm installed
  • Claude Code project with .claude/settings.json
  • Cedar policy file (protect.cedar) at project root
  • Local receipt-signing server (npx protect-mcp@latest serve --enforce)
Claude Code
Cursor
Windsurf
Cline

How to use protect-mcp-setup

  1. 1.Install the plugin: claude plugin install wshobson/agents/protect-mcp
  2. 2.Create a Cedar policy file at ./protect.cedar defining allowed/denied tool actions
  3. 3.Add PreToolUse and PostToolUse hooks to .claude/settings.json pointing to protect-mcp evaluate and sign commands
  4. 4.Start the receipt-signing server: npx protect-mcp@latest serve --enforce
  5. 5.Use Claude Code normally; each tool call is now evaluated and signed
  6. 6.Verify receipts offline: npx @veritasacta/verify receipts/<timestamp>.json or use /verify-receipt slash command

Use cases

Good for
  • Compliance audits in finance or healthcare requiring cryptographic proof of agent actions
  • Regulated research projects needing third-party-verifiable evidence of tool execution decisions
  • Enterprise deployments requiring policy-gated access to destructive tools like Bash and file writes
  • Post-incident forensics with tamper-evident logs that cannot be edited after signing
  • Demonstrating safe agent behavior to auditors or regulators without revealing operator credentials
Who it's for
  • Compliance officers and audit teams
  • Enterprise security and governance teams
  • Regulated industry developers (finance, healthcare, research)
  • Teams building AI agents for high-stakes decision-making
  • Organizations requiring offline-verifiable audit trails

protect-mcp-setup FAQ

Can receipts be edited after signing?

No. Ed25519 signatures lock the receipt at signing time. Any modification invalidates the signature, which offline verification will detect.

Do I need to trust the operator or a server to verify receipts?

No. Receipts use RFC 8032 Ed25519 signatures and RFC 8785 JCS canonicalization, allowing anyone to verify offline without network calls or vendor accounts.

What happens if a Cedar policy denies a tool call?

The PreToolUse hook exits with code 2, which blocks Claude Code from executing the tool entirely.

Can I use custom Cedar policies?

Yes. You define your own protect.cedar file with permit/forbid rules tailored to your tools, commands, and paths.

What tools does protect-mcp cover?

All Claude Code tools: Bash, Edit, Write, WebFetch, Read, Glob, and Grep. Each can have separate policy rules.

Full instructions (SKILL.md)

Source of truth, from wshobson/agents.


name: protect-mcp-setup description: Configure Cedar policy enforcement and Ed25519 signed receipts for Claude Code tool calls. Use when setting up projects that need cryptographic audit trails, policy-gated tool execution, or compliance-ready evidence of agent actions.

protect-mcp — Policy Enforcement + Signed Receipts

Cryptographic governance for every Claude Code tool call. Each invocation is evaluated against a Cedar policy and produces an Ed25519-signed receipt that anyone can verify offline.

Overview

Claude Code runs powerful tools: Bash, Edit, Write, WebFetch. By default there is no audit trail, no policy enforcement, and no way to prove what was decided after the fact. protect-mcp closes all three gaps:

  • Cedar policies (AWS's open authorization engine) evaluate every tool call before execution. Cedar deny is authoritative.
  • Ed25519 receipts record each decision with its inputs, the policy that governed it, and the outcome. Receipts are hash-chained.
  • Offline verification via npx @veritasacta/verify. No server, no account, no trust in the operator.

Problem

AI agents make decisions that affect money, safety, and rights. The Claude Code session log records what happened, but the log is:

  • Mutable — anyone with access can edit it
  • Unsigned — there is no way to prove integrity
  • Operator-bound — verification requires trusting whoever holds the log

For compliance contexts (finance, healthcare, regulated research), this is not sufficient. You need tamper-evident evidence that can be verified by third parties without trusting you.

Solution

Add protect-mcp to your Claude Code project:

# 1. Install the plugin (adds hooks + skill to your project)
claude plugin install wshobson/agents/protect-mcp

# 2. Configure hooks in .claude/settings.json (see below)

# 3. Start the receipt-signing server (runs locally, no external calls)
npx protect-mcp@latest serve --enforce

# 4. Use Claude Code normally. Every tool call is now policy-evaluated
#    and produces a signed receipt in ./receipts/

Hook Configuration

Add the following to your project's .claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": ".*",
        "hook": {
          "type": "command",
          "command": "npx protect-mcp@latest evaluate --policy ./protect.cedar --tool \"$TOOL_NAME\" --input \"$TOOL_INPUT\" || exit 2"
        }
      }
    ],
    "PostToolUse": [
      {
        "matcher": ".*",
        "hook": {
          "type": "command",
          "command": "npx protect-mcp@latest sign --tool \"$TOOL_NAME\" --input \"$TOOL_INPUT\" --output \"$TOOL_OUTPUT\" --receipts ./receipts/"
        }
      }
    ]
  }
}

What each hook does

PreToolUse — Runs BEFORE the tool executes. Evaluates the tool call against your Cedar policy file. If Cedar returns deny, the hook exits with code 2 and Claude Code blocks the tool call entirely.

PostToolUse — Runs AFTER the tool completes. Signs a receipt containing the tool name, input hash, output hash, decision, policy digest, and timestamp. Writes the receipt to ./receipts/<timestamp>.json.

Cedar Policy File

Create ./protect.cedar at the project root:

// Allow read-only tools by default
permit (
    principal,
    action in [Action::"Read", Action::"Glob", Action::"Grep", Action::"WebFetch"],
    resource
);

// Require explicit allow for destructive tools
permit (
    principal,
    action == Action::"Bash",
    resource
) when {
    // Allow safe commands only
    context.command_pattern in ["git", "npm", "ls", "cat", "echo", "pwd", "test"]
};

// Never allow recursive deletion
forbid (
    principal,
    action == Action::"Bash",
    resource
) when {
    context.command_pattern == "rm -rf"
};

// Require confirmation for writes outside the project
forbid (
    principal,
    action in [Action::"Edit", Action::"Write"],
    resource
) when {
    context.path_starts_with != "."
};

Verification

Verify a single receipt:

npx @veritasacta/verify receipts/2026-04-15T10-30-00Z.json
# Exit 0 = valid
# Exit 1 = tampered
# Exit 2 = malformed

Verify the entire chain:

npx @veritasacta/verify receipts/*.json

Use the plugin's slash commands from within Claude Code:

/verify-receipt receipts/latest.json
/audit-chain ./receipts/ --last 20

Receipt Format

Each receipt is a JSON file with this structure:

{
  "receipt_id": "rec_8f92a3b1",
  "receipt_version": "1.0",
  "issuer_id": "claude-code-protect-mcp",
  "event_time": "2026-04-15T10:30:00.000Z",
  "tool_name": "Bash",
  "input_hash": "sha256:a3f8...",
  "decision": "allow",
  "policy_id": "autoresearch-safe",
  "policy_digest": "sha256:b7e2...",
  "parent_receipt_id": "rec_3d1ab7c2",
  "public_key": "4437ca56815c0516...",
  "signature": "4cde814b7889e987..."
}
  • Ed25519 signatures (RFC 8032)
  • JCS canonicalization (RFC 8785) before signing
  • Hash-chained to the previous receipt via parent_receipt_id
  • Offline verifiable — no network call, no vendor lookup

Why This Matters

BeforeAfter
"Trust me, the agent only read files"Cryptographically provable: every Read logged and signed
"The log shows it happened"The receipt proves it happened, and no one can edit it
"You'd have to audit our system"Anyone can verify every receipt offline
"Logs might be different by now"Ed25519 signatures lock the record at signing time

Standards

  • Ed25519 — RFC 8032 (digital signatures)
  • JCS — RFC 8785 (deterministic JSON canonicalization)
  • Cedar — AWS's open authorization policy language
  • IETF draftdraft-farley-acta-signed-receipts

Related