resy-mcp
Summary: Manage your own Resy account via natural language — search venues and availability, book and cancel reservations, and manage favorites and Priority Notify subscriptions.
Profile & account: Get your profile (
resy_get_profile), list saved payment methods (resy_list_payment_methods), and verify credentials/upstream reachability (resy_healthcheck).Discovery: Search venues with availability for a date and party size (
resy_search_venues), list bookable slots at a venue (resy_find_slots), and fetch full venue details (resy_get_venue).Booking: Book a table (
resy_book) — a composite find → details → book flow that targets an exact slot (time, seating type, terms) and always previews before committing; supports payment method selection and duplicate protection.Reservations: List upcoming, past, or all reservations with their
resy_tokens (resy_list_reservations) and cancel one by token (resy_cancel).Favorites: List your favorited venues (
resy_list_favorites) and add or remove them (resy_add_favorite/resy_remove_favorite).Priority Notify: List notify subscriptions (
resy_list_notify) and add or remove them for a venue/date/party size with a time window (resy_add_notify/resy_remove_notify).Safety: Write tools (
resy_book,resy_cancel) require user confirmation, via an elicitation prompt where supported or a two-stepconfirmTokenfallback, withMCP_CONFIRM_MODEcontrol.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@resy-mcpFind available tables at Carbone in NYC for tomorrow night."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
resy-mcp
Resy reservation management as an MCP server for Claude — search restaurants, book tables, manage reservations, favorites, and Priority Notify via natural language.
⚠️ Resy does not publish an official API. This server uses the same private endpoints the Resy web app calls, with the public web-app
api_keyand one of three user-level auth paths (token override, email + password, or a fetchproxy browser bridge). Use at your own discretion.
Tools
Tool | Purpose |
| Current user profile (name, email, booking count) |
| Search venues with availability for a date + party size |
| List bookable slots at a venue |
| Full venue details |
| Book a reservation (composite: find → details → book) |
| Upcoming / past reservations |
| Cancel by |
| Favorited venues |
| Manage favorites |
| Priority Notify subscriptions |
| Manage Priority Notify |
Related MCP server: Restaurant Reservation MCP Server
Acknowledgement of Terms
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses your own Resy account. Auth happens via your own credentials (email/password) or your own signed-in browser session through the ContextMint Bridge extension. It does not — and cannot — access anyone else's reservations.
2. Resy's Terms of Service govern your use of this server, just as they govern your direct use of resy.com. Resy's ToS prohibits the use of bots and automated booking, enforces rate limits, deploys CAPTCHA, and states that automated booking bots can result in account bans. Reservations are not transferable and may not be resold.
You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server.
3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with Resy or American Express. It is a personal automation tool intended only to help one user manage one person's reservations from the command line. Specifically: do not use it to mass-book, snipe slot-tokens the moment they open, resell tables, or compete with Resy. The booking tools exist so you can book the table you would have booked anyway, faster.
4. Stability is not guaranteed. This server calls the same api.resy.com endpoints the Resy mobile app and web app call, with the same public web-app api_key. Resy may change endpoint shapes, rotate keys, or add new bot detection at any time. It may break.
5. You accept full responsibility for any consequences of using this server in connection with your Resy account — rate limiting, slot-lock rejections, account warnings, suspension, or bans. If Resy objects to your use, stop using this server.
This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Resy's actual ToS.
Install
npm install
npm run buildConfigure
Pick one of three auth paths. The client tries them in this priority order:
RESY_AUTH_TOKEN— pre-obtainedx-resy-auth-token. Overrides everything; useful for CI or power users who already have a token.RESY_EMAIL+RESY_PASSWORD— the classic flow. POSTs/3/auth/passwordand caches the returned token.fetchproxy fallback — when no env vars are set, the server uses the fetchproxy browser bridge to call
/3/auth/refreshthrough your signed-in resy.com tab. Install the ContextMint Bridge extension once from its releases page (unzip the Chrome build and load it unpacked atchrome://extensions; Safari isn't available yet — it will ship inside the ContextMint app, which has no public download — so use Chrome for now), sign into resy.com, and that's it — no credentials in env.ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README points to it. Its source is public at nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the
.sha256file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).
Copy .env.example to .env and fill in whichever path you want:
# Path 2: password login (classic)
RESY_EMAIL=you@example.com
RESY_PASSWORD=changeme
# Path 1: direct token (overrides everything)
RESY_AUTH_TOKEN=...
# Opt-out of the fetchproxy fallback (forces 1 or 2)
RESY_DISABLE_FETCHPROXY=1For MCPB / Claude Desktop install, the packaged manifest prompts for all three optional inputs — leave them blank to route through ContextMint Bridge instead.
Confirmations
resy_book and resy_cancel ask you to confirm before they change anything. A client that can show a confirmation prompt (Claude Code) shows one. On a client that cannot, the first call returns a preview and a confirmToken, and only a repeat call with that token goes ahead:
variable | default | |
|
| What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). |
|
| How long a token stays valid. |
| random per process | Signing key; set it only if tokens must survive a server restart. On mcp-host the host supplies a stable per-child key ( |
resy_book additionally books only the exact slot a preview showed. On a client without prompts the preview itself carries the confirmToken, bound to that slot's time, seating type and terms; once you approve, the model repeats the call with the preview's time as desired_time plus the token. On a client with prompts the call must name the slot (desired_time + slot_type + terms_token) before you are asked. If the slot or its terms changed in between, nothing is booked and a fresh preview is returned.
Run (local stdio)
node dist/bundle.jsTest
npm test # tsc typecheck + unit tests (mocked fetch)
npm run smoke # live endpoint probe — requires real .envNotes
The api key is the public one baked into resy.com's JS bundle. It is captured from your signed-in tab and cached, so a rotation is picked up on its own —
RESY_API_KEYpins a specific key instead, and is only needed when you want to override that.Favorites and Priority Notify endpoint paths are reverse-engineered; if live endpoints differ, run
npm run smokeand adjust.
This project was developed and is maintained by AI (Claude Opus 4.7).
Available Tools
15 toolsresy_add_favoriteA
Add a venue to the user's favorites by venue_id.
| Name | Required | Description | Default |
|---|---|---|---|
| venue_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive write, and the description's 'Add' is consistent with that profile. However, it adds no further behavioral detail: idempotency, duplicate handling, error behavior, and response expectations are not disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. It states the action and the method of identifying the venue efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with annotations covering the safety profile, the description gives enough information to know what the tool does and what input is required. A note about response or error behavior would round it out, but nothing essential to invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The phrase 'by venue_id' establishes that the venue is identified by the single parameter, but it largely restates the schema property name. With 0% schema description coverage, more detail would have been helpful, though the parameter is simple and self-descriptive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Add'), names the resource ('a venue'), and specifies the target ('user's favorites'), making the operation unambiguous. It also distinguishes itself from siblings like resy_remove_favorite and resy_list_favorites by the operation type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The wording implies the tool should be used when a user wants to favorite a venue, but it gives no explicit guidance on when to prefer this over alternatives such as resy_remove_favorite or resy_list_favorites. There are no stated exclusions, prerequisites, or contextual conditions beyond the obvious action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_add_notifyA
Subscribe to Priority Notify for a venue/date/party size. Resy emails you when a matching slot opens. time_start / time_end bound the window you're willing to accept (HH:MM, 24h). Resy's notify booking window only accepts near-term dates (~30 days out).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD (must be within Resy's notify window, ~30 days) | |
| time_end | No | Latest acceptable time, HH:MM. Defaults 21:00. | |
| venue_id | Yes | ||
| party_size | Yes | ||
| time_start | No | Earliest acceptable time, HH:MM. Defaults 18:00. | |
| service_type_id | No | Resy service type (2 = dining room, observed default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, destructiveHint=false), so the description carries the burden. It discloses the core behavior (email notification on matching slot) and the date-window limitation, but does not mention side effects like idempotency, whether it replaces existing notifications, or response format. It adds some behavioral context beyond annotations but is not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no fluff, front-loaded with the main purpose. The first sentence states the action, the second explains the effect, and the third gives the time and date constraints. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param tool with no output schema, the description covers the main purpose, the time window, and the date limit. It doesn't mention return value or idempotency, but those are not critical for a subscription tool. It omits the service_type_id default, but that is already in the schema. Overall, an agent can call this correctly without missing essential information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% (4 of 6 params described). The description adds meaning for time_start/time_end (window bounds, HH:MM format) and clarifies the date constraint, but does not elaborate on venue_id, party_size, or service_type_id. Since venue_id and party_size are self-explanatory from their names and the schema covers the rest, the description adds moderate value but does not fully compensate for the 33% missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Subscribe to Priority Notify for a venue/date/party size' – a specific verb, resource, and key parameters. It also explains the outcome ('Resy emails you when a matching slot opens'), making the purpose unambiguous and distinguishable from siblings like resy_remove_notify or resy_list_notify.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on when to use (to get notified about a slot) and a key constraint (notify window ~30 days). It doesn't explicitly mention alternatives or when not to use it, but the purpose is so specific that an agent can infer it should be used when the goal is to be notified rather than to book directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_bookADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lng | No | ||
| date | Yes | YYYY-MM-DD | |
| venue_id | Yes | ||
| slot_type | No | 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. | |
| party_size | Yes | ||
| terms_token | No | 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). | |
| confirmToken | No | 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. | |
| desired_time | No | HH:MM (24h) | |
| allow_duplicate | No | 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. | |
| payment_method_id | No | ||
| allow_closest_time | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
resy_cancelADestructive
Cancel a Resy reservation by its resy_token (the rr://... identifier returned from resy_book or resy_list_reservations). The confirmation preview shows the venue, date, time, party size, and any cancellation fee. 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).
| Name | Required | Description | Default |
|---|---|---|---|
| resy_token | Yes | rr://... reservation identifier | |
| confirmToken | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses the confirmation flow, the two-phase behavior in fallback mode, and that the preview shows venue, date, time, party size, and cancellation fee. This gives the agent a realistic model of the tool's side effects and interaction pattern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action appears in the first phrase, followed only by essential operational details. Every sentence adds useful information, and the confirmation flow is explained without unnecessary padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive cancellation operation with two parameters and no output schema, this description is complete. It explains the token source, the preview contents, and the full confirmation/fallback mechanism, so an agent knows how to invoke it correctly in both supported and fallback modes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already describes both parameters, the description adds critical meaning: resy_token provenance from resy_book or resy_list_reservations, and confirmToken semantics including when it must appear, that it must be passed back with the same arguments, and that it is ignored when elicitation is supported.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Cancel a Resy reservation by its resy_token', and clarifies the exact identifier format plus where it comes from ('returned from resy_book or resy_list_reservations'). This makes the tool's purpose unambiguous and distinct from the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool (to cancel a reservation) and provides required context: the resy_token must come from resy_book or resy_list_reservations. It also gives strong when-not guidance for confirmToken, saying it should 'never be on the first call, never invented, never reused'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_find_slotsARead-only
List available reservation slots at a specific venue for a date + party size. Returns slot config_tokens suitable for booking. Tokens expire quickly; book soon after fetching.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lng | No | ||
| date | Yes | YYYY-MM-DD | |
| venue_id | Yes | ||
| party_size | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks this as a safe read operation; the description adds valuable behavioral context beyond that by disclosing that the response contains config_tokens and that those tokens expire quickly. It does not cover rate limits or live-availability caveats, but it provides material, non-obvious behavior that an agent needs to avoid acting on stale data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler or repetition. It front-loads the core purpose first, then adds the critical return-value and expiry warning. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description appropriately discloses the key return value (config_tokens) and its short lifespan. However, the tool has five parameters with only 20% schema coverage, and the unexplained lat/lng fields create real ambiguity. The description also stops short of connecting the tokens to the specific booking sibling that consumes them, leaving room for an agent to misinterpret the overall flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (just the date format), so the description must compensate for the other parameters. It does clarify venue_id ('specific venue'), date, and party_size conceptually, but lat and lng are completely unexplained and no guidance is given about whether they are optional locators or alternatives to venue_id. This leaves significant parameter ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('available reservation slots at a specific venue'), and clearly identifies the two key query dimensions ('date + party size'). It also states that the output consists of booking-ready config_tokens, which distinguishes it from venue-search and booking tools. An agent can immediately tell what this tool does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys the intended workflow: fetch slots, receive tokens, then book soon afterward because tokens expire quickly. While it does not explicitly name resy_book as the alternative or provide a when-not-to-use statement, the token-expiry warning gives clear operational context and makes the pre-booking usage pattern evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_get_profileARead-only
Get the authenticated Resy user's profile (name, email, phone, booking count, member-since date). Payment method IDs are not exposed.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds useful context by listing the returned fields and explicitly stating that payment method IDs are not exposed, but it does not discuss authentication requirements, errors, or response format. For a read-only profile getter this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with the primary action and returned data. The exclusion of payment method IDs is relevant and earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only, no-required-parameter tool, the description provides the essential return fields and an important exclusion. The optional 'view' parameter is fully documented in the schema, so nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the 'view' parameter already has a detailed description explaining compact versus full response shapes. The tool description itself adds no parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('authenticated Resy user's profile'), then enumerates the returned fields: name, email, phone, booking count, member-since date. The explicit note that payment method IDs are not exposed distinguishes this tool from resy_list_payment_methods.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear this is for profile retrieval and warns that payment method IDs are not exposed, implying it should not be used as a payment-method source. However, it does not explicitly name an alternative tool or provide when-to-use/when-not-to-use guidance beyond that single exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_get_venueBRead-only
Get full details for a single Resy venue by id.
| Name | Required | Description | Default |
|---|---|---|---|
| venue_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates the safe read-only nature. The description adds the expectation that 'full details' will be returned, but it does not disclose any further behavioral traits such as payload size, response format, required authentication, or rate limits. This is acceptable but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no filler or irrelevant details. The verb, resource, and key parameter are front-loaded, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only get-by-id tool, the description is minimally viable, but without an output schema it leaves 'full details' vague. It does not enumerate what venue attributes are included, nor does it mention how to obtain a valid venue_id from sibling tools. This is functional but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining venue_id. It only repeats 'by id' and does not clarify where the ID comes from, how it identifies the venue, or what values are expected beyond the schema's integer type. The parameter semantics are therefore only minimally conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), the resource ('Resy venue'), and the scope ('single ... by id'), making the operation unambiguous. It is clearly distinct from search/list siblings because it targets one venue by ID and promises 'full details'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to choose this tool over resy_search_venues or other venue-related tools. It only implies that a venue_id is required, without stating that the ID likely comes from a prior search or that this tool should be used for fetching a single venue's complete details.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_healthcheckVerify credentials and upstream reachabilityARead-onlyIdempotent
Resolves the credential the way real tools do, then makes one authenticated request to api.resy.com. Reports which source supplied the credential, whether api.resy.com accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a api.resy.com-side problem'. Read-only; never returns the credential itself. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description discloses meaningful behavior: it performs exactly one authenticated request, reports the credential source, round-trip time, and distinguishes failure categories, and explicitly says it never returns the credential itself. This adds security-relevant context not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: behavior, output, safety, and usage are covered in a compact, front-loaded description. There is no filler or repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless diagnostic tool without an output schema, the description is complete: it explains what happens, what gets reported, the safety guarantee, and the intended trigger condition. An agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema fully covers the input contract. The description adds no parameter details, but none are needed; per the rubric, 0 parameters warrants a baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it resolves the credential, makes one authenticated request to api.resy.com, and reports the diagnostic results. It is distinctly a healthcheck/diagnostic tool, clearly differentiated from the domain-operation siblings like resy_book or resy_cancel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Call this when a real tool fails and you want to know which hop broke.' It does not enumerate alternatives or exclusions, but the usage context is clear and not likely to be confused with the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_list_favoritesARead-only
List the user's favorited Resy venues ("hit list").
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already communicates that this is a safe read operation, and the description aligns with that by saying 'List'. The description adds minimal behavioral context beyond purpose, such as the user-scoped nature of the data, but does not disclose details like pagination, ordering, or auth requirements. With the annotation covering the safety profile, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence with no filler. The parenthetical 'hit list' is a useful synonym rather than redundancy, and the core action and target are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional parameter and no output schema, the description plus the detailed parameter schema provide enough context for correct invocation. It does not describe return structure or pagination, but the low complexity and readOnly annotation reduce the need for further elaboration.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the only parameter 'view' is thoroughly documented in the input schema. The tool description itself adds no parameter-level meaning, so it neither helps nor hurts. Baseline 3 is appropriate because the schema already does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('the user's favorited Resy venues'), and adds the helpful 'hit list' alias for clarity. It is clearly distinct from sibling tools like resy_list_reservations, resy_add_favorite, and resy_remove_favorite.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for retrieving favorites, so an agent can infer when to use it. However, it does not explicitly state when not to use it or mention alternatives such as resy_list_reservations or resy_search_venues, leaving the routing entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_list_notifyARead-only
List Priority Notify subscriptions — tables you are waiting for when reservations open up.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already declares safety, and the description's 'List' aligns with that. It adds useful scoping that the results are the current waiting lists, but it does not disclose response format, ordering, pagination, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence that begins with the action and object, with the explanatory clause adding useful domain context. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The operation is a simple read-only list with one optional, well-documented parameter and no required inputs. The description plus schema and annotations give enough to invoke it correctly; only minor details about the returned payload shape are left to the view parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, 'view', is fully documented in the schema with a detailed description of compact vs full response shapes and the rationale for not doing field projection. Since schema coverage is 100%, the description has no burden to add parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a precise resource ('Priority Notify subscriptions') and explains what those are ('tables you are waiting for when reservations open up'). This clearly distinguishes the tool from sibling notify operations like add/remove and from list_reservations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The described use case—viewing tables you are waiting on—gives clear context for when to call it. It does not explicitly name alternatives or when not to use it, but there is no competing 'list notify' sibling, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_list_payment_methodsARead-only
List the user's saved payment methods on Resy. Returns id, brand, last four digits, expiry, and is_default. The id can be passed as payment_method_id to resy_book.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the return field set and downstream integration with resy_book, which is useful, but it does not disclose additional behavioral traits such as authentication requirements, rate limits, or what happens when no payment methods are saved. Given the read-only annotation, a middle score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. It front-loads the core purpose and immediately gives the most important return fields and reuse context, so every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only list operation with one well-documented optional parameter and no output schema, the description covers purpose, return fields, and the key integration use case. Nothing essential for an agent to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the view parameter's description in the schema is already detailed and self-explanatory. The tool description does not add any parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('the user's saved payment methods on Resy'), and enumerates the exact returned fields (id, brand, last four digits, expiry, is_default). This clearly differentiates it from sibling list tools like resy_list_reservations and resy_list_favorites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context by explaining that the returned id can be passed as payment_method_id to resy_book, effectively stating when this tool is useful. It does not explicitly name alternatives or exclusions, but no direct alternative for listing payment methods exists among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_list_reservationsARead-only
List the user's Resy reservations. Defaults to upcoming; pass scope="past" or "all" to broaden. Each result includes the resy_token needed for cancellation, plus occasion/special_request/cancellability.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safe-read profile is already known. The description adds behavioral context beyond that: the default scope ('Defaults to upcoming'), the effect of passing scope values ('pass scope="past" or "all" to broaden'), and the response content (resy_token, occasion, special_request, cancellability). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry all essential information with no filler. Purpose comes first, parameter guidance second, and output payload last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, optional-parameter list tool with no output schema, the description provides enough: the action, scope defaults, and the notable output fields. It lacks pagination or authentication details, but those are less critical given the readOnly annotation and the single enum parameter. The cancellation-token hint also links it to the broader workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description fully compensates by explaining the only parameter: it states the default ('upcoming'), the alternative enum values, and the effect of choosing them ('broaden'). This is meaningful guidance the schema alone does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List the user's Resy reservations.' This clearly distinguishes it from sibling listing tools (e.g., resy_list_payment_methods, resy_list_favorites) by naming the exact resource. It also adds the key deliverable (resy_token) that ties it to the cancellation workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: 'Each result includes the resy_token needed for cancellation' routes an agent toward this tool when preparing for resy_cancel. It does not explicitly name alternatives or exclusions, but the default-to-upcoming scope and the 'to broaden' phrasing give practical usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_remove_favoriteA
Remove a venue from the user's favorites by venue_id.
| Name | Required | Description | Default |
|---|---|---|---|
| venue_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation already states readOnlyHint=false, indicating the tool mutates state. The description adds no further behavioral traits – no idempotency, side effects, consent requirements, or failure behavior. It simply restates the action, providing no transparency beyond what the annotation already offers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence that front-loads the action and critical information. Every word contributes; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one required param, no output schema) and annotations cover the basic safety profile. The description fully identifies the action and parameter. Minor omissions like error conditions or prerequisite that the venue must already be a favorite are not critical given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain the parameter. It names 'venue_id' and indicates it identifies the venue to remove, but does not clarify how to source it (e.g., from resy_search_venues) or any additional context. For a single integer parameter, this is minimally adequate but adds little beyond the parameter name itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Remove'), a specific resource ('a venue from the user's favorites'), and the required parameter ('by venue_id'). This clearly distinguishes it from sibling tools like resy_add_favorite and resy_list_favorites, and even from resy_remove_notify which targets a different resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: remove a favorite by providing venue_id. However, the description gives no explicit when-to-use guidance, no exclusions, and does not mention alternatives such as resy_remove_notify or when not to use this tool (e.g., if the venue is not a favorite). It relies on the agent to infer context from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_remove_notifyA
Cancel a Priority Notify subscription by notify_id. The tool looks up the full spec from resy_list_notify internally — no other input needed.
| Name | Required | Description | Default |
|---|---|---|---|
| notify_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool as mutating but non-destructive, so the description is not required to restate that. It adds one useful behavioral detail: the tool internally looks up the full spec from resy_list_notify, which explains why only notify_id is needed. It does not discuss idempotency or error behavior, but the cancel action is clear and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the active purpose, and no filler. The internal-lookup detail is the only extra information and it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter cancellation tool with no output schema, the description covers the action, the exact required input, and why that input is sufficient. The only minor gap is that it doesn't state failure behavior for a nonexistent notify_id, but that is not essential to selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides no parameter descriptions, so the description must carry the meaning. It identifies notify_id as the subscription identifier and explicitly states that no other input is needed, which is the critical semantic missing from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Cancel'), a concrete resource ('Priority Notify subscription'), and the key identifier ('notify_id'). This makes the tool's function obvious and separates it from sibling list/add tools even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for canceling an existing subscription rather than listing or adding one, and it notes that no other input is needed. However, it never explicitly says when to choose this over resy_add_notify or how to obtain a valid notify_id, so routing is left mostly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resy_search_venuesARead-only
Search Resy for restaurants with availability. Returns venues including any bookable slot tokens for the requested date + party size. Defaults to NYC geo if lat/lng omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude (default 40.7128 NYC) | |
| lng | No | Longitude (default -73.9876 NYC) | |
| date | Yes | Desired date YYYY-MM-DD | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs. | |
| limit | No | Max venues (default 20) | |
| query | No | Venue name or keyword | |
| party_size | Yes | Number of guests | |
| radius_meters | No | Search radius in meters (default 16100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a read operation, and the description adds useful behavior beyond that: it returns venue objects with bookable slot tokens and defaults to NYC geo when lat/lng are omitted. It does not cover pagination or rate limits, but for a read-only search tool the annotations and description together are reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no filler. The core purpose is front-loaded, followed by the key return characteristic and the default geo behavior. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema, the description gives only an overview: venues and bookable slots, plus the geo default. It does not describe response shape details, pagination, or how the returned venue identifiers might relate to downstream tools like resy_get_venue or resy_find_slots. It is adequate but leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description mostly restates the date/party size relationship and the lat/lng defaults already present in the schema, adding little beyond what structured fields provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: 'Search Resy for restaurants with availability.' It also specifies the returned data ('venues including any bookable slot tokens') and the date/party context requested. However, it does not explicitly distinguish itself from sibling tools like resy_find_slots or resy_get_venue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: use this when searching for restaurants with availability for a date and party size, with optional geo or keyword narrowing. It does not mention when to prefer sibling tools like resy_find_slots or resy_get_venue, and it offers no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.3.0- Changed
resy_book2 fields changed- changed
Input schema / properties / slot_type / descriptionPrevious 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." - changed
Input schema / properties / terms_token / descriptionPrevious 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 tool updates
v1.2.1- Changed
resy_book6 fields changed- changed
Input schema / properties / allow_closest_time / descriptionPrevious 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." - changed
Input schema / properties / allow_duplicate / descriptionPrevious 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." - removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded 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" +} - changed
Input schema / properties / slot_type / descriptionPrevious 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." - changed
Input schema / properties / terms_token / descriptionPrevious 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."
- Changed
resy_cancel2 fields changed- removed
Input schema / properties / confirmRemoved value: -{ - "description": "Must be true to proceed. Without this, the tool returns a preview.", - "type": "boolean" -} - added
Input schema / properties / confirmTokenAdded 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" +}
1 tool update
v1.1.3- Changed
resy_book4 fields changed- changed
Input schema / properties / allow_closest_time / descriptionPrevious 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." - added
Input schema / properties / allow_duplicateAdded 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" +} - added
Input schema / properties / slot_typeAdded 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" +} - added
Input schema / properties / terms_tokenAdded 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" +}
15 tool updates
v1.0.0- Changed
resy_add_favorite1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_add_notify1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_book1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_cancel1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_find_slots1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_get_profile1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_get_venue1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_healthcheck1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_list_favorites1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_list_notify1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_list_payment_methods1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_list_reservations1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_remove_favorite1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_remove_notify1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
resy_search_venues1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
5 tool updates
v0.13.0- Changed
resy_get_profile2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
resy_list_favorites2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
resy_list_notify2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
resy_list_payment_methods2 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
resy_search_venues1 field changed- added
Input schema / properties / viewAdded value: +{ + "description": "Response shape: \"compact\" (default) drops fields the response already carries elsewhere; \"full\" returns every field this server understands. compact strips image/avatar URLs from the response; \"full\" returns Resy's payload untouched. No field projection: this server has no verified record of which Resy fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
1 tool update
v0.9.0- Added
resy_healthcheck
4 tool updates
v0.6.2- Added
resy_get_profile - Added
resy_get_venue - Added
resy_list_payment_methods - Added
resy_search_venues
4 tool updates
v0.6.1- Removed
resy_get_profile - Removed
resy_get_venue - Removed
resy_list_payment_methods - Removed
resy_search_venues
2 tool updates
v0.5.4- Changed
resy_book2 fields changed- added
Input schema / properties / allow_closest_timeAdded 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" +} - added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true to proceed. Without this, the tool returns a preview.", + "type": "boolean" +}
- Changed
resy_cancel1 field changed- added
Input schema / properties / confirmAdded value: +{ + "description": "Must be true to proceed. Without this, the tool returns a preview.", + "type": "boolean" +}
TDQS
Scored across 15 tools
Most tools target clearly distinct resources/actions (venue details vs search vs slots, favorites CRUD, notify CRUD). The only mild overlap is between resy_search_venues (returns venues with slot tokens) and resy_find_slots (lists slots at a specific venue), but the descriptions make the boundary clear enough.
All 15 tools share the resy_ prefix and follow a predictable verb_noun or action pattern (list_x, add_x, remove_x, get_x). Minor deviations are resy_book, resy_cancel (verb-only) and resy_healthcheck (noun-only), but these remain readable and consistent in spirit.
15 tools sits at the top of the ideal 3-15 range and each one maps to a real capability (venue lookup, slot finding, booking, cancelling, favorites, notify, payment, profile, health). No filler tools.
Favorites and Priority Notify have full list/add/remove coverage, and reservations cover book/list/cancel plus discovery. The main gap is that an existing reservation cannot be modified/updated, and payment methods are read-only, but these are reasonable limitations users can work around.
Maintenance
Related MCP Connectors
Find Resy restaurants and request reservations through Scout; the user approves every booking.
Book hard-to-get restaurant reservations on your own Resy, SevenRooms, or OpenTable account.
- OpenAjanOAuthcom.openajan
Find local shops, read live menus and free times, and order or book on the user's behalf.
Discover and book businesses via AI agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables restaurant reservation management through SevenRooms API, allowing users to create reservations and query available time slots with guest details and party size information.-
- FlicenseBqualityFmaintenanceEnables users to search, check availability, and book restaurant reservations across Resy and OpenTable platforms. It supports direct booking for Resy and includes an automated reservation 'sniper' for securing high-demand slots the moment they become available.124-
- AlicenseAqualityAmaintenanceManage OpenTable reservations via natural language — find slots, book, cancel, manage favorites, and read your dashboard using your own browser session.14641 npmMIT
- AlicenseAqualityCmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, including managing booking history and handling multi-factor authentication.962 npmMIT