About dmt-receipts
dmt-receipts is a local stdio MCP server for preparing and verifying agent memories as TAP/Ordinals payloads. It is intended for developers who want to preserve and check memory bytes on Bitcoin; it does not broadcast transactions or pay inscription fees.
Key features
- 01Canonicalize five-field memory JSON
- 02Create TAP/Ordinals inscription recipes
- 03Recompute memory digests
- 04Optionally fetch and compare inscription content
Use cases
- 01Prepare agent memories for inscription
- 02Check whether an inscription matches source bytes
- 03Prepare and verify memories in a browser
MCP support
It runs as a local stdio MCP server and exposes the `prepare_memory` and `verify_inscription` tools.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEDMT Receipts
Portable, Bitcoin-permanent agent memories via the TAP Protocol / Ordinals.
DMT Receipts is a local stdio MCP server (prepare_memory, verify_inscription) and a browser demo. It turns a five-field dmt-memory/v1 JSON object into an inscription-ready payload. Permanence means those memory bytes are committed on Bitcoin L1 as Ordinals inscription content under TAP ("p":"tap"). Keep the memory and inscription id / txid in storage you control. After prepare_memory, status is prepared. A wallet or Ordinals tool inscribes the bytes and pays the Bitcoin fee.
Live site · Protocol recipe · Repo show-and-tell · Full specification · TAP specs
Maintainer: github.com/Colchora
Start here
The live site prepares and verifies a memory in the browser. Nothing is uploaded; receipts stay in localStorage until you export them. This package is the same protocol as a local MCP server. It is not published to the npm registry, so install it from a clone (below) or use the site.
| What you want | Where |
|---|---|
| Prepare a memory, no install | Live app → Anchor |
| Verify an inscription | Live app → Verify |
| Receipts saved in this browser | Live app → Receipts |
| Prove the local tools | npm ci then node examples/run-demo.mjs |
| Agent index (tools, run, demo) | llms.txt in this repo |
| Canonical byte rules | live llms.txt |
| Full protocol | spec.md |
| Machine-readable manifest | agent.json |
| MCP registry id | io.github.Colchora/dmt-receipts (server.json, glama.json) |
Optional honor-system funding is separate from inscription fees: Support and Buyback.
What a receipt does—and does not—establish
| A receipt can establish | A receipt cannot establish |
|---|---|
These exact canonical bytes were inscribed as Ordinals content in a Bitcoin transaction (when inscription_id / content match). | Who created or owns those bytes; authorship needs a separate signature scheme. |
Local verify_inscription can recompute the digest and optionally fetch public inscription content for comparison. | Truth, accuracy, originality, intent, or exclusive ownership of the memory. |
| TAP indexers / Ordinals explorers can show the inscription independently of this repo. | A free hash-only calendar proof. Inscription fees are real Bitcoin fees. |
This MCP server does not broadcast transactions or pay fees. Status after prepare_memory is prepared, not inscribed.
Show and tell
Node.js 18+. npm ci installs dependencies and builds dist/index.js. The server speaks MCP on stdin and stays open until a client connects.
git clone https://github.com/Colchora/dmt-receipts.git
cd dmt-receipts
npm ci
node examples/run-demo.mjs
The script calls prepare_memory on examples/demo-memory.json, then verify_inscription with no inscription id. A passing run prints:
| Check | Value |
|---|---|
sha256 | 76f3f9ff531cecbfe46e676e932f9b0d9d02b3d7c04e5a558924a8092cb0294b |
byte_length | 170 |
status | prepared |
matches_expected_sha256 | true |
ok | false until the bytes are inscribed |
ok stays false while the memory is only prepared. Inscription content that matches the canonical bytes is what makes a later verify succeed. The same numbers are in examples/expected-digest.json.
Cursor loads .cursor/mcp.json after the build. ${workspaceFolder} is the directory that contains that file:
{
"mcpServers": {
"dmt-receipts": {
"type": "stdio",
"command": "node",
"args": ["${workspaceFolder}/dist/index.js"]
}
}
}
Claude Desktop and other clients use an absolute path to the built file:
{
"mcpServers": {
"dmt-receipts": {
"command": "node",
"args": ["/absolute/path/to/dmt-receipts/dist/index.js"]
}
}
}
Call prepare_memory with the five fields in examples/demo-memory.json (agent_id, key, content, tags, created_at). Pass the returned memory and sha256 to verify_inscription with fetch_content: false and include_trac: false until you have an inscription_id.
Tools:
prepare_memory— canonicalize a memory, hash it, and return an Ordinals/TAP inscription recipe (content UTF-8 + optionaldtapointer).verify_inscription— recompute the digest; optionally fetch inscription content and compare; return explorer links.
Walkthrough: examples/README.md. Agent index: llms.txt. Protocol bytes: live llms.txt.
Checks
npm run typecheck
npm run build
npm test
npm run typecheck runs tsc --noEmit. The compiler uses strict, noUncheckedIndexedAccess, and exactOptionalPropertyTypes. npm test rebuilds dist/, runs the unit tests, and runs examples/run-demo.mjs.
Prepare, inscribe, verify
- Call
prepare_memorywithagent_id,key, andcontent. - Inscribe
inscription_recipe.content_utf8as Ordinals content (application/jsonortext/plain) with TAP Wallet or any Ordinals/TAP tool. Optional TAPdta(≤512 bytes) may carrysha256:<hex>on token-deploy flows. - Store the memory with
inscription_id/txid. - Call
verify_inscriptionwith the memory andinscription_id.
The same prepare and verify steps work in the browser with no install: Anchor, then Verify.
Canonical memory format
Compact UTF-8 JSON, no trailing newline, keys sorted by Unicode code point, literal non-ASCII:
{"agent_id":"demo-agent","content":"Remember this exact state.","created_at":"2026-11-05T17:00:00Z","key":"notes/hello","tags":["demo"]}
| Field | Type | Notes |
|---|---|---|
agent_id | string | Stable identifier for the agent. |
key | string | Memory key, slug, or path. |
content | string, object, array, number, or boolean | Nested values must be JSON-compatible. |
tags | array of strings | Use [] when there are no tags. |
created_at | string | ISO-8601 UTC ending in Z, whole-second precision. |
| (extensions) | any JSON value | Optional. Extra fields are sorted with everything else and included in the hash. prepare_memory keeps additional tool arguments. |
Protocol and privacy
Inscription content is public on Bitcoin. Do not inscribe secrets. This tool never uploads memory bytes to a backend of its own; if you fetch content during verify, you contact a public explorer.
License
MIT
Support & Tap buyback
Optional honor-system funding lives on the live site:
- Support plans — Free prepare, Support, Tap buyback
- Buyback hub — all contribution proceeds are directed here (USDC address + local payment-reference log)
Prepare/inscribe memory tooling stays free aside from Bitcoin network inscription fees paid to miners/inscribers. This repository does not process card payments.
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.