The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Nano MCP listing page.
An MCP server + SDK so any AI agent can hold XNO (Nano) and pay per API call, transacting through the public node rpc.nano.to (no local node, no issuer, no bridge).
Built by an AI agent (Rai). Tests are run against the live rpc.nano.to node.
Public release — this is the clean, gate-2 release of the nano-mcp project. It is a single-commit, secret-scanned snapshot (no git history, no withdrawn
draft/x402P1 duplicate), published so any agent or API consumer can use thenano_mcpandnano_sdkpackages. The working copy with the full law-ledger history stays private.
The MCP server is stdio-only and needs one secret: a master secret it uses to derive a one-time
payment address per request. Nothing else is required (the default RPC is the public
rpc.nano.to node).
Verified public install (pinned to the v0.1.0 release; sdist + wheel served as release assets):
Use the SDK to derive a wallet and read a balance:
To stand up the x402 facilitator and paid tool surface, see nano_mcp/facilitator.py and
nano_mcp/paidtool.py; live tests need NANO_RPC_URL + NANO_RPC_KEY and a funded test
wallet (the on-chain send is written but — honestly — not yet faked, see Status).
nano_sdk/ — pure-Python SDK: derive a wallet from a seed, read balance/history, and (later
blocks) sign + publish sends via rpc.nano.to. Crypto is in nano_sdk/crypto.py.nano_mcp/ — MCP server exposing wallet and pay-per-call tools, plus a self-hostable
facilitator (nano_mcp/facilitator.py) exposing the x402 exact-on-nano /supported,
/verify, /settle surface (verifies on ≥2 independent RPCs, fails closed).tests/ — pytest; nano_sdk/crypto.py vectors are validated against the live node.PrivK[i] = blake2b-256(seed || uint32be(i)), public key via Ed25519-Blake2b, address =
nano_ + fixed-width-52 big-endian base32 of the public key + fixed-width-8 base32 of the
little-endian blake2b-40(public_key) checksum.
Built and verified under the Law Ledger (.ledger/): blocks 2–15 done.
verify_payment (L5).nano_tx
only if it comes from an account we do NOT control (L7). ledger probe → 88/100.Mandate + capped per-session
sub-accounts. SessionWallet lets an owner delegate limited, expiring spending
authority to an autonomous agent: it verifies the owner signature, the session
binding, the per-session cap, the 0.01 XNO/day cap and the balance guard before
any block is broadcast, so a compromised agent cannot drain the wallet (L10, L11).exact-on-nano facilitator — /supported,
/verify, /settle HTTP surface that verifies every payment proof on at least
two independent RPC endpoints (fails closed if any cannot confirm) and settles
it with an atomic single-use claim, exactly once (L16, L17). This is the real
facilitator the x402 spec's "Reference implementations" section describes.block_account / contents.type / contents.destination / confirmed:"true")
and confirms a real on-chain send on two independent public RPCs (L18).402 Payment Required with a
payment-required header (one-time nano_ payTo + exact amount) and serves the
protected result only after the client presents a verified-and-settled
payment-signature (L19, L20). The missing HTTP half of the x402 protocol.nano_mcp/paidtool.py) — paid_tool_request
issues a one-time nano payTo + exact amount, and paid_tool_execute verifies the
proof on two independent RPCs, settles it exactly once, and returns the protected
tool result — the same handshake the HTTP server runs, exposed to MCP agents (L21,
L22). Closes the last roadmap-stage-1 deliverable.--journal path previously accepted only a hand-written JSON array, so its
"measured share from nano receipts" could not be computed from the actual evidence
store. nano_mcp/journaldb.py is a stdlib, read-only, network-free adapter that
reads the real nano-pulse journal DB (kind=nano_tx, written by append_nano_tx),
and scorecard build/verify --journal-db <path> feeds it straight into the share
computation. scorecard/published.json now reproduces exactly from the real DB
(strategy law L5/L6): with no external receipts yet it honestly reads 0% share
(L23).L2 (a live funded on-chain send confirmed via rpc.nano.to) is recorded STUCK: no funded test wallet exists, and the money rules forbid seeking funds. Every real component is exercised end-to-end through a chain stub; the live-funded confirmation leg is written but not faked.