MCP server exposing Signet cryptographic signing, verification, and content hash tools over stdio.
io.github.Prismer-AI/signet-mcp-tools โ Model Context Protocol (MCP) Server
This MCP server exposes Signet cryptographic tools over stdio for signing, verification, and content hashing. It is intended for agent security and audit-trail workflows, providing hash-chained, offline-verifiable cryptographic receipts for AI agent tool calls, independent of any provider.
๐ ๏ธ Key Features
Cryptographic signing tools
Verification tools
Content hash tooling
Hash-chained receipts for AI agent tool calls
Operates over stdio (MCP transport)
๐ Use Cases
Proving agent actions instead of only logging them
Creating offline-verifiable audit trails for agent tool calls
โก Developer Benefits
Provider-independent verification of agent actions
Compatible with agent security and audit-trail needs (topics include mcp, security, signing)
โ ๏ธ Limitations
Server behavior described here is limited to signing, verification, and content hash tools over stdio; no other capabilities are provided in the available data.
Don't just log agent actions. Prove them. Cryptographic trust and authorization evidence for every AI agent action โ identity, delegation, policy, receipts: signed, hash-chained, offline-verifiable. Independent of any provider.
Single-host pilot flow: sign every tool call, hand off a signed evidence bundle, re-verify on any machine โ no signet keystore required. Pilot runbook โ
Your AI agent just placed an order, deleted a row, sent an email, merged a PR. Can you prove exactly what it did โ to an auditor, a customer, or yourself after an incident?
Signet is the independent trust layer for agent actions. Every tool call gets a signed receipt that anyone can verify offline, without trusting the platform that hosted the agent or the vendor that stored the logs โ and since 0.11, the authorization behind an action carries its own proof: who the agent is (principal), who let it act (delegation), and who allowed this specific action (authority-signed decision).
Your agents run on their infrastructure. The proof belongs to you.
Why Not Just Logs?
Traditional logs tell you what a platform says happened. They're mutable, provider-dependent, and unverifiable without trusting the party that wrote them.
Signet receipts are different. Modify any field โ tool name, parameters, timestamp, signer โ and the Ed25519 signature breaks. Delete or reorder entries and the SHA-256 hash chain breaks. Verification requires only the public key. No network call, no API, no login.
Ordinary logs
Signet receipts
Provider says it happened
Anyone can verify it, offline
Mutable after the fact
Signature breaks on tamper
No ordering proof
Hash chain breaks on delete/reorder
Trust the log host
Verify with the public key
One-sided claim
Bilateral co-signing available
Use logs for observability. Use Signet when you need evidence.
Who Is This For?
MCP builders โ wrap any MCP server with signet proxy, sign every tools/call, no code changes
Security / compliance teams โ tamper-evident audit trail that satisfies EU AI Act Art. 12, SOC 2 CC7.2, ISO 27001 A.8.15
Enterprise agent platforms โ prove what the agent did, who authorized it, which policy was in force
Framework users โ LangChain, CrewAI, Claude Code, Codex, OpenAI Agents, Vercel AI SDK โ all supported
Agent-to-agent deployments โ bilateral co-signing when both sides hold keys
If a tool call cannot be verified independently, it should not be trusted unconditionally. This matters when an auditor asks for proof, when an incident happens on infrastructure you don't control, or when the question isn't "what does the console say" but "what actually happened."
Each agent gets an Ed25519 identity. Every tool call can be signed, appended to a hash-chained audit trail, verified offline or before execution, co-signed by the server, bound to a delegation chain, and optionally bound to a policy decision.
The video above shows the full flow. The SVG below shows the CLI signing details, or jump to See It Reject Bad Requests to watch the server block bad requests before they run.
This first demo shows signing + audit receipts. See also the MCP flow diagram.
What Signet Adds
Signet adds a lightweight trust layer for agent actions:
Sign every tool call with the agent's cryptographic key
Verify requests offline or at the execution boundary before they are trusted
Proxy any MCP server transparently โ sign requests without touching agent or server code, with local bilateral audit co-signing in the proxy path
Co-sign server responses with bilateral receipts when you control both sides
Trace multi-step workflows by linking receipts with trace_id and parent_receipt_id
Authorize agents with scoped delegation chains that prove who allowed the action
Attest policy by embedding a signed PolicyAttestation when a YAML policy is satisfied
Inspect locally with an append-only audit log and dashboard, no hosted control plane required
What's New In 0.11
Canonical principals: every identity can carry a scoped principal URI (agent://prismer/deploy-bot), signed inside receipts and delegation tokens; acting_for claims are machine-corroborated by the chain root.
Authority-signed authorization decisions: signet authorize pre-approves one intent; signet sign --decision produces a receipt backed by it (or --authority-key does it in one step). A decision binds to the action via intent_hash, so replay onto a different action is refused.
Revocation: signet revoke invalidates delegation tokens and decisions with an issuer-signed record. Verification reports an explicit status โ revoked fails, unknown is never reported as authorized (--require-revocation-known for strict mode). Evidence bundles carry revocation records.
Conditions and limits: policy rules carry typed obligations (require_approval, sandbox, โฆ); delegation scopes carry constraints (--max-calls, --spend-limit). Sign paths enforce call-count budgets and the narrowing invariant (a grant can shrink a delegation, never widen it).
Hardening: verify() now correctly verifies v4 receipts; rate-limited policy rules fail closed when no state is supplied; delegation expiry binds to wall clock (backdating a receipt timestamp no longer dodges it).
Compliance
Signet provides the technical controls that auditors look for when assessing AI agent operations. See the full Compliance Mapping for details.
Signet is a tool, not a certification. It provides controls that support compliance โ your deployment and configuration determine compliance posture.
Signet is building a new category: verifiable tool-call receipts for AI agents. Starring isn't just a bookmark โ it helps push cryptographic evidence for agent actions into the ecosystem so regulated industries, enterprise platforms, and framework users don't have to roll their own.
Working with Microsoft Agent Governance Toolkit (example merged in PR #1196)
Named contributor in LangChain's ComplianceBackend RFC (#35691)
Conformance work toward the IETF draft-farley-acta-signed-receipts spec
Maps to NIST NCCoE's four pillars for AI agent identity and authorization (Q4 2026 Interoperability Profile)
If you're building agents that need to survive an audit, an incident, or a third party asking "prove it" โ star the repo, try it, open an issue.
If you're new, start with one of these five paths:
Choose Your Path
Claude Code: Best for the fastest first run in a coding agent. Run /plugin install signet@claude-plugins-official in Claude Code. In 5 minutes you'll have signed tool calls and a local audit log at ~/.signet/audit/.
Codex CLI: Best for signing Bash tool calls in Codex. Copy plugins/codex/ into ~/.codex/plugins/signet and add one PostToolUse hook. In 5 minutes you'll have signed Bash actions in Codex using the same audit trail.
Python SDK: Best if you want receipts inside LangGraph, LlamaIndex, OpenAI Agents, CrewAI, or your own tool runner. Start with SigningAgent.create(...) and add framework hooks only where you need them.
MCP clients: Best if you control an MCP client or transport. Wrap your transport with new SigningTransport(inner, secretKey, "my-agent"). In 5 minutes you'll have signed tools/call requests with receipts in params._meta._signet.
MCP servers: Best if you want verification before execution. Call verifyRequest(request, {...}) in your tool handler. In 5 minutes you'll have signer, freshness, target-binding, and tool/params checks at the execution boundary.
See It Reject Bad Requests
Run the shortest execution-boundary demo:
bash
cd examples/mcp-agent
npm run execution-boundary-demo
Signet receipts prove what happened. Delegation chains prove who allowed it.
A root identity (human or org) cryptographically delegates scoped authority to an agent. Permissions can only narrow, never widen. The agent's v4 receipt carries the full proof of authorization.
text
Owner (alice) โ Agent A (tools: [Bash, Read], max_depth: 0)
โ
v4 Receipt: tool=Bash, authorization.chain proves alice โ Agent A
Best practice: Use short-lived delegations (--ttl 1h, --ttl 24h) instead of long-lived or non-expiring tokens. If an agent is compromised, the delegation expires automatically. Re-issue tokens as needed. This is the same pattern used by short-lived JWTs and X.509 certificates.
Signet can enforce a YAML policy before signing. When an action is allowed, the signed receipt carries a PolicyAttestation proving which policy hash, rule, and decision were in force.
Auto-sign every tool call in Claude Code with zero configuration:
bash
# Option A: From the official Anthropic plugin marketplace
/plugin install signet@claude-plugins-official
# Option B: Add Signet as a marketplace source, then install
/plugin marketplace add Prismer-AI/signet
/plugin install signet@signet
Every tool call is signed with Ed25519 and logged to a hash-chained audit trail at ~/.signet/audit/.
Alternative install methods:
bash
# From Git
claude plugin add --from https://github.com/Prismer-AI/signet
# Via signet CLI
signet claude install
from signet_auth import SigningAgent
from signet_auth.langchain import SignetCallbackHandler
agent = SigningAgent("my-agent")
handler = SignetCallbackHandler(agent)
# Every tool call is now signed + audited
chain.invoke(input, config={"callbacks": [handler]})
# Async chains supported toofrom signet_auth.langchain import AsyncSignetCallbackHandler
CrewAI Integration
python
from signet_auth import SigningAgent
from signet_auth.crewai import install_hooks
agent = SigningAgent("my-agent")
install_hooks(agent)
# All CrewAI tool calls are now globally signed
crew.kickoff()
AutoGen Integration
python
from signet_auth import SigningAgent
from signet_auth.autogen import signed_tool, sign_tools
agent = SigningAgent("my-agent")
# Wrap a single tool
wrapped = signed_tool(tool, agent)
# Or wrap all tools at once
wrapped_tools = sign_tools([tool1, tool2], agent)
LangGraph Integration
LangGraph uses LangChain's callback system โ the same handler works directly:
python
from signet_auth import SigningAgent
from signet_auth.langgraph import SignetCallbackHandler
agent = SigningAgent("my-agent")
handler = SignetCallbackHandler(agent)
result = graph.invoke(input, config={"callbacks": [handler]})
LlamaIndex Integration
python
from signet_auth import SigningAgent
from signet_auth.llamaindex import install_handler
agent = SigningAgent("my-agent")
handler = install_handler(agent)
# All tool call events are now signed
index = ... # your LlamaIndex setup
response = index.as_query_engine().query("What is Signet?")
# Access receiptsprint(handler.receipts)
Pydantic AI Integration
python
from signet_auth import SigningAgent
from signet_auth.pydantic_ai_integration import SignetMiddleware
agent = SigningAgent("my-agent")
middleware = SignetMiddleware(agent)
@middleware.wrapdefmy_tool(query: str) -> str:
returnf"result: {query}"
Google ADK Integration
python
from signet_auth import SigningAgent
from signet_auth.google_adk import SignetPlugin
agent = SigningAgent("my-agent")
plugin = SignetPlugin(agent)
# Pass as callback to ADK agent
Smolagents Integration
python
from signet_auth import SigningAgent
from signet_auth.smolagents import signet_step_callback
agent = SigningAgent("my-agent")
callback = signet_step_callback(agent)
bot = CodeAgent(tools=[...], model=model, step_callbacks=[callback])
OpenAI Agents SDK Integration
python
from signet_auth import SigningAgent
from signet_auth.openai_agents import SignetAgentHooks
agent = SigningAgent("my-agent")
oai_agent = Agent(
name="assistant",
hooks=SignetAgentHooks(agent),
tools=[...],
)
Note: Tool call arguments are not yet available in the hook API (issue #939). Only the tool name is signed.
Your Agent
|
v
SigningTransport (wraps any MCP transport)
|
+---> Signs each tool call (Ed25519)
+---> Appends Action Receipt to local audit log (hash-chained)
+---> Forwards request to MCP server (unchanged)
Client-side signing works without changing the server. If you control the server too, add verifyRequest() and optional signResponse() for execution-boundary verification and bilateral receipts. signResponse() should only run after a successful trusted verifyRequest(), and it can now carry final executed / failed / rejected / requires_approval outcome state inside the bilateral signature.
Action Receipt
Every tool call starts with a signed receipt. Higher receipt versions add server co-signing (v3) and authorization chains (v4):
The signature covers the entire receipt body (action + signer + timestamp + nonce) using RFC 8785 (JCS) canonical JSON. Modifying any field invalidates the signature.
Verify v3 bilateral receipts with replay protection that survives process restarts
signet claude install
Install Claude Code plugin (PostToolUse signing hook)
signet claude uninstall
Remove Claude Code plugin
signet dashboard
Open local audit dashboard in browser
Passphrase via interactive prompt or SIGNET_PASSPHRASE env var for CI.
Audit Dashboard
Run signet dashboard to open a local web UI for your audit log โ no account, no network, just your local receipts.
Timeline view: every tool call logged with signer, tool name, target, and receipt ID. Filter by time, tool, or signer.
The Chain Integrity tab verifies the SHA-256 hash chain across your entire audit log โ any tampering or gap is pinpointed to the exact file and line:
Chain broken at line 189: expected vs actual hash shown. This is what "append-only" actually looks like in practice.
XChaCha20-Poly1305 key encryption with authenticated associated data (AAD)
SHA-256 hash chain for tamper-evident audit log
RFC 8785 (JCS) canonical JSON for deterministic signatures
Keys stored at ~/.signet/keys/ with 0600 permissions. Override with SIGNET_HOME env var.
What Signet proves
Agent key X signed intent to call tool Y with params Z at time T
What Signet does NOT prove (yet)
That the MCP server executed the action (use bilateral receipts with signResponse() for server co-signing โ shipped in v0.4)
That signer.owner actually controls the key (planned: identity registry)
Signet is first an evidence layer: it proves what happened. It can also enforce checks at the signing boundary and execution boundary, but it does not replace sandboxing, least-privilege design, or human approval where those are required.
Related Projects
Prismer Cloud โ Full agent harness with evolution engine, memory layer, community, and built-in Ed25519/DID identity. Use Prismer Cloud for the complete agent platform; use Signet when you only need the standalone attestation layer.
Prismer.AI โ The open-source AI research platform
Star History
If Signet is useful to you, please star this repo โ it helps more teams find it.