opentable-mcp
This server turns your signed-in OpenTable browser session into an MCP interface so Claude can manage reservations, search restaurants, and handle account data via natural language.
Search & discover restaurants — search by cuisine/name/location and get full details (cuisine, price band, rating, hours, address, phone, payment options)
Find available reservation slots — query by restaurant, date, time, and party size to get bookable slots with tokens
Book reservations — with a required dry-run/confirm flow; supports CC-required slots via preview token, auto-resolves dining area, and returns confirmation number + security token
Preview before booking — see cancellation policy, credit-card no-show fees, and held payment card before committing
List reservations — upcoming, past, or all, each with the security token needed to cancel or modify
Modify reservations — change date/time/party size of an existing booking while preserving the confirmation number
Cancel reservations — cancel with a dry-run confirm guard taking no action unless confirmed
Manage favorites — list, add, and remove saved restaurants
View your profile — name, email, phone, loyalty points/tier, home metro, member-since date (no payment details exposed)
Healthcheck — verify the browser bridge is connected
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@opentable-mcpfind dinner slots for 4 at Gramercy Tavern on Saturday"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
opentable-mcp
OpenTable reservation manager as an MCP server for Claude — find slots, book, cancel, manage favorites, and read your dashboard via natural language.
v0.3.0-alpha status: Chrome-extension bridge, 10 tools, read + write. Every OpenTable request is relayed through your signed-in Chrome tab over a localhost WebSocket — each request rides your existing session and reaches OpenTable as if you'd clicked it yourself.
How it works
OpenTable's edge (Akamai Bot Manager) enforces a behavioral challenge on /, /s, /r/…, /dapi/…, and /booking/…. Tooling that builds its own HTTP client — cycletls, impersonated curl, headless Chrome — invents a separate identity and gets a 403 or JS interstitial. opentable-mcp does the opposite: it uses your own browser session as-is, with the cookies and TLS context it already has.
So instead of standing in for the browser, this MCP server:
Starts a WebSocket listener on
127.0.0.1:37149via@fetchproxy/server.The fetchproxy browser extension (installed once, shared across all fetchproxy-based MCPs) connects from your signed-in browser and relays every request through the opentable.com tab via
fetch(..., { credentials: 'include' })— your TLS, your cookies, your already-solved_abck.Parses JSON responses (public GraphQL / JSON endpoints) and SSR HTML (
/user/*) into tool-shaped output.
No cookie-pasting. No cycletls. No Playwright. Just your own browser, acting on its own behalf — the MCP server only picks what to ask for.
Related MCP server: resy-mcp
Tools
Tool | Kind | Source |
| read |
|
| read |
|
| read |
|
| read |
|
| read |
|
| read |
|
| read |
|
| write |
|
| write |
|
| read |
|
| write |
|
| write |
|
| write |
|
| read |
|
Acknowledgement of Terms
By using this MCP server, you acknowledge and agree to the following:
1. This server accesses your own OpenTable account. Every request is dispatched through your own signed-in browser tab via the fetchproxy extension (or hangwin/mcp-chrome). It does not — and cannot — access anyone else's reservations.
2. OpenTable's Terms of Use govern your use of this server, just as they govern your direct use of opentable.com. The clauses most relevant here:
You may not use any deep-link, robot, spider, scraper, generative AI or other AI technology including, but not limited to, those that operate by interacting with or otherwise making use of your browser, such as automated assistants or other automatic or manual device, process, or means to access, copy, search, or monitor any portion of the Services or OpenTable Content, except as expressly authorized by OpenTable.
And, critically: "Actions of AI agents are acknowledged as actions of the User that is using them, and the User is responsible for checking and verifying the action…"
You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. OpenTable's ToU explicitly enumerates AI/automated-assistant access among the things they have not authorized; they also explicitly impute AI-agent actions back to you.
3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with OpenTable, Inc. It is a personal automation tool that drives the same /dapi/... and /booking/... endpoints opentable.com uses. Do not use it to mass-book, sweep CC-required tables, resell reservations, or for any commercial purpose. The book/cancel/modify tools exist so you can manage one reservation as if you were sitting at your browser.
4. Stability is not guaranteed. This server depends on internal OpenTable persisted-GraphQL query hashes that OpenTable rotates between deployments. When they rotate, tools break and we re-capture them. Your own use is at the mercy of OpenTable's release cadence.
5. You accept full responsibility for any consequences of using this server in connection with your OpenTable account — rate limiting, slot-lock rejections, no-show penalties for runaway bookings, account warnings, suspension, or any enforcement action. Per OpenTable's ToU, the AI agent's actions are your actions — review every book/cancel before you confirm. If OpenTable objects to your use, stop using this server.
This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede OpenTable's actual ToU.
Install
npm install
npm run buildInstall the fetchproxy extension
opentable-mcp shares one browser extension with every other fetchproxy-based MCP. Install it once from https://github.com/chrischall/fetchproxy:
Install the fetchproxy extension (Chrome Web Store / Safari
.dmg).Sign in to
https://www.opentable.com/in that same browser profile.The extension badge shows a green dot when the WebSocket + tab + auth cookie are all detected.
After that, any MCP client that launches node dist/bundle.js will reach OpenTable through your signed-in tab.
Full setup + troubleshooting guide: see the fetchproxy repo for the status-dot reference, WS protocol, and request lifecycle. Persisted-query hash capture for OpenTable redeploys is documented in CLAUDE.md here.
Configure (Claude Desktop / Claude Code)
{
"mcpServers": {
"opentable": {
"command": "node",
"args": ["/absolute/path/to/opentable-mcp/dist/bundle.js"]
}
}
}No env vars required by default — auth lives in the browser, not the MCP process.
Optional: bridge through hangwin/mcp-chrome instead
If you've installed hangwin/mcp-chrome for browser automation, opentable-mcp can route its OpenTable fetches through it instead of the fetchproxy extension:
{
"mcpServers": {
"opentable": {
"command": "node",
"args": ["/absolute/path/to/opentable-mcp/dist/bundle.js"],
"env": { "OT_BRIDGE": "mcp-chrome" }
}
}
}In that mode you don't need the fetchproxy extension. Every OpenTable request becomes a chrome_network_request call against your existing mcp-chrome install, pinned via tabUrl to an opentable.com tab.
Note: this path requires mcp-chrome ≥ the release containing PR #348 (tabUrl parameter on chrome_network_request). Pre-#348 mcp-chrome versions are active-tab-only and will misbehave for cross-origin fetches. Live-verification of this path is pending the upstream merge.
Other env vars: OT_WS_PORT (default 37149) overrides the fetchproxy WebSocket port; OT_MCP_CHROME_URL (default http://127.0.0.1:12306/mcp) overrides the mcp-chrome endpoint.
Run (local stdio)
node dist/bundle.jsTest
npm test # vitest, 72 unit tests, mocked fetch
npm run build # tsc + esbuild bundle
npx tsx scripts/probe-find-slots.ts # live GET round-trip via extension
npx tsx scripts/probe-list-res.ts # live dashboard SSRThe scripts/probe-*.ts files spin up the MCP server, call one or two tools through the extension bridge, and print the response. They require the extension to be loaded and an opentable tab to be open.
Troubleshooting
Red dot in popup / "extension offline" errors. See the fetchproxy extension's troubleshooting guide — most "extension offline" issues are upstream lifecycle bugs (service-worker sleep, dead content script), not opentable-mcp.
Behavioral challenge page in Chrome. Akamai sometimes interrupts a long-idle tab with a "verify you're human" interstitial. Click through it once and the tab is usable again.
list_favoritesdoesn't reflect a freshadd_favorite. The/user/favoritesSSR page is cached for a few seconds. Re-list after ~10 s or verify viaopentable_get_profile's count.
Layout
src/transport-fetchproxy.ts—FetchproxyTransport: thin adapter over@fetchproxy/server'sFetchproxyServer, the shared WebSocket bridge that talks to the fetchproxy browser extension.src/client.ts—OpenTableClient: wraps the transport withfetchJson/fetchHtml+ error-mapping.src/tools/*.ts— one file per concern (reservations / restaurants / favorites / user / search). Each exportsregisterXxxTools(server, client).src/parse-*.ts— pure HTML/JSON parsers, fully unit-tested.tests/— 1:1 mirror ofsrc/, vitest. WS-protocol-level tests live upstream in the fetchproxy repo.scripts/probe-*.ts— live round-trip probes (require the fetchproxy extension + sign-in).
Known quirks
Apollo persisted queries. Slot search, slot lock, cancel, autocomplete — all use
extensions.persistedQuery.sha256Hashwith hashes captured from opentable.com. If OpenTable re-deploys, the server returnsPersistedQueryNotFound; seeCLAUDE.md→ "Hot spots" for the re-capture procedure.dining_area_idis a required book arg. We can't auto-resolve rooms, so pass the restaurant's slug or numeric id toopentable_get_restaurant(slugs route to/r/{slug}, numeric ids to/restaurant/profile/{id}), readdiningAreas[], and feed the id intoopentable_book.Service-worker sleep. MV3 SWs sleep after ~30 s idle. The fetchproxy extension keeps itself warm; on cold wake, the first request may wait up to ~5 s for WS reconnect.
This project was developed and is maintained by AI (Claude Opus 4.7).
Available Tools
14 toolsopentable_add_favoriteB
Add a restaurant to the user's Saved Restaurants list.
| Name | Required | Description | Default |
|---|---|---|---|
| restaurant_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It does not disclose idempotency, error behavior for duplicates, authentication needs, or side effects. Only states the basic 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 a single sentence, which is concise. However, it is too sparse to be maximally helpful, lacking details that could be included without losing conciseness.
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 add operation, the description minimally covers the purpose. But without output schema or behavioral details, it is incomplete for an agent to invoke correctly, especially regarding duplicates or success confirmation.
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 should compensate. However, it adds no meaning beyond the schema's 'restaurant_id' parameter, which is already defined as an integer with constraints.
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 'Add a restaurant to the user's Saved Restaurants list' clearly states the action (add) and the resource (restaurant to Saved Restaurants list). It distinguishes itself from siblings like 'opentable_remove_favorite'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use or alternatives. Usage is implied by the name, but no when-not or context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_bookA
Book an OpenTable reservation. Requires a fresh slot_hash + reservation_token from opentable_find_slots (tokens expire within minutes — call find_slots just before book). dining_area_id is OPTIONAL: when omitted it's auto-resolved to the default dining area from OpenTable's booking-details page, so find_slots → book works without a separate opentable_get_restaurant call. For CC-required slots (prime-time at busy restaurants), opentable_book refuses without a booking_token from opentable_book_preview — the preview step surfaces the cancellation policy and the saved card that would be held. Auto-fetches the user's profile (name/email/phone) from /user/dining-dashboard. Returns confirmation_number + security_token; save both — they're required to cancel. For Listing-type restaurants there's no slot to lock — callers should check opentable_get_restaurant.bookable first and surface the restaurant's phone/URL instead. Without confirm:true this returns a dry-run and makes NO booking; re-run with confirm:true to commit.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — must match the slot returned by find_slots | |
| confirm | No | Must be true to proceed. Without this, the tool returns a preview. | |
| slot_hash | Yes | slot_hash from opentable_find_slots | |
| party_size | Yes | ||
| booking_token | No | Opaque token from opentable_book_preview. REQUIRED for CC-required slots (book will refuse otherwise). Optional for standard slots — when present, skips a redundant re-lock. | |
| experience_id | No | Tamper-check signal for Experience tokens. When set, must match the experienceId baked into the booking_token by preview — agents that re-state the experience choice here get refused if it drifted from preview. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional dining-area (room) id. When omitted, auto-resolved to the default dining area from the booking-details page — no opentable_get_restaurant call needed. Pass explicitly only to pin a specific room. Ignored on the booking_token path (the token already carries the resolved area). | |
| experience_ids | No | Pass-through from find_slots.experience_ids. When non-empty, book refuses without a booking_token from opentable_book_preview. | |
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| reservation_token | Yes | slot_availability_token from opentable_find_slots |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full burden. It discloses token expiry, dry-run mode, CC-required slot behavior, auto-fetching of user profile, return values, and limitations like database_region not being auto-derived.
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 well-structured, front-loaded with the main action, and each sentence adds useful information. Slightly verbose but not unnecessarily.
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 and no output schema, the description is fully adequate, covering prerequisites, side effects, return values, error conditions, and alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83% (high), baseline 3. The description adds significant value by explaining token expiry, optionality of dining_area_id, dry-run with confirm, booking_token requirement, and database_region limitation.
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 'Book an OpenTable reservation' and distinguishes from siblings by specifying prerequisites (slot_hash, reservation_token from opentable_find_slots) and noting that Listing-type restaurants should use alternative flows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool, including token expiry, optional parameters, required preview step for CC-required slots, dry-run behavior, and conditions for Listing-type restaurants. It also references sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_book_previewARead-only
Preview an OpenTable booking BEFORE committing. Fetches the /booking/details SSR page and the slot-lock to surface: the cancellation policy (including any credit-card no-show fee), the saved payment card that would be charged/held, and a short-lived booking_token that opentable_book consumes. REQUIRED for CC-required slots — opentable_book refuses to commit without the token. Safe to call for standard slots too (the token skips a redundant re-lock in book). Holds the slot for ~60-90s; preview → book should happen within a minute. For Listing-type restaurants (Le Bernardin, etc.) this tool can't fetch a slot at all — callers should check opentable_get_restaurant.bookable first and surface the restaurant's phone/URL instead. For Experience-mandatory slots (find_slots returned booking_type=experience_mandatory), pass experience_id from the slot's experience_ids to route through the Experience slot-lock.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD | |
| time | Yes | HH:MM (24h) — must match a slot returned by find_slots | |
| slot_hash | Yes | slot_hash from opentable_find_slots | |
| party_size | Yes | ||
| experience_id | No | For Experience-mandatory slots: which experience to book (from slot.experience_ids). Required when find_slots returned an Experience slot. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional dining-area (room) id. When omitted, auto-resolved to the default dining area from OpenTable's booking-details page — so you can go straight from find_slots to book without calling opentable_get_restaurant. Pass explicitly only to pin a specific room. | |
| experience_ids | No | Pass-through from find_slots.experience_ids. When non-empty, experience_id must also be set. | |
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| reservation_token | Yes | slot_availability_token from opentable_find_slots |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description confirms read-only preview behavior. It adds timing context (holds slot ~60-90s) and notes skipping redundant re-lock in book, going beyond 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?
Front-loaded with main purpose, all sentences add value (purpose, required scenarios, alternatives, timing, edge cases). No redundancy despite length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all critical context: what it surfaces, when mandatory, special cases (Listing, Experience-mandatory), timing, and database region handling. Adequate given no output 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 coverage is 80%, so baseline is 3. The description adds extra context for experience_id, database_region (with limitation), and auto-resolve for dining_area_id, justifying above 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 clearly states it previews a booking before committing, distinguishes from sibling opentable_book, and specifies the resources surfaced (cancellation policy, payment card, booking_token).
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 says when to use (required for CC-required slots, safe for standard slots) and when not (Listing-type restaurants cannot fetch slot; check bookable first). Also provides guidance for Experience-mandatory slots.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_cancelA
Cancel an OpenTable reservation. Requires restaurant_id, confirmation_number, and security_token — all three come from opentable_list_reservations or opentable_book. Without confirm:true this returns a dry-run and takes NO cancellation action; re-run with confirm:true to cancel the reservation.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to proceed. Without this, the tool returns a preview. | |
| restaurant_id | Yes | ||
| security_token | Yes | ||
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| confirmation_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully explains the dry-run behavior (no action without confirm:true) and the prerequisites. It does not cover all potential behaviors (e.g., error handling, reversibility), but the key behavioral trait is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no unnecessary words. Every sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the required workflow but omits return value information and does not discuss edge cases or error handling. The database_region parameter is important but not mentioned in the description, although it is in 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?
The description adds meaning for three parameters (restaurant_id, confirmation_number, security_token) by noting their source. It does not mention the database_region parameter, which is well-described in the schema. Overall, it partially compensates for the 40% schema coverage.
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 'Cancel an OpenTable reservation,' using a specific verb and resource. The action is unambiguous and distinct from sibling tools like opentable_book or opentable_modify.
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 tells the agent where to obtain required parameters (from opentable_list_reservations or opentable_book) and explains the dry-run vs. cancellation workflow. However, it does not explicitly contrast with opentable_modify (for changes instead of cancellation).
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 only say read-only. The description adds that availability is not held, that tokens must be used promptly, that dining-area resolution is automatic, and that a one-time page load may be needed. This is genuinely useful behavioral context beyond the structured metadata.
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?
Dense but efficient. Every sentence adds operational value: core behavior, next step, response field, cross-tool handoff, and an error prerequisite. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a multi-step integration tool with no output schema, the description covers inputs, outputs, handoff to booking, and an error prerequisite. Minor gap: no statement about empty availability responses.
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 schema covers the parameters, and the description adds cross-tool semantics: which parameter is the anchor, what the response token is for, and that view=dining_area changes the response shape. It doesn't restate every schema description, which 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?
Opens with a precise action and object: 'Given a restaurant_id, list available reservation slots for a date and time.' It also separates listing from booking, which distinguishes it from the booking sibling.
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?
Clearly says this tool only lists slots and that booking happens via another tool, including the token handoff. It doesn't explicitly enumerate when not to use it, but the placement and warning are strong enough for an agent to route correctly.
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?
With readOnlyHint already true, the description still adds value by explicitly stating that payment and credit-card details are never exposed, and by revealing that the tool operates on the authenticated user's data. It also names the returned field categories, supplying more than the annotation alone. No behavior contradicts the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste: the first lists the resource and returned fields, the second covers an important guarantee in the front-loaded core. It is compact, structured, and enough for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only profile endpoint with one optional fully-specified parameter, the description together with the schema and annotations is sufficient: it gives the resource, lists the returned content, and notes the privacy boundary. Omitting field-level types or output formatting is not a significant gap because no output schema is required.
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 schema's own text fully explains the 'view' parameter (compact vs. full, default behavior, what compact strips). The tool description does not mention the parameter, so it adds no semantic information beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Get the authenticated OpenTable user's profile') and enumerates exactly what data is included (name, email, phones, loyalty points and tier, home metro, member-since date). It is easy to distinguish from sibling tools like opentable_list_reservations or opentable_search_restaurants, which target different resources.
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 purpose clearly implies when to use the tool—when the caller needs the authenticated user's profile rather than reservations, favorites, or booking operations. It does not name an alternative or present explicit when-not conditions, but the 'never exposed' note about payment details does carve out an expectation boundary. The context is clear even though it lacks direct sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_get_restaurantARead-only
Get full details for a single OpenTable restaurant: cuisine, price band, description, address, hours, phone, payment options, features, rating/review count, and availability_token (used internally when booking). Accepts the numeric restaurant_id, a slug, a path, or the full URL from opentable_search_restaurants — passing the search result's "url" verbatim always resolves, including legacy venues served at /{slug} instead of /r/{slug}.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| restaurant_id | Yes | Numeric restaurant_id (as returned by opentable_list_reservations / opentable_list_favorites), slug ("state-of-confusion-charlotte"), path, or full URL from opentable_search_restaurants. Passing the search result's "url" verbatim resolves both /r/{slug} and legacy /{slug} venues; a numeric id resolves via /restaurant/profile/{id}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, which the description matches (a 'Get' operation). Beyond that, the description discloses genuinely useful behavior: the availability_token is for internal booking use, and the tool resolves both /r/{slug} and legacy /{slug} URLs. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, purpose and field list front-loaded, with input-format details in the second sentence. Dense but not bloated; the long field enumeration earns its place given there is no output schema to describe the return shape.
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 tool with no output schema, the description compensates by listing the returned fields and clarifying the union-typed identifier parameter's resolution behavior. The view parameter's semantics are fully handled by the schema. Little an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (view, restaurant_id) are already documented in detail within the schema, including the enum and the anyOf union. The description adds only a marginal guarantee ('passing the search result's url verbatim always resolves'), which is not in the schema but is a small increment over a solid 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?
States a specific verb+resource ('Get full details for a single OpenTable restaurant') followed by an explicit field list (cuisine, price band, address, hours, phone, etc.) that distinguishes it from siblings like opentable_search_restaurants (search) and opentable_get_profile (user profile). The availability_token mention adds precision about what is returned.
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?
Clearly identifies where valid inputs come from (opentable_search_restaurants, opentable_list_reservations, opentable_list_favorites) and gives practical guidance on passing the search result's 'url' verbatim to guarantee resolution. It does not explicitly contrast against alternatives ('use this when... not that when...'), but the input-source guidance is strong enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_healthcheckVerify the fetchproxy bridge end-to-endARead-onlyIdempotent
Round-trips a small public www.opentable.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'real www.opentable.com-side problem'. Read-only, no auth required. Call this when a real tool fails and you want to know which hop broke.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description reinforces safety with 'Read-only, no auth required' and adds crucial behavioral context: it reveals the exact diagnostics returned (role, port, version, extension link state, elapsed time, and a distinguishing hint). This goes beyond the annotations by disclosing what the call exercises and how the output isolates failures, without any contradiction.
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 front-loaded with the action, then lists the returned diagnostics in a compact, en-dash-separated series. The final two sentences tersely state 'Read-only, no auth required' and give a one-line invocation condition. Every phrase carries diagnostic value; none is fluff. Despite its length, it remains structured and readable.
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 a zero-parameter, read-only, idempotent health check with no output schema, the description provides complete context: it describes the jest performed, the specific fields returned, and the interpretation hints. The agent will know exactly what it is calling, what output to expect, and when the call is appropriate. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema is trivially complete (describe coverage is 100%). The description adds no parameter semantics because none are needed. Per rubric, 0 params earns a baseline of 4, and there is no gap to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific, action-oriented phrase: 'Round-trips a small public www.opentable.com URL (/robots.txt) through the fetchproxy bridge and returns diagnostics.' It names the resource, the operation, and explicitly enumerates the diagnostic fields. This clearly distinguishes it from the sibling tools, which are all business operations (book, cancel, search, etc.) rather than a bridge health check.
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 states exactly when to call it: 'Call this when a real tool fails and you want to know which hop broke.' This is an explicit trigger condition. It also implies when not to use it (for normal data operations), and since none of the siblings are diagnostic tools, no alternatives need be named. The guidance is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_list_favoritesBRead-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?
Annotations already declare readOnlyHint=true, and the description does not contradict that. It adds useful context that the source is the user's Saved Restaurants list and enumerates the returned fields, but it does not disclose pagination, limits, or other behavioral details. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no fluff, front-loaded with verb and resource, then a compact list of returned fields. Every clause earns its place, and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a single optional parameter and no output schema, the description covers scope and return fields well. It lacks details like pagination, response ordering, or explicit auth requirements, but those are secondary for selecting and invoking a favorite-list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers the only parameter ('view') with a full description and enum, so the prose description doesn't need to add parameter meaning. The schema's coverage is 100%, so the baseline of 3 applies; the description doesn't make the one parameter any clearer, but it doesn't need to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('the user's saved restaurants from OpenTable'), and enumerates the returned fields. The phrase 'Saved Restaurants list' clearly targets favorites, but it doesn't explicitly compare against siblings like opentable_list_reservations or opentable_search_restaurants, so sibling differentiation is implicit rather than stated.
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 about when to use this tool versus add_favorite/remove_favorite or search_restaurants. No prerequisites, exclusions, or non-goals are stated, so the agent must rely on the tool's name and inference to know when it fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_list_reservationsARead-only
List the authenticated user's OpenTable reservations. Defaults to upcoming; pass scope="past" or scope="all" to broaden. Each entry includes the security_token needed to cancel or modify.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | Response shape: "compact" (default) drops fields the response already carries elsewhere; "full" returns every field this server understands. compact strips image/avatar URLs from the response; "full" returns OpenTable's payload untouched. No field projection: this server has no verified record of which OpenTable fields matter, and inventing one would risk dropping a field a caller needs. | |
| scope | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description adds the detail that each entry includes a security_token needed for cancel/modify, which is useful. It does not disclose pagination, limits, or error behaviors, but the safety profile is covered by annotations and the core data shape is hinted.
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 concise and front-loads the core purpose and default behavior. It adds key details about scope and the security_token in just two sentences. The schema's 'view' description is verbose but belongs to the schema, not the description.
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 simple read-only nature, the description covers the essential context: what is returned (reservations, including security_token) and how to control scope. No output schema exists, so the return format is hinted but not exhaustive; however, for a list operation this is acceptable.
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 50%, and the description adds meaning to 'scope' by explaining its values and default. The 'view' parameter is fully documented in the schema, so the description doesn't need to add more. This compensates well for the uncovered parameter.
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 identifies the action (list), the resource (the authenticated user's OpenTable reservations), and explicitly differentiates from siblings such as opentable_search_restaurants or opentable_get_profile. It does not name a direct sibling for listing other entities, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default behavior (upcoming) and instructs how to broaden with scope, providing clear usage guidance. It does not explicitly state when not to use this tool relative to siblings, but the context is sufficient for typical listing scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_modifyA
Modify an existing OpenTable reservation in place. Requires the existing reservation's identity (restaurant_id + confirmation_number + security_token) plus a fresh modify_token from opentable_modify_preview — preview is mandatory because the new slot's cancellation policy / CC re-hold can differ from the original. Submits /dapi/booking/make-reservation with isModify: true + the existing confirmation_number + security_token; OpenTable preserves confirmation_number across modifies but may regenerate reservation_id and security_token. dining_area_id is OPTIONAL — the modify_token already carries the area opentable_modify_preview resolved; pass it only to restate it (mismatch is refused). Returns the same shape as opentable_book plus was_modified: true so the agent can phrase the user confirmation accurately. For Listing-type restaurants there's no slot to lock — agents should check opentable_get_restaurant.bookable first. Without confirm:true this returns a dry-run and makes NO change to the reservation; re-run with confirm:true to submit the modification.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD (the NEW date) | |
| time | Yes | HH:MM (24h) — the NEW time | |
| confirm | No | Must be true to proceed. Without this, the tool returns a preview. | |
| slot_hash | Yes | slot_hash from opentable_find_slots for the NEW slot | |
| party_size | Yes | ||
| modify_token | No | REQUIRED. From opentable_modify_preview. No no-token path — the new slot's policy + CC re-hold can differ from the original. | |
| experience_id | No | Optional tamper-check signal. When set, must match the experienceId baked into modify_token. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional. The modify_token carries the dining area preview resolved; when restated here it must match the token. | |
| security_token | Yes | ||
| reservation_token | Yes | slot_availability_token from opentable_find_slots for the NEW slot | |
| confirmation_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it discloses that without confirm:true the tool is a dry-run, that confirmation_number is preserved, that reservation_id and security_token may be regenerated, and that mismatched dining_area_id is refused. It also states the return shape (same as opentable_book plus was_modified:true).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: prerequisites, side effects, optional parameters, return shape, and dry-run flow are all covered without fluff. The structure front-loads the mandatory identity and preview requirement before optional details, which is appropriate for a complex mutation tool.
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 no annotations and no output schema, the description is notably complete: it specifies return shape via opentable_book plus was_modified, explains the reservation-identity and confirmation flow, warns about Listing-type restaurants, and describes the dry-run-to-confirm invocation protocol. An agent has everything needed to invoke this 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 coverage is 67%, so the description must add meaning, and it does: it identifies restaurant_id + confirmation_number + security_token as the reservation identity, marks modify_token as mandatory and sourced from opentable_modify_preview, and explains that dining_area_id and experience_id are optional/tamper-check values. It also ties reservation_token and slot_hash to opentable_find_slots, adding provenance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Modify an existing OpenTable reservation in place' with a specific verb and resource, and clearly distinguishes this from sibling tools like opentable_book (new reservations) and opentable_modify_preview (required preview step). It also names the endpoint and core semantics, so an agent can understand exactly what this tool does.
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 requires a fresh modify_token from opentable_modify_preview and explains why the preview is mandatory. It also tells agents to check opentable_get_restaurant.bookable for Listing-type restaurants and to re-run with confirm:true to submit, including the dry-run behavior. This is clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_modify_previewARead-only
Preview a MODIFICATION to an existing OpenTable reservation. Takes the existing reservation's identity (restaurant_id + confirmation_number + security_token from opentable_list_reservations or the original opentable_book result) plus the NEW slot args (from a fresh opentable_find_slots call) and returns the new cancellation_policy, CC re-hold details, and a modify_token that opentable_modify consumes. Mirrors opentable_book_preview, but the /booking/details URL includes confirmationNumber + securityToken + isModify=true so OpenTable's SSR returns the modify state. dining_area_id is OPTIONAL — omitted, it's auto-resolved from the booking-details page like book_preview does. REQUIRED before opentable_modify — no shortcut path. For Listing-type restaurants the modify can't proceed (no slot picker); check opentable_get_restaurant.bookable first.
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | YYYY-MM-DD (the NEW date) | |
| time | Yes | HH:MM (24h) — the NEW time | |
| slot_hash | Yes | slot_hash from opentable_find_slots for the NEW slot | |
| party_size | Yes | ||
| experience_id | No | For Experience-mandatory slots; required when the new slot has experience_ids. | |
| restaurant_id | Yes | ||
| dining_area_id | No | Optional dining-area (room) id for the NEW slot. When omitted, auto-resolved to the default dining area from OpenTable's booking-details page — the same resolution opentable_book_preview uses. Pass explicitly only to pin a specific room. | |
| experience_ids | No | Pass-through from find_slots.experience_ids. When non-empty, experience_id must also be set. | |
| security_token | Yes | ||
| database_region | No | OpenTable's sharded-database region for the restaurant. Defaults to 'NA' (North America). Pass the venue's region (e.g. for UK/EU/APAC restaurants) when booking or cancelling outside North America — slot-lock, availability, and cancel route to the wrong database shard, or fail opaquely, when this is wrong. LIMITATION: not auto-derived from restaurant data (OpenTable's availability/booking responses don't surface the shard id), so non-NA bookings must set it explicitly. | |
| reservation_token | Yes | slot_availability_token from opentable_find_slots for the NEW slot | |
| confirmation_number | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint=true, the description discloses that the endpoint returns cancellation_policy, CC re-hold details, and modify_token; that dining_area_id is auto-resolved when omitted; and that Listing-type restaurants cannot proceed. It also reveals the internal mechanism (isModify=true in the /booking/details URL), giving the agent useful expectations about behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: the first sentence states the purpose, and every subsequent sentence earns its place by covering source data, return values, a required precondition, and a failure mode. There is no filler or redundant restatement of schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, 8-required tool with no output schema, the description supplies the full call context: where identity and slot args come from, what the response contains, the mandatory position before opentable_modify, and the Listing-type failure condition. This is sufficient for an agent to 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 coverage is 67%, and the description compensates by explaining the provenance of key parameters: restaurant_id + confirmation_number + security_token come from list/book results; reservation_token and slot_hash come from a fresh find_slots call. It clarifies optionality and auto-resolution of dining_area_id and the relationship between experience_ids and experience_id, mapping cleanly to the schema fields.
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 'Preview a MODIFICATION to an existing OpenTable reservation' — a specific verb, resource, and scope. It distinguishes itself from opentable_book_preview by noting it 'Mirrors opentable_book_preview' but targets the modify state and returns a modify_token, so an agent can tell them apart.
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 states 'REQUIRED before opentable_modify — no shortcut path,' explicitly setting when this tool must be used. It directs the agent to source identity from opentable_list_reservations or the original opentable_book result, to pull NEW slot args from a fresh opentable_find_slots call, and it names the Listing-type exclusion with a check on opentable_get_restaurant.bookable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
opentable_remove_favoriteB
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?
No annotations provided, so the description carries full burden. It indicates a mutation (remove), but fails to disclose important behavioral traits such as whether the operation fails if the restaurant is not a favorite, authentication requirements, or rate limits. Transparency is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence of 11 words, front-loading the action and resource with no extraneous information. It is efficient and fits within the MCP context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description provides a basic functional understanding. However, it lacks guidance on usage and behavioral details that would make it fully complete for agent usage.
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% for the single parameter. While the parameter name 'restaurant_id' is self-explanatory, the description adds no additional meaning or context (e.g., where to find the ID, or acceptable formats). The tool description does not compensate for the lack of schema documentation.
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 resource ('a restaurant from the user's Saved Restaurants list'). It effectively distinguishes from sibling tools like opentable_add_favorite and opentable_list_favorites.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used when a restaurant should be removed from favorites, but it does not provide explicit guidance on prerequisites (e.g., the restaurant must already be a favorite) or when to avoid using it. Sibling tool names provide context, but the description itself lacks explicit usage direction.
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?
The read-only hint is already in annotations, so the description carries little weight on that front. The description adds useful behavioral context beyond the schema: it lists what the response contains and, more importantly, declares that it does NOT include bookable slot tokens. This influences whether the agent should continue with this tool or switch to the slots tool. It does not cover pagination or rate limits, but those are not hinted as critical.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: one defines the purpose, one defines the output and the critical limitation. There is no filler, and the sibling disambiguation is also the back-loaded second sentence. This is efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with no required parameters and no output schema, the description covers the gaps: it lists the returned fields and warns about the absence of the slot tokens. The input schema already handles the parameter details. The additional behavioral note about the partial output is exactly the kind of information the description needs to provide.
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 uses many parameters (7 of 9) with verbose descriptions, which covers most semantics. The description itself does not elaborate on any parameter, so its added value here is minimal. Latitude and longitude are left without a schema description, and the tool description does not compensate for those either, but the high overall coverage keeps this acceptable at the 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 specific verb and resource ('Search OpenTable for restaurants'), names the return fields (cuisine, neighborhood, price band, rating, description, URL), and distinguishes the tool from the sibling `opentable_find_slots` by stating it explicitly does not include bookable slot tokens. That is enough for an agent to tell this from its siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-not: this tool does NOT include slot tokens, and then names the exact sibling to use instead (`opentable_find_slots`) for availability checks. This is an explicit exclusion and alternative, which meets the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
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: profile, favorites, restaurant search/details, slots, previews, booking actions, and health checks. The preview/book and modify_preview/modify pairs are clearly separated by descriptions and token flow, so an agent should not confuse them.
The tool names are almost uniformly `opentable_verb_noun` and easy to predict, with clear patterns like add/remove/list for favorites and book/modify/cancel for reservations. The minor exception is `opentable_healthcheck`, which is a noun rather than a verb-noun action, and `book`, `modify`, and `cancel` omit explicit objects.
Fourteen tools is well within a reasonable scope and each tool earns its place in the OpenTable domain. The count covers search, restaurant details, favorites, availability, booking, modification, cancellation, and diagnostics without feeling bloated.
The reservation lifecycle is fully covered: list, preview, book, modify, and cancel, with previews handling required tokens and edge cases. Favorites have list/add/remove, restaurants have search/detail, and profile retrieval plus healthcheck round out the surface with no obvious dead ends.
Maintenance
Related MCP Connectors
Find Resy restaurants and request reservations through Scout; the user approves every booking.
Book hard-to-get restaurant reservations on your own Resy, SevenRooms, or OpenTable account.
AI-native scheduling and booking: check availability, book meetings, share links.
Last-minute booking slots across 11 suppliers. Search, price, and execute bookings via AI agents.
Related MCP Servers
- FlicenseBqualityFmaintenanceEnables users to search, check availability, and book restaurant reservations across Resy and OpenTable platforms. It supports direct booking for Resy and includes an automated reservation 'sniper' for securing high-demand slots the moment they become available.124-
- AlicenseAqualityAmaintenanceManage Resy reservations via natural language: search restaurants, book tables, and manage reservations, favorites, and Priority Notify.151,1101MIT
- AlicenseAqualityCmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, including managing booking history and handling multi-factor authentication.945MIT
- AlicenseAqualityDmaintenanceEnables AI agents to search restaurants, check availability, and book reservations on OpenTable, with persistent sessions and MFA handling.9451MIT