Try it
Let your AI book a bike service
Oficina Maré is a pretend bike workshop running Surfing Dog Inbox. Point your AI at it, ask for a booking, and watch the shop confirm it. It takes about a minute, and there is nothing to sign up for.
-
Connect your AI
In Claude, ChatGPT, Gemini, Grok or any assistant that takes an MCP server, add a custom connector with this address. No key, no sign-in.
https://demo.surfingdog.ai/mcp -
Ask for a booking
Paste this, or say it your own way. Any name will do.
Book a bike service with Oficina Maré on Saturday morning
-
Watch it arrive
It shows up below within a few seconds. The shop's own rules confirm a small booking in a free slot inside its hours and accept a small order; anything else waits for a person, and says why.
Live
What the shop is getting
Looking for the shop
The demo never emails anyone who uses it, never shows a name, an address or a message, and is wiped every night, then set up again with a few examples, dated as if from the past week and marked example.
For developers
The same with curl
The shop speaks plain REST too. Find the service, book it, then ask how it went.
-
The services, with their ids:
curl -s https://demo.surfingdog.ai/v1/services | jq '.items[] | {id, name}' -
A full service at the first free time from Saturday on, asked for as an assistant does:
SVC=$(curl -s https://demo.surfingdog.ai/v1/services | jq -r '.items[] | select(.name == "Full service") | .id') SLOT=$(curl -s "https://demo.surfingdog.ai/v1/availability?service_id=$SVC&from=2026-11-14T00:00:00Z&to=2026-11-21T00:00:00Z" | jq -c '.slots[0]') KEY=$(uuidgen) # keep it: a retry with it gets the same answer jq -n --arg svc "$SVC" --argjson slot "$SLOT" '{ payload: { reservationFor: { serviceId: $svc, name: "Full service" }, startTime: $slot.startTime, endTime: $slot.endTime }, contact: { name: "Rita" } }' | curl -s -X POST https://demo.surfingdog.ai/v1/bookings -H 'content-type: application/json' -H "idempotency-key: $KEY" -d @-It has a price, so the first answer is
409 confirm_terms: what the customer confirms before it binds them (details.summary) and its fingerprint (details.terms_sha). Send the same request again, with the same key andterms_shaadded, as an assistant does on its person's yes. A time the shop does not offer is a422that names the nearest free ones. -
The answer carries the booking's id,
view.item.id, and anaccessToken: send it in thex-access-tokenheader to read or cancel the booking. A second later it saysconfirmed:curl -s https://demo.surfingdog.ai/v1/items/<item id> -H 'x-access-token: <token>' | jq .item.state -
And the tools an AI sees over MCP:
curl -s https://demo.surfingdog.ai/mcp \ -H 'content-type: application/json' \ -H 'accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Every call is in openapi.json, and the API page explains them.
Want one for your business?
We host it for you for free, or you run the open-source inbox yourself.