mcpField
O
opentable-mcp

opentable-mcp

ローカル
github.com/chrischall地図・旅行04 日前に更新

opentable-mcp について

opentable-mcpは、OpenTable利用者向けのMCPサーバーです。自然言語でレストラン検索や空席確認、予約・お気に入りの管理ができ、ログイン済みのChromeセッションを介して処理します。書き込み操作には確認が必要です。

主な機能

  1. 01レストラン検索と空席確認
  2. 02レストラン情報とメニューの取得
  3. 03予約の確認と管理
  4. 04お気に入りの追加と削除
  5. 05書き込み操作の確認

活用シーン

  1. 01日付と人数を指定して空席を探す
  2. 02予約やレストランのメニューを確認する
  3. 03予約の作成・変更・キャンセル
  4. 04OpenTableのお気に入りを管理する

MCP 対応

MCPクライアントにOpenTableの検索・アカウント管理ツールを提供します。標準ではローカルWebSocket経由でログイン済みのChromeタブにリクエストを中継し、書き込み操作には確認を求めます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"chrischall-opentable": {
"command": "npx",
"args": [
"-y",
"opentable-mcp"
],
"env": {
"OT_BRIDGE": "<OT_BRIDGE>",
"OT_MCP_CHROME_URL": "<OT_MCP_CHROME_URL>",
"OT_WS_PORT": "<OT_WS_PORT>",
"FETCHPROXY_WS_HOST": "<FETCHPROXY_WS_HOST>",
"FETCHPROXY_IDENTITY_DIR": "<FETCHPROXY_IDENTITY_DIR>"
}
}
}
}
起動コマンドnpx -y opentable-mcp
設定が必要な環境変数
OT_BRIDGEWhich browser transport to use: "websocket" (default, the fetchproxy bridge) or "mcp-chrome".
OT_MCP_CHROME_URLURL of the mcp-chrome bridge (default http://127.0.0.1:12306/mcp). Only used when OT_BRIDGE=mcp-chrome.
OT_WS_PORTOverrides the fetchproxy WebSocket port (default 37149, the fleet-shared port).
FETCHPROXY_WS_HOSTBridge bind interface, a literal IP only (anything else is ignored); default 127.0.0.1. Keep on loopback — it exists for a hosted child in its own network namespace.
FETCHPROXY_IDENTITY_DIRWhere to store the long-term bridge identity keypair, an absolute path only (anything else is ignored); default ~/.fetchproxy/identity/. Exists for a host that runs a separate child per caller.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmopentable-mcp1.3.5

ツール

15

掲載時のツール一覧 · 1 週間前に更新

パラメーター型必須説明
viewenumいいえレスポンス形式:「compact」(デフォルト)では、レスポンス内の別の場所にすでに含まれるフィールドを省略します。「full」では、このサーバーが認識するすべてのフィールドを返します。compact はレスポンスから画像/アバターの URL を除外します。「full」は OpenTable のペイロードを変更せずに返します。フィールドの選択には対応していません。このサーバーには、重要な OpenTable フィールドについて検証済みの記録がなく、独自に項目を定めると呼び出し元に必要なフィールドを削除する恐れがあるためです。compact | full
scopeenumいいえupcoming | past | all

詳細

opentable-mcp

CI npm license

Claude 向けの MCP サーバーとして動作する OpenTable 予約管理ツールです。自然言語で空席を検索し、予約、キャンセル、お気に入りの管理、ダッシュボードの閲覧ができます。

v0.3.0-alpha の状況:Chrome 拡張機能ブリッジ、10 個のツール、読み取り+書き込みに対応。 OpenTable へのすべてのリクエストは、ログイン済みの Chrome タブを経由し、localhost WebSocket で中継されます。各リクエストは既存のセッションを使い、ユーザー自身がクリックした場合と同様に OpenTable に送信されます。

仕組み

OpenTable のエッジ(Akamai Bot Manager)は、/、/s、/r/…、/dapi/…、/booking/… に対して行動チャレンジを実施します。独自の HTTP クライアントを構築するツール(cycletls、偽装した curl、ヘッドレス Chrome など)は別の ID を作り、403 または JavaScript のインタースティシャルを受けます。opentable-mcp は逆に、Cookie と TLS コンテキストをそのまま利用できる、ユーザー自身のブラウザーセッションを使用します。

つまり、ブラウザーになり代わるのではなく、この MCP サーバーは次のように動作します。

  1. @fetchproxy/server を使って、127.0.0.1:37149 で WebSocket リスナーを起動します。
  2. ContextMint Bridge ブラウザー拡張機能(一度インストールすれば、fetchproxy ベースのすべての MCP で共有されます)が、ログイン済みのブラウザーから接続し、fetch(..., { credentials: 'include' }) を使って opentable.com のタブ経由ですべてのリクエストを中継します。TLS、Cookie、すでに解決済みの _abck はそのまま使用されます。
  3. JSON レスポンス(公開 GraphQL/JSON エンドポイント)と SSR HTML(/user/*)を解析し、ツール向けの出力に変換します。

Cookie の貼り付けは不要です。cycletls も Playwright も使いません。ユーザー自身のブラウザーが、自身の名義で動作するだけです。MCP サーバーはリクエストする内容を選ぶだけです。

ツール

ツール種類ソース
opentable_list_reservations読み取り/user/dining-dashboard SSR
opentable_get_profile読み取り/user/dining-dashboard SSR
opentable_list_favorites読み取り/user/favorites SSR
opentable_search_restaurants読み取り/dapi/fe/gql?opname=Autocomplete
opentable_get_restaurant読み取り/r/{slug} SSR(__INITIAL_STATE__)
opentable_get_menu読み取りレストランプロフィール SSR(restaurantProfile.menus)
opentable_find_slots読み取り/dapi/fe/gql?opname=RestaurantsAvailability
opentable_book_preview読み取り/booking/details SSR + SlotLock
opentable_book書き込みSlotLock → /dapi/booking/make-reservation
opentable_cancel書き込み/dapi/fe/gql?opname=CancelReservation
opentable_modify_preview読み取り/booking/details SSR(isModify=true)+ SlotLock
opentable_modify書き込み/dapi/booking/make-reservation(isModify: true)
opentable_add_favorite書き込み/dapi/wishlist/add
opentable_remove_favorite書き込み/dapi/wishlist/remove
opentable_healthcheck読み取り/robots.txt(ブリッジのプローブ)
公開メニュー

opentable_get_menu は、opentable_get_restaurant と同じレストラン ID、スラッグ、パス、または完全一致する URL を受け付けます。 menu_name を省略すると公開中のすべてのメニューが返され、"Dinner" のような完全一致するタイトル(大文字と小文字は区別されません)を渡すと、特定のメニューを選択できます。

{"restaurant_id":"https://www.opentable.com/r/social-san-juan","menu_name":"Dinner"}

レスポンスには、レストランの識別情報と、ソースの url、available_menus、menus、および任意の外部 menu_url が含まれます。公開中の各メニューには、OpenTable のセクション/項目、価格文字列、variationGroups、通貨、提供元、updated タイムスタンプが保持されます。view のデフォルトは compact(メディア URL を削除)です。full ではメディア URL も保持されます。公開価格はレストランの現在のメニューと異なる場合があるため、価格を引用する際はソースと更新タイムスタンプを保持してください。

大きなメニューは、料理の途中でレスポンスが途切れないよう、項目全体単位のページに分けて返されます。ページング引数を指定せず、メニューが収まる場合はそのまま返され、大きい場合は最初のページが返されます。各ページには available_sections と pagination が含まれます。

{"offset":0,"returned_items":20,"total_items":57,"next_offset":20}

続きの取得には、offset を next_offset に設定し、同じ menu_name/section_name を指定して再度呼び出してください。最後のページでは next_offset は null になります。任意のページング入力は次のとおりです。

  • section_name — セクションタイトルとの完全一致(大文字と小文字は区別されません)。レスポンスに section_found が追加されます。
  • offset — 取得開始位置の項目(デフォルト 0)。
  • limit — 1 ページあたりの最大項目数(1~50、デフォルト 20)。レスポンスの予算内に収めるため、ページに含まれる項目数がこれより少なくなる場合があります。

ページング入力を指定せずに view: "full" を指定すると、出力制限のないクライアント向けに、上限なしでメニュー全体が返されます。ページに収まらないほど大きな単一項目は、説明が切り詰められるのではなく、エラーになります。

status は available、menu_not_found(available_menus を確認してください)、external_only、not_available を区別します。メニューが存在しないことは HTTP/ブリッジエラーや解析エラーではありません。これらの失敗は引き続きエラーとして扱われます。外部リンクは、他のホストへのアクセスや PDF の解析を行わずに返されます。このツールは、既存のブラウザブリッジを通じて同じレストランページを読み取るだけで、テーブルの予約は行いません。

規約への同意

この MCP サーバーを使用することで、以下の事項を確認し、同意したものとみなされます。

1. このサーバーは、お客様自身の OpenTable アカウントにアクセスします。 すべてのリクエストは、ContextMint Bridge ブラウザー拡張機能(または hangwin/mcp-chrome)を介して、お客様自身がサインインしているブラウザータブから送信されます。他の人の予約にアクセスすることはなく、またアクセスできません。

2. OpenTable の利用規約は、このサーバーの使用にも適用されます。 opentable.com を直接利用する場合と同様です。ここで特に関連する条項は次のとおりです。

OpenTable が明示的に許可した場合を除き、ディープリンク、ロボット、スパイダー、スクレーパー、生成 AI、その他の AI 技術(自動アシスタント、またはサービスや OpenTable コンテンツの一部へのアクセス、コピー、検索、監視のためにブラウザーを操作するなど、ブラウザーと対話する、あるいはブラウザーを利用する技術を含みますが、これらに限定されません)、その他の自動または手動のデバイス、プロセス、手段を使用することはできません。

そして、特に重要な点として、「AI エージェントの行為は、それを使用するユーザーの行為とみなされ、ユーザーはその行為を確認し、検証する責任を負います……」

このサーバーのツールを呼び出すたびに、これらの規約に同意することになります。保守担当者は 2026-05-23 に内容を確認しました。OpenTable の利用規約では、AI/自動アシスタントによるアクセスを、許可していない行為として明示的に列挙しています。また、AI エージェントの行為はお客様自身に帰属することも明示しています。

3. 個人的な非商用利用に限ります。 このプロジェクトは OpenTable, Inc. と提携、推奨、後援、または協力関係にありません。opentable.com が使用するものと同じ /dapi/... および /booking/... エンドポイントを操作する、個人向けの自動化ツールです。大量予約、クレジットカード情報が必要なテーブルの一斉確保、予約の転売、その他の商用目的には使用しないでください。予約/キャンセル/変更ツールは、ブラウザーの前にいるときと同じように、1 件の予約を管理するためのものです。

4. 安定性は保証されません。 このサーバーは、OpenTable がデプロイのたびに変更する内部の OpenTable 永続化 GraphQL クエリハッシュに依存しています。ハッシュが変更されるとツールは動作しなくなり、再取得が必要になります。お客様自身による利用も、OpenTable のリリース頻度に左右されます。

5. このサーバーの使用が OpenTable アカウントに関連してもたらす結果については、お客様が全面的に責任を負います。 レート制限、予約枠ロックによる拒否、制御不能な予約による無断キャンセルのペナルティ、アカウントへの警告、利用停止、またはその他の措置が含まれます。OpenTable の利用規約に従い、AI エージェントの行為はお客様自身の行為です。確定する前に、予約/キャンセルの内容を毎回確認してください。OpenTable がお客様の利用に異議を唱えた場合は、このサーバーの使用を中止してください。

このセクションは、保守担当者による規約の誠意ある要約です。法的助言ではなく、OpenTable の実際の利用規約を変更したり、優先したりするものではありません。

インストール

npm install
npm run build
ContextMint Bridge をインストールする

opentable-mcp は、ほかの fetchproxy ベースの MCP と共通のブラウザー拡張機能 ContextMint Bridge を使用します。以下から一度だけインストールしてください:https://github.com/nullnet-app/contextmint-bridge/releases

ContextMint Bridge は、新しい名前で提供されている fetchproxy のブラウザー拡張機能で、メンテナーも同じです。fetchproxy の README(https://github.com/chrischall/fetchproxy#extension)からもリンクされています。ソースコードは https://github.com/nullnet-app/contextmint-bridge で公開されています。自分でビルドするか、リリース zip と同じ場所に公開されている .sha256 ファイルを使って zip を検証してください(shasum -a 256 -c contextmint-bridge-chrome-<version>.zip.sha256)。

  1. Chrome: 最新リリースから Chrome 用 zip をダウンロードし、解凍して、展開した拡張機能を読み込みます(chrome://extensions → デベロッパーモード → 展開して読み込み)。Safari はまだ利用できません。公開ダウンロードのない ContextMint アプリに同梱される予定のため、現時点では Chrome を使用してください。
  2. 同じブラウザープロファイルで https://www.opentable.com/ にサインインします。
  3. WebSocket、タブ、認証 Cookie がすべて検出されると、拡張機能のバッジに緑色の点が表示されます。

これで、node dist/bundle.js を起動する任意の MCP クライアントが、サインイン済みのタブを通じて OpenTable にアクセスできるようになります。

セットアップとトラブルシューティングの完全ガイド: ステータスドットのリファレンス、WS プロトコル、リクエストのライフサイクルについては、ContextMint Bridge リポジトリを参照してください。OpenTable の再デプロイに備えた Persisted Query ハッシュの取得方法は、このリポジトリの CLAUDE.md に記載されています。

設定(Claude Desktop / Claude Code)

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

デフォルトでは環境変数は不要です。認証情報は MCP プロセスではなく、ブラウザーに保存されます。

オプション:代わりに hangwin/mcp-chrome 経由で接続する

ブラウザー自動化用に hangwin/mcp-chrome をインストールしている場合、opentable-mcp は ContextMint Bridge の代わりに、OpenTable へのフェッチを mcp-chrome 経由で行えます。

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

このモードでは ContextMint Bridge は不要です。すべての OpenTable リクエストは、既存の mcp-chrome インストールに対する chrome_network_request 呼び出しとなり、tabUrl で opentable.com のタブに固定されます。

このモードは読み取り専用です。 予約、変更、キャンセル、お気に入りへの追加は、明確なエラーとともに拒否されます。このトランスポートでは、OpenTable の書き込みエンドポイントに必要なレストラン/予約/アカウントページの CSRF トークンを取得できないためです。また、opentable_find_slots は利用できません。これらの操作には、デフォルトの ContextMint Bridge トランスポートを使用してください。

注: この経路には、PR #348 を含むリリース以降の mcp-chrome(≥)が必要です(chrome_network_request の tabUrl パラメーター)。#348 より前の mcp-chrome バージョンはアクティブなタブのみを対象とするため、オリジンをまたぐフェッチで正しく動作しません。この経路のライブ検証は、上流でのマージ待ちです。

その他の環境変数:OT_WS_PORT(デフォルトは 37149)は fetchproxy の WebSocket ポートを上書きします。OT_MCP_CHROME_URL(デフォルトは http://127.0.0.1:12306/mcp)は mcp-chrome エンドポイントを上書きします。

確認

opentable_book、opentable_modify、opentable_cancel は、操作を実行する前に確認を求めます。確認プロンプトを表示できるクライアント(Claude Code)では、確認プロンプトが表示されます。表示できないクライアント(claude.ai、Claude Desktop)では、最初の呼び出しでは予約、変更、キャンセルは行われず、実行される内容の正確なプレビューと confirmToken が返されます。どちらの場合も、プロンプトにはレストラン、日付、時刻、人数が記載されます。また、予約または変更の場合は、仮押さえされるカードとキャンセルポリシーも記載されます(プレビュー用ツールが返す booking_token / modify_token に含まれます。キャンセルの場合は、ダイニングダッシュボードで予約を検索し、見つからなければその旨が通知されます)。同じ引数とそのトークンを使った再呼び出しに限り、一度だけ処理が進みます。その間に引数を変更すると、拒否され(DRAFT_CHANGED)、新しいプレビューが返されます。

変数デフォルト
MCP_CONFIRM_MODEask-user確認プロンプトを表示できないクライアント(claude.ai、Claude Desktop)での書き込み操作の動作です。ask-user:2 段階で処理します。最初の呼び出しでは何も実行せず、プレビューとトークンを返します。モデルは、トークンを使って再度呼び出す前に、チャットでユーザーの承認を得る必要があります。auto:同じく 2 段階で処理しますが、モデルはプレビューを確認した後、自らトークンを使用できます。refuse:そのようなクライアントでは書き込み操作を拒否します。確認プロンプトを表示できるクライアント(Claude Code)には、MCP_CONFIRM_ELICITATION=off でない限り、常に実際の確認プロンプトが表示されます。認識されない値は refuse として扱われます。
MCP_CONFIRM_ELICITATIONonoff にすると、確認プロンプトは表示されず、すべてのクライアントで MCP_CONFIRM_MODE の動作が適用されます。プロンプトを表示できると通知するものの実際には表示しないクライアント(opencode 2.0.x では書き込みが停止します)に設定してください。その他の値は on として扱われ、stderr に警告が出力されます。
MCP_CONFIRM_TTL_SECONDS600トークンの有効期間です。
MCP_CONFIRM_SECRETプロセスごとにランダム署名キーです。サーバーの再起動後もトークンを有効にする必要がある場合にのみ設定してください。mcp-host では、ホストが子プロセスごとの固定キー(MCP_HOST_CONFIRM_SECRET)を提供し、使用済みトークンは MCP_DATA_DIR の下に記録されるため、アイドル状態からの再起動後も承認が有効です。

実行(ローカル stdio)

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

scripts/probe-*.ts ファイルは MCP サーバーを起動し、拡張機能ブリッジを介して 1 つまたは 2 つのツールを呼び出し、応答を出力します。拡張機能が読み込まれており、OpenTable のタブが開いている必要があります。

トラブルシューティング

  • ポップアップに赤い点が表示される/「extension offline」エラーが発生する。 ContextMint Bridge のトラブルシューティングガイドを参照してください。「extension offline」の問題の多くは、opentable-mcp ではなく、上流のライフサイクルに関するバグ(service-worker のスリープ、content script の停止)が原因です。
  • Chrome で行動確認ページが表示される。 Akamai は、長時間アイドル状態のタブに「人間であることを確認してください」という中間ページを表示することがあります。一度クリックして進めると、タブを再び使用できます。
  • 「OpenTable returned an incomplete page」。 OpenTable が、実際のページが読み込まれる前に短いプレースホルダー(数 KB で、ページ状態なし)を返す場合や、人間による確認を求める場合があります。ヘルスチェックでは、これを parse_error(ページ全体のサイズがあるものの、形式が変更された場合)とは区別して incomplete_page として記録します。サインイン済みのブリッジ経由ブラウザーでレストランのページを更新し、読み込みが完了するまで待ってから、もう一度お試しください。
  • find_slots が HTTP 409 で失敗する。 ブラウザーの OpenTable セッションを更新する必要があります。サインイン済みのブリッジ経由タブでレストランのページを開き、空席情報が読み込まれるまで待ってから、もう一度お試しください。エラーは空席がないのではなく、空席情報を確認できていないことを示します。ブリッジのヘルスチェックが成功しても、空席情報は確認されません。
  • list_favorites に新しく追加した add_favorite が反映されない。 /user/favorites の SSR ページは数秒間キャッシュされます。約 10 秒後に再度一覧を取得するか、opentable_get_profile の件数で確認してください。

構成

  • src/transport-fetchproxy.ts — FetchproxyTransport:@fetchproxy/server の FetchproxyServer を薄くラップするアダプターです。ContextMint Bridge ブラウザー拡張機能と通信する、共有 WebSocket ブリッジです。
  • src/client.ts — OpenTableClient:トランスポートを fetchJson / fetchHtml とエラーマッピングでラップします。
  • src/tools/*.ts — 関心事ごとに 1 ファイル(予約/レストラン/お気に入り/ユーザー/検索)です。それぞれ registerXxxTools(server, client) をエクスポートします。
  • src/parse-*.ts — HTML / JSON の純粋なパーサーで、すべてユニットテスト済みです。
  • tests/ — src/ と 1 対 1 で対応する構成で、vitest を使用します。WS プロトコルレベルのテストは fetchproxy リポジトリにあります。
  • scripts/probe-*.ts — 実環境でのラウンドトリップ確認用プローブです(ContextMint Bridge とサインインが必要です)。

既知の注意点

  • Apollo の永続化クエリ。 空席検索、空席のロック、キャンセル、オートコンプリートでは、すべて opentable.com から取得したハッシュを使う extensions.persistedQuery.sha256Hash を使用します。OpenTable が再デプロイされると、サーバーは PersistedQueryNotFound を返します。再取得の手順については、CLAUDE.md →「要注意箇所」を参照してください。
  • dining_area_id は予約に必須の引数です。 エリアを自動解決できないため、レストランのスラッグ または数値 ID を opentable_get_restaurant に渡してください(スラッグの場合は /r/{slug}、数値 ID の場合は /restaurant/profile/{id} にルーティングされます)。diningAreas[] を読み取り、その ID を opentable_book に渡してください。
  • サービスワーカーのスリープ。 MV3 のサービスワーカーは、約 30 秒間アイドル状態が続くとスリープします。ContextMint Bridge は自身を起動状態に保ちますが、スリープから復帰した直後は、最初のリクエストで WebSocket の再接続に最大約 5 秒かかる場合があります。

このプロジェクトは AI(Claude Opus 4.7)によって開発・保守されています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。