Agents escrow USDC, search real hotels & flights, and book — non-custodial, merchant-of-record.
Both servers speak the Streamable HTTP transport — just give your client the URL.
POST https://booking-layer.ianb-sia.workers.dev/test/mcpPOST https://booking-layer.ianb-sia.workers.dev/mcpDrop this into your client's mcp.json:
{
"mcpServers": {
"booking-layer-test": { "url": "https://booking-layer.ianb-sia.workers.dev/test/mcp" },
"booking-layer-prod": { "url": "https://booking-layer.ianb-sia.workers.dev/mcp" }
}
}
A live copy is served at https://booking-layer.ianb-sia.workers.dev/mcp.json. In testing, the MCP server auto-creates an ephemeral agent wallet for you.
We're a merchant-of-record, not a marketplace: the agent pays us, and we pay the supplier off-chain. That requires us to front supplier cash at settlement.
The production code path is real and validated end-to-end up to settlement — only the supplier capital is missing (no pre-funded float yet), so book won't settle in prod. Prove your integration in testing; the identical prod path settles for real once capital is in place.
Single ES module: https://booking-layer.ianb-sia.workers.dev/sdk/booking-layer.mjs (or src/sdk.ts in the repo).
import { BookingClient } from "./booking-layer.mjs";
const c = new BookingClient({ baseUrl: "https://booking-layer.ianb-sia.workers.dev/test", agentKey: "0xthrowaway" });
const v = await c.verify({ constraints: { kinds: ["flight"], where: { city: "Paris" } }, budgetUsdc: 60 });
const offers = await c.search({ type: "flight", location: "LHR", destination: "CDG" });
const booking = await c.book({ type: "flight", location: "LHR", destination: "CDG", offerId: offers[0]?.id });
console.log(booking);
Testing guide llms.txt Discovery (test) Discovery (prod) mcp.json