Receipt — sign an agent's work, verify it offline

io.github.ecstaticaPublished by GitHub account ecstaticav1.1.0Updated Oct 30, 2026

Ed25519 receipts over work artifacts: issue and verify offline, no account, no chain, no network.

VerifiedStreamable HTTPWeb executableDeveloper ToolsSecurity & Monitoring

Overview

AI-generated overview

Issues and verifies Ed25519 receipts that bind an agent, a task and a file, so anyone can check offline that an artifact is unchanged.

What you can do
  • Sign an artifact with an Ed25519 receipt, returning JSON with the artifact hash, agent, task, amount and signature
  • Verify a receipt offline against its signature, every field and optionally the artifact hash, reporting the failing reason when something changed
When to use it
Use it when an agent delivers files and a buyer or reviewer needs independent, offline proof that the file came from that agent and has not been altered since. It is not a quality or identity check.
Requirements
Runs as a remote endpoint or as a local process; the local MCP server is a Python script needing Python 3.10+ and the cryptography package. No account, API key or network access is required for verification.
Before you install
Issuing a receipt needs an Ed25519 private key file, which should be kept private and permission-restricted. Receipts prove only that a key signed an artifact hash with those fields at that time, not that the work is good or that the key belongs to a particular person.

Installation

In SourceWeft

  1. Open Receipt — sign an agent's work, verify it offline in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.ecstatica%2Fggbank-receipt/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "receipt-sign-an-agent-s-work-verify-it-o": {
      "type": "http",
      "url": "https://receipt.whirlwindcorp.com/mcp"
    }
  }
}

README

receipt

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

bash
git clone https://github.com/ecstatica/ggbank-receiptcd ggbank-receiptpython3 -m pip install --user cryptography

No dependency beyond cryptography. Python 3.10+.

Use

bash
# 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 deliveredpython3 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, offlinepython3 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.

json
{"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

json
{ "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

bash
python3 receipt.py verify --receipt tampered.json     # FAIL signature: InvalidSignaturepython3 receipt.py verify --receipt good.json --artifact edited.pdf                                                      # FAIL artifact: hash mismatch

Licence

MIT.

Source: README.md at commit a0266f2

Tools

2

issue_receipt

Sign an artifact with an Ed25519 receipt. Returns the receipt JSON: artifact hash, agent, task, amount and a signature anyone can verify offline.

Parameterstaskrequiredagentrequiredkey_pathamount_ggartifact_b64artifact_nameartifact_pathartifact_text

verify_receipt

Verify a receipt offline: signature, every field, and optionally the artifact hash. Returns ok=false with the failing reason when anything has changed.

Parametersreceiptrequiredartifact_b64artifact_pathartifact_text

Version history

1
  1. v1.1.0LatestOct 29, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.