Receipt — sign an agent's work, verify it offline について
Receiptは、エージェントや購入者が成果物に署名し、オフラインで検証するためのPythonツールです。Ed25519署名でファイルのハッシュとタスク、エージェントの情報を結び付け、ネットワークなしで改ざんを検出します。
主な機能
- 01Ed25519署名付きレシートの発行
- 02レシートとファイルハッシュのオフライン検証
- 03署名対象フィールドの変更検出
- 04正規化JSONによる署名
活用シーン
- 01納品ファイルとレシートの一致確認
- 02ネットワークなしでのレシート確認
- 03ファイルやレシートの改変検出
MCP 対応
stdioのMCPサーバーとして、MCPクライアントに `issue_receipt` と `verify_receipt` ツールを提供します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
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"}}}Cursor で開く{"servers":{"ecstatica-ggbank-receipt":{"type":"http","url":"https://receipt.whirlwindcorp.com/mcp"}}}VS Code で開く{"mcpServers":{"ecstatica-ggbank-receipt":{"type":"http","url":"https://receipt.whirlwindcorp.com/mcp"}}}{"mcpServers":{"ecstatica-ggbank-receipt":{"serverUrl":"https://receipt.whirlwindcorp.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
receipt
エージェントが行った作業に署名します。誰でもオフラインで検証できます。
レシートは、エージェント、タスク、ファイルを Ed25519 署名で結び付けます。検証にアカウント、チェーン、ネットワーク、または当方の許可は必要ありません。ファイルの文字を1つ変えるか、レシートのフィールドを1つ変えると、検証に失敗します。
これはエージェント経済における、最小限の実用的なものです。支払いの仕組みは、証明の仕組みより先に登場しました。x402 では1億3,800万件の支払いが行われましたが、エージェントの仕事の大半は、資金提供を受けておらず、独立した第三者による評価も受けていません。
インストール
git clone https://github.com/ecstatica/ggbank-receipt
cd ggbank-receipt
python3 -m pip install --user cryptography
cryptography 以外の依存関係はありません。Python 3.10 以降が必要です。
使い方
# 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
ファイルと一緒にレシートを送ります。購入者はコマンドを1つ実行するだけで、そのファイルがエージェントの生成したものであり、その後変更されていないことを確認できます。
証明できること、できないこと
証明できること: この鍵が、指定されたフィールドを含むこのアーティファクトのハッシュに、この時点で署名したこと、そしてその後何も変更されていないことです。
証明できないこと: 作業の品質や、その鍵が特定の人物のものであることです。品質は別途判断するものであり、本人確認も別途主張するものです。
MCP サーバーとして使う(エージェントが実際に呼び出す方法)
mcp_server.py は、JSON-RPC over stdio を使用します。これは Claude Code、Cursor、Codex、Hermes、およびほとんどのエージェントフレームワークがすでに使っているプロトコルです。ツールは2つです:issue_receipt、verify_receipt。ネットワークは不要で、依存関係は 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": {...}}
往復検証済みです:issue_receipt → verify_receipt は ok: true を返します。金額を変更すると、ok: false, reason: "signature: InvalidSignature" を返します。
レシートに含まれる内容
{
"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>"
}
正規化された JSON(キーをソートし、空白を含まない)に署名するため、署名対象のバイト列はどの言語でも再現できます。金額フィールドには浮動小数点数ではなく、10進数の文字列を使用します。
改ざん検知テスト済み
python3 receipt.py verify --receipt tampered.json # FAIL signature: InvalidSignature
python3 receipt.py verify --receipt good.json --artifact edited.pdf
# FAIL artifact: hash mismatch
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。