Can an agent buy from you? A one-cent till, six refusals, and twelve cold agents A developer built a single-process Express demo server that tests whether AI agents can actually complete a purchase, answering four questions in a fixed order — price (402), input validity (422), contract version (409), and payment verification (402/409) — before serving the item with a 200. The server combines llms.txt and .well-known discovery, x402 payments via EIP-3009 TransferWithAuthorization verified with viem on Base Sepolia or Base in USDC, and an append-only sha256-chained JSONL receipt ledger. The work argues that MCP and x402 move bytes and money but not meaning, and that typed failures with a code, hint, fix and retryable flag are what agents need most. Most agent-payment demos stop at the happy path: an agent hits an endpoint, gets a 402 , signs a payment, gets a 200 , the room claps. That demo teaches that a protocol works. It does not teach what breaks, and the thing that breaks is not the payment. It is everything around it. So this repo does three things: An agent that wants to buy from your service is not asking "do you support x402". It is asking four questions, in order: x402 answers the third one well. MCP hands an agent a tool with a name. Neither of them tells the agent what the tool actually promises, what version it is, or how it fails. A handshake is not an agreement. MCP moves bytes, x402 moves money, nothing in the stack moves meaning. The repo is an argument for putting meaning in the interface, and the demo is how you show it in twenty minutes. One process. That is the first design decision and it matters more than it sounds. agent / browser / curl │ GET /llms.txt │ POST /api/vend/:item │ GET /api/receipts ▼ ▼ ▼ ┌───────────────────────────────────────────────────────────────┐ │ Express │ │ │ │ discovery: llms.txt, .well-known/agent.json, schema.json, │ │ registration.json, /mcp generated │ │ │ │ funnel: price → input → version → money → serve │ │ 402 422 409 402 200 │ │ │ │ x402: EIP-3009 TransferWithAuthorization, verified │ │ with viem, nonce-checked against the ledger │ │ │ │ receipts: append-only JSONL, sha256 chain, re-verifiable │ │ │ │ demo: chaos runs, tamper drill, three-doors results │ └───────────────────────────────────────────────────────────────┘ │ ▼ Base Sepolia eip155:84532 or Base eip155:8453 , USDC verify locally, then ask the facilitator to settle Why one process: llms.txt says a penny and the endpoint wants two, that is not a documentation bug, it is impossible. src/server/vend.ts is the whole product. It answers the four questions in a fixed order: / One call, four questions answered in order: what does this cost and where do I pay 402 - is the input even valid 422 - is the money real and unused 402/409 - here is what you bought 200 . / export async function vend itemId: string, input: Record