Fail-closed Cedar policy gate + Ed25519 signed receipts for agent tool calls. Denies on any error.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent — or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag — we're steadily working through the catalog.
💡 Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Fail-closed Cedar policy gate plus signed receipts for AI agent tool calls.
protect-mcp is a gate that sits in front of an AI agent's tool calls. It evaluates
each call against a Cedar policy,
blocks what breaks the rules before it runs, and signs an
offline-verifiable Ed25519 receipt of every decision. The configured gateway runs locally and sends no decision telemetry. The
separate coordination adapter connects to ScopeBlind’s hosted collaboration service;
its requests and returned records have the data path described below. Both are
MIT licensed.
For shared repository work, use client projects: people agree on the brief and limits, agents prepare reviews, and both people approve an exact version before the owner's receiver can change the repository. The repository workflow below includes setup and the five bounded agent tools.
would_deny: true, so a failure is never silent.serve --enforce and doctor run a startup
self-test and refuse to arm the gate unless they can show that a known-forbidden
action is actually denied. A gate that cannot prove it denies does not start.@veritasacta/verify.
Signature verification needs no network lookup. Claims about execution still
depend on the identified gate operator.For Claude Desktop, run a dry-run config patch first, then apply it:
The dashboard binds to 127.0.0.1, reads only local log/receipt files, and does
not upload anything. Use npx protect-mcp connect only if you explicitly want a
hosted ScopeBlind dashboard.
If you would rather call the gate as tools than wire the Claude Code hooks, run it as an MCP server:
It speaks MCP over stdio and exposes four read-only tools, the whole loop:
evaluate_action: decide a proposed tool call against an inline Cedar policy, fail-closed (any policy error is DENY). Returns { allowed, decision, reason, policy_digest }.sign_decision: turn a decision into an Ed25519 signed receipt (a denial signs a gateway_restraint, an allow a decision_receipt). Returns the receipt and its public key; generates an ephemeral key if you do not supply one.verify_receipt: verify a signed receipt offline against a public key. Returns { valid, error, type, kid, issuer }.self_test: prove it, no inputs. A known-forbidden action is denied, then a signed receipt round-trips and a tampered copy fails.Point any MCP host at it, for example Claude Desktop:
Receipts are byte-compatible with the ones the gate signs at runtime, so a
receipt minted here uses the same Acta envelope. Verification capabilities and
canonicalization compatibility depend on the verifier version; use the gateway's
verifyReceipt API for the conformance behavior described below.
This source tree fixes the integer-key ordering defect present through 0.14.0: signatures and
chain hashes now use direct JCS member emission, retaining the gateway's ASCII
object-key profile. Numeric-looking keys such as "10" precede "2", including
inside nested objects. Non-JSON values and invalid Unicode are rejected.
Ordinary JSON receipts whose encodings are unchanged continue to verify.
Historical receipts signed with the old numeric-key order are reported as
legacy_non_jcs_signature; strict verification does not call them valid JCS.
For an explicit historical compatibility check, use
verifyReceipt(receipt, publicKey, { allowLegacyNumericKeys: true }) and inspect
the canonicalization and warning fields. Its hash is then the original
historical hash. Preserve original receipts and chain links: recomputing an old
numeric-key receipt with receiptHash now produces its JCS hash and can break
the historical chain. These changes are included in 0.15.0.
Version 0.25.0 includes a reusable agent profile. Open
Start through your agent
for the setup command with the service’s displayed authority key. Check that key
against a trusted source before connecting. For example:
Use --client codex or --client json for those registration instructions.
Setup prints configuration; apply it in your client, then reopen that client.
The private profile holds an agent key and separately scoped connections, with
file permissions 600. Setup grants no task permissions and copies no human
browser key. The registered server runs coordination agent --profile FILE.
Ask your agent to prepare a shared invoice task for your review. The tool flow is:
coordination.prepare_task({request_id, draft}) saves an unsigned draft and
returns a private review link for you. Keep the same request_id
when retrying. The draft contains a title, goal, and optional proposed limits,
assumptions, and private preferences. It creates no room or human authority.coordination.inspect_task_request({request_id}) checks that review.
coordination.claim_task_connection({request_id}) claims the exact authorized
grant and returns a connection_id. Then call
coordination.inspect_negotiation({connection_id}) before proposing or testing.coordination.check_handoffs({connection_id}) discovers that authorization;
coordination.claim_execution_connection({connection_id, handoff_id}) saves
a new execution connection. Inspect its returned connection_id before
submitting payments. The negotiation token never becomes a payment token.Every scoped tool in the profile requires an explicit connection_id; use
coordination.connections to list saved connections without credentials. The
profile preserves tokens before claiming so an uncertain reply can be recovered
with the same IDs. Initial pairing windows last at most ten minutes. If that
window or a grant expires, the original person must explicitly reconnect the
same profile under current limits. Missing profiles require fresh authorization.
A profile holds at most 50 requests and 50 connections; keep it private.
Existing one-room connections below still work. Import one with
coordination agent import --profile FILE --config OLD_PRIVATE_CONFIG after
setting up the profile. Import preserves its scope and cannot reconstruct a
private agent key discarded by older pairing; that connection cannot claim a
same-key execution handoff.
Draft text and private instructions are sent to ScopeBlind. Your agent’s model provider may receive tool results, including your own authorized private brief. A hosted assistant receives its own principal’s brief plus shared records. Neither profile setup nor a stopped client runs a background agent or model.
From a task on the original authorized browser, choose Continue on another device. Open or scan its link on your phone, request access, and compare the shown code on both devices. The original browser signs the exact phone key, room, permissions, and expiry. A link or QR code alone grants no authority; each device retains its own private signing key.
Factual signals from GitHub, npm, and our automated checks — not a rating.
No reviews yet — be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/protect-mcp)<a href="https://allmcps.com/mcp/protect-mcp"><img src="https://allmcps.com/api/badge/protect-mcp?style=directory" alt="Protect MCP on AllMCPs" /></a>