# opentable-mcp [Health: Active]

**Category:** 💻 Developer Tools  
**Repository:** https://github.com/chrischall/opentable-mcp  
**GitHub Stars:** 0  
**npm Downloads (last month):** 3820  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/opentable-mcp

## Description
OpenTable reservation management: find slots, book, cancel, list reservations, manage favorites.

## Tools
Capabilities this server exposes over MCP:

- **opentable_list_reservations** — 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.
- **opentable_find_slots** — 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.
- **opentable_book_preview** — 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.
- **opentable_modify_preview** — 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.
- **opentable_book** — 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).
- **opentable_modify** — 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).
- **opentable_cancel** — 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.
- **opentable_get_profile** — 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.
- **opentable_list_favorites** — List the user's saved restaurants from OpenTable (Saved Restaurants list). Returns each entry's numeric restaurant_id (a number, or null when OpenTable omits it — the same id opentable_get_restaurant, opentable_find_slots and opentable_remove_favorite take), name, cuisine, neighborhood, price band, rating, and OpenTable URL.
- **opentable_add_favorite** — Add a restaurant to the user's Saved Restaurants list.
- **opentable_remove_favorite** — Remove a restaurant from the user's Saved Restaurants list.
- **opentable_search_restaurants** — 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.
- **opentable_get_restaurant** — 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}.
- **opentable_get_menu** — Large menus return bounded pages of whole items; follow pagination.next_offset with the same filters. Optional section_name selects an exact section; offset/limit paginate items. view=full without paging is uncapped. Get published menus for an OpenTable restaurant, including sections, dishes, prices, variations, currency, provider and updated timestamps. Accepts the same numeric id/slug/path/URL as opentable_get_restaurant. Optional menu_name selects an exact title case-insensitively (e.g. Dinner). Returns available_menus and status: available, menu_not_found, external_only or not_available. External menu_url links are returned but never fetched. Prices describe OpenTable's published menu, not a live quote from the restaurant.
- **opentable_healthcheck** — Round-trips a small public www.opentable.com URL (/robots.txt) through ContextMint Bridge (your signed-in browser tab) and returns diagnostics: the bridge's role (host/peer/null), port, version, the extension link (linked / pair pending / not attached / never answered), the elapsed round-trip time, and a plain-English hint distinguishing 'bridge never came up' from 'extension not connected' from 'this browser can't serve a capability' from 'real www.opentable.com-side problem'. Read-only, no auth required. Tests bridge transport only. Search/menus/availability are reported only from observed real reads; booking is never probed.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "opentable-mcp": {
    "command": "npx",
    "args": ["-y","opentable-mcp"]
  }
}
```

## Documentation

## What opentable-mcp MCP server does

The opentable-mcp MCP server exposes OpenTable account and restaurant operations as MCP tools. It can read reservations, profile information, favorites, restaurant details, menus, and available booking times. It also provides write operations for creating, cancelling, and modifying reservations, plus adding or removing favorites.

Restaurant lookup accepts identifiers such as a restaurant ID, slug, path, or exact OpenTable URL where supported. Menu retrieval can return all published menus or select a menu by its exact title, such as `Dinner`. Menu responses preserve sections, items, prices, currency, provider, update time, and any available external menu URL.

## How it works

The server starts a WebSocket listener on `127.0.0.1:37149`. The ContextMint Bridge browser extension connects to that listener and forwards requests through an OpenTable tab using the tab's existing authenticated browser context. This means requests use the signed-in session's cookies and browser environment instead of a separately constructed HTTP identity.

Responses from OpenTable's JSON and GraphQL endpoints are parsed into tool results. Server-rendered pages are also parsed for account dashboards, restaurant data, and booking previews. Booking and modification flows use OpenTable's slot-lock process before sending the final request.

## Setup and configuration

Install and build the package with npm:

```bash
npm install
npm run build
```

Install the ContextMint Bridge extension from its release page, load the unpacked Chrome extension through `chrome://extensions`, and sign in to OpenTable in the browser tab used for requests. The extension is shared with other fetchproxy-based MCP servers.

## Tools and capabilities

The available tools cover these operations:

- Read reservations, profile data, favorites, restaurant records, menus, and availability.
- Search for restaurants through OpenTable autocomplete.
- Preview and complete new reservations.
- Preview and submit reservation modifications.
- Cancel reservations.
- Add or remove restaurants from favorites.
- Check bridge health through `opentable_healthcheck`.

Large menus use item-based pagination. A response reports the available sections, returned item count, total item count, and the next offset. Menu results can be limited to a section, and `view: "full"` retains media URLs. External menu links are returned but not fetched.

## Limitations and notes

The opentable-mcp MCP server operates on the OpenTable account already signed in to the browser; it cannot access another user's reservations. The project documentation says it is intended for personal, non-commercial use and is not affiliated with OpenTable. Users remain responsible for reviewing booking, cancellation, and modification actions and for consequences involving their account.

The implementation depends on OpenTable's internal endpoints and persisted GraphQL query hashes. OpenTable deployments can change those interfaces, causing tools to stop working until they are updated. The documentation also notes that OpenTable's terms address automated and AI-assisted access, so users should review those terms before operating the server. The menu tool reads published data from the restaurant page and does not hold a table or fetch external menu hosts.

_Full upstream README: https://allmcps.com/mcp/opentable-mcp/readme_

