OpenTable reservation management: find slots, book, cancel, list reservations, manage favorites.
OpenTable reservation management: find slots, book, cancel, list reservations, manage favorites.
Valid MCP server (1 strong, 1 medium validity signals). No known CVEs in dependencies. Package registry verified. Imported from the Official MCP Registry. Trust signals: trusted author (9/9 approved).
6 files analyzed · 1 issue found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-chrischall-opentable-mcp": {
"args": [
"-y",
"opentable-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
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, so Akamai sees a real browser and we get clean 200s on paths that block Node
fetchentirely.
OpenTable's edge (Akamai Bot Manager) serves a behavioral challenge to non-browser HTTP clients on /, /s, /r/…, /dapi/…, and /booking/…. cycletls, impersonated curl, and headless Chrome all hit 403 or a JS interstitial. The only thing Akamai never blocks is the actual signed-in Chrome tab.
So instead of shipping another bot-evasion dance, this MCP server:
127.0.0.1:37149../extension/) connects from your signed-in browser and relays every request through the opentable.com tab via fetch(..., { credentials: 'include' }) — real TLS, real cookies, real challenge-solved _abck./user/*) into tool-shaped output.No cookie-pasting. No cycletls. No Playwright.
| 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 | write | SlotLock → /dapi/booking/make-reservation |
opentable_cancel | write | /dapi/fe/gql?opname=CancelReservation |
opentable_add_favorite | write | /dapi/wishlist/add |
opentable_remove_favorite | write | /dapi/wishlist/remove |
npm install
npm run build
chrome://extensions, enable Developer Mode../extension/ from this repo.https://www.opentable.com/ in that same Chrome profile.After that, any MCP client that launches node dist/bundle.js will reach OpenTable through your signed-in tab.
Full setup + troubleshooting guide: extension/README.md covers the status-dot reference, WS protocol, request lifecycle, and how to capture new persisted-query hashes when OpenTable redeploys.
{
"mcpServers": {
"opentable": {
"command": "node",
"args": ["/absolute/path/to/opentable-mcp/dist/bundle.js"]
}
}
}
No env vars required — auth lives in the browser, not the MCP process.
node dist/bundle.js
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.
chrome://extensions. The extension auto-reinjects content scripts into any existing opentable tab on reload.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.src/ws-server.ts — OpenTableWsServer: accepts the extension WS, relays fetch RPCs.src/client.ts — OpenTableClient: wraps the WS 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.extension/ — MV3 service worker, content script (fetch relay, isolated world), capture logger (MAIN world).tests/ — 1:1 mirror of src/, vitest.scripts/probe-*.ts — live round-trip probes (require extension + sign-in).extensions.persistedQuery.sha256Hash with hashes captured from opentable.com. If OpenTable re-deploys, the server returns PersistedQueryNotFound; open the extension's capture log to re-grab them.dining_area_id is a required book arg. /r/<numeric-id> 404s on OpenTable (URLs use slugs), so we can't auto-resolve rooms. Pass the restaurant's URL slug to opentable_get_restaurant, read diningAreas[], and feed the id into opentable_book.chrome.alarms tick to stay 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).
Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace · Developer Tools
Create, build, and publish Python MCP servers to PyPI — conversationally.