easyTable reservations
easyTable is a restaurant table-booking system. Each restaurant has a public
booking widget at https://book.easytable.com/book/?id=<restaurantId> — the
id is the only identifier (there's no login). This MCP drives that widget
through the user's own signed-in, Cloudflare-cleared browser tab via the
ContextMint Bridge extension (fetchproxy's browser extension); the site blocks any server-side request.
Setup (one time)
- Install the ContextMint Bridge browser extension from
https://github.com/nullnet-app/contextmint-bridge/releases (Chrome: load the
contextmint-bridge-chrome-*.zipunpacked; Safari: ships inside the ContextMint app, no public download yet — use Chrome for now). It is the renamed fetchproxy extension, same maintainer; source is public — build it or verify the zip with its published.sha256. - Open a booking widget in Chrome:
https://book.easytable.com/book/?id=<restaurantId>. Let the page finish loading — its Cloudflare Turnstile check solves itself. - The first tool call prints a one-time pair code; approve it in ContextMint Bridge.
Typical flow
easytable_list_types— the restaurant's booking areas (e.g. indoor, bar); note thetypeid.easytable_list_dates— bookable dates for thattype+ party size.easytable_list_times— time slots (HH:MM) for a chosen date.easytable_create_booking— make the reservation (needs name + mobile).
To change or cancel, first easytable_find_bookings with the mobile the
booking was made under, then easytable_modify_booking /
easytable_cancel_booking with the returned booking id.
Writes are confirmed first
create, modify, and cancel ask the user to confirm before anything is
sent: a confirmation prompt where the client supports one (unless the server
sets MCP_CONFIRM_ELICITATION=off). Otherwise the first
call sends nothing and returns status: "confirmation-required" with a
preview and a confirmToken — show the user the preview, and only after they
approve it in chat call again with the same arguments plus that confirmToken.
The token is single-use; a changed argument is refused as DRAFT_CHANGED with a
fresh preview (see MCP_CONFIRM_MODE).
cancel looks the booking up first (a read) and refuses a bookingId that
isn't one of that mobile's bookings; its preview's booking shows the matching
row (date, time, party) so the user can see which reservation they're cancelling.
create and modify submit a Cloudflare Turnstile token the MCP reads from
the widget tab's hidden input, so a book.easytable.com/book/?id=<id> tab must
be open and loaded when you confirm. The token is single-use and expires after
a few minutes; if a create fails on the token, reload the tab and retry.
If a create/modify comes back with an unknown outcome (a timeout, or a reply
easyTable didn't clearly accept or reject), the booking may already exist —
run easytable_find_bookings with the guest mobile before retrying.
cancel needs no token.
modify replaces the whole booking, and easyTable offers no way to read an
existing booking's email or comment back. Ask the user for the booking's current
email, comment (special requests, allergy notes) and company and pass them
through unchanged, or pass '' to clear one on purpose; the preview lists what
will be cleared.
Notes
- Times are HH:MM; the widget internally uses minute-of-day.
- All reads and the whole booking flow are the user's own actions on their own browser session — no easyTable account or API key is involved.
