Receipt — sign an agent's work, verify it offline
RemoteAbout Receipt — sign an agent's work, verify it offline
Receipt is a Python tool for agents and buyers to sign work artifacts and verify them offline. Ed25519 signatures bind an artifact hash to task and agent fields, with tampering detectable without a network connection.
Key features
- 01Issue Ed25519-signed receipts
- 02Verify receipts and artifact hashes offline
- 03Detect changes to signed fields
- 04Canonical JSON signing format
Use cases
- 01Prove a delivered file matches its receipt
- 02Check a receipt without network access
- 03Detect edits to a file or receipt
MCP support
Its stdio MCP server exposes `issue_receipt` and `verify_receipt` tools to MCP clients.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://receipt.whirlwindcorp.com/mcpclaude mcp add --transport http ecstatica-ggbank-receipt https://receipt.whirlwindcorp.com/mcp{"mcpServers":{"ecstatica-ggbank-receipt":{"type":"http","url":"https://receipt.whirlwindcorp.com/mcp"}}}Open in Cursor{"servers":{"ecstatica-ggbank-receipt":{"type":"http","url":"https://receipt.whirlwindcorp.com/mcp"}}}Open in VS Code{"mcpServers":{"ecstatica-ggbank-receipt":{"type":"http","url":"https://receipt.whirlwindcorp.com/mcp"}}}{"mcpServers":{"ecstatica-ggbank-receipt":{"serverUrl":"https://receipt.whirlwindcorp.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
Details
From the project READMEreceipt
Sign the work your agent did. Let anyone verify it offline.
A receipt binds an agent, a task and a file with an Ed25519 signature. Verification needs no account, no chain, no network and no permission from us. Change one character of the file or one field of the receipt, and verification fails.
This is the smallest useful thing in the agent economy: the payment rails arrived before the proof rails. x402 passed 138 million payments while most agent jobs remain unfunded and unevaluated by anyone independent.
Install
git clone https://github.com/ecstatica/ggbank-receipt
cd ggbank-receipt
python3 -m pip install --user cryptography
No dependency beyond cryptography. Python 3.10+.
Use
# 1. your agent's key (Ed25519, private key mode 0600)
python3 receipt.py keygen --out ~/.agent.key
# 2. sign a receipt over the artifact the agent delivered
python3 receipt.py issue \
--key ~/.agent.key \
--artifact report.pdf \
--task q-1042 \
--agent VOID-9 \
--amount 25 \
--out q-1042.receipt.json
# 3. anyone can verify it, offline
python3 receipt.py verify --receipt q-1042.receipt.json --artifact report.pdf
OK signature valid · issuer QRs56MmYfzwtOAih…
OK artifact matches 04002a7e5527bbad…
deliver · VOID-9 · task q-1042 · 25.0 GG · 2026-10-25T11:56:24Z
Send the receipt with the file. The buyer runs one command and knows the file is the one that agent produced and has not changed since.
What it proves, and what it does not
Proves: this key signed this artifact hash with these fields at this time, and nothing has changed since.
Does not prove: that the work is good, or that the key belongs to a particular human. Quality is a separate judgement; identity is a separate claim.
Use it as an MCP server (what agents actually call)
mcp_server.py speaks JSON-RPC over stdio — the protocol Claude Code, Cursor, Codex, Hermes and most agent
frameworks already speak. Two tools: issue_receipt, verify_receipt. No network, no dependencies beyond
cryptography.
{"mcpServers": {"receipt": {"command": "python3", "args": ["/abs/path/mcp_server.py"]}}}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"issue_receipt",
"arguments":{"artifact_path":"/tmp/report.pdf","agent":"VOID-9","task":"q-1042","amount_gg":25}}}
→ {"ok": true, "receipt": {...}}
Verified round trip: issue_receipt → verify_receipt returns ok: true; change the amount and it returns
ok: false, reason: "signature: InvalidSignature".
What a receipt contains
{
"spec": "ggbank.receipt/1",
"verb": "deliver",
"agent": "VOID-9",
"task": "q-1042",
"artifact": {"name": "report.pdf", "sha256": "04002a7e…", "bytes": 18422},
"amount_gg": "25.000000",
"fee_gg": "0.125000",
"issued_at": "2026-10-25T11:56:24Z",
"issuer": "<base64 public key>",
"nonce": "…",
"signature": "<base64>"
}
Canonical JSON (sorted keys, no whitespace) is signed, so the signed bytes are reproducible in any language. Money fields are decimal strings, never floats.
Tamper detection, tested
python3 receipt.py verify --receipt tampered.json # FAIL signature: InvalidSignature
python3 receipt.py verify --receipt good.json --artifact edited.pdf
# FAIL artifact: hash mismatch
Licence
MIT.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.