Skip to content
Docs · MCP server

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 waitlist

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

ScopeWhat it grants
org:read

Organization Read

View organization data
menu:read

Menu Read

View menus, sections, items and specials
menu:write

Menu Write

Create and update menus and items, and publish them
booking:read

Booking Read

View bookings, availability, resources and service types — not revenue or margin
booking:write

Booking Write

Create, confirm, reschedule and cancel bookings
event:read

Event Read

View events and their registrations
event:write

Event Write

Create, update and publish events
contact:read

Contact Read

View guest contacts and groups
contact:write

Contact Write

Create and update guest contacts and their group membership
loyalty:read

Loyalty Read

View visits, points and rewards
staff:read

Staff Read

View staff members, the rota and coverage — not pay or labour cost
analytics:read

Analytics 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 tools

Generated 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:read
  • list_propertiesRead onlyGET /api/organizations/:organizationId/properties

    List 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:read
  • list_menusRead onlyGET /api/menus

    List an organization's menus with their status (draft, published, archived). Supports a search term.

  • get_menuRead onlyGET /api/menus/:menuId

    Read one menu in full: its categories, the items filed under each, prices, allergens and dietary tags.

  • list_menu_itemsRead onlyGET /api/menu-items

    Search 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/specials

    List a menu's daily specials with the dates each one runs.

Change the menu

menu:write
  • create_menu_specialChanges dataPOST /api/menus/:menuId/specials

    Add a daily special to a menu for a given date or date range.

  • set_menu_item_availabilityChanges dataPATCH /api/menus/:menuId/categories/:assignmentId/items/:itemAssignmentId

    Change 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/publish

    Publish 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:read
  • get_booking_availabilityRead onlyGET /api/public/bookings/availability/slots

    Free 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-resources

    List the bookable resources at a venue — tables, rooms, chairs, courts — with their capacities.

  • list_booking_service_typesRead onlyGET /api/booking-service-types

    List the service types a venue takes bookings for (dinner service, treatment, rental) with their durations.

  • list_bookingsRead onlyGET /api/bookings

    List 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/:bookingId

    Read one booking: guest, party size, time, assigned resources, status and notes.

Take and change bookings

booking:write
  • create_bookingChanges dataPOST /api/bookings

    Take 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/confirm

    Confirm 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/reschedule

    Move 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/cancel

    Cancel 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:read
  • list_eventsRead onlyGET /api/events

    List events, filterable by venue, status, category, search term, or upcoming-only.

  • get_eventRead onlyGET /api/events/:eventId

    Read one event: schedule, venue, capacity, ticketing and whether it is published.

  • list_event_registrationsRead onlyGET /api/events/:eventId/registrations

    List 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:write
  • create_eventChanges dataPOST /api/events

    Create an event at a venue. It starts as a draft and is not public until publish_event runs.

  • publish_eventChanges dataPOST /api/events/:eventId/publish

    Publish a draft event so it appears on the venue's public page and starts taking registrations.

Read the guest book

contact:read
  • list_contactsRead onlyGET /api/contacts

    Search 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/:contactId

    Read one guest: contact details, consent state, and the email and phone endpoints they can be reached on.

  • list_contact_groupsRead onlyGET /api/contact-groups

    List 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:write
  • create_contactChanges dataPOST /api/contacts

    Add 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/members

    Put a guest into a contact group. Groups are how this product tags people — there is no separate tag.

Read visits and loyalty

loyalty:read
  • list_visitsRead onlyGET /api/loyalty/visits

    Visit history: recorded guest check-ins, filterable by guest, venue, status and date range. This answers "when was she last in".

Read the rota

staff:read
  • list_staff_membersRead onlyGET /api/staff-members

    List the people on a venue's team, with their roles and employment state.

  • list_staff_shiftsRead onlyGET /api/staff-shifts

    The 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/day

    Coverage 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:read
  • get_booking_analyticsRead onlyGET /api/booking-analytics/summary

    Booking 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/covers

    Booked covers by day and service type over a date range.

  • get_labour_cost_reportRead onlyGET /api/staff-reporting/labour-cost

    Rostered labour cost against booked covers for one venue over a date range, including cost per cover.