opentable-mcp
Manage your own OpenTable account through natural language — all requests ride your signed-in browser tab, never a separate HTTP client.
Find restaurants: search by term, location, or lat/lng; get full venue details (cuisine, price, hours, features) by id, slug, or URL.
Check availability: list slots at a restaurant for a date/time/party size, with reservation tokens ready for booking.
Book: preview a booking first (surfaces cancellation policy, no-show fee, and the card that would be held), then commit; auto-fills your profile and returns a confirmation number + security token.
Modify: preview and apply changes to an existing reservation (new date/time/party), with CC re-hold details checked against the original.
Cancel: cancel a reservation using its confirmation number and security token.
Review your account: list upcoming, past, or all reservations (with the tokens needed to cancel/modify), read your profile (name, email, phones, loyalty tier), and list saved restaurants.
Manage favorites: add or remove restaurants from your Saved Restaurants list.
Diagnose connectivity: healthcheck round-trips a public OpenTable URL through the browser bridge to tell you which hop broke.
Safety: write actions (book/modify/cancel) require explicit confirmation — a prompt or a two-step preview-plus-token flow — and every write only ever touches your own account.
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 ContextMint Bridge 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 | Restaurant profile SSR ( |
| read |
|
| read |
|
| write |
|
| write |
|
| read |
|
| write |
|
| write |
|
| write |
|
| read |
|
Published menus
opentable_get_menu accepts the same restaurant ID, slug, path, or exact URL
as opentable_get_restaurant. Omit menu_name to return all published menus,
or pass an exact title such as "Dinner" (case-insensitive) to select one:
{"restaurant_id":"https://www.opentable.com/r/social-san-juan","menu_name":"Dinner"}The response includes restaurant identity and source url, available_menus,
menus, and an optional external menu_url. Each published menu retains
OpenTable's sections/items, price strings, variationGroups, currency,
provider, and updated timestamp. view defaults to compact (media URLs
removed); full retains media URLs too. Published prices may differ from the
restaurant's current menu, so keep the source and update timestamp when quoting.
Large menus come back as pages of whole items, so a reply never stops halfway
through a dish. Without paging arguments a menu that fits is returned as-is;
a larger one returns its first page. Each page carries available_sections and
pagination:
{"offset":0,"returned_items":20,"total_items":57,"next_offset":20}To continue, call again with offset set to next_offset and the same
menu_name/section_name; next_offset is null on the last page. Optional
paging inputs:
section_name— an exact section title (case-insensitive); the reply addssection_found.offset— the item to start from (default0).limit— at most this many items per page (1–50, default 20). A page may return fewer to stay within the response budget.
view: "full" with no paging inputs returns the whole menu uncapped, for
clients without an output limit. A single item too large for a page is an
error, never a truncated description.
status distinguishes available, menu_not_found (check available_menus),
external_only, and not_available. An absent menu is not an HTTP/bridge or
parsing error: those failures remain errors. External links are returned
without fetching other hosts or parsing PDFs. This tool only reads the same
restaurant page through the existing browser bridge; it never holds a table.
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 ContextMint Bridge browser 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 ContextMint Bridge
opentable-mcp shares one browser extension, ContextMint Bridge, with every other fetchproxy-based MCP. Install it once from https://github.com/nullnet-app/contextmint-bridge/releases:
ContextMint Bridge is the fetchproxy browser extension under its new name, from the same maintainer — fetchproxy's own README (https://github.com/chrischall/fetchproxy#extension) points to it. Its source is public at https://github.com/nullnet-app/contextmint-bridge: build it yourself, or check a release zip against the .sha256 file published beside it (shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256).
Chrome: download the Chrome zip from the latest release, unzip it, and load it unpacked (
chrome://extensions→ Developer mode → Load unpacked). Safari isn't available yet — it will ship inside the ContextMint app, which has no public download — so use Chrome for now.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 ContextMint Bridge 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 ContextMint Bridge:
{
"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 ContextMint Bridge. Every OpenTable request becomes a chrome_network_request call against your existing mcp-chrome install, pinned via tabUrl to an opentable.com tab.
This mode is read-only. Booking, modifying, cancelling and favorites are refused with a clear error — OpenTable's write endpoints need a CSRF token from a restaurant/booking/account page, which this transport can't supply — and opentable_find_slots is unavailable. Use the default ContextMint Bridge transport for those.
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.
Confirmations
opentable_book, opentable_modify and opentable_cancel ask you before they act. A client that can show a confirmation prompt (Claude Code) shows one. On a client that cannot (claude.ai, Claude Desktop), the first call books, changes or cancels nothing: it returns a preview of exactly what would happen plus a confirmToken. Either way the prompt names the restaurant, date, time and party size, and for a booking or change the card that will be held and the cancellation policy (carried in the booking_token / modify_token from the preview tools; a cancel looks the reservation up on your dining dashboard and warns if it isn't there). Only a repeat call with the same arguments and that token proceeds, once — change any argument in between and it is refused (DRAFT_CHANGED) with a fresh preview.
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 ( |
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 ContextMint Bridge'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.
"OpenTable returned an incomplete page". OpenTable sometimes answers with a short placeholder (a few KB, no page state) before the real page has loaded, or with a human check. The healthcheck records it as
incomplete_page, distinct fromparse_error(a full-size page whose format changed). Refresh the restaurant's page in the signed-in bridged browser, let it finish loading, then retry once.find_slotsfails with HTTP 409. The browser's OpenTable session needs refreshing. Open the restaurant's page in the signed-in bridged tab and let its availability load, then retry once. The error says availability is unverified, not empty, and a passing bridge healthcheck does not test it.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 ContextMint Bridge 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 ContextMint Bridge + 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. ContextMint Bridge 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
15 toolsopentable_add_favoriteBIdempotent
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?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety and repeat-call profile is covered structurally. The description adds only the target of the mutation ('Saved Restaurants list') and says nothing about auth requirements, behavior when the restaurant is already saved, or error cases.
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 efficient sentence with the action front-loaded and no filler. It is well-formed but so terse that it forgoes easy opportunities to add routing or parameter context.
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 rich annotations and no output schema, the minimum needed to call it correctly is nearly present, but the origin and valid range of restaurant_id and the result of a duplicate add are left unexplained.
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% and the description gives no information about restaurant_id — not its format, not where to source it (e.g. from opentable_search_restaurants or opentable_get_restaurant). For a tool whose only parameter is an opaque numeric ID, the description should compensate and does not.
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 ('Add') and resource ('a restaurant') plus the destination ('user's Saved Restaurants list'), which cleanly separates it from opentable_remove_favorite and opentable_list_favorites. It stops short of naming those siblings, so differentiation is implicit rather than explicit.
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?
There is no guidance on when to use this tool versus alternatives such as opentable_remove_favorite, nor any prerequisite (e.g. obtaining a valid restaurant_id via opentable_search_restaurants). Usage is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_bookADestructive
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. 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; the prompt names the restaurant, the card that will be held and the cancellation policy (see MCP_CONFIRM_MODE).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — must match the slot returned by find_slots | |
| slot_hash | Yes | slot_hash from opentable_find_slots | |
| party_size | Yes | ||
| 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. | |
| 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?
Annotations declare destructive/non-idempotent/open-world, and the description adds substantial context beyond them: the two-phase confirmation flow (preview + confirmToken vs elicitation), auto-fetch of user profile, the returned confirmation_number + security_token that are required to cancel, refusal behavior when booking_token is missing, and the surfaced cancellation policy. This is exactly the extra behavioral detail annotations cannot carry.
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 with the primary action and its input dependencies, then flows into confirmation, returns, and edge cases in a sensible order. It is dense and long, but nearly every clause (token expiry, Listing restaurants, database_region caveat) carries actionable information rather than 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?
No output schema exists, yet the description states the return payload (confirmation_number + security_token and that they are needed for cancel), documents the confirmation handshake across both client modes, and covers the non-slot Listing path. For a 12-param destructive tool, nothing an agent needs to invoke 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 coverage is 83% (baseline 3), but the description adds workflow meaning: it explains why dining_area_id is optional (auto-resolved so find_slots → book needs no get_restaurant), when booking_token becomes mandatory, and how experience_ids/experience_id interact with preview. Some points duplicate the schema descriptions (confirmToken, database_region), keeping it from a 5.
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 an OpenTable reservation') and immediately distinguishes itself from siblings by naming the upstream tools (opentable_find_slots, opentable_book_preview) and the failure modes that route to them. An agent can tell this apart from opentable_modify/opentable_cancel without reading any schema.
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 explicit when-to-use mechanics: requires a fresh slot_hash + reservation_token, warns they expire within minutes so find_slots must be called just before, and states dining_area_id may be omitted because it auto-resolves. It also names preconditions for CC-required slots (booking_token from opentable_book_preview) and the Listing-type edge case (check opentable_get_restaurant.bookable instead).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_book_previewA
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. Slots that charge the card at booking (a Deposit policy, or a prepaid/priced Experience) are refused with a link to book on opentable.com directly.
| 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 already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, idempotentHint=false. The description adds critical behavioral context beyond annotations: holds the slot for ~60-90s, token is short-lived, safe to call for standard slots, refuses charge-at-booking cases, and cannot fetch slots for Listing-type restaurants.
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 with the core purpose, then dense but valuable details. Every sentence carries actionable information. Slightly paragraph-heavy; could be structured with bullets, but no wasted words.
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 10 parameters and no output schema, the description covers return content (cancellation policy, payment card, booking_token), timing constraints, dependencies, failure modes, and alternatives. An agent has all it needs to call 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?
Schema description coverage is 80%, so baseline is 3. The description adds meaning for the experience_id/experience_ids parameters by tying them to find_slots booking_type=experience_mandatory and the Experience slot-lock routing. It also clarifies the cross-tool token flow, though it does not document every parameter, so not a 5.
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 specific verb and resource: 'Preview an OpenTable booking BEFORE committing.' Explicitly names the sibling it differs from (opentable_book) and describes the token handoff. An agent can distinguish it without opening schemas.
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?
Provides explicit when-to-use conditions (required for CC-required slots, safe for standard slots), when-not-to-use cases (Listing-type restaurants, deposit/prepaid experiences), and names alternatives (opentable_book, opentable_get_restaurant.bookable, phone/URL). No inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_cancelADestructiveIdempotent
Cancel an OpenTable reservation. Requires restaurant_id, confirmation_number, and security_token — all three come from opentable_list_reservations or opentable_book. 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; the prompt names the restaurant, date, time and party size from your dining dashboard (see MCP_CONFIRM_MODE). Refused when the confirmation_number belongs to a different restaurant.
| Name | Required | Description | Default |
|---|---|---|---|
| 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. | |
| 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?
Annotations already flag destructiveHint=true and idempotentHint=true, but the description goes well beyond them: it documents the two-phase confirmation flow (preview + confirmToken, only a repeat call proceeds), the elicitation-capable client path, the MCP_CONFIRM_MODE dependency, and the cross-restaurant refusal rule. That is the operational reality an agent must plan around for a destructive call.
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?
Purpose is front-loaded and nearly every clause carries information, but the second half is a single long run-on sentence packing confirmation flow, refusal rule, and prompt contents together. It remains readable, though a break or two 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?
There is no output schema, so the description takes responsibility for describing the return behavior — the phase-1 'confirmation-required' preview and confirmToken — which it does. Combined with the schema's confirmToken and database_region notes, an agent has everything needed to call this destructive 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?
Schema description coverage is only 40%, so the description must compensate — and it does for restaurant_id, confirmation_number, and security_token by stating they all originate from opentable_list_reservations or opentable_book. The remaining detail (confirmToken lifecycle, database_region shard caveat) is carried in the schema descriptions themselves, so the split leaves no parameter truly unexplained.
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 ('Cancel an OpenTable reservation') that an agent can distinguish immediately from sibling mutators like opentable_modify or opentable_book. It also states the three required inputs and their provenance, so the agent knows exactly what this tool needs.
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 routes parameter sourcing to opentable_list_reservations or opentable_book, and spells out the confirmation precondition and the one case where the call is refused (confirmation_number belonging to a different restaurant). The when-to-use and when-not-to-use conditions are both covered.
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?
Goes well beyond the readOnly/openWorld annotations: token expiry pressure, that book auto-resolves the dining area, why the numeric dining-area id isn't in the availability response, and a specific error message with a concrete retry recipe. This is exactly the operational context annotations cannot carry.
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-loads the core action, then layers workflow and troubleshooting detail. It is dense and on the long side, with a parenthetical about OpenTable internals that borders on tangential, but nearly every sentence carries actionable information.
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 listing tool with no output schema, it covers the return payload (reservation_token, slot attributes, types), cross-tool handoff, expiry semantics, region caveats via schema, and a known failure mode with recovery steps. An agent has what it needs to call this 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?
Schema description coverage is 67%, so date, time, view, and database_region are already documented in the schema. The description clarifies output-side vocabulary (slot attributes and type values) and cross-references reservation_token/slot_hash, but adds little about the two undocumented parameters (restaurant_id, party_size) beyond their names. Baseline 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?
States a specific verb and resource ('List available reservation slots') plus scope ('at a specific OpenTable restaurant for a date + party size'). It is clearly distinguishable from siblings like opentable_book and opentable_get_restaurant, and even names the sibling it feeds into.
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 context for the workflow: use the reservation_token with opentable_book, book promptly because tokens expire, and skip a separate opentable_get_restaurant call. It doesn't explicitly frame when to reach for this versus a hypothetical alternate availability tool, but the routing is largely unambiguous.
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 openWorldHint=true, so the safety profile is covered. The description adds useful value by explicitly guaranteeing that 'Payment and credit-card details are never exposed', which is a privacy constraint not conveyed by 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 tightly written sentences with zero waste. The field list is front-loaded, and the privacy note is a valuable addition that 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 profile getter with no output schema, the description lists the returned fields and adds a key privacy guarantee. Combined with rich annotations and full schema coverage, an agent has everything needed 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?
Schema description coverage is 100%, and the single 'view' parameter is fully documented in the schema, including its enum values and effects. The description adds no additional meaning about the parameter; baseline 3 is appropriate when the schema does all the work.
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') and resource ('authenticated OpenTable user's profile'), then enumerates the returned fields (name, email, phones, loyalty points and tier, home metro, member-since date). This clearly distinguishes it from all sibling tools, which handle reservations, favorites, restaurants, menus, and health.
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 does not provide any when-to-use guidance, prerequisites, or alternatives. It states what the tool fetches but never says when an agent should call it versus another tool or in what workflow context it is appropriate.
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?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral value: it discloses the availability_token field is used internally for booking and explains id-resolution behavior, including legacy /{slug} venues. Auth and rate-limit behavior remain unstated.
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-loads purpose before the input-format detail, and every sentence carries information. The second sentence is dense but earns its place by disambiguating id forms; minor redundancy with the schema description keeps it from a 5.
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 usefully enumerates the returned fields, and the id-resolution paragraph covers the main calling ambiguity. Nothing critical is missing, though permissions or failure modes for unresolvable ids are not mentioned.
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 restaurant_id schema description already documents the accepted id/slug/path/URL forms and legacy resolution, so the description largely repeats structured data. The view parameter (compact/full) is left to the schema. Baseline 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?
States a specific verb (get) and resource (single OpenTable restaurant) and enumerates the exact payload returned (cuisine, price band, address, hours, features, rating, availability_token). This clearly distinguishes it from siblings like opentable_get_menu 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?
Establishes the workflow context by naming opentable_search_restaurants as the source of the URL to pass in, and explains that any id form resolves. However, it does not explicitly state when to prefer this over siblings such as opentable_get_menu or opentable_get_profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_healthcheckARead-onlyIdempotent
Round-trips a small public www.opentable.com URL (/robots.txt) through ContextMint Bridge (your signed-in browser tab) 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 'this browser can't serve a capability' from 'real www.opentable.com-side problem'. Read-only, no auth required. Tests bridge transport only. Search/menus/availability are reported only from observed real reads; booking is never probed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly, openWorld, and idempotent, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: what the diagnostics reveal (bridge role, port, version, extension link states, round-trip time), the plain-English hint taxonomy, and the explicit statement that booking is never probed. It doesn't describe timeouts or error-return behavior in detail, keeping it at a 4.
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 with the core action, then progressively discloses return contents, hints, and constraints. It's a long sentence chain but each clause adds information (what is returned, what the hint distinguishes, what is explicitly not tested). Slight redundancy in enumerating link states and hint categories.
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 0-parameter, no-output-schema diagnostic tool, the description is complete: it explains the mechanism, the returned diagnostics, the hint taxonomy, the read-only/no-auth constraint, and the explicit non-goals (no booking probing). An agent has everything needed to call it correctly and interpret results.
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?
Zero parameters, so the baseline is 4; however the description compensates by describing exactly what the tool returns (diagnostic fields and hint categories), giving the agent full understanding of the call's shape without a 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 states a specific action (round-trips /robots.txt through ContextMint Bridge for diagnostics) and clearly distinguishes itself from every sibling tool, which all concern reservations, restaurants, menus, or favorites. An agent can immediately see this is a connectivity/diagnostic tool, not a data-fetch tool.
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 explains the scope clearly: 'Tests bridge transport only' and explicitly rules out booking ('booking is never probed'), plus notes that search/menus/availability are only reported from observed real reads. It doesn't explicitly name which sibling to use for actual data, but the exclusions give strong routing signal.
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 numeric restaurant_id (a number, or null when OpenTable omits it — the same id opentable_get_restaurant, opentable_find_slots and opentable_remove_favorite take), 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?
Annotations already declare readOnlyHint and openWorldHint, but the description adds a genuinely useful behavioral caveat — restaurant_id can be null 'when OpenTable omits it' — which an agent must handle. It does not mention result limits, ordering, 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?
Front-loaded verb+resource followed by the field list in one dense sentence; every clause carries information. The nested parentheses around the id caveat make it slightly harder to parse but nothing is wasted.
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 carries the return-value burden and does so by enumerating fields and flagging the null-id case. Missing only secondary details like list length, ordering, or behavior when the user has no favorites.
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 single 'view' parameter is fully documented in the schema, including the compact/full semantics. The description never references 'view', so it adds nothing beyond the schema; baseline 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?
States a specific verb and resource ('List the user's saved restaurants from OpenTable (Saved Restaurants list)') and enumerates the returned fields. The parenthetical scoping to the Saved Restaurants list separates it from opentable_search_restaurants without needing the schema.
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 rather than stated: the description notes the id is 'the same id opentable_get_restaurant, opentable_find_slots and opentable_remove_favorite take,' which routes the agent onward but never says when to call this instead of search_restaurants or add_favorite. No explicit when/when-not guidance.
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?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely useful behavioral context beyond them: the default scope resolution and the fact that each entry carries the security_token required to cancel or modify, which is a downstream workflow hint. It omits pagination, result caps, and any auth/permission nuance.
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 sentences, no filler, front-loaded with the core action and followed by the default and the token handoff. 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 read-only list tool with annotations covering safety and no output schema, the description covers purpose, default scoping, and the key returned artifact (security_token). Missing only return-order/pagination details, which are minor for this shape.
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 only 50%: 'view' is fully documented in the schema, but 'scope' carries no schema description at all. The description compensates for that gap by stating the default value and the meaningful enum alternatives, which is more than the schema alone conveys.
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 specific verb and resource ("List the authenticated user's OpenTable reservations") with clear scope. It is unambiguously distinct from the action siblings (book, modify, cancel) and from the favorites/search tools, so an agent can route to it from the name plus first sentence alone.
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 sets the default behavior ("Defaults to upcoming") and explains how to broaden with scope="past" or scope="all", which is exactly the decision an agent must make. It stops short of naming an alternative tool or an explicit when-not-to-use condition, but no sibling competes for this retrieval job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_modifyADestructive
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. 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; the prompt names the restaurant, the current and new slot, and the card re-hold (see MCP_CONFIRM_MODE).
| 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 | ||
| 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. | |
| 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?
Annotations already mark this as non-idempotent and destructive, but the description adds substantial context beyond them: the confirmation prompt flow, the two-step confirmToken fallback for non-elicitation clients, the CC re-hold, cancellation-policy drift, and that confirmation_number is preserved while reservation_id/security_token may be regenerated.
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 with purpose and requirements, and nearly every sentence carries actionable detail. However it is a single dense paragraph mixing API internals ('Submits /dapi/booking/make-reservation') with agent-facing guidance, which costs some readability.
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-param mutation tool with no output schema, the description covers the return contract (same shape as opentable_book plus was_modified: true), the confirmation semantics, and the preview prerequisite. Nothing an agent needs to invoke 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 67%, and the description supplements it by grouping the identity triad (restaurant_id + confirmation_number + security_token), reinforcing modify_token as required with no no-token path, and explaining that dining_area_id is optional and refused on mismatch. It adds little for the still-undocumented restaurant_id/party_size fields, so not a full 5.
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 specific verb and resource ('Modify an existing OpenTable reservation in place') and immediately distinguishes it from the preview step and the other siblings. An agent can tell this apart from opentable_book / opentable_modify_preview without opening any schema.
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 declares the precondition (a fresh modify_token from opentable_modify_preview is mandatory, with the reason) and routes the agent via named siblings. It also flags the Listing-type restaurant edge case and points at opentable_get_restaurant.bookable as the check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_modify_previewA
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?
Annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) cover the safety profile, and the description goes well beyond them: it discloses the return payload (new cancellation_policy, CC re-hold details, modify_token), the internal /booking/details URL construction with isModify=true, and the Listing-type failure mode. It is a preview that yields a token rather than performing the change, which is clearly conveyed.
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?
Purpose and the identity-vs-new-slot split are front-loaded, then constraints (dining_area_id optional, required-before-modify, Listing-type block) follow. It is dense and slightly repetitive on provenance, but nearly every sentence carries operational information and nothing is 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?
For a 12-parameter, no-output-schema tool, the description supplies what is otherwise missing: the returned artifacts (cancellation_policy, CC re-hold, modify_token), the workflow position (must precede opentable_modify), and the non-NA database_region caveat is documented in the schema. Nothing an agent needs to call this correctly is absent.
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%, and the description adds real meaning beyond it: it groups the params conceptually (existing identity vs NEW slot args) and explains origin/staleness ('from a fresh opentable_find_slots call'). It also reinforces dining_area_id as optional with auto-resolution. Some of this (slot_hash/reservation_token provenance) is already in the schema, so it is additive rather than filling a large 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?
States a specific verb+resource ('Preview a MODIFICATION to an existing OpenTable reservation') and explicitly distinguishes itself from siblings opentable_book_preview ('Mirrors opentable_book_preview, but...') and opentable_modify ('modify_token that opentable_modify consumes'). An agent can tell why this preview exists versus a plain booking preview without opening any schema.
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 explicit when-to-use ('REQUIRED before opentable_modify — no shortcut path') and where each input originates (identity from opentable_list_reservations or opentable_book, new slot args from a fresh opentable_find_slots call). Also names a when-not case: Listing-type restaurants can't proceed and you should 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_favoriteBIdempotent
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 already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, and openWorldHint=true, covering the mutation and repeat-call profile. The description adds nothing beyond the name's implication: it does not state what happens if the restaurant is not saved, whether auth is required, or how to confirm success.
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, front-loaded with the action and resource, with no wasted words.
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 one-parameter removal with annotations covering safety and idempotency, the description states the essential purpose. However, it omits the error/edge behavior when the item is not favorited and any success signal, which leaves gaps for an agent deciding whether the call succeeded.
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 single parameter is undocumented, so the description carries the burden. It only implies that 'a restaurant' is identified, without explaining that restaurant_id comes from search/get_restaurant results or giving any format detail. The self-explanatory parameter name keeps this from being worse than a bare minimum.
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 ('Remove') and resource ('restaurant from the user's Saved Restaurants list'), making the operation unambiguous. It does not explicitly name the sibling it contrasts with (opentable_add_favorite), but the verb alone is distinctive enough to route an agent correctly.
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?
There is no guidance on when to use this versus alternatives, nor any precondition (e.g., the restaurant must already be in the list). The agent must infer usage entirely from the name and description.
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 and openWorldHint, so safety is covered. The description adds valuable behavioral context by enumerating the returned fields (cuisine, neighborhood, price band, rating, description, URL) and the key negative — no bookable slot tokens. It omits pagination/rate-limit behavior, so not a 5.
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, front-loaded with purpose, then return contents, then the sibling routing caveat. 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?
No output schema exists, so the description reasonably carries the return-field burden via its enumeration. It covers the key exclusion (slots) and most return fields, though a full field list or pagination note would be more 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 coverage is 78%, high enough that the schema documents most parameters (date, term, time, view, location, metro_id, party_size). The description adds no parameter syntax beyond what the schema provides, including the important note that date affects ranking but not returned slots. Baseline 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?
States a specific verb (Search) and resource (OpenTable restaurants), and lists what comes back. It explicitly distinguishes itself from opentable_find_slots by declaring it does NOT return bookable slot tokens.
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 explicit routing: use opentable_find_slots for a specific venue to check availability, implying this tool is for discovery. The exclusion of slots is stated directly, so the agent knows which sibling to pick.
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.
6 tool updates
v1.3.4- Changed
opentable_book2 fields changed- added
Input schema / properties / date / patternAdded value: +"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" - added
Input schema / properties / time / patternAdded value: +"^([01]\\d|2[0-3]):[0-5]\\d$"
- Changed
opentable_book_preview2 fields changed- added
Input schema / properties / date / patternAdded value: +"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" - added
Input schema / properties / time / patternAdded value: +"^([01]\\d|2[0-3]):[0-5]\\d$"
- Changed
opentable_find_slots2 fields changed- added
Input schema / properties / date / patternAdded value: +"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" - added
Input schema / properties / time / patternAdded value: +"^([01]\\d|2[0-3]):[0-5]\\d$"
- Added
opentable_get_menu - Changed
opentable_modify2 fields changed- added
Input schema / properties / date / patternAdded value: +"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" - added
Input schema / properties / time / patternAdded value: +"^([01]\\d|2[0-3]):[0-5]\\d$"
- Changed
opentable_modify_preview2 fields changed- added
Input schema / properties / date / patternAdded value: +"^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" - added
Input schema / properties / time / patternAdded value: +"^([01]\\d|2[0-3]):[0-5]\\d$"
3 tool updates
v1.2.1- Changed
opentable_book2 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" +}
- Changed
opentable_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" +}
- Changed
opentable_modify2 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" +}
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
TDQS
Scored across 15 tools
Each tool targets a distinct resource+action, including the tricky preview/commit pairs (book_preview vs book, modify_preview vs modify), which are explicitly differentiated by the mandatory-token flow described in their descriptions. Favorites (list/add/remove), catalog (search/get_restaurant/get_menu), and reservation lifecycle (list/find_slots/book/modify/cancel) occupy clearly separate niches. find_slots feeding the booking tools is a documented dependency rather than an overlap.
All 15 tools use the opentable_ prefix with snake_case verb_noun structure (list_reservations, add_favorite, find_slots, book_preview, get_restaurant, remove_favorite). The preview/commit naming convention is applied uniformly to both booking and modification flows. No mixed conventions or vague verbs like 'process' or 'handle'.
15 tools sit at the top of the well-scoped range for a domain that legitimately spans search, restaurant/menu details, availability, book/modify/cancel lifecycles with mandatory previews, favorites management, profile, and a bridge diagnostic. No tool appears redundant; even the healthcheck earns its place as a transport diagnostic for the ContextMint bridge.
The surface covers the full reservation lifecycle end to end (discover → inspect → find slots → preview → book → modify → cancel) plus favorites, profile, and menus, with no obvious dead ends for core workflows. Minor gaps exist (e.g. no waitlist/notify support, no multi-restaurant availability comparison, no points/loyalty redemption), but these are non-core and agents can work around them.
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.
Book tables at restaurants on the Loyalist network. No login; read availability, then book.
Related MCP Servers
- AlicenseBqualityFmaintenanceEnables 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.124MIT
- AlicenseAqualityAmaintenanceManage Resy reservations via natural language: search restaurants, book tables, and manage reservations, favorites, and Priority Notify.15555 npm1MIT
- AlicenseAqualityDmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, including managing booking history and handling multi-factor authentication.947 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, with persistent sessions and MFA handling.947 npm1MIT