mcpField
R
reserve-with-google

reserve-with-google

github.com/koala73生産性473 回インストール39 週間前に更新
リポジトリ

reserve-with-google について

ブラウザー操作で Google Maps から飲食店や事業者の予約先を探し、予約を進めるためのスキルです。予約サービスごとのフォーム入力を案内し、送信前にユーザーの確認を求めます。

主な機能

  1. 01Google Mapsで予約先を検索
  2. 02外部予約サービスの手順に対応
  3. 03予約情報や要望を入力
  4. 04送信前に確認を要求
  5. 05予約エラーへの対処を案内

活用シーン

  1. 01オンライン予約可能な飲食店の検索
  2. 02選んだ店舗の席を予約
  3. 03希望時間がない場合の代替提示

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/koala73/reservewithgoogle-skill --skill reserve-with-google

インストール後、Claude Code で/reserve-with-googleを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
assets/
selectors.json
references/
REFERENCE.md
FORMS.md
THIRD-PARTY-PROVIDERS.md
scripts/
search-places.sh
search-and-book.sh
setup-profile.sh

詳細

Google で予約

ブラウザー自動化を使って、Google マップからレストランの予約やビジネスの予約を自動化します。

クイックリファレンス

プロバイダー予約 URL のパターン特記事項
SevenRoomssevenrooms.com/reservations/{venue}SEVENROUNDS.md を参照
OpenTableopentable.com最良の結果を得るには --headed を使用します
Resyresy.com電話番号による確認が必要な場合がよくあります
Yelpyelp.com/reservations通常、ログインが必要です

よくある問題:

  • タイトルのドロップダウン:find text "Mr." click を使用します
  • ポリシーのチェックボックス:find text "I agree..." click を使用します

前提条件

  • agent-browser がインストールされていること:npm install -g agent-browser
  • インターネット接続
  • 任意:認証済みの Google プロファイル(下記の「プロファイルの設定」を参照)
  • 任意:認証付きルーティング用のプロキシサーバー(下記の「プロキシの設定」を参照)

開始前

ユーザーから次の情報を収集します:

  1. 検索クエリ — 予約する場所や内容(例:「シカゴ中心部のイタリア料理店」)
  2. 日付 — 希望する予約日
  3. 時刻 — 希望する時刻
  4. 人数 — 利用者数(レストランの場合)
  5. 名前 — 予約者名
  6. 電話番号 — 連絡先
  7. メールアドレス — 確認メールの送信先
  8. 特別なリクエスト — 任意(例:「窓側の席」「子ども用のハイチェアが必要」)

プロファイルの設定(一度のみ)

最良の結果を得るには、Google アカウントにログインした状態を維持するブラウザープロファイルを設定します:

agent-browser --headed --profile ~/.reservegoogle open "https://accounts.google.com"

ユーザーは最初に一度、手動でログインします。プロファイルはセッションをまたいで保持されます。プロファイルが存在しない場合は、ゲストモードに切り替えます。

代替手段:状態の保存と読み込みを使って、認証情報を持ち運べるようにします:

# After logging in:
agent-browser state save ~/.reservegoogle-auth.json

# In future sessions:
agent-browser state load ~/.reservegoogle-auth.json
agent-browser open "https://www.google.com/maps"

プロキシの設定

認証付きプロキシ経由でトラフィックをルーティングすると、レート制限や地域制限を回避したり、住宅用 IP アドレスを使用したりできます:

agent-browser --proxy http://user:[email protected]:8080 open "https://www.google.com/maps"
agent-browser --proxy socks5://user:[email protected]:1080 open "https://www.google.com/maps"

プロキシフラグを渡す必要があるのは、セッションを開始する open コマンドだけです。同じセッション内の後続のコマンドでは、プロキシが再利用されます。

認証済みかつプロキシ経由のセッションにするには、プロファイルと組み合わせます:

agent-browser --headed --profile ~/.reservegoogle --proxy http://user:[email protected]:8080 open "https://accounts.google.com"

すべてのコマンドで渡さずに済むよう、環境変数で設定します:

export AGENT_BROWSER_PROXY="http://user:[email protected]:8080"
agent-browser open "https://www.google.com/maps"

基本的なワークフロー

重要:インタラクションの前には必ず snapshot を使用してください。参照はページが更新されるたびに変わります。要素の参照をハードコードしないでください。

ステップ 1:Google マップを開いて検索する
agent-browser --profile ~/.reservegoogle open "https://www.google.com/maps"
agent-browser snapshot -i

スナップショットで検索ボックスを見つけてから、次を実行します:

agent-browser fill @<searchBoxRef> "<user's search query>"
agent-browser press Enter
agent-browser wait --load networkidle
agent-browser snapshot -i

検索結果の一覧を解析します。予約可能な店舗が分かるように表示し、候補をユーザーに提示します(結果内の「テーブルを予約」「オンラインで予約」などのテキストを確認します)。

ステップ 2:場所を選択する

ユーザーが場所を選んだ後:

agent-browser click @<resultRef>
agent-browser wait --load networkidle
agent-browser snapshot -i

スナップショットで予約ボタンを探します。よくあるテキストのパターン:

  • 「テーブルを予約」
  • 「オンラインで予約」
  • 「予約をする」
  • 「スケジュール」
  • 「テーブルを探す」

予約ボタンが見つからない場合:この場所ではオンライン予約に対応していないことをユーザーに伝えます。検索結果にある近隣の候補を提案します。

ステップ 3:予約を開始する
agent-browser click @<bookButtonRef>
agent-browser wait --load networkidle

何が起きたかを確認します:

agent-browser get url で URL を確認します:

  • google.com/maps のまま → Google ネイティブのウィジェットまたは iframe
  • opentable.com → OpenTable のフロー(THIRD-PARTY-PROVIDERS.md を参照)
  • resy.com → Resy のフロー
  • vagaro.com → Vagaro のフロー
  • yelp.com/reservations → Yelp のフロー
  • toasttab.com → Toast のフロー
  • その他のドメイン → 汎用のサードパーティーのフロー

iframe を確認します:予約ウィジェットが iframe 内に読み込まれた場合:

agent-browser snapshot -i

スナップショットに iframe 要素が表示されたら、その CSS セレクター(id や name 属性など)を特定してから、iframe に切り替えます:

agent-browser frame "#booking-iframe"
agent-browser snapshot -i

iframe での操作後、メインフレームに戻るには:

agent-browser frame main
ステップ 4:日付、時刻、人数を選択する

スナップショットを取得して、予約フォームの要素を特定します。

agent-browser snapshot -i

レストランの場合は、次の項目を探します。

  • 日付ピッカー:カレンダーウィジェットまたは日付のドロップダウン
  • 時間枠:利用可能な時刻が表示されたボタンまたはドロップダウン
  • 人数:数値入力欄、ドロップダウン、または +/- ボタン

ユーザーの希望を入力します。

agent-browser click @<datePickerRef>
# Navigate to correct date in calendar
agent-browser click @<targetDateRef>
agent-browser click @<timeSlotRef>
agent-browser fill @<partySizeRef> "<count>"

希望の時刻が利用できない場合は、もう一度スナップショットを取得し、利用可能な候補をユーザーに提示します。

ステップ 5:個人情報を入力する
agent-browser snapshot -i
agent-browser fill @<nameFieldRef> "<user's name>"
agent-browser fill @<phoneFieldRef> "<user's phone>"
agent-browser fill @<emailFieldRef> "<user's email>"

特別なリクエストの入力欄がある場合:

agent-browser fill @<specialRequestsRef> "<user's requests>"

スナップショットを取得して、すべての項目が正しく入力されていることを確認します。

ステップ 6:送信前に確認する

必須:最後の予約ボタンをクリックする前に、内容の概要をユーザーに提示します。

Booking Summary:
- Place: [restaurant name]
- Date: [date]
- Time: [time]
- Party size: [count]
- Name: [name]
- Special requests: [if any]

Confirm this booking?

ユーザーの確認を得てから進めてください。

ステップ 7:予約を完了する
agent-browser click @<confirmButtonRef>
agent-browser wait --load networkidle
agent-browser snapshot -i

次の確認表示を探します。

  • 「予約が確定しました」
  • 「予約が確定しました」
  • 確認番号/コード
  • 「これで完了です」

ユーザーの記録用にスクリーンショットを撮ります。

agent-browser screenshot confirmation.png

次の内容をユーザーに報告します。

  • 確認ステータス
  • 確認番号(表示されている場合)
  • 確定した日付/時刻/人数
  • レストランからの特別な案内

エラー処理

CAPTCHA が検出された場合

ユーザーに「Google で CAPTCHA が表示されています。手動で完了してください。」と伝えます。ユーザーが解決するまで待ってから続行します。

時間枠を利用できなくなった場合

スナップショットを再取得し、残っている時間枠を表示して、別の候補を選ぶようユーザーに依頼します。

支払いが必要な場合

ユーザーに「この予約には支払いが必要です。支払い情報を入力することはできません。手動で支払いを完了してください。」と伝えます。支払いページのスクリーンショットを撮ります。

空きがない場合

別の日付/時刻、近くにある類似のレストラン、または後でもう一度試すことを提案します。

予約方法が複数ある場合

店内飲食、テイクアウト、ウェイトリストなど、複数の予約方法が提示されている場合は、先にどれを希望するかユーザーに確認します。

セッション管理

並列検索には --session を使用します。

agent-browser --session search1 --profile ~/.reservegoogle open "https://www.google.com/maps"

参考ファイル


学んだこと(2026 年 2 月)

SevenRooms 固有のパターン

多くのレストランで使用されている SevenRooms の予約システムには、特有の挙動があります。

タイトルのドロップダウンの問題

問題: 選択ボタン(@e2)をクリックしても、agent-browser が操作できる形で選択肢が表示されないことがあります。

解決策: テキストベースの選択を使用します。

agent-browser find text "Mr." click

一致候補が曖昧な場合(「Mr.」の要素が複数ある場合):

agent-browser find text --exact "Mr." click
ポリシーのチェックボックスの検出

問題: 「会場の必須ポリシーに同意します *」のチェックボックス要素は、スナップショット内で標準的なチェックボックスとして公開されません。

解決策: ポリシーのテキストを直接クリックします。

agent-browser find text "I agree to the venue's required policy" click
フォームのセッションタイムアウト

問題: SevenRooms を含む多くの予約システムでは、テーブルが約 20 分間確保されます。フォームへの入力に時間がかかりすぎると確保が期限切れになり、選択し直す必要があります。

解決策:

  • 考え込みすぎず、素早くフォームに入力します
  • 再選択の手順:戻る → 時刻を再選択 → ゲストとして続行 → タイトル → 項目を入力 → ポリシー → 送信
フォーム項目のリセット動作

観察: セッションをリセットしてもタイトルは保持されることがありますが、名、姓、メールアドレス、電話番号の各項目は通常クリアされます。

解決策: 最終送信の前に、すべてのフォーム項目を必ず確認し、再入力してください。

より速く予約するスクリプト

同じ会場で予約を繰り返す場合:

# Open booking page
agent-browser open "https://www.sevenrooms.com/reservations/restaurantname"

# Select date/time/guests → SEARCH
agent-browser snapshot -i
agent-browser click @<dateRef>
agent-browser click @<timeRef>
agent-browser fill @<partySizeRef> "3"
agent-browser click @<searchButtonRef>
agent-browser snapshot -i

# Click desired time slot
agent-browser click @<timeSlotRef>

# Quick guest flow
agent-browser find text "Continue as guest" click
agent-browser click @<selectTitleRef>
agent-browser find text "Mr." click

# Fill and submit
agent-browser fill @<firstNameRef> "John"
agent-browser fill @<lastNameRef> "Doe"
agent-browser fill @<emailRef> "[email protected]"
agent-browser fill @<phoneRef> "+1234567890"
agent-browser find text "I agree to the venue's required policy" click
agent-browser click @<submitRef>
要素参照の変更

重要: 要素参照(@e1、@e2 など)は、ページの読み込みまたは操作のたびに変わります。クリックする直前に必ず snapshot を実行してください。

エラーからの復旧パターン

送信に失敗した場合、または確保が期限切れになった場合:

  1. コンソールログを確認します:agent-browser console
  2. 「Released hold」メッセージを探します(タイムアウトを示します)
  3. 時刻の選択に戻ります:agent-browser click @<backRef>
  4. 同じ時間枠を再選択します
  5. ゲストフローから続行します

コメント