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.

  1. 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

  2. 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

  3. 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.

    See the shop live

Live

What the shop is getting

Open the full view

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.

    1. The services, with their ids:

      curl -s https://demo.surfingdog.ai/v1/services | jq '.items[] | {id, name}'
    2. 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 and terms_sha added, as an assistant does on its person's yes. A time the shop does not offer is a 422 that names the nearest free ones.

    3. The answer carries the booking's id, view.item.id, and an accessToken: send it in the x-access-token header to read or cancel the booking. A second later it says confirmed:

      curl -s https://demo.surfingdog.ai/v1/items/<item id> -H 'x-access-token: <token>' | jq .item.state
    4. 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.