opentable-mcp
Manage your own OpenTable reservations through Claude, using your signed-in Chrome tab as the transport.
Find restaurants —
opentable_search_restaurantsby term, location, lat/lng, or metro id;opentable_get_restaurantfor full details (cuisine, price band, hours, address, phone, features, ratings) from an id, slug, path, or URL.Check availability —
opentable_find_slotsfor a restaurant + date + time + party size; returns slot tokens (Standard / Experience / POP, and bar / high-top / outdoor attributes).Book —
opentable_book_previewsurfaces the cancellation policy, any no-show fee, and the card that would be held, thenopentable_bookcommits and returns a confirmation number + security token.Modify —
opentable_modify_preview+opentable_modifyto change date/time/party size on an existing reservation in place.Cancel —
opentable_cancelusing the restaurant id, confirmation number, and security token.Review your account —
opentable_list_reservations(upcoming / past / all),opentable_get_profile(name, email, phones, loyalty tier; never payment details).Manage Saved Restaurants —
opentable_list_favorites,opentable_add_favorite,opentable_remove_favorite.Diagnose the bridge —
opentable_healthcheckreports which hop failed (bridge down vs. extension not connected vs. upstream problem).Safety rails — book / modify / cancel require confirmation (prompt, or a preview +
confirmTokentwo-step on clients without prompts); writes are refused if any argument changes between the preview and the commit.Caveats — personal, non-commercial use only; requires the ContextMint Bridge (or hangwin/mcp-chrome) extension plus a signed-in opentable.com tab; only your own reservations are reachable; non-North-America venues need
database_regionset manually; persisted-query hashes can break tools after OpenTable redeploys.
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 |
|
| read |
|
| write |
|
| write |
|
| read |
|
| write |
|
| write |
|
| write |
|
| read |
|
Acknowledgement of Terms
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses your own OpenTable account. Every request is dispatched through your own signed-in browser tab via the 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.
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. |
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.
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
14 toolsopentable_add_favoriteCIdempotent
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 establish that this is a mutation (readOnlyHint=false), non-destructive (destructiveHint=false), and safe to repeat (idempotentHint=true). The description adds nothing beyond that—it doesn't disclose what happens when the restaurant is already in the list, whether the restaurant must exist, or what the response looks like. The description does not contradict the annotations, but it contributes no behavioral context beyond them.
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 clean sentence with zero filler; the action verb is front-loaded and every word is load-bearing. It is appropriately sized for a tool with a single parameter and simple semantics.
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 tool with annotations declaring safety, the description is minimally sufficient to make the call. However, with no output schema and no error/edge-case behavior described, an agent cannot predict outcomes for invalid IDs or duplicate favorites—a notable gap for an operation with no other structured signals.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for restaurant_id. It loosely maps the parameter to 'a restaurant' but doesn't explain where the ID comes from (e.g., search results), how to obtain it, or any validation expectations. The self-descriptive parameter name partially mitigates the gap, but the description barely compensates for the undocumented 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 pairs a specific verb ('Add') with a concrete resource ('a restaurant' → 'the user's Saved Restaurants list'), making the operation unambiguous. The sibling set naturally includes remove_favorite and list_favorites, and the add/remove semantic contrast is implicit—but the description never names or references an alternative, so it stops short of explicit sibling differentiation.
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?
No guidance is given on when to call this tool versus opentable_remove_favorite or opentable_list_favorites. There are no conditions, exclusions, prerequisites, or alternatives mentioned anywhere in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_bookA
Book an OpenTable reservation. Requires a fresh slot_hash + reservation_token from opentable_find_slots (tokens expire within minutes — call find_slots just before book). dining_area_id is OPTIONAL: when omitted it's auto-resolved to the default dining area from OpenTable's booking-details page, so find_slots → book works without a separate opentable_get_restaurant call. For CC-required slots (prime-time at busy restaurants), opentable_book refuses without a booking_token from opentable_book_preview — the preview step surfaces the cancellation policy and the saved card that would be held. Auto-fetches the user's profile (name/email/phone) from /user/dining-dashboard. Returns confirmation_number + security_token; save both — they're required to cancel. For Listing-type restaurants there's no slot to lock — callers should check opentable_get_restaurant.bookable first and surface the restaurant's phone/URL instead. 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?
Without relying on sparse annotations, the description discloses token expiration, auto-fetching of the user profile, the two-step confirmation fallback, and the returned security_token that must be saved for cancellation. It also states refusal conditions for CC-required slots, exceeding what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and purpose-built; almost every sentence introduces an operational rule or warning that affects whether the call succeeds. Key facts are front-loaded before edge cases and confirmation instructions.
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?
Covers prerequisites, sequencing, authentication/profile handling, refund/cancellation consequences, optional parameters, regional sharding, and the return value. With no output schema and a 12-parameter surface, this description gives an agent everything needed to call the tool safely.
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?
Adds critical meaning beyond the schema: slot_hash and reservation_token must be fresh, dining_area_id is optional and auto-resolved, booking_token is required for CC-required slots, and database_region is needed for non-NA restaurants. This materially improves correct invocation of all 12 parameters.
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 action ('Book an OpenTable reservation') with prerequisites, and the sibling context (find_slots, book_preview, get_restaurant) makes the boundaries clear. It immediately distinguishes booking from previewing and slot-finding.
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 and sequencing rules: call find_slots immediately before booking, use opentable_book_preview for CC-required slots, and avoid booking Listing-type restaurants when opentable_get_restaurant.bookable is false. It also explains confirmation-mode behavior, leaving no ambiguity about the required call order.
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 only say readOnly=false, idempotent=false, destructive=false, so the description carries the full burden and delivers: it discloses the slot-lock side effect, the ~60-90s hold, the token's effect of skipping re-lock in opentable_book, and refusal behavior for deposit/prepaid slots. Nothing is hidden or contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: purpose, required-use, side-effect timing, unsupported categories, special routing, and refusal behavior. It is front-loaded with the core purpose and then delivers decision-relevant details in a logical order with zero 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 10-parameter tool with no output schema, the description covers the essential preconditions, side effects, special cases, and alternatives. It explains the booking flow, token lifetime, Listing-type limitation, Experience-mandatory handling, and deposit/prepaid refusal, leaving an agent with enough context to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the baseline is 3. The description adds value beyond the schema by explaining how experience_id routes through the Experience slot-lock, how reservation_token relates to the returned booking_token, and why dining_area_id can be auto-resolved. It does not need to repeat every schema field, and the coverage is already high.
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 ('Preview') and resource ('OpenTable booking') with a clear outcome: surfaces cancellation policy, saved payment card, and a short-lived booking_token consumed by opentable_book. It distinguishes itself from opentable_book by framing itself as the pre-commit step that produces the token required for CC-required slots.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when the tool is REQUIRED (CC-required slots), when it is safe but optional (standard slots), when it cannot work (Listing-type restaurants, directing callers to check opentable_get_restaurant.bookable), and how to handle Experience-mandatory slots via experience_id. It also names the alternative path of booking on opentable.com for refused cases.
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?
Beyond the annotations, the description discloses the two-step confirmation fallback, the confirmToken lifecycle, the preview details, and the refusal case for mismatched confirmation numbers. This adds substantial operational context beyond the destructiveHint/idempotentHint already present, and nothing contradicts 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?
The description is structured with purpose first, then required inputs, then confirmation flow, then refusal. It is fairly dense, but each sentence carries necessary operational detail; only the reference to MCP_CONFIRM_MODE adds minor overhead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive cancellation tool with no output schema, the description covers the full confirmation mechanism, parameter provenance, and a failure condition. It does not describe the success response format, but that is partly mitigated by the confirmation flow details and annotations. Sufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 40% schema description coverage, the description compensates by clarifying that restaurant_id, confirmation_number, and security_token are outputs of other tools, and by explaining confirmToken's role. database_region is not covered in the description, but the schema already provides a thorough explanation for it, so the overall parameter guidance is solid.
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 and resource: 'Cancel an OpenTable reservation.' It also names the required inputs and their origin, which distinguishes it from sibling operations like opentable_book or opentable_modify. The purpose is unambiguous and not a restatement of the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: the three required values come from opentable_list_reservations or opentable_book, and it explains the confirmation flow and refusal condition. However, it does not explicitly contrast cancellation with modification (opentable_modify) or state when not to use this tool, so it stops short of full alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_find_slotsARead-only
List available reservation slots at a specific OpenTable restaurant for a date + party size. Returns each slot's reservation_token (use it with opentable_book — tokens expire quickly, book promptly). Slots may be attributes=['default'|'bar'|'highTop'|'outdoor'] and type=Standard|Experience|POP. You can pass a slot's reservation_token + slot_hash straight to opentable_book without a separate opentable_get_restaurant call — book auto-resolves the dining area. (OpenTable's availability response carries only the seating category, not the numeric dining-area id, so that id is resolved at book time from the booking-details page.) If this errors with "operation ... not yet observed on this tab", open any OpenTable restaurant page in your browser once (the graphql bridge needs to see the page's own availability query fire first), then retry.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — anchor time; slots come back relative to this | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| party_size | Yes | ||
| restaurant_id | Yes | ||
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true reporters, and the description adds substantial behavior: tokens expire quickly, slot_hash can bypass a get_restaurant call, the dining-area id is resolved at book time, and the exact 'operation ... not yet observed on this tab' error workaround. This is rich behavioral disclosure well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description carries distinct operational information: core purpose, token expiration, slot attributes/types, booking shortcut, and error recovery. It is front-loaded with the main purpose, and the length is justified by the complexity of the integration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description does a good job explaining the key return value (reservation_token), slot_attributes, type, and slot_hash as an input to opentable_book. It also covers a known failure mode glitch. Minor gaps remain: it doesn't describe the full output shape or explicitly mention the required 'time' parameter in the prose, so it is very good but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents date, time, view, and database_region in detail. The description reinforces 'date + party size' and restaurant specificity, but it doesn't add significant meaning for restaurant_id, party_size, or time beyond what the schema already says. With 67% schema coverage, this is adequate but not exemplary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'List available reservation slots at a specific OpenTable restaurant for a date + party size.' It clearly differentiates from siblings like opentable_list_reservations by focusing on availability rather than existing reservations, and it names the downstream integration with opentable_book.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: returned reservation_token and slot_hash should be passed directly to opentable_book, and opentable_get_restaurant is unnecessary for that flow. It also provides a concrete retry condition. It doesn't explicitly contrast with opentable_list_reservations or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_get_profileARead-only
Get the authenticated OpenTable user's profile: name, email, phones, loyalty points and tier, home metro, member-since date. Payment and credit-card details are never exposed.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds valuable context by explicitly stating that payment and credit-card details are never exposed. This goes beyond the annotation and gives agents a clear guarantee about the response content, though it does not cover authentication or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the resource and fields, and ends with a crucial exclusion. Every sentence earns its place; there is zero fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional parameter, no output schema), the description lists all major return fields and the key exclusion. It does not specify exact structures (e.g., phone object layout), but for a read-only profile tool this is adequate; the schema covers the view parameter fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema's description for the 'view' parameter is thorough, covering response shape, defaults, and rationale for not offering field projection. Since schema coverage is 100%, the tool description does not need to add parameter detail; it provides no extra semantics, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'get the authenticated OpenTable user's profile', and enumerates the specific fields returned. It is unambiguous and distinguishes itself from sibling tools, which all concern reservations, bookings, restaurants, or favorites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the tool's purpose obvious—profile retrieval—so an agent can infer when to use it. It does not explicitly name alternatives or exclusion conditions, but given the unique scope and clear resource, the context is sufficient; no misleading guidance exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_get_restaurantARead-only
Get full details for a single OpenTable restaurant: cuisine, price band, description, address, hours, phone, payment options, features, rating/review count, and availability_token (used internally when booking). Accepts the numeric restaurant_id, a slug, a path, or the full URL from opentable_search_restaurants — passing the search result's "url" verbatim always resolves, including legacy venues served at /{slug} instead of /r/{slug}.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| restaurant_id | Yes | Numeric restaurant_id (as returned by opentable_list_reservations / opentable_list_favorites), slug ("state-of-confusion-charlotte"), path, or full URL from opentable_search_restaurants. Passing the search result's "url" verbatim resolves both /r/{slug} and legacy /{slug} venues; a numeric id resolves via /restaurant/profile/{id}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by explaining the compact/full view behavior, the fact that compact strips image/avatar URLs, and the reasoning that no field projection is invented to avoid dropping caller-needed fields. It also discloses resolution details for numeric IDs, slugs, paths, and full URLs, including legacy venue handling. This is rich behavioral context that annotations alone would not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and returned fields, and the second sentence efficiently explains identifier flexibility and legacy URL resolution. Every clause earns its place; there is no repetition, filler, or optional background.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-resource retrieval tool with no output schema, the description is complete: it enumerates all returned categories, explains both view modes, details accepted identifier forms, and notes availability_token's role in booking. An agent has enough information to select the tool and call it correctly without needing to inspect the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the tool description largely restates what the input schema already documents for restaurant_id and view. The description does not add meaning beyond the schema's parameter descriptions: both explain accepted ID forms and the compact/full distinction. Since the schema carries the full burden, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get full details') and resource ('a single OpenTable restaurant'), then enumerates the exact fields returned: cuisine, price band, description, address, hours, phone, payment options, features, rating/review count, and availability_token. This clearly distinguishes it from sibling tools like opentable_search_restaurants, which lists/search results, and opentable_list_reservations, which handles user reservations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: to retrieve full details for a single known restaurant, often as a follow-on to opentable_search_restaurants. It even instructs that passing the search result's 'url' verbatim always resolves, including legacy /{slug} venues. It does not explicitly state when not to use it or name alternatives for other cases, but the usage context is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_healthcheckVerify the ContextMint Bridge connection end-to-endARead-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. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, and the description confirms read-only/no-auth. Beyond that it discloses what the round-trip actually probes and enumerates the failure classes the hint distinguishes (bridge never came up vs extension not connected vs capability unavailable vs site-side problem), which is real behavioral value the annotations don't 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 mechanism, then the returned fields, then the call condition. The middle sentence is dense with enumerations, but every item is a distinct diagnostic the agent needs, so little is wasted. Slightly heavy for a single read-only probe.
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 must carry the return contract, and it does — it names each diagnostic field and the categories of hint returned. Combined with annotations covering safety, an agent has everything needed to call this correctly and interpret the result.
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 schema imposes no burden and the baseline is 4. The description correctly adds no parameter commentary because there is nothing to parameterize — the URL and target are fixed internally.
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 action (round-trips /robots.txt through the ContextMint Bridge) and the exact output (bridge role, port, version, link state, elapsed time, hint). This is unmistakably a connectivity diagnostic, cleanly separable from the booking/reservation siblings that share the opentable_ prefix.
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 an explicit trigger: 'Call this when a real tool fails and you want to know which hop broke.' That is clear when-to-use guidance. It doesn't spell out when NOT to use it (e.g., for routine preflight checks), but no sibling competes for this role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_list_favoritesARead-only
List the user's saved restaurants from OpenTable (Saved Restaurants list). Returns each entry's id, name, cuisine, neighborhood, price band, rating, and OpenTable URL.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true, the annotation already covers the non-mutating behavior. The description adds a useful account of what the response contains (id, name, cuisine, neighborhood, price band, rating, URL), but it does not disclose potential traits such as authentication requirements, empty-list behavior, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the action and resource immediately, and the appended field list is informative without bloat. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list with one optional parameter and no output schema, the description covers the operation, the return payload, and the relevant domain. The schema fully documents the only parameter, so nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the view parameter's enum and description are already explicit about compact/full behavior and defaults. The tool description itself adds no parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('List'), resource ('user's saved restaurants from OpenTable'), and explicitly names it as the Saved Restaurants list. It also enumerates the returned fields, distinguishing it from siblings like opentable_list_reservations and opentable_search_restaurants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'user's saved restaurants from OpenTable (Saved Restaurants list)' provides clear context that this tool is for reading the current user's favorites rather than reservations or search results. It does not explicitly name alternative tools or exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_list_reservationsARead-only
List the authenticated user's OpenTable reservations. Defaults to upcoming; pass scope="past" or scope="all" to broaden. Each entry includes the security_token needed to cancel or modify.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| scope | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares safety, so the bar is lower; the description adds meaningful behavior beyond that: it operates on the authenticated user's reservations, defaults to upcoming, and each entry includes the security_token needed for downstream cancel/modify operations. It does not cover pagination or error behavior, but it goes well beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, purposeful sentences. The first states the core action, the second gives the key invocation option, and the third explains the security_token relevance. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with two optional enum parameters and a readOnly annotation, the description plus schema covers what an agent needs to invoke it correctly. The absence of an output schema is partially addressed by noting that entries include security_token and by the view parameter's response-shape explanation, though pagination, ordering, and full return-structure details are not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only the view parameter is documented in the schema (50% coverage), but the description compensates by explaining scope: its default and the 'past'/'all' broadening options. The view parameter carries a thorough schema description, so together the two parameters are effectively well explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List the authenticated user's OpenTable reservations.' This clearly distinguishes the tool from siblings like opentable_search_restaurants, opentable_list_favorites, and opentable_book by focusing on the user's own reservation records.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to call it: to see the authenticated user's reservations, with an explicit default of upcoming and instructions to pass scope="past" or scope="all" to broaden. It does not explicitly name when-not-to-use alternatives, but the purpose is specific enough that no sibling tool is a realistic substitute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_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 flag mutation (destructiveHint=true, readOnlyHint=false), so the description's job is to add context beyond that, which it does: it discloses that confirmation_number is preserved while reservation_id/security_token may be regenerated, that dining_area_id mismatch is refused, and that without client elicitation a first call returns preview+confirmToken and only a repeat call commits. These are non-obvious behaviors the agent cannot infer from annotations, and nothing contradicts the annotated hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense (~5 sentences) and front-loaded with purpose and prerequisites, with every sentence carrying operational facts not in the schema. There is mild redundancy — the identity trio appears twice and dining_area_id's optionality appears in both schema and description — but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, 8 required, and no output schema, the description covers the full call protocol: mandatory preview, user-confirmation flow with confirmToken fallback, the return shape (opentable_book shape plus was_modified), and the Listing-type exclusion. The only indirection is pointing to opentable_book's shape rather than spelling it out, which is acceptable given sibling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at 67%, the description compensates by grouping restaurant_id + confirmation_number + security_token as the 'existing reservation's identity', explaining why modify_token is mandatory with no no-token path, and clarifying that dining_area_id is optional because the token already carries the resolved area, with mismatch refused. party_size, restaurant_id, and security_token still lack explicit schema descriptions, but the identity-grouping covers the latter two.
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 — 'Modify an existing OpenTable reservation in place' — and immediately anchors the flow by naming opentable_modify_preview as a mandatory prerequisite, separating this submission step from the preview sibling. The isModify:true/confirmation_number details further distinguish it from opentable_book and opentable_cancel in the sibling list.
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?
States when to use (modifying an existing reservation) and explicitly when not: 'For Listing-type restaurants there's no slot to lock — agents should check opentable_get_restaurant.bookable first.' It mandates the precondition (fresh modify_token from opentable_modify_preview) and the human-confirmation requirement before the call, leaving little ambiguity about the correct call sequence.
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 are all false, so the description carries the full burden. It does disclose return values (cancellation_policy, CC re-hold details, modify_token) and an optional auto-resolution behavior for dining_area_id, plus the Listing-type restriction. However, it does not clarify side effects (e.g., whether it holds the new slot or affects the existing reservation), idempotency, or authentication needs. This leaves meaningful behavioral ambiguity for a non-read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose, then adds necessary operational details (input sources, optional param behavior, preconditions). It is not padded, but the length is justified given the 12-parameter surface and the need to differentiate from a sibling. Every sentence adds value.
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 tool with 12 params, 8 required, no output schema, and no annotations, the description covers the full workflow: where to get inputs, how optional params behave, the database_region caveat, and a critical precondition. It also states the return items. It lacks explicit error-handling or side-effect detail, but given the complexity and the sibling references (find_slots, book_preview, modify), it is substantially 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 67%, and the description adds significant context beyond the schema: it groups parameters by source (existing reservation identity vs. new slot args), explains dining_area_id auto-resolution, and clarifies database_region's role and default. It compensates for the undocumented parameters (restaurant_id, confirmation_number, security_token, party_size) by describing their provenance. Some parameter-specific details are still left to inference, but the added semantics are strong.
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 the specific action ('Preview a MODIFICATION'), the resource (existing OpenTable reservation), and explicitly differentiates from opentable_book_preview by pointing out the isModify=true URL difference. Also clearly declares its role as a mandatory prerequisite for opentable_modify, so an agent can immediately understand its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when it is required ('REQUIRED before opentable_modify — no shortcut path'), how to obtain its inputs (reservation identity from list_reservations/book result, new slot args from find_slots), and a key exclusion ('For Listing-type restaurants the modify can't proceed; check bookable first'). This gives clear guidance on when and how to use it versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_remove_favoriteADestructiveIdempotent
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 indicate idempotentHint=true and destructiveHint=true, so the description doesn't contradict them. The description adds value by clarifying that the action targets the user's saved list and affects only that restaurant. It doesn't need to repeat the annotations, but it could have mentioned side effects (e.g., irreversible removal), which is a minor gap given the mutation nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, concise and to the point. It avoids unnecessary detail while covering the core purpose, making it easy for an agent to process quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter tool with annotations and no output schema, the description is nearly complete. It clearly states what the tool does, and the only missing piece is explicit guidance on how to determine the restaurant_id, which could be inferred from the sibling tools. Overall, it provides sufficient context for an agent to understand and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the parameter. The description doesn't explicitly explain restaurant_id, but the tool name and description imply that restaurant_id identifies the restaurant to remove. However, it doesn't provide details like how to obtain the ID (e.g., from list_favorites), which would be more helpful. With only one parameter, the context is fairly clear, but the description could be more explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (remove) and the target (a restaurant from the Saved Restaurants list). It distinguishes this from sibling tools like opentable_add_favorite and opentable_list_favorites, though it doesn't explicitly name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by mentioning the Saved Restaurants list, which hints that this tool is appropriate when a restaurant is already a favorite and needs to be removed. However, it doesn't explicitly state when to use or avoid this tool relative to siblings, nor does it mention any prerequisites (e.g., the restaurant must already be saved).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_search_restaurantsARead-only
Search OpenTable for restaurants. Returns matching restaurants with cuisine, neighborhood, price band, rating, description, and URL. Does NOT include bookable slot tokens — use opentable_find_slots for a specific venue to check availability.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | YYYY-MM-DD. Affects search ranking but not returned slots. | |
| term | No | Free-text query (cuisine or restaurant name) | |
| time | No | HH:MM (24h). Default 19:00 when date is set. | |
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| latitude | No | ||
| location | No | City / neighborhood / address — appended to the term. Prefer lat/lng when precise. | |
| metro_id | No | OpenTable metro id (e.g. 8 = SF Bay Area, 31 = Charlotte). | |
| longitude | No | ||
| party_size | No | Number of guests. Default 2. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral context by stating exactly what fields are returned and, crucially, that slot tokens are not included—information an agent needs to avoid assuming availability is present. This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero filler. The first sentence delivers the core purpose and output, and the second sentence provides a critical exclusion plus a pointer to the sibling. It is front-loaded, efficient, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no required parameters and no output schema, the description covers the essential behavioral contract: what it returns, what it omits, and when to use a different tool. It does not explain parameter interactions (like date affecting ranking), but those are already in the schema. Minor gaps like pagination or result limits are not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 78%, so most parameters already have their own explanations in the schema. The tool description adds no new parameter-level meaning; it only restates the return fields. Per the rubric, high schema coverage sets a baseline of 3, and the description does not exceed that baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Search OpenTable for restaurants' and lists specific returned fields (cuisine, neighborhood, price band, rating, description, URL). It explicitly differentiates itself from opentable_find_slots by stating it does NOT include bookable slot tokens, making its scope unambiguous among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-not and names the alternative: 'Does NOT include bookable slot tokens — use opentable_find_slots for a specific venue to check availability.' This directly routes the agent away from the most likely confusion and toward the correct sibling, which is exactly what good usage guidance looks like.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
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
13 tool updates
v0.14.3- First observed
opentable_add_favorite - First observed
opentable_book - First observed
opentable_book_preview - First observed
opentable_cancel - First observed
opentable_find_slots - First observed
opentable_get_profile - First observed
opentable_get_restaurant - First observed
opentable_list_favorites - First observed
opentable_list_reservations - First observed
opentable_modify - First observed
opentable_modify_preview - First observed
opentable_remove_favorite - First observed
opentable_search_restaurants
TDQS
Scored across 14 tools
Each tool targets a distinct resource and action: search vs. restaurant details vs. slot availability, preview vs. commit for both bookings and modifications, and favorites CRUD vs. reservation management. Descriptions explicitly clarify boundaries and warn about overlapping-sounding tools (e.g., search_restaurants does not return slots; get_restaurant's availability_token is internal). No two tools appear to do the same thing.
All tools use a consistent opentable_ prefix and snake_case, with predictable verb_noun or verb patterns (find_slots, book_preview, list_reservations, add_favorite, remove_favorite, search_restaurants). The lone 'healthcheck' is still snake_case and fits the same style. The naming scheme is uniform throughout.
14 tools is well-scoped for a reservation platform, covering discovery, availability, booking, modification, cancellation, profile, favorites, and diagnostics without bloat. Each tool earns its place in a coherent workflow.
The set covers the full OpenTable lifecycle: search and detail lookup, slot discovery, preview and booking, modify preview and modify, cancel, list reservations, profile access, and favorites CRUD. A healthcheck tool also provides diagnostic support. No obvious dead ends or missing core operations for the domain.
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.
AI-native scheduling and booking: check availability, book meetings, share links.
Related MCP Servers
- FlicenseBqualityFmaintenanceEnables users to search, check availability, and book restaurant reservations across Resy and OpenTable platforms. It supports direct booking for Resy and includes an automated reservation 'sniper' for securing high-demand slots the moment they become available.124-
- AlicenseAqualityAmaintenanceManage Resy reservations via natural language: search restaurants, book tables, and manage reservations, favorites, and Priority Notify.151,089 npm1MIT
- AlicenseAqualityCmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, including managing booking history and handling multi-factor authentication.962 npmMIT
- AlicenseAqualityDmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, with persistent sessions and MFA handling.962 npm1MIT