Model Context Protocol · 5 tools · no authentication

Gaplessly's booking connector for AI assistants

One endpoint for the whole platform. An assistant connected to it can find free appointment and table times at any business that takes bookings through Gaplessly, and hand the guest a link to finish the booking themselves.

The endpoint

POST https://gaplessly.com/api/mcp

Streamable HTTP, JSON-RPC 2.0, stateless. No authentication, no API key and no OAuth, because nothing here reaches anything a member of the public cannot already see on a business's own booking page. Call tools/list against it for the authoritative tool definitions; the summary below is prose about the same thing.

There is no CORS and none is planned. An MCP client is a server-to-server HTTP client, so the browser-based Inspector cannot reach this and is not meant to. Use the Inspector CLI.

The five tools

Every one of them is read-only, including the two named book_. That is not a labelling convenience: they return a link and write nothing, and calling one twice produces the same link twice.

get_venue
Takes a venue slug. Returns the venue's public booking profile, its service list, and the venue's own current date and time. Call it first: everything else needs the slug, and appointment searches need a service id from here.
find_appointment_times
Takes a venue, a service, a day and a span of up to 14 days. Returns free times for that service, each as a display label plus a signed slot token.
find_table_times
Takes a venue, a party size, a day and a span of up to 14 days. Returns free sittings for that party size. An empty day says why it is empty when the venue told us, so "closed on Mondays" never reads as "fully booked".
book_appointment
Takes a venue, a slot token and the service it was found for. Returns a short-lived link to the venue's booking page, opened at that time. It books nothing.
book_table
Takes a venue, a slot token and the party size it was found for. Returns the same: a link, opened at that sitting. The venue holds the table from the moment the guest opens it, for about ten minutes.

Why nothing here books

An assistant cannot prove who it is speaking for. No mainstream assistant passes a verified human identity to a tool, so a connector that booked outright would be booking for whoever the model says, on details the model typed. Nobody in this industry does that: Resy's connector requires a sign-in, Google's AI links you to the booking page for the last step, and Calendly will not book without a code.

So the last step is a link and a tap. The person who taps is demonstrably the person in the conversation; their name, email and phone never pass through the assistant, because no tool accepts them; and a deposit, a house policy or a venue's own intake questions are all asked by the page that already knows how to ask them.

Times, and why they look like that

No tool ever returns a timezone, and no time comes back in a form a date library will parse. A model that sees an IANA zone beside a time converts it, and books hours wrong. Times come back as display text plus an opaque signed token, and every date you send is resolved against the venue's own today rather than yours, which are frequently different days.

A slot token is signed, expires in about thirty minutes, and carries the venue, the time, and what the slot was found for inside the signature. It cannot be edited, built by hand, moved between venues, or reused for a different service or party size. That is what stops a prompt injection redirecting a booking while the transcript still shows the right venue.

What to try first

  1. get_venue for a venue slug, to see the profile and the venue's current time.
  2. find_table_times for a party of two, next week. Then the same call on a day the venue is shut, to see the reason rather than an empty list.
  3. book_table with a token from that result, and open the link it returns.
  4. The same call with a token from a different venue, or with a party size the token was not issued for. Both are refused, and the refusal says what to do instead.

Limits

The connector is rate limited per calling network address. An assistant platform's address is shared by everyone using it, so the budget is deliberately modest; a normal conversation is three calls.

There is no tool that reads or cancels an existing booking, and there is not going to be one by default. Both would need the private link that manages a booking, which is the one credential this design keeps away from assistants. A guest manages their booking from the link in their own confirmation email.