Let an agent read the diary
The Model Context Protocol is how an assistant asks another system for things. This page is the server we speak it with: what it can be asked, what a key is allowed to reach, and what happens when it is asked for more.
You cannot mint a key yet
API keys are switched off in production. The endpoint below is up and answers the protocol handshake, so a client will connect and list the tools, and then every single call comes back 401 because no key exists to authenticate with. Nothing on this page is pastable today. Put your name down and we will tell you the day that changes.
Join the waitlistWhat it is
A thin proxy in front of the same REST API the dashboard uses.
It holds no database connection and decides nothing on its own. Tenancy, plan limits, validation and rate limits are all enforced by the API, which is the only place they can be enforced once. Every tool below maps onto a route that already exists, gated on a permission that is already checked.
MCP is an open protocol, so any client that speaks it works. We do not have a favourite.
What a key is
One credential, one organization, and as little reach beyond that as you care to leave it.
Pinned to one organization
The organization is chosen when the key is minted and cannot be changed after. A call that names another one is refused with a 403 that no permission can widen. An agent working across two companies needs two keys.
Narrowable to specific venues
An organization may hold six restaurants, and a key does not have to reach all of them. Tick the venues it may work at and a call aimed anywhere else is refused, including a list call that names no venue at all.
Narrowable to specific actions
Read the menu at both venues, take bookings only downtown. Actions are granted per venue, so the narrowing is a grid rather than a single switch.
Written down, and reversible
Anything a key changes is recorded before the change happens, with the arguments, the record it touched and how it looked beforehand. If the record cannot be written the call does not run. Most changes can be put back from your settings by a person.
Scopes
A scope is the coarse permission a key carries. A write scope implies its matching read, so tick the narrowest one that does the job. The commercial numbers sit behind their own scope and are implied by nothing.
| Scope | What it grants |
|---|---|
org:readOrganization Read | View organization data |
menu:readMenu Read | View menus, sections, items and specials |
menu:writeMenu Write | Create and update menus and items, and publish them |
booking:readBooking Read | View bookings, availability, resources and service types — not revenue or margin |
booking:writeBooking Write | Create, confirm, reschedule and cancel bookings |
event:readEvent Read | View events and their registrations |
event:writeEvent Write | Create, update and publish events |
contact:readContact Read | View guest contacts and groups |
contact:writeContact Write | Create and update guest contacts and their group membership |
loyalty:readLoyalty Read | View visits, points and rewards |
staff:readStaff Read | View staff members, the rota and coverage — not pay or labour cost |
analytics:readAnalytics Read | View revenue, margin, covers, no-show rate and labour cost reports |
There is no admin scope on offer. It would satisfy every tool including the ones added after the key was minted, which is not something anyone can agree to by ticking a box.
Connecting, once keys are on
Two lines in your client config. The endpoint is a hosted streamable HTTP transport, so there is nothing to install and nothing to keep running.
Copy this today and your client will connect, list the tools, and get a 401 on the first call. That is expected, not a misconfiguration.
{
"mcpServers": {
"guestavo": {
"type": "http",
"url": "https://mcp.guestavo.com/mcp",
"headers": { "Authorization": "Bearer gvsk_your_key_here" }
}
}
}What refusal looks like
A missing permission comes back as a 403 naming the one it wanted, so the person who minted the key can fix it from settings without reading this page. A key aimed at the wrong organization or the wrong venue comes back as a 403 that no permission fixes.
The tools
34 toolsGenerated from the registry the server itself reads, so this list cannot drift from what a client will see. Grouped the way the permission screen groups them, which is the way an owner decides.
No tool here messages a guest. Booking tools that would normally send a confirmation or a cancellation email run with that suppressed when the caller is a key, because an email to a real person is the one thing no undo button can take back.
Find our venues
org:readlist_propertiesRead onlyGET /api/organizations/:organizationId/propertiesList the venues (properties) in an organization. Start here to get the propertyId that menu, booking, event and staff tools ask for.
Read the menu
menu:readlist_menusRead onlyGET /api/menusList an organization's menus with their status (draft, published, archived). Supports a search term.
get_menuRead onlyGET /api/menus/:menuIdRead one menu in full: its categories, the items filed under each, prices, allergens and dietary tags.
list_menu_itemsRead onlyGET /api/menu-itemsSearch the dish catalogue by name across the whole organization. Items live independently of the menus they appear on, so use this to find a dish when the menu is unknown.
list_menu_specialsRead onlyGET /api/menus/:menuId/specialsList a menu's daily specials with the dates each one runs.
Change the menu
menu:writecreate_menu_specialChanges dataPOST /api/menus/:menuId/specialsAdd a daily special to a menu for a given date or date range.
set_menu_item_availabilityChanges dataPATCH /api/menus/:menuId/categories/:assignmentId/items/:itemAssignmentIdChange the availability note or price override of one item as it appears on one menu. This is how a dish comes off tonight, or goes lunch-only, without being deleted.
publish_menuChanges dataPOST /api/menus/:menuId/publishPublish a menu so the venue's public page and QR code serve it. Draft edits are invisible to guests until this runs.
Read the diary
booking:readget_booking_availabilityRead onlyGET /api/public/bookings/availability/slotsFree booking slots at a venue on one date, optionally narrowed by party size, service type or resource. Call before create_booking. Name the venue by propertyId or by propertySlug.
list_booking_resourcesRead onlyGET /api/booking-resourcesList the bookable resources at a venue — tables, rooms, chairs, courts — with their capacities.
list_booking_service_typesRead onlyGET /api/booking-service-typesList the service types a venue takes bookings for (dinner service, treatment, rental) with their durations.
list_bookingsRead onlyGET /api/bookingsList bookings for an organization, filterable by venue, date range, status and guest name. This answers "who is coming in tonight".
get_bookingRead onlyGET /api/bookings/:bookingIdRead one booking: guest, party size, time, assigned resources, status and notes.
Take and change bookings
booking:writecreate_bookingChanges dataPOST /api/bookingsTake a booking for a guest at a venue on a date and time. Check get_booking_availability first; an identical repeat is answered from the first call, not booked twice. The guest is not emailed; the venue confirms.
confirm_bookingChanges dataPOST /api/bookings/:bookingId/confirmConfirm a pending booking. The guest is not emailed by this call; the venue tells them. Do not report to the caller that the guest has been notified.
reschedule_bookingChanges dataPOST /api/bookings/:bookingId/rescheduleMove an existing booking to a different date or time, keeping the guest and party size. The guest is not emailed about the change; the venue tells them.
cancel_bookingChanges dataPOST /api/bookings/:bookingId/cancelCancel a booking, with an optional reason recorded against it. The reason does not reach the guest and no cancellation email is sent; the venue tells them.
Read events
event:readlist_eventsRead onlyGET /api/eventsList events, filterable by venue, status, category, search term, or upcoming-only.
get_eventRead onlyGET /api/events/:eventIdRead one event: schedule, venue, capacity, ticketing and whether it is published.
list_event_registrationsRead onlyGET /api/events/:eventId/registrationsList who has registered for an event, with party sizes and check-in state. This answers "how many are coming to the quiz".
Create and publish events
event:writecreate_eventChanges dataPOST /api/eventsCreate an event at a venue. It starts as a draft and is not public until publish_event runs.
publish_eventChanges dataPOST /api/events/:eventId/publishPublish a draft event so it appears on the venue's public page and starts taking registrations.
Read the guest book
contact:readlist_contactsRead onlyGET /api/contactsSearch guests by name, email or phone, optionally within one contact group. Use it to resolve a name to a contactId.
get_contactRead onlyGET /api/contacts/:contactIdRead one guest: contact details, consent state, and the email and phone endpoints they can be reached on.
list_contact_groupsRead onlyGET /api/contact-groupsList contact groups (segments), static and rule-based, with member counts. Use it to find the groupId for add_contact_to_group.
Add and file guests
contact:writecreate_contactChanges dataPOST /api/contactsAdd a guest to the contact book. Creating a contact is not a marketing opt-in — consent is recorded separately.
add_contact_to_groupChanges dataPOST /api/contact-groups/:groupId/membersPut a guest into a contact group. Groups are how this product tags people — there is no separate tag.
Read visits and loyalty
loyalty:readlist_visitsRead onlyGET /api/loyalty/visitsVisit history: recorded guest check-ins, filterable by guest, venue, status and date range. This answers "when was she last in".
Read the rota
staff:readlist_staff_membersRead onlyGET /api/staff-membersList the people on a venue's team, with their roles and employment state.
list_staff_shiftsRead onlyGET /api/staff-shiftsThe rota over a date range: who is on, when, in what role, and which shifts are still open. Requires from and to dates.
get_staff_coverage_dayRead onlyGET /api/staff-coverage/dayCoverage for one venue on one date: rostered hours against expected demand, hour by hour, so a gap is visible. This answers "are we short on Saturday".
Read the reports, including money
analytics:readget_booking_analyticsRead onlyGET /api/booking-analytics/summaryBooking trend, capacity use, no-show rate, revenue and margin over a date range. The general "how did we do" number.
get_covers_reportRead onlyGET /api/booking-reporting/coversBooked covers by day and service type over a date range.
get_labour_cost_reportRead onlyGET /api/staff-reporting/labour-costRostered labour cost against booked covers for one venue over a date range, including cost per cover.