opentable-mcp
This server turns your signed-in OpenTable browser session into an MCP interface so Claude can manage reservations, search restaurants, and handle account data via natural language.
Search & discover restaurants — search by cuisine/name/location and get full details (cuisine, price band, rating, hours, address, phone, payment options)
Find available reservation slots — query by restaurant, date, time, and party size to get bookable slots with tokens
Book reservations — with a required dry-run/confirm flow; supports CC-required slots via preview token, auto-resolves dining area, and returns confirmation number + security token
Preview before booking — see cancellation policy, credit-card no-show fees, and held payment card before committing
List reservations — upcoming, past, or all, each with the security token needed to cancel or modify
Modify reservations — change date/time/party size of an existing booking while preserving the confirmation number
Cancel reservations — cancel with a dry-run confirm guard taking no action unless confirmed
Manage favorites — list, add, and remove saved restaurants
View your profile — name, email, phone, loyalty points/tier, home metro, member-since date (no payment details exposed)
Healthcheck — verify the browser bridge is connected
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., "@opentable-mcpfind dinner slots for 4 at Gramercy Tavern on Saturday"
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.
opentable-mcp
OpenTable reservation manager as an MCP server for Claude — find slots, book, cancel, manage favorites, and read your dashboard via natural language.
v0.3.0-alpha status: Chrome-extension bridge, 10 tools, read + write. Every OpenTable request is relayed through your signed-in Chrome tab over a localhost WebSocket — each request rides your existing session and reaches OpenTable as if you'd clicked it yourself.
How it works
OpenTable's edge (Akamai Bot Manager) enforces a behavioral challenge on /, /s, /r/…, /dapi/…, and /booking/…. Tooling that builds its own HTTP client — cycletls, impersonated curl, headless Chrome — invents a separate identity and gets a 403 or JS interstitial. opentable-mcp does the opposite: it uses your own browser session as-is, with the cookies and TLS context it already has.
So instead of standing in for the browser, this MCP server:
Starts a WebSocket listener on
127.0.0.1:37149via@fetchproxy/server.The fetchproxy browser extension (installed once, shared across all fetchproxy-based MCPs) connects from your signed-in browser and relays every request through the opentable.com tab via
fetch(..., { credentials: 'include' })— your TLS, your cookies, your already-solved_abck.Parses JSON responses (public GraphQL / JSON endpoints) and SSR HTML (
/user/*) into tool-shaped output.
No cookie-pasting. No cycletls. No Playwright. Just your own browser, acting on its own behalf — the MCP server only picks what to ask for.
Related MCP server: resy-mcp
Tools
Tool | Kind | Source |
| read |
|
| read |
|
| read |
|
| read |
|
| read |
|
| read |
|
| read |
|
| write |
|
| write |
|
| read |
|
| write |
|
| write |
|
| write |
|
| read |
|
Acknowledgement of Terms
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses your own OpenTable account. Every request is dispatched through your own signed-in browser tab via the fetchproxy extension (or hangwin/mcp-chrome). It does not — and cannot — access anyone else's reservations.
2. OpenTable's Terms of Use govern your use of this server, just as they govern your direct use of opentable.com. The clauses most relevant here:
You may not use any deep-link, robot, spider, scraper, generative AI or other AI technology including, but not limited to, those that operate by interacting with or otherwise making use of your browser, such as automated assistants or other automatic or manual device, process, or means to access, copy, search, or monitor any portion of the Services or OpenTable Content, except as expressly authorized by OpenTable.
And, critically: "Actions of AI agents are acknowledged as actions of the User that is using them, and the User is responsible for checking and verifying the action…"
You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. OpenTable's ToU explicitly enumerates AI/automated-assistant access among the things they have not authorized; they also explicitly impute AI-agent actions back to you.
3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with OpenTable, Inc. It is a personal automation tool that drives the same /dapi/... and /booking/... endpoints opentable.com uses. Do not use it to mass-book, sweep CC-required tables, resell reservations, or for any commercial purpose. The book/cancel/modify tools exist so you can manage one reservation as if you were sitting at your browser.
4. Stability is not guaranteed. This server depends on internal OpenTable persisted-GraphQL query hashes that OpenTable rotates between deployments. When they rotate, tools break and we re-capture them. Your own use is at the mercy of OpenTable's release cadence.
5. You accept full responsibility for any consequences of using this server in connection with your OpenTable account — rate limiting, slot-lock rejections, no-show penalties for runaway bookings, account warnings, suspension, or any enforcement action. Per OpenTable's ToU, the AI agent's actions are your actions — review every book/cancel before you confirm. If OpenTable 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 OpenTable's actual ToU.
Install
npm install
npm run buildInstall the fetchproxy extension
opentable-mcp shares one browser extension with every other fetchproxy-based MCP. Install it once from https://github.com/chrischall/fetchproxy:
Install the fetchproxy extension (Chrome Web Store / Safari
.dmg).Sign in to
https://www.opentable.com/in that same browser profile.The extension badge shows a green dot when the WebSocket + tab + auth cookie are all detected.
After that, any MCP client that launches node dist/bundle.js will reach OpenTable through your signed-in tab.
Full setup + troubleshooting guide: see the fetchproxy repo for the status-dot reference, WS protocol, and request lifecycle. Persisted-query hash capture for OpenTable redeploys is documented in CLAUDE.md here.
Configure (Claude Desktop / Claude Code)
{
"mcpServers": {
"opentable": {
"command": "node",
"args": ["/absolute/path/to/opentable-mcp/dist/bundle.js"]
}
}
}No env vars required by default — auth lives in the browser, not the MCP process.
Optional: bridge through hangwin/mcp-chrome instead
If you've installed hangwin/mcp-chrome for browser automation, opentable-mcp can route its OpenTable fetches through it instead of the fetchproxy extension:
{
"mcpServers": {
"opentable": {
"command": "node",
"args": ["/absolute/path/to/opentable-mcp/dist/bundle.js"],
"env": { "OT_BRIDGE": "mcp-chrome" }
}
}
}In that mode you don't need the fetchproxy extension. Every OpenTable request becomes a chrome_network_request call against your existing mcp-chrome install, pinned via tabUrl to an opentable.com tab.
Note: this path requires mcp-chrome ≥ the release containing PR #348 (tabUrl parameter on chrome_network_request). Pre-#348 mcp-chrome versions are active-tab-only and will misbehave for cross-origin fetches. Live-verification of this path is pending the upstream merge.
Other env vars: OT_WS_PORT (default 37149) overrides the fetchproxy WebSocket port; OT_MCP_CHROME_URL (default http://127.0.0.1:12306/mcp) overrides the mcp-chrome endpoint.
Run (local stdio)
node dist/bundle.jsTest
npm test # vitest, 72 unit tests, mocked fetch
npm run build # tsc + esbuild bundle
npx tsx scripts/probe-find-slots.ts # live GET round-trip via extension
npx tsx scripts/probe-list-res.ts # live dashboard SSRThe scripts/probe-*.ts files spin up the MCP server, call one or two tools through the extension bridge, and print the response. They require the extension to be loaded and an opentable tab to be open.
Troubleshooting
Red dot in popup / "extension offline" errors. See the fetchproxy extension's troubleshooting guide — most "extension offline" issues are upstream lifecycle bugs (service-worker sleep, dead content script), not opentable-mcp.
Behavioral challenge page in Chrome. Akamai sometimes interrupts a long-idle tab with a "verify you're human" interstitial. Click through it once and the tab is usable again.
list_favoritesdoesn't reflect a freshadd_favorite. The/user/favoritesSSR page is cached for a few seconds. Re-list after ~10 s or verify viaopentable_get_profile's count.
Layout
src/transport-fetchproxy.ts—FetchproxyTransport: thin adapter over@fetchproxy/server'sFetchproxyServer, the shared WebSocket bridge that talks to the fetchproxy browser extension.src/client.ts—OpenTableClient: wraps the transport withfetchJson/fetchHtml+ error-mapping.src/tools/*.ts— one file per concern (reservations / restaurants / favorites / user / search). Each exportsregisterXxxTools(server, client).src/parse-*.ts— pure HTML/JSON parsers, fully unit-tested.tests/— 1:1 mirror ofsrc/, vitest. WS-protocol-level tests live upstream in the fetchproxy repo.scripts/probe-*.ts— live round-trip probes (require the fetchproxy extension + sign-in).
Known quirks
Apollo persisted queries. Slot search, slot lock, cancel, autocomplete — all use
extensions.persistedQuery.sha256Hashwith hashes captured from opentable.com. If OpenTable re-deploys, the server returnsPersistedQueryNotFound; seeCLAUDE.md→ "Hot spots" for the re-capture procedure.dining_area_idis a required book arg. We can't auto-resolve rooms, so pass the restaurant's slug or numeric id toopentable_get_restaurant(slugs route to/r/{slug}, numeric ids to/restaurant/profile/{id}), readdiningAreas[], and feed the id intoopentable_book.Service-worker sleep. MV3 SWs sleep after ~30 s idle. The fetchproxy extension keeps itself warm; on cold wake, the first request may wait up to ~5 s for WS reconnect.
This project was developed and is maintained by AI (Claude Opus 4.7).
Available Tools
14 toolsopentable_add_favoriteB
Add a restaurant to the user's Saved Restaurants list.
| Name | Required | Description | Default |
|---|---|---|---|
| restaurant_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavior. It only says 'Add' which implies mutation, but does not mention side effects, idempotency, authentication requirements, potential errors, or what happens if the restaurant is already saved. For a mutation tool with zero annotation coverage, this is a significant gap.
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, efficient sentence with zero waste. It front-loads the action and target, making it immediately scannable. Every word 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 mutation tool with no annotations and no output schema, the description is incomplete. It omits how to source the restaurant_id, whether the operation is idempotent, what the response looks like, and any error conditions. An agent would need to guess at critical details, making it insufficient for safe and correct invocation.
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. It mentions 'a restaurant' but does not explain the restaurant_id parameter, how to obtain it, or its format. The schema only provides an integer range, which is insufficient for an agent to correctly select the ID. The description adds minimal meaning beyond 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 clearly states the verb 'Add' and the resource 'restaurant' with the target 'user's Saved Restaurants list', making its purpose unambiguous. It naturally distinguishes itself from siblings like opentable_remove_favorite and opentable_list_favorites by naming the specific action.
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: when you want to save a restaurant for later. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention any prerequisites or conditions. It leaves the agent to infer the appropriate context, though the action is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_bookA
Book an OpenTable reservation. Requires a fresh slot_hash + reservation_token from opentable_find_slots (tokens expire within minutes — call find_slots just before book). dining_area_id is OPTIONAL: when omitted it's auto-resolved to the default dining area from OpenTable's booking-details page, so find_slots → book works without a separate opentable_get_restaurant call. For CC-required slots (prime-time at busy restaurants), opentable_book refuses without a booking_token from opentable_book_preview — the preview step surfaces the cancellation policy and the saved card that would be held. Auto-fetches the user's profile (name/email/phone) from /user/dining-dashboard. Returns confirmation_number + security_token; save both — they're required to cancel. For Listing-type restaurants there's no slot to lock — callers should check opentable_get_restaurant.bookable first and surface the restaurant's phone/URL instead. Without confirm:true this returns a dry-run and makes NO booking; re-run with confirm:true to commit.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — must match the slot returned by find_slots | |
| confirm | No | Must be true to proceed. Without this, the tool returns a preview. | |
| slot_hash | Yes | slot_hash from opentable_find_slots | |
| party_size | Yes | ||
| booking_token | No | Opaque token from opentable_book_preview. REQUIRED for CC-required slots (book will refuse otherwise). Optional for standard slots — when present, skips a redundant re-lock. | |
| experience_id | No | Tamper-check signal for Experience tokens. When set, must match the experienceId baked into the booking_token by preview — agents that re-state the experience choice here get refused if it drifted from preview. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional dining-area (room) id. When omitted, auto-resolved to the default dining area from the booking-details page — no opentable_get_restaurant call needed. Pass explicitly only to pin a specific room. Ignored on the booking_token path (the token already carries the resolved area). | |
| experience_ids | No | Pass-through from find_slots.experience_ids. When non-empty, book refuses without a booking_token from opentable_book_preview. | |
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| reservation_token | Yes | slot_availability_token from opentable_find_slots |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden — and it is thorough. It discloses that tokens expire within minutes, that the tool auto-fetches the user's profile, that it returns confirmation_number + security_token needed for cancellation, that CC-required slots refuse without booking_token, and that confirm:true is required to commit while omitting it produces a dry-run with no booking.
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 dense and every sentence contributes a distinct operational fact, but it is a long single paragraph that mixes workflow, parameter nuances, return values, and edge cases. It is efficient rather than padded, though minor restructuring or bullets would improve scannability.
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 mutating, 12-parameter tool with no annotations and no output schema, the description is nearly complete: it covers required upstream calls, token expiration, the dry-run/commit workflow, auto-resolved fields, the CC-required preview path, return values and their downstream use, the Listing-type alternative, and the database-region shard limitation.
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 high at 83%, but the description adds substantial meaning beyond the schema: slot_hash/reservation_token freshness, dining_area_id auto-resolution versus explicit pinning, booking_token's role for CC-required slots, experience_id tamper-check behavior, database_region shard routing, and the confirm dry-run contract. This is exactly the inter-parameter knowledge an agent needs.
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 concrete verb and resource: 'Book an OpenTable reservation.' It then defines the tool's scope precisely — locking a slot, dry-run vs commit, and required upstream tokens — and distinguishes it from adjacent tools like opentable_find_slots, opentable_book_preview, and opentable_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 gives explicit sequencing: obtain a fresh slot_hash + reservation_token from opentable_find_slots immediately before booking; use opentable_book_preview for CC-required slots; and for Listing-type restaurants, check opentable_get_restaurant.bookable and surface phone/URL instead. This clearly states when to use this tool versus alternatives and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_book_previewARead-only
Preview an OpenTable booking BEFORE committing. Fetches the /booking/details SSR page and the slot-lock to surface: the cancellation policy (including any credit-card no-show fee), the saved payment card that would be charged/held, and a short-lived booking_token that opentable_book consumes. REQUIRED for CC-required slots — opentable_book refuses to commit without the token. Safe to call for standard slots too (the token skips a redundant re-lock in book). Holds the slot for ~60-90s; preview → book should happen within a minute. For Listing-type restaurants (Le Bernardin, etc.) this tool can't fetch a slot at all — callers should check opentable_get_restaurant.bookable first and surface the restaurant's phone/URL instead. For Experience-mandatory slots (find_slots returned booking_type=experience_mandatory), pass experience_id from the slot's experience_ids to route through the Experience slot-lock.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — must match a slot returned by find_slots | |
| slot_hash | Yes | slot_hash from opentable_find_slots | |
| party_size | Yes | ||
| experience_id | No | For Experience-mandatory slots: which experience to book (from slot.experience_ids). Required when find_slots returned an Experience slot. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional dining-area (room) id. When omitted, auto-resolved to the default dining area from OpenTable's booking-details page — so you can go straight from find_slots to book without calling opentable_get_restaurant. Pass explicitly only to pin a specific room. | |
| experience_ids | No | Pass-through from find_slots.experience_ids. When non-empty, experience_id must also be set. | |
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| reservation_token | Yes | slot_availability_token from opentable_find_slots |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, but the description adds valuable behavioral context beyond that: the slot is held for 60-90 seconds, the preview-to-book window is about a minute, and the tool surfaces a short-lived token. It also explains a subtle side effect (skipping a redundant re-lock) and a known failure mode for Listing-type restaurants. No contradiction with the readOnly annotation.
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 dense but front-loaded with the core purpose, and every subsequent sentence adds a distinct caveat or usage detail. It is longer than minimal, but the complexity (10 parameters, multiple slot types, time sensitivity) justifies the length. Slight room for improvement via structuring or bullets, but no filler.
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 sufficiently explains what will be returned: cancellation policy, saved payment card, and the booking_token. It also covers required timing, prerequisites, fallback behavior for unsupported restaurants, and handling of Experience-mandatory slots. Nothing critical is missing for an agent to decide whether and how to call the tool.
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 80%, so the baseline is 3. The description adds some cross-tool meaning, such as passing experience_id from slot.experience_ids to route through the Experience slot-lock, and clarifies the role of reservation_token from find_slots. However, most parameter semantics are already carried by the schema, so the description does not need to carry much more weight here.
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 gives a specific verb-resource pair: 'Preview an OpenTable booking BEFORE committing.' It clearly distinguishes the tool from opentable_book by explaining it fetches the booking-details page and produces a booking_token rather than committing. This is more than a generic restatement of the tool name.
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 says when the tool is REQUIRED (CC-required slots), when it is safe (standard slots), and when it cannot be used at all (Listing-type restaurants), including the fallback of checking opentable_get_restaurant.bookable and surfacing phone/URL. It also gives specific routing guidance for Experience-mandatory slots. This is strong when-to-use, when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_cancelA
Cancel an OpenTable reservation. Requires restaurant_id, confirmation_number, and security_token — all three come from opentable_list_reservations or opentable_book. Without confirm:true this returns a dry-run and takes NO cancellation action; re-run with confirm:true to cancel the reservation.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to proceed. Without this, the tool returns a preview. | |
| restaurant_id | Yes | ||
| security_token | Yes | ||
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| confirmation_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full safety burden, and it does well by disclosing that confirm:true is required and that the default run is a non-destructive dry-run. It also warns that without confirmation no cancellation action is taken. It doesn't describe post-cancellation effects or return values, but the destructive-action guard is the critical 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?
Two sentences with no filler: the purpose, required inputs, their source, and the critical confirmation behavior are all packed in, front-loading the action before the dry-run caveat. 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 destructive cancellation tool with no output schema and no annotations, this is largely complete: it covers inputs, prerequisites, and the dry-run/confirm mechanism. The database_region parameter is well documented in the schema itself, so the only real gap is the lack of any description of the response or post-cancellation state, which is secondary to safe invocation.
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 40%, so the description compensates by explaining that restaurant_id, confirmation_number, and security_token all originate from opentable_list_reservations or opentable_book, and by clarifying the confirm flag's gating role. This adds real meaning beyond the raw schema types, though param-specific format details are still left to the schema or source tools.
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?
Starts with 'Cancel an OpenTable reservation,' a specific verb and resource that clearly identifies the tool's function. The name 'opentable_cancel' matches, and no sibling tool performs cancellation, so an agent can distinguish it at a glance.
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?
Gives clear conditions for use: the required params must come from opentable_list_reservations or opentable_book, and the two-step confirm:true flow is explicitly described. It doesn't explicitly contrast with alternatives like opentable_modify, but the cancellation use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_find_slotsARead-only
List available reservation slots at a specific OpenTable restaurant for a date + party size. Returns each slot's reservation_token (use it with opentable_book — tokens expire quickly, book promptly). Slots may be attributes=['default'|'bar'|'highTop'|'outdoor'] and type=Standard|Experience|POP. You can pass a slot's reservation_token + slot_hash straight to opentable_book without a separate opentable_get_restaurant call — book auto-resolves the dining area. (OpenTable's availability response carries only the seating category, not the numeric dining-area id, so that id is resolved at book time from the booking-details page.) If this errors with "operation ... not yet observed on this tab", open any OpenTable restaurant page in your browser once (the graphql bridge needs to see the page's own availability query fire first), then retry.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — anchor time; slots come back relative to this | |
| 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| party_size | Yes | ||
| restaurant_id | Yes | ||
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true reporters, and the description adds substantial behavior: tokens expire quickly, slot_hash can bypass a get_restaurant call, the dining-area id is resolved at book time, and the exact 'operation ... not yet observed on this tab' error workaround. This is rich behavioral disclosure well beyond 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?
Every sentence in the description carries distinct operational information: core purpose, token expiration, slot attributes/types, booking shortcut, and error recovery. It is front-loaded with the main purpose, and the length is justified by the complexity of the integration.
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?
Given there is no output schema, the description does a good job explaining the key return value (reservation_token), slot_attributes, type, and slot_hash as an input to opentable_book. It also covers a known failure mode glitch. Minor gaps remain: it doesn't describe the full output shape or explicitly mention the required 'time' parameter in the prose, so it is very good 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?
The input schema already documents date, time, view, and database_region in detail. The description reinforces 'date + party size' and restaurant specificity, but it doesn't add significant meaning for restaurant_id, party_size, or time beyond what the schema already says. With 67% schema coverage, this is adequate but not exemplary.
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 action and resource: 'List available reservation slots at a specific OpenTable restaurant for a date + party size.' It clearly differentiates from siblings like opentable_list_reservations by focusing on availability rather than existing reservations, and it names the downstream integration with opentable_book.
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 gives explicit usage context: returned reservation_token and slot_hash should be passed directly to opentable_book, and opentable_get_restaurant is unnecessary for that flow. It also provides a concrete retry condition. It doesn't explicitly contrast with opentable_list_reservations or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_get_profileARead-only
Get the authenticated OpenTable user's profile: name, email, phones, loyalty points and tier, home metro, member-since date. Payment and credit-card details are never 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable 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, and the description adds valuable context by explicitly stating that payment and credit-card details are never exposed. This goes beyond the annotation and gives agents a clear guarantee about the response content, though it does not cover authentication or rate limits.
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, front-loaded with the resource and fields, and ends with a crucial exclusion. Every sentence earns its place; there is zero fluff or repetition.
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?
Given the tool's simplicity (one optional parameter, no output schema), the description lists all major return fields and the key exclusion. It does not specify exact structures (e.g., phone object layout), but for a read-only profile tool this is adequate; the schema covers the view parameter fully.
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's description for the 'view' parameter is thorough, covering response shape, defaults, and rationale for not offering field projection. Since schema coverage is 100%, the tool description does not need to add parameter detail; it provides no extra semantics, matching the baseline of 3.
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 clear verb and resource: 'get the authenticated OpenTable user's profile', and enumerates the specific fields returned. It is unambiguous and distinguishes itself from sibling tools, which all concern reservations, bookings, restaurants, or 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 makes the tool's purpose obvious—profile retrieval—so an agent can infer when to use it. It does not explicitly name alternatives or exclusion conditions, but given the unique scope and clear resource, the context is sufficient; no misleading guidance exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_get_restaurantARead-only
Get full details for a single OpenTable restaurant: cuisine, price band, description, address, hours, phone, payment options, features, rating/review count, and availability_token (used internally when booking). Accepts the numeric restaurant_id, a slug, a path, or the full URL from opentable_search_restaurants — passing the search result's "url" verbatim always resolves, including legacy venues served at /{slug} instead of /r/{slug}.
| 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| restaurant_id | Yes | Numeric restaurant_id (as returned by opentable_list_reservations / opentable_list_favorites), slug ("state-of-confusion-charlotte"), path, or full URL from opentable_search_restaurants. Passing the search result's "url" verbatim resolves both /r/{slug} and legacy /{slug} venues; a numeric id resolves via /restaurant/profile/{id}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by explaining the compact/full view behavior, the fact that compact strips image/avatar URLs, and the reasoning that no field projection is invented to avoid dropping caller-needed fields. It also discloses resolution details for numeric IDs, slugs, paths, and full URLs, including legacy venue handling. This is rich behavioral context that annotations alone would not provide.
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, front-loaded with the core purpose and returned fields, and the second sentence efficiently explains identifier flexibility and legacy URL resolution. Every clause earns its place; there is no repetition, filler, or optional background.
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 read-only single-resource retrieval tool with no output schema, the description is complete: it enumerates all returned categories, explains both view modes, details accepted identifier forms, and notes availability_token's role in booking. An agent has enough information to select the tool and call it correctly without needing to inspect the schema.
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 tool description largely restates what the input schema already documents for restaurant_id and view. The description does not add meaning beyond the schema's parameter descriptions: both explain accepted ID forms and the compact/full distinction. Since the schema carries the full burden, a baseline of 3 is appropriate.
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 full details') and resource ('a single OpenTable restaurant'), then enumerates the exact fields returned: cuisine, price band, description, address, hours, phone, payment options, features, rating/review count, and availability_token. This clearly distinguishes it from sibling tools like opentable_search_restaurants, which lists/search results, and opentable_list_reservations, which handles user 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 description gives clear context on when to use the tool: to retrieve full details for a single known restaurant, often as a follow-on to opentable_search_restaurants. It even instructs that passing the search result's 'url' verbatim always resolves, including legacy /{slug} venues. It does not explicitly state when not to use it or name alternatives for other cases, but the usage context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_healthcheckVerify the fetchproxy bridge end-to-endARead-onlyIdempotent
Round-trips a small public www.opentable.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real www.opentable.com-side problem'. Read-only, no auth required. 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?
It discloses the read-only, no-auth behavior and goes beyond the annotations by describing the bridge role, port, version, extension link state, elapsed time, and the plain-English failure categorization. This gives the agent a concrete picture of what happens during the call, including how it disambiguates failure modes.
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 dense but every clause earns its place: it states the action, the exact URL, the full result payload, and the trigger condition. The most important decision information is front-loaded, and the diagnostic field list is highly relevant.
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?
Despite having no output schema, the description enumerates every returned diagnostic component and the meaning of the hint. It also covers auth requirements and usage context, so an agent has all the information needed to invoke and interpret 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 has zero parameters and the description explicitly states the fixed URL used, so there is no param ambiguity to compensate for. With no parameters, the description fully removes any need for the agent to infer inputs.
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 action — round-tripping a public www.opentable.com URL through the fetchproxy bridge — and precisely enumerates the diagnostic output it returns. It clearly distinguishes this tool from the OpenTable domain siblings, none of which perform connectivity/bridge diagnostics.
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 says when to call it: 'when a real tool fails and you want to know which hop broke.' This gives the agent a decision rule that separates the health check from the operational OpenTable tools, which are the things being diagnosed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_list_favoritesARead-only
List the user's saved restaurants from OpenTable (Saved Restaurants list). Returns each entry's id, name, cuisine, neighborhood, price band, rating, and OpenTable URL.
| 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable 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?
With readOnlyHint=true, the annotation already covers the non-mutating behavior. The description adds a useful account of what the response contains (id, name, cuisine, neighborhood, price band, rating, URL), but it does not disclose potential traits such as authentication requirements, empty-list behavior, or pagination.
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?
A single front-loaded sentence states the action and resource immediately, and the appended field list is informative without bloat. Every part 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 with one optional parameter and no output schema, the description covers the operation, the return payload, and the relevant domain. The schema fully documents the only parameter, so nothing needed to call it 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 description coverage is 100%, and the view parameter's enum and description are already explicit about compact/full behavior and defaults. The tool description itself adds no parameter-level detail, 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?
Description states a specific verb ('List'), resource ('user's saved restaurants from OpenTable'), and explicitly names it as the Saved Restaurants list. It also enumerates the returned fields, distinguishing it from siblings like opentable_list_reservations and opentable_search_restaurants.
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 phrase 'user's saved restaurants from OpenTable (Saved Restaurants list)' provides clear context that this tool is for reading the current user's favorites rather than reservations or search results. It does not explicitly name alternative tools or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_list_reservationsARead-only
List the authenticated user's OpenTable reservations. Defaults to upcoming; pass scope="past" or scope="all" to broaden. Each entry includes the security_token needed to cancel or modify.
| 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| scope | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares safety, so the bar is lower; the description adds meaningful behavior beyond that: it operates on the authenticated user's reservations, defaults to upcoming, and each entry includes the security_token needed for downstream cancel/modify operations. It does not cover pagination or error behavior, but it goes well beyond what annotations alone provide.
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 short, purposeful sentences. The first states the core action, the second gives the key invocation option, and the third explains the security_token relevance. No filler or repetition.
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 list operation with two optional enum parameters and a readOnly annotation, the description plus schema covers what an agent needs to invoke it correctly. The absence of an output schema is partially addressed by noting that entries include security_token and by the view parameter's response-shape explanation, though pagination, ordering, and full return-structure details are not described.
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?
Only the view parameter is documented in the schema (50% coverage), but the description compensates by explaining scope: its default and the 'past'/'all' broadening options. The view parameter carries a thorough schema description, so together the two parameters are effectively well explained.
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: 'List the authenticated user's OpenTable reservations.' This clearly distinguishes the tool from siblings like opentable_search_restaurants, opentable_list_favorites, and opentable_book by focusing on the user's own reservation records.
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 clear context for when to call it: to see the authenticated user's reservations, with an explicit default of upcoming and instructions to pass scope="past" or scope="all" to broaden. It does not explicitly name when-not-to-use alternatives, but the purpose is specific enough that no sibling tool is a realistic substitute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_modifyA
Modify an existing OpenTable reservation in place. Requires the existing reservation's identity (restaurant_id + confirmation_number + security_token) plus a fresh modify_token from opentable_modify_preview — preview is mandatory because the new slot's cancellation policy / CC re-hold can differ from the original. Submits /dapi/booking/make-reservation with isModify: true + the existing confirmation_number + security_token; OpenTable preserves confirmation_number across modifies but may regenerate reservation_id and security_token. dining_area_id is OPTIONAL — the modify_token already carries the area opentable_modify_preview resolved; pass it only to restate it (mismatch is refused). Returns the same shape as opentable_book plus was_modified: true so the agent can phrase the user confirmation accurately. For Listing-type restaurants there's no slot to lock — agents should check opentable_get_restaurant.bookable first. Without confirm:true this returns a dry-run and makes NO change to the reservation; re-run with confirm:true to submit the modification.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD (the NEW date) | |
| time | Yes | HH:MM (24h) — the NEW time | |
| confirm | No | Must be true to proceed. Without this, the tool returns a preview. | |
| slot_hash | Yes | slot_hash from opentable_find_slots for the NEW slot | |
| party_size | Yes | ||
| modify_token | No | REQUIRED. From opentable_modify_preview. No no-token path — the new slot's policy + CC re-hold can differ from the original. | |
| experience_id | No | Optional tamper-check signal. When set, must match the experienceId baked into modify_token. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional. The modify_token carries the dining area preview resolved; when restated here it must match the token. | |
| security_token | Yes | ||
| reservation_token | Yes | slot_availability_token from opentable_find_slots for the NEW slot | |
| confirmation_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it discloses the exact endpoint, isModify flag, that confirmation_number is preserved while reservation_id/security_token may be regenerated, that dining_area mismatch is refused, that the tool returns was_modified: true, and that confirm:true is required for actual mutation. This is unusually 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?
The description is long but every sentence earns its place: prerequisites, endpoint behavior, optional-parameter nuance, return shape, an edge case, and the confirmation flow are all covered without repetition. The most important purpose and precondition appear first.
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?
Given 12 parameters, 8 required, no output schema, and a complex mutation/dry-run flow, the description is remarkably complete. It tells the agent what is required, why preview is mandatory, how confirm changes behavior, what output to expect, and when to check a restaurant's bookability first.
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 67%, so the description adds needed meaning for critical parameters: it groups restaurant_id + confirmation_number + security_token as the reservation identity, explains modify_token's mandatory origin, clarifies dining_area_id's optional restatement semantics, and connects reservation_token/slot_hash to the new slot. A few parameters like party_size remain obvious from context, but the description compensates well for the schema gap.
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 ('Modify an existing OpenTable reservation in place') and clearly distinguishes this from creation, preview, and cancellation flows. It names related sibling tools and explains that a preview token is mandatory, so an agent can unambiguously select this tool for modifications.
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 requires opentable_modify_preview first, explains why preview is mandatory, warns about Listing-type restaurants needing opentable_get_restaurant.bookable, and spells out the confirm:true dry-run vs. submission behavior. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_modify_previewARead-only
Preview a MODIFICATION to an existing OpenTable reservation. Takes the existing reservation's identity (restaurant_id + confirmation_number + security_token from opentable_list_reservations or the original opentable_book result) plus the NEW slot args (from a fresh opentable_find_slots call) and returns the new cancellation_policy, CC re-hold details, and a modify_token that opentable_modify consumes. Mirrors opentable_book_preview, but the /booking/details URL includes confirmationNumber + securityToken + isModify=true so OpenTable's SSR returns the modify state. dining_area_id is OPTIONAL — omitted, it's auto-resolved from the booking-details page like book_preview does. REQUIRED before opentable_modify — no shortcut path. For Listing-type restaurants the modify can't proceed (no slot picker); check opentable_get_restaurant.bookable first.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD (the NEW date) | |
| time | Yes | HH:MM (24h) — the NEW time | |
| slot_hash | Yes | slot_hash from opentable_find_slots for the NEW slot | |
| party_size | Yes | ||
| experience_id | No | For Experience-mandatory slots; required when the new slot has experience_ids. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional dining-area (room) id for the NEW slot. When omitted, auto-resolved to the default dining area from OpenTable's booking-details page — the same resolution opentable_book_preview uses. Pass explicitly only to pin a specific room. | |
| experience_ids | No | Pass-through from find_slots.experience_ids. When non-empty, experience_id must also be set. | |
| security_token | Yes | ||
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| reservation_token | Yes | slot_availability_token from opentable_find_slots for the NEW slot | |
| confirmation_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the SSR URL mechanism (isModify=true), the auto-resolution behavior of dining_area_id, the hard dependency on this step before opentable_modify, and the Listing-type failure mode. It stops short of clarifying whether the 'CC re-hold details' reflect a hold actually placed by this call or a simulated preview — a lingering side-effect ambiguity for a read-only-annotated tool.
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?
A single dense paragraph of roughly 110 words where every sentence earns its place: purpose, identity inputs, new-slot inputs, outputs, the book_preview mirror, the optional-parameter behavior, the prerequisite, and the edge case. It is front-loaded with the purpose and heavily compacted, but the density demands careful reading.
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 12-parameter, 8-required tool with no output schema, the description covers input provenance, return values (cancellation_policy, CC re-hold details, modify_token), the prerequisite step, and the Listing-type exclusion. Minor gaps remain: no statement about idempotency/repeated calls and the unresolved question of whether the CC re-hold is actually executed.
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 only 67% schema coverage, the description compensates for the undocumented identity parameters by naming restaurant_id + confirmation_number + security_token as the existing reservation's identity and giving their source, and by grouping date/time/party_size/reservation_token/slot_hash as NEW slot args from a fresh find_slots call. The schema already documents date, time, slot_hash, reservation_token, dining_area_id, experience fields, and database_region well, so the description need not repeat them.
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 ('Preview a MODIFICATION to an existing OpenTable reservation') and immediately differentiates itself from the sibling opentable_book_preview ('Mirrors opentable_book_preview, but the /booking/details URL includes confirmationNumber + securityToken + isModify=true') and from opentable_modify, whose token it produces. An agent can tell exactly what this tool does and how it differs from its closest relatives.
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 the tool chain: the existing reservation's identity comes from opentable_list_reservations or the original opentable_book result, the NEW slot args come from a fresh opentable_find_slots call, and this tool is 'REQUIRED before opentable_modify — no shortcut path.' It also tells when NOT to use it ('For Listing-type restaurants the modify can't proceed... check opentable_get_restaurant.bookable first').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_remove_favoriteC
Remove a restaurant from the user's Saved Restaurants list.
| Name | Required | Description | Default |
|---|---|---|---|
| restaurant_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are not provided, so the description must handle behavioral disclosure. It describes the mutation (removing) but does not state whether the action is reversible (e.g., can add back later), whether it requires authentication, or what the response contains. For a mutation tool with no annotation safety profile, this is a gap; an agent might not know if the action has side effects beyond the list change.
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 that is appropriately concise. It front-loads the action and object, avoiding unnecessary elaboration. While it could add more detail on parameters or behavior, it does not include fluff, so it scores high on conciseness relative to its length.
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?
Given the tool's simplicity (one parameter, no output schema) and the absence of annotations, the description is minimal but incomplete for an agent to use it correctly. It lacks usage context, what constitutes a valid restaurant_id, and any behavioral expectations. However, the simplicity means less is needed than for a complex tool, so it is not a 1, but it still falls short of adequate.
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 0% and the description does not explain the restaurant_id parameter beyond its name. The schema only defines it as an integer, but the description does not clarify what a restaurant_id is (e.g., a unique identifier from a search result) or how to obtain it. With a single required parameter and no schema descriptions, the description should provide more practical guidance.
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 ('Remove a restaurant') and the target resource ('Saved Restaurants list'). It effectively matches the tool name and distinguishes it from its sibling opentable_add_favorite (which would add rather than remove), though it does not explicitly name the sibling. The verb 'remove' is specific and unambiguous.
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 a use case for removing a saved restaurant but does not state when to use this tool versus alternatives. It does not mention that opentable_add_favorite is the opposite action or that opentable_list_favorites could be used to view the current list. No explicit conditions or exclusions are given, but the purpose is clear enough for an agent to infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_search_restaurantsARead-only
Search OpenTable for restaurants. Returns matching restaurants with cuisine, neighborhood, price band, rating, description, and URL. Does NOT include bookable slot tokens — use opentable_find_slots for a specific venue to check availability.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD. Affects search ranking but not returned slots. | |
| term | No | Free-text query (cuisine or restaurant name) | |
| time | No | HH:MM (24h). Default 19:00 when date is set. | |
| 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| latitude | No | ||
| location | No | City / neighborhood / address — appended to the term. Prefer lat/lng when precise. | |
| metro_id | No | OpenTable metro id (e.g. 8 = SF Bay Area, 31 = Charlotte). | |
| longitude | No | ||
| party_size | No | Number of guests. Default 2. |
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 valuable behavioral context by stating exactly what fields are returned and, crucially, that slot tokens are not included—information an agent needs to avoid assuming availability is present. This goes beyond the annotation without contradicting it.
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 zero filler. The first sentence delivers the core purpose and output, and the second sentence provides a critical exclusion plus a pointer to the sibling. It is front-loaded, efficient, and every word 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 search tool with no required parameters and no output schema, the description covers the essential behavioral contract: what it returns, what it omits, and when to use a different tool. It does not explain parameter interactions (like date affecting ranking), but those are already in the schema. Minor gaps like pagination or result limits are not critical for correct invocation.
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 78%, so most parameters already have their own explanations in the schema. The tool description adds no new parameter-level meaning; it only restates the return fields. Per the rubric, high schema coverage sets a baseline of 3, and the description does not exceed that baseline.
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 clear verb and resource: 'Search OpenTable for restaurants' and lists specific returned fields (cuisine, neighborhood, price band, rating, description, URL). It explicitly differentiates itself from opentable_find_slots by stating it does NOT include bookable slot tokens, making its scope unambiguous among 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?
It gives an explicit when-not and names the alternative: 'Does NOT include bookable slot tokens — use opentable_find_slots for a specific venue to check availability.' This directly routes the agent away from the most likely confusion and toward the correct sibling, which is exactly what good usage guidance looks like.
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.
14 tool updates
v1.0.0- Changed
opentable_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
opentable_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
opentable_book_preview1 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
opentable_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
opentable_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
opentable_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
opentable_get_restaurant1 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
opentable_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
opentable_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
opentable_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
opentable_modify1 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
opentable_modify_preview1 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
opentable_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
opentable_search_restaurants1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
6 tool updates
v0.19.2- Changed
opentable_find_slots1 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
opentable_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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
opentable_get_restaurant1 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
opentable_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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
opentable_list_reservations1 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
- Changed
opentable_search_restaurants1 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 OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs.", + "enum": [ + "compact", + "full" + ], + "type": "string" +}
2 tool updates
v0.18.2- Changed
opentable_modify2 fields changed- added
Input schema / properties / dining_area_id / descriptionAdded value: +"Optional. The modify_token carries the dining area preview resolved; when restated here it must match the token." - changed
Input schema / requiredPrevious value: -[ - "restaurant_id", - "confirmation_number", - "security_token", - "date", - "time", - "party_size", - "reservation_token", - "slot_hash", - "dining_area_id" -]New value: +[ + "restaurant_id", + "confirmation_number", + "security_token", + "date", + "time", + "party_size", + "reservation_token", + "slot_hash" +]
- Changed
opentable_modify_preview2 fields changed- added
Input schema / properties / dining_area_id / descriptionAdded value: +"Optional dining-area (room) id for the NEW slot. When omitted, auto-resolved to the default dining area from OpenTable's booking-details page — the same resolution opentable_book_preview uses. Pass explicitly only to pin a specific room." - changed
Input schema / requiredPrevious value: -[ - "restaurant_id", - "confirmation_number", - "security_token", - "date", - "time", - "party_size", - "reservation_token", - "slot_hash", - "dining_area_id" -]New value: +[ + "restaurant_id", + "confirmation_number", + "security_token", + "date", + "time", + "party_size", + "reservation_token", + "slot_hash" +]
2 tool updates
v0.18.1- Changed
opentable_get_restaurant1 field changed- changed
Input schema / properties / restaurant_id / descriptionPrevious value: -"Slug (\"state-of-confusion-charlotte\"), path, or full URL from opentable_search_restaurants. Prefer passing the search result's \"url\" verbatim — it resolves both /r/{slug} and legacy /{slug} venues. Numeric ids are not supported (they 404); use the slug/url instead."New value: +"Numeric restaurant_id (as returned by opentable_list_reservations / opentable_list_favorites), slug (\"state-of-confusion-charlotte\"), path, or full URL from opentable_search_restaurants. Passing the search result's \"url\" verbatim resolves both /r/{slug} and legacy /{slug} venues; a numeric id resolves via /restaurant/profile/{id}."
- Added
opentable_healthcheck
13 tool updates
v0.14.3- First observed
opentable_add_favorite - First observed
opentable_book - First observed
opentable_book_preview - First observed
opentable_cancel - First observed
opentable_find_slots - First observed
opentable_get_profile - First observed
opentable_get_restaurant - First observed
opentable_list_favorites - First observed
opentable_list_reservations - First observed
opentable_modify - First observed
opentable_modify_preview - First observed
opentable_remove_favorite - First observed
opentable_search_restaurants
TDQS
Scored across 14 tools
Every tool targets a distinct resource and action: reservations (list, preview, book, modify, cancel), favorites (list, add, remove), restaurant discovery (search, get), profile, and a diagnostic healthcheck. There is no overlap in purpose, and the preview/modify-preview tools are clearly differentiated from their committing counterparts.
All tools follow a consistent opentable_ prefix and a verb_noun pattern (list_reservations, find_slots, book_preview, etc.). The few single-verb names (book, modify, cancel) are still predictable and match the overall style, so the naming is coherent and easily anticipated.
With 14 tools, the set is well-scoped for an OpenTable server covering reservation management, favorites, restaurant search/details, user profile, and health diagnostics. Each tool serves a distinct need, and the count feels neither sparse nor bloated for the domain.
The tool surface covers the full reservation lifecycle (search, get, list, preview, book, modify, cancel), favorites management (list, add, remove), user profile retrieval, and a healthcheck. There are no obvious dead ends—every action that might be required for the primary workflows is present, including handling of edge cases like CC-required slots and Listing-type restaurants.
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.
AI-native scheduling and booking: check availability, book meetings, share links.
Last-minute booking slots across 11 suppliers. Search, price, and execute bookings via AI agents.
Related MCP Servers
- 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 Resy reservations via natural language: search restaurants, book tables, and manage reservations, favorites, and Priority Notify.15404 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, including managing booking history and handling multi-factor authentication.948 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, with persistent sessions and MFA handling.948 npm1MIT