Skill flagged — suspicious patterns detected

ClawHub Security flagged this skill as suspicious. Review the scan results before using.

Opentable Mcp

v0.7.0

Manage OpenTable reservations via MCP — search restaurants, check slot availability, book tables, list/cancel reservations, and manage favorites. Triggers on...

0· 77·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for chrischall/opentable-mcp.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Opentable Mcp" (chrischall/opentable-mcp) from ClawHub.
Skill page: https://clawhub.ai/chrischall/opentable-mcp
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install opentable-mcp

ClawHub CLI

Package manager switcher

npx clawhub@latest install opentable-mcp
Security Scan
Capability signals
CryptoRequires walletCan make purchasesRequires OAuth tokenRequires sensitive credentials
These labels describe what authority the skill may exercise. They are separate from suspicious or malicious moderation verdicts.
VirusTotalVirusTotal
Pending
View report →
OpenClawOpenClaw
Suspicious
medium confidence
Purpose & Capability
Name/description match the implementation: a local MCP server plus a Chrome companion extension that relays requests through a signed-in opentable.com tab. The repo contains the expected ws server, client, tools, parsers, and extension code to implement searching, slot-finding, booking, canceling and favorites management.
!
Instruction Scope
SKILL.md and the code instruct the user to run the MCP server and side-load the extension; that is appropriate. However the repo also contains probe scripts that perform real write actions (e.g., scripts/probe-book-cancel.ts and scripts/probe-book-cc-cancel.ts explicitly book and immediately cancel actual reservations) and planning docs that ask users to capture and paste raw XHR logs (window.__otMcpCaptures) into chat for persisted-query capture. Running those probes or pasting raw capture JSON could result in unintended real bookings or disclosure of sensitive session/request data. The extension's capture/logger intentionally reads page network traffic and syncs CSRF tokens into the DOM so the content script can use them — that is necessary for the bridge but increases the sensitive surface.
Install Mechanism
No opaque or remote installer is embedded in the skill bundle. SKILL.md recommends npx (npm registry) or cloning the GitHub repo (both normal release hosts). There is no arbitrary binary download/extract in the registry metadata.
!
Credentials
The skill declares no env vars or external credentials (good), and auth is intentionally held in a signed-in Chrome tab (cookies/session). That is coherent for the functionality. However the extension and server will access the user's session cookies and can read booking pages and saved-wallet metadata (e.g., wallet.savedCards last4/brand) as part of the booking-preview flow. Additionally, some docs/instructions request pasting captured XHR JSON into chat; those captures may include personal/profile data, CSRF tokens, persisted-query hashes, or other sensitive request/response bodies — asking the user to paste them into a chat system is out-of-scope for what a user might expect and is risky.
Persistence & Privilege
The skill is not always-enabled; it is user-invocable. The extension runs in the browser when installed by the user and injects content scripts into opentable.com pages, which is required for the design. The skill does not request elevated platform privileges beyond side-loading a Chrome extension and listening on 127.0.0.1; it does not claim to modify other skills or global agent settings.
What to consider before installing
This package does what it says — it bridges a local MCP process to your signed-in OpenTable tab using a side-loaded Chrome extension. Before installing or running it: - Review the extension code (extension/*.js) yourself (or with someone you trust). The extension injects content scripts into opentable.com and relays request/response bodies to the local MCP server; that is necessary but means page data and cookies are accessible to the local process. - Do NOT run the probe scripts (scripts/probe-book-cancel.ts, scripts/probe-book-cc-cancel.ts) unless you knowingly want to create and cancel real reservations on your account. They will interact with OpenTable write endpoints. - The repo's docs include instructions to capture raw XHR output (window.__otMcpCaptures) and even to paste it into chat for persisted-query extraction; do not paste raw capture JSON into any chat or public place because it can include CSRF tokens, request bodies, or personal/profile data. Redact or inspect captures locally and only share the minimal fields needed (e.g., persisted-query hashes) with redaction. - Prefer running the MCP server and extension in a disposable browser profile if you want to test (create a separate Chrome profile for the extension and OpenTable sign-in). - Check the npm package and the GitHub repo owner/commit history if you plan to install via npx. If you clone and build, inspect package.json scripts and background.js for any network endpoints beyond 127.0.0.1 or github/npm. If you trust the author and understand the above risks, the package is coherent for its purpose. If you are unsure, avoid running probes that perform writes and avoid pasting capture logs into any external chat or service.
!
extension/manifest.json:10
Install source points to URL shortener or raw IP.
About static analysis
These patterns were detected by automated regex scanning. They may be normal for skills that integrate with external APIs. Check the VirusTotal and OpenClaw results above for context-aware analysis.

Like a lobster shell, security has layers — review code before you run it.

latestvk97d22fcrm582hzky146jcvpz985a8by
77downloads
0stars
3versions
Updated 6d ago
v0.7.0
MIT-0

opentable-mcp

MCP server for OpenTable — natural-language restaurant reservation management. Every request is relayed through the user's signed-in Chrome tab via a companion extension, so there's no cookie paste, no bot-wall dance, and no password handling.

OpenTable does not publish an official API. This server calls the same endpoints the opentable.com web app uses. Auth lives in the user's browser (OpenTable's passwordless email-OTP session). Use at your own discretion.

Setup

The MCP server is half of the picture — the other half is a Chrome companion extension that actually talks to OpenTable from your signed-in tab. Both are required.

1. Install the MCP server

Option A — npx (recommended)

Add to .mcp.json in your project or ~/.claude/mcp.json:

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

Option B — from source

git clone https://github.com/chrischall/opentable-mcp
cd opentable-mcp
npm install && npm run build

Then add to .mcp.json:

{
  "mcpServers": {
    "opentable": {
      "command": "node",
      "args": ["/path/to/opentable-mcp/dist/bundle.js"]
    }
  }
}

2. Install the Chrome extension

  1. Clone the repo (Option B above does this).
  2. Open chrome://extensions, enable Developer Mode.
  3. Click Load unpacked, select the extension/ folder.
  4. Sign in to https://www.opentable.com/ in the same Chrome profile.

The extension's toolbar badge turns green when the WebSocket + tab + auth are all good.

Full extension walkthrough: extension/README.md.

Authentication

No env vars. Auth is whatever cookies your signed-in opentable.com tab has. If Akamai rotates _abck or OpenTable's SSO expires, visit opentable.com and click through whatever prompt appears — subsequent MCP calls will use the fresh cookies automatically.

The server throws SessionNotAuthenticatedError (with a clear message) if it detects the sign-in interstitial.

Tools

Discovery

ToolDescription
opentable_search_restaurants(term?, location?, date?, time?, party_size?, latitude?, longitude?, metro_id?)Search by free-text + optional location / date / party size. Returns cuisine, neighborhood, price band, rating, URL slug. No bookable slots — call find_slots for those.
opentable_get_restaurant(restaurant_id)Full detail for one restaurant by URL slug (e.g. "state-of-confusion-charlotte"). Includes diningAreas[] — you need one of their ids to book. Numeric ids 404 here; always pass the slug.
opentable_find_slots(restaurant_id, date, time, party_size)List bookable slots for a restaurant on a date + party size. Each slot has a short-lived reservation_token + slot_hash (book within a minute or two of fetching).

User

ToolDescription
opentable_list_reservations(scope?)List reservations. scope: upcoming (default), past, all. Each entry has the confirmation_number + security_token needed to cancel.
opentable_get_profileAuthenticated user's profile: name, email, phones, loyalty points, home metro, member-since. No payment data.

Bookings

ToolDescription
opentable_book_preview(restaurant_id, date, time, party_size, reservation_token, slot_hash, dining_area_id)Preview a booking: runs slot-lock + fetches /booking/details, returns the cancellation policy, the saved card that would be held/charged, and a short-lived booking_token. REQUIRED before opentable_book for CC-required slots; safe to call for others. Holds the slot for ~60-90s.
opentable_book(restaurant_id, date, time, party_size, reservation_token, slot_hash, dining_area_id, booking_token?)Book a slot. For CC-required slots, pass the booking_token from opentable_book_preview — the tool errors out pointing you at preview if you don't. For non-guaranteed slots, booking_token is optional (but harmless). Returns confirmation_number + security_token (save both — they're required for cancel).
opentable_cancel(restaurant_id, confirmation_number, security_token)Cancel by the triple returned from book or list_reservations.

Favorites

ToolDescription
opentable_list_favoritesList saved restaurants.
opentable_add_favorite(restaurant_id)Add a restaurant (numeric id) to Saved Restaurants.
opentable_remove_favorite(restaurant_id)Remove from Saved Restaurants.

Workflows

Book a specific restaurant for a specific evening (no-CC slot):

opentable_search_restaurants(term: "state of confusion", location: "Charlotte")
  → note the restaurant_id (numeric) + URL slug
opentable_get_restaurant(restaurant_id: "state-of-confusion-charlotte")
  → pick dining_area_id from diningAreas[]
opentable_find_slots(restaurant_id, date: "2026-05-01", time: "19:00", party_size: 2)
  → pick a slot, grab reservation_token + slot_hash
opentable_book(restaurant_id, date, time, party_size, reservation_token, slot_hash, dining_area_id)
  → save confirmation_number + security_token

Book a CC-required slot (prime-time at a busy restaurant):

opentable_find_slots(...)                                   # pick one
opentable_book_preview(restaurant_id, date, time, party_size, reservation_token, slot_hash, dining_area_id)
  → shows cancellation_policy (e.g. "$50/guest no-show fee, cancel 24h ahead for no charge")
  → shows payment_method (e.g. Mastercard •••• 4242)
  → returns booking_token

   [Surface the policy + card to the user. Let them confirm in plain English.]

opentable_book(..., booking_token: <from preview>)          # commits
  → save confirmation_number + security_token

If opentable_book is called on a CC-required slot without booking_token, it
errors out with "call opentable_book_preview first". That's the gate.

"What's available tonight for 2 at a nice Italian spot?":

opentable_search_restaurants(term: "italian", date: "2026-04-20", time: "19:00", party_size: 2, latitude: <lat>, longitude: <lng>)
  → scan results, pick candidates
opentable_find_slots(restaurant_id, date, time, party_size)  # for each candidate

Cancel an upcoming reservation:

opentable_list_reservations(scope: "upcoming")
  → find the one to cancel, read confirmation_number + security_token
opentable_cancel(restaurant_id, confirmation_number, security_token)

Save a restaurant for later:

opentable_search_restaurants(term: "carbone")
  → pick the restaurant_id
opentable_add_favorite(restaurant_id)

Notes

  • CC-required bookings must go through preview first. Restaurants that hold your card for a no-show fee (common at prime-time tables) require opentable_book_preview before opentable_book. The preview surfaces the cancellation policy and the saved card last-4; the booking_token it returns is opaque, stateless, and expires with OpenTable's ~60–90 s slot lock. If the user has no default payment method on opentable.com, preview throws a link to the account settings page. Plain opentable_book (no token) refuses CC-required slots with a pointer to preview.
  • Slot tokens are short-lived. reservation_token + slot_hash from find_slots typically expire within a minute or two. Call find_slots just before book, and if the user is deliberating, re-fetch.
  • dining_area_id is mandatory for book. OpenTable's /r/<numeric-id> routes 404 — there's no way to auto-resolve the default dining room. Always call opentable_get_restaurant(slug) first and pick a room from diningAreas[].
  • /user/favorites has a read-after-write lag. A fresh add_favorite may not show up in list_favorites for ~10 s. The 204 response from add/remove is authoritative.
  • Extension must be running. If the MCP server throws "opentable-mcp extension offline", the user needs to: load the extension at chrome://extensions, open an opentable.com tab, and sign in. The popup has a green/yellow/red status indicator.
  • Service worker sleep. Chrome MV3 SWs sleep after ~30 s idle. Cold wake adds ~2-5 s to the first request. Subsequent calls are fast.
  • Persisted-query hashes. find_slots, book, cancel, and search use Apollo persisted queries pinned by sha256Hash. If OpenTable redeploys and returns PersistedQueryNotFound, re-capture via the extension's XHR logger (see extension/README.md).

Comments

Loading comments...