Skip to main content
Glama
chrischall

opentable-mcp

by chrischall

opentable-mcp

CI npm license

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:

  1. Starts a WebSocket listener on 127.0.0.1:37149 via @fetchproxy/server.

  2. 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.

  3. 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

opentable_list_reservations

read

/user/dining-dashboard SSR

opentable_get_profile

read

/user/dining-dashboard SSR

opentable_list_favorites

read

/user/favorites SSR

opentable_search_restaurants

read

/dapi/fe/gql?opname=Autocomplete

opentable_get_restaurant

read

/r/{slug} SSR (__INITIAL_STATE__)

opentable_find_slots

read

/dapi/fe/gql?opname=RestaurantsAvailability

opentable_book_preview

read

/booking/details SSR + SlotLock

opentable_book

write

SlotLock → /dapi/booking/make-reservation

opentable_cancel

write

/dapi/fe/gql?opname=CancelReservation

opentable_modify_preview

read

/booking/details SSR (isModify=true) + SlotLock

opentable_modify

write

/dapi/booking/make-reservation (isModify: true)

opentable_add_favorite

write

/dapi/wishlist/add

opentable_remove_favorite

write

/dapi/wishlist/remove

opentable_healthcheck

read

/robots.txt (bridge probe)

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 build

Install 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).

  1. 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.

  2. Sign in to https://www.opentable.com/ in that same browser profile.

  3. 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

MCP_CONFIRM_MODE

ask-user

What a write does on a client that cannot show a confirmation prompt (claude.ai, Claude Desktop). ask-user: two steps — the first call does nothing and returns a preview plus a token, and the model must get your approval in chat before calling again with it. auto: the same two steps, but the model may use the token after reviewing the preview itself. refuse: writes are refused on such clients. A client that can show prompts (Claude Code) always gets the real prompt. An unrecognised value is treated as refuse.

MCP_CONFIRM_TTL_SECONDS

600

How long a token stays valid.

MCP_CONFIRM_SECRET

random per process

Signing key; set it only if tokens must survive a server restart.

Run (local stdio)

node dist/bundle.js

Test

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 SSR

The 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_favorites doesn't reflect a fresh add_favorite. The /user/favorites SSR page is cached for a few seconds. Re-list after ~10 s or verify via opentable_get_profile's count.

Layout

  • src/transport-fetchproxy.ts — FetchproxyTransport: thin adapter over @fetchproxy/server's FetchproxyServer, the shared WebSocket bridge that talks to the ContextMint Bridge browser extension.

  • src/client.ts — OpenTableClient: wraps the transport with fetchJson / fetchHtml + error-mapping.

  • src/tools/*.ts — one file per concern (reservations / restaurants / favorites / user / search). Each exports registerXxxTools(server, client).

  • src/parse-*.ts — pure HTML/JSON parsers, fully unit-tested.

  • tests/ — 1:1 mirror of src/, 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.sha256Hash with hashes captured from opentable.com. If OpenTable re-deploys, the server returns PersistedQueryNotFound; see CLAUDE.md → "Hot spots" for the re-capture procedure.

  • dining_area_id is a required book arg. We can't auto-resolve rooms, so pass the restaurant's slug or numeric id to opentable_get_restaurant (slugs route to /r/{slug}, numeric ids to /restaurant/profile/{id}), read diningAreas[], and feed the id into opentable_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 tools
opentable_add_favoriteC
Idempotent

Add a restaurant to the user's Saved Restaurants list.

ParametersJSON Schema
NameRequiredDescriptionDefault
restaurant_idYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesYYYY-MM-DD
timeYesHH:MM (24h) — must match the slot returned by find_slots
slot_hashYesslot_hash from opentable_find_slots
party_sizeYes
confirmTokenNoONLY 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_tokenNoOpaque 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_idNoTamper-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_idYes
dining_area_idNoOptional 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_idsNoPass-through from find_slots.experience_ids. When non-empty, book refuses without a booking_token from opentable_book_preview.
database_regionNoOpenTable'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_tokenYesslot_availability_token from opentable_find_slots

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesYYYY-MM-DD
timeYesHH:MM (24h) — must match a slot returned by find_slots
slot_hashYesslot_hash from opentable_find_slots
party_sizeYes
experience_idNoFor Experience-mandatory slots: which experience to book (from slot.experience_ids). Required when find_slots returned an Experience slot.
restaurant_idYes
dining_area_idNoOptional 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_idsNoPass-through from find_slots.experience_ids. When non-empty, experience_id must also be set.
database_regionNoOpenTable'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_tokenYesslot_availability_token from opentable_find_slots

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_cancelA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmTokenNoONLY 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_idYes
security_tokenYes
database_regionNoOpenTable'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_numberYes

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_slotsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesYYYY-MM-DD
timeYesHH:MM (24h) — anchor time; slots come back relative to this
viewNoResponse 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_sizeYes
restaurant_idYes
database_regionNoOpenTable'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

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_profileA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_restaurantA
Read-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}.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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_idYesNumeric 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

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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-endA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_favoritesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reservationsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
viewNoResponse 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.
scopeNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to call it: to see the authenticated user's reservations, with an explicit default of upcoming and instructions to pass scope="past" or scope="all" to broaden. It does not explicitly name when-not-to-use alternatives, but the purpose is specific enough that no sibling tool is a realistic substitute.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

opentable_modifyA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesYYYY-MM-DD (the NEW date)
timeYesHH:MM (24h) — the NEW time
slot_hashYesslot_hash from opentable_find_slots for the NEW slot
party_sizeYes
confirmTokenNoONLY 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_tokenNoREQUIRED. From opentable_modify_preview. No no-token path — the new slot's policy + CC re-hold can differ from the original.
experience_idNoOptional tamper-check signal. When set, must match the experienceId baked into modify_token.
restaurant_idYes
dining_area_idNoOptional. The modify_token carries the dining area preview resolved; when restated here it must match the token.
security_tokenYes
reservation_tokenYesslot_availability_token from opentable_find_slots for the NEW slot
confirmation_numberYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesYYYY-MM-DD (the NEW date)
timeYesHH:MM (24h) — the NEW time
slot_hashYesslot_hash from opentable_find_slots for the NEW slot
party_sizeYes
experience_idNoFor Experience-mandatory slots; required when the new slot has experience_ids.
restaurant_idYes
dining_area_idNoOptional 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_idsNoPass-through from find_slots.experience_ids. When non-empty, experience_id must also be set.
security_tokenYes
database_regionNoOpenTable'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_tokenYesslot_availability_token from opentable_find_slots for the NEW slot
confirmation_numberYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_favoriteA
DestructiveIdempotent

Remove a restaurant from the user's Saved Restaurants list.

ParametersJSON Schema
NameRequiredDescriptionDefault
restaurant_idYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_restaurantsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD. Affects search ranking but not returned slots.
termNoFree-text query (cuisine or restaurant name)
timeNoHH:MM (24h). Default 19:00 when date is set.
viewNoResponse 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.
latitudeNo
locationNoCity / neighborhood / address — appended to the term. Prefer lat/lng when precise.
metro_idNoOpenTable metro id (e.g. 8 = SF Bay Area, 31 = Charlotte).
longitudeNo
party_sizeNoNumber of guests. Default 2.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 3 tool updatesv1.2.1
    • Changedopentable_book2 fields changed
      • removedInput schema / properties / confirm
        Removed value: -{
        -  "description": "Must be true to proceed. Without this, the tool returns a preview.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmToken
        Added 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"
        +}
    • Changedopentable_cancel2 fields changed
      • removedInput schema / properties / confirm
        Removed value: -{
        -  "description": "Must be true to proceed. Without this, the tool returns a preview.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmToken
        Added 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"
        +}
    • Changedopentable_modify2 fields changed
      • removedInput schema / properties / confirm
        Removed value: -{
        -  "description": "Must be true to proceed. Without this, the tool returns a preview.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmToken
        Added 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"
        +}
  2. 14 tool updatesv1.0.0
    • Changedopentable_add_favorite1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_book1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_book_preview1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_cancel1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_find_slots1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_get_profile1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_get_restaurant1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_list_favorites1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_list_reservations1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_modify1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_modify_preview1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_remove_favorite1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedopentable_search_restaurants1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. 6 tool updatesv0.19.2
    • Changedopentable_find_slots1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedopentable_get_profile2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedopentable_get_restaurant1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedopentable_list_favorites2 fields changed
      • addedInput schema / $schema
        Added value: +"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedopentable_list_reservations1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
    • Changedopentable_search_restaurants1 field changed
      • addedInput schema / properties / view
        Added 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"
        +}
  4. 2 tool updatesv0.18.2
    • Changedopentable_modify2 fields changed
      • addedInput schema / properties / dining_area_id / description
        Added value: +"Optional. The modify_token carries the dining area preview resolved; when restated here it must match the token."
      • changedInput schema / required
        Previous 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"
        +]
    • Changedopentable_modify_preview2 fields changed
      • addedInput schema / properties / dining_area_id / description
        Added 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."
      • changedInput schema / required
        Previous 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"
        +]
  5. 2 tool updatesv0.18.1
    • Changedopentable_get_restaurant1 field changed
      • changedInput schema / properties / restaurant_id / description
        Previous 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}."
    • Addedopentable_healthcheck
  6. 13 tool updatesv0.14.3
    • First observedopentable_add_favorite
    • First observedopentable_book
    • First observedopentable_book_preview
    • First observedopentable_cancel
    • First observedopentable_find_slots
    • First observedopentable_get_profile
    • First observedopentable_get_restaurant
    • First observedopentable_list_favorites
    • First observedopentable_list_reservations
    • First observedopentable_modify
    • First observedopentable_modify_preview
    • First observedopentable_remove_favorite
    • First observedopentable_search_restaurants

TDQS

A4.1/5.0

Scored across 14 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers