Skip to main content
Glama
chrischall

resy-mcp

by chrischall

resy_book

Destructive

Preview an exact slot then confirm to book a table; checks existing reservations, prevents duplicates, and applies the selected payment method.

Instructions

Book a reservation. Composite tool: internally runs find-slots → get booking details → book. It books ONLY the exact slot a preview showed. The first call returns a preview (venue, date, party size, the exact slot time that would be booked, its slot_type, the payment card last-4, and the slot's cancellation_policy / payment_terms — any no-show fee or deposit) and books nothing. Pass desired_time (HH:MM, 24-hour) to target a specific slot. If your exact desired_time is not available the tool does NOT auto-book a different time — it returns the available times so you can pick, unless you pass allow_closest_time:true (which previews the nearest slot). Omit desired_time to preview the first available slot. Resy can list several slots at one time with different seating types (Dining Room / Bar / Patio) and different fees; pass slot_type to target one. To book: on a client without a confirmation prompt the preview comes back with a confirmToken bound to that exact slot and its terms — after the user approves, call again with the same arguments plus the preview's time as desired_time and the confirmToken. On a client that can prompt, call again with the preview's time as desired_time, its slot_type and its terms_token, and the user is asked to confirm. If that slot is gone, or its seating type or cancellation/payment terms changed since the preview, nothing is booked and a fresh preview is returned. Asks the user to confirm first: a confirmation prompt where the client supports one; otherwise the first call returns a preview and a confirmToken, and only a repeat call with that token proceeds (see MCP_CONFIRM_MODE). Before booking, it checks your existing reservations and refuses if you already hold one at this venue on this date (e.g. an earlier call that timed out but went through); pass allow_duplicate:true to book another anyway. Uses the user's default payment method unless payment_method_id is supplied.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latNo
lngNo
dateYesYYYY-MM-DD
venue_idYes
slot_typeNoSeating type (e.g. 'Dining Room', 'Bar', 'Patio'), matched case-insensitively. Only slots of this type are considered. On a client that can prompt it is required to book — pass the preview's slot_type. With a confirmToken it is optional: the token already binds the seating type.
party_sizeYes
terms_tokenNoThe preview's terms_token. It fingerprints the slot's seating type and cancellation/payment terms; if they changed since the preview, the call re-previews instead of booking. Required to book on a client that can prompt; with a confirmToken it is optional, because the token already binds the terms (a change is refused as DRAFT_CHANGED).
confirmTokenNoONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.
desired_timeNoHH:MM (24h)
allow_duplicateNoWhen true, book even if you already hold a reservation at this venue on this date. Default false: the booking refuses and lists the existing reservation, so a retry after a timed-out booking cannot book twice.
payment_method_idNo
allow_closest_timeNoWhen true, if your exact desired_time is unavailable the preview selects the closest slot instead of returning the available times to pick from. It never books on its own: book with that slot's time as desired_time. Default false.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.3.0
    • changedInput schema / properties / slot_type / description
      Previous value: -"Seating type (e.g. 'Dining Room', 'Bar', 'Patio'), matched case-insensitively. Only slots of this type are considered. Required to book — pass the preview's slot_type."New value: +"Seating type (e.g. 'Dining Room', 'Bar', 'Patio'), matched case-insensitively. Only slots of this type are considered. On a client that can prompt it is required to book — pass the preview's slot_type. With a confirmToken it is optional: the token already binds the seating type."
    • changedInput schema / properties / terms_token / description
      Previous value: -"The preview's terms_token, required to book. It fingerprints the slot's seating type and cancellation/payment terms; if they changed since the preview, the call re-previews instead of booking."New value: +"The preview's terms_token. It fingerprints the slot's seating type and cancellation/payment terms; if they changed since the preview, the call re-previews instead of booking. Required to book on a client that can prompt; with a confirmToken it is optional, because the token already binds the terms (a change is refused as DRAFT_CHANGED)."
  2. Changed6 schema fields changedv1.2.1
    • changedInput schema / properties / allow_closest_time / description
      Previous value: -"When true, if your exact desired_time is unavailable the preview selects the closest slot instead of returning the available times to pick from. It never books on its own: confirm with that slot's time as desired_time. Default false."New value: +"When true, if your exact desired_time is unavailable the preview selects the closest slot instead of returning the available times to pick from. It never books on its own: book with that slot's time as desired_time. Default false."
    • changedInput schema / properties / allow_duplicate / description
      Previous value: -"When true, book even if you already hold a reservation at this venue on this date. Default false: a confirm refuses and lists the existing reservation, so a retry after a timed-out booking cannot book twice."New value: +"When true, book even if you already hold a reservation at this venue on this date. Default false: the booking refuses and lists the existing reservation, so a retry after a timed-out booking cannot book twice."
    • removedInput schema / properties / confirm
      Removed value: -{
      -  "description": "Must be true to proceed. Without this, the tool returns a preview.",
      -  "type": "boolean"
      -}
    • addedInput schema / properties / confirmToken
      Added value: +{
      +  "description": "ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same tool's phase-1 \"confirmation-required\" response, passed back ONLY after the user has seen that preview and explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the same arguments. Ignored when the client supports elicitation.",
      +  "type": "string"
      +}
    • changedInput schema / properties / slot_type / description
      Previous value: -"Seating type (e.g. 'Dining Room', 'Bar', 'Patio'), matched case-insensitively. Only slots of this type are considered. Required with confirm:true — pass the preview's slot_type."New value: +"Seating type (e.g. 'Dining Room', 'Bar', 'Patio'), matched case-insensitively. Only slots of this type are considered. Required to book — pass the preview's slot_type."
    • changedInput schema / properties / terms_token / description
      Previous value: -"The preview's terms_token, required with confirm:true. It fingerprints the slot's seating type and cancellation/payment terms; if they changed since the preview, the confirm re-previews instead of booking."New value: +"The preview's terms_token, required to book. It fingerprints the slot's seating type and cancellation/payment terms; if they changed since the preview, the call re-previews instead of booking."
  3. Changed4 schema fields changedv1.1.3
    • changedInput schema / properties / allow_closest_time / description
      Previous value: -"When true, if your exact desired_time is unavailable the closest slot is booked instead of returning the available times to pick from. Default false: an unavailable desired_time never silently books a different time."New value: +"When true, if your exact desired_time is unavailable the preview selects the closest slot instead of returning the available times to pick from. It never books on its own: confirm with that slot's time as desired_time. Default false."
    • addedInput schema / properties / allow_duplicate
      Added value: +{
      +  "description": "When true, book even if you already hold a reservation at this venue on this date. Default false: a confirm refuses and lists the existing reservation, so a retry after a timed-out booking cannot book twice.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / slot_type
      Added value: +{
      +  "description": "Seating type (e.g. 'Dining Room', 'Bar', 'Patio'), matched case-insensitively. Only slots of this type are considered. Required with confirm:true — pass the preview's slot_type.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / terms_token
      Added value: +{
      +  "description": "The preview's terms_token, required with confirm:true. It fingerprints the slot's seating type and cancellation/payment terms; if they changed since the preview, the confirm re-previews instead of booking.",
      +  "minLength": 1,
      +  "type": "string"
      +}
  4. Changed1 schema field changedv1.0.0
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  5. Changed2 schema fields changedv0.5.4
    • addedInput schema / properties / allow_closest_time
      Added value: +{
      +  "description": "When true, if your exact desired_time is unavailable the closest slot is booked instead of returning the available times to pick from. Default false: an unavailable desired_time never silently books a different time.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / confirm
      Added value: +{
      +  "description": "Must be true to proceed. Without this, the tool returns a preview.",
      +  "type": "boolean"
      +}
  6. First observedv0.5.1

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint false, destructiveHint true) are consistent with a mutation tool, and the description goes far beyond them: it discloses the preview-first contract, the confirmToken/terms_token binding, that a changed slot type or cancellation terms re-previews without booking, the DRAFT_CHANGED refusal, and the duplicate-reservation guard that protects against timed-out retries booking twice.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded correctly with the verb and composite behavior, but the confirmation flow is restated twice ('To book: on a client without a confirmation prompt...' and 'Asks the user to confirm first: a confirmation prompt where the client supports one...'), which is redundant for an already dense wall of text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-stakes, multi-param mutation with no output schema and no annotations beyond safety hints, the description covers the preview payload contents, every branch (unavailable time, changed terms, duplicate reservation, confirm vs elicitation clients), and the token plumbing. An agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 58% schema coverage across 12 params, the description supplies the missing semantics for desired_time, slot_type, terms_token, confirmToken, allow_duplicate, allow_closest_time and payment_method_id, including the token/argument combinations required per confirmation mode. It never mentions lat/lng, which remain undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Book a reservation') and immediately clarifies it is a composite (find-slots → get booking details → book) that books ONLY the exact slot a preview showed. This distinguishes it cleanly from the sibling resy_find_slots and from resy_cancel.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when it previews vs books, how to target a slot (desired_time, slot_type), what happens when the exact time is unavailable (no auto-book unless allow_closest_time:true), the duplicate-reservation refusal and its allow_duplicate escape hatch, and the two confirmation paths keyed to MCP_CONFIRM_MODE. Alternatives and exclusions are named rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.