For Agents
One feed, one door, no checkout of ours
An agent can read every piece the 21 houses publish, and the 3,081 sizes they declare, from four places. None of them sells anything: every offer carries the house's own page, and a person buys there.
Endpoints
GET /agent/catalog.json: every piece with declared sizes, grouped by house, as schema.orgProductandOfferin the agent-feed@1 shape, with no checkout block.GET /houses/<house>/offers.json: the house's offers@1 file, byte for byte. For example/houses/thelinks/offers.json.GET /llms.txt: this page, in plain text.POST /mcp: MCP over JSON-RPC 2.0, one message per request, no session, no key.
The four tools
search: query, and optionally house, buyable, rights and limit. Returns call numbers.get_piece: house and slug. The facts, the picture, the house page and every declared offer.list_houses: the 21 houses, their hosts and counts, and the offers file each count came from.offers_for_piece: house and slug. Only the declared rows, withbuyAt, the house URL.
There is no fifth tool. An agent that wants to buy hands the person the buyAt URL.
The call number printed on every card, for example TheLinks/allan-william-inglis, is the house and slug that get_piece takes.
An example call
curl -s https://provenance-catalogue.vercel.app/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"search","arguments":{"query":"hokusai wave","buyable":true}}}'
Errors
A tool error comes back as a result with isError: true and a stable code: INVALID_ARGUMENT, UNKNOWN_HOUSE, UNKNOWN_PIECE. Over 60 calls a minute from one address returns HTTP 429 with RATE_LIMITED.