mcpField
V
vrbo

vrbo

github.com/borskiその他78043 回インストール2 日前に更新
リポジトリ

vrbo について

vrbo は、目的地や日程、宿泊人数を指定してVRBOの一棟貸し、コンドミニアム、キャビンを検索するコマンドラインスキルです。Patchrightでブラウザー検証に対応し、価格と予約リンクを返しますが、予約手続きは行いません。

主な機能

  1. 01一棟貸しの検索
  2. 02日程・人数・ペット・寝室数での絞り込み
  3. 03価格と予約リンクの取得
  4. 04検索結果のJSON出力
  5. 05ブラウザー検証リクエストの再試行

活用シーン

  1. 01家族旅行向けの一棟貸し探し
  2. 02AirbnbとVRBOの掲載物件の比較
  3. 03リゾート地や山間部の複数寝室物件探し

インストール

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

$npx skills add https://github.com/borski/travel-hacking-toolkit --skill vrbo

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

同梱ファイル

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

Dockerfile
scripts/
entrypoint.sh
search_vrbo.py
tests/
test_search_vrbo.py

詳細

VRBO 検索

Patchright を使って VRBO のバケーションレンタルを検索し、料金と予約リンク付きで、一棟貸し/コンドミニアム/キャビンの物件を返します。VRBO は、グループや家族での滞在において Airbnb MCP を補完するサービスです。山間の町やリゾート地では、多くの物件管理会社が両方に掲載していますが、VRBO には Airbnb には表示されない、専門業者が管理するコンドミニアムやキャビンがあります。

Patchright(検出を回避する Playwright のフォーク)が必要です。 VRBO は Akamai Bot Manager の背後にあります。通常の HTTP、標準の Playwright、@playwright/mcp、agent-browser は、いずれもボット対策ページの 429 Too Many Requests(「Provisioned request rate has been exceeded」)に阻まれます。Patchright は Akamai のセンサーを通過し、_abck Cookie を取得します。これは chase-travel/amex-travel/southwest スキルと同じボット対策ページで、対処方法も同じです。

ヘッドあり(headless=False)で実行する必要があります。 Akamai はヘッドレスブラウザーにフラグを立てます。macOS では Chrome ウィンドウが一時的に表示されます。バックグラウンド実行や無人実行には Docker を使用してください(Xvfb が仮想ディスプレイを提供します)。

ログインは不要です。 VRBO の検索結果は公開されています。chase-travel/amex-travel とは異なり、認証情報は必要ありません。永続プロファイルには Akamai の Cookie のみがキャッシュされるため、検索を繰り返す際に再チャレンジが減ります。

前提条件

pip install patchright && patchright install chromium

または、Docker を使用します(ローカルへのインストール不要、Xvfb 経由のヘッドあり実行)。

docker build -t vrbo skills/vrbo/

使用する場面

  • 一棟貸し、コンドミニアム、キャビンを希望するグループや家族での滞在
  • 「の Airbnb と VRBO を比較」
  • 部屋が分かれている、複数ベッドルームのレンタル(複数人での旅行パターン)
  • リゾート地や山間の町(Canmore、Banff 周辺、Whistler、Muskoka)。Airbnb にはないコンドミニアムを、専門の物件管理会社が VRBO に掲載している地域

使用しない場面

  • 予約の完了。 このスキルはレンタル物件を探してリンクを返すだけです。購入を完了しようとしないでください。
  • ホテル。 compare-hotels/serpapi/liteapi/ポータルスキルを使用してください。
  • 個室/相部屋。 VRBO は物件全体の貸し出しのみです。共同住宅内の個室には Airbnb MCP(private_room)を使用してください。

使用方法

# Local (pops up a Chrome window on macOS)
python3 skills/vrbo/scripts/search_vrbo.py \
  --dest "Canmore, Alberta, Canada" \
  --checkin 2026-06-26 --checkout 2026-07-02 --adults 3 --json

# Whole homes with 3+ bedrooms
python3 skills/vrbo/scripts/search_vrbo.py \
  --dest "Canmore, Alberta" --checkin 2026-06-26 --checkout 2026-07-02 \
  --adults 3 --min-bedrooms 3 --json

# Docker (headless host, headed browser via Xvfb)
docker run --rm vrbo \
  --dest "Canmore, Alberta" --checkin 2026-06-26 --checkout 2026-07-02 \
  --adults 3 --json
引数
フラグデフォルト備考
--dest必須目的地のキーワード。例:"Canmore, Alberta, Canada"。VRBO がサーバー側で regionId に解決します。
--checkin / --checkout必須ISO 形式の YYYY-MM-DD。今日以降の日付を指定してください。
--adults2旅行者の人数。
--children0
--petsオフペット同伴可能な物件のみ。
--min-bedrooms0クライアント側のフィルター(VRBO の URL フィルターは信頼性が低いため)。
--limit20返す物件の最大数。
--retries4Akamai への再試行回数(ホームページのウォームアップ → SERP)。
--jsonオフJSON を標準出力に出力します(オーケストレーションにはこちらを使用してください)。

出力

--json を指定した場合の JSON の形式:

{
  "source": "vrbo",
  "extractor": "__PLUS_REDUX_STORE__ | dom:lodging-card | dom:anchors",
  "searchUrl": "https://www.vrbo.com/search?...",
  "count": 12,
  "listings": [
    {
      "id": "1234567",
      "name": "Mountain-View Condo Steps from Main St",
      "bedrooms": 3, "bathrooms": 2, "sleeps": 6,
      "rating": 4.9, "reviewCount": 84,
      "priceText": "The current price is CA $312 CA $312 CA $2,184 total includes taxes & fees",
      "pricePerNight": 312, "priceTotal": 2184, "priceIncludesTaxes": true,
      "lat": 51.08, "lng": -115.35,
      "url": "https://www.vrbo.com/en-ca/cottage-rental/p1234567?..."
    }
  ]
}

extractor は、どのレイヤーがデータを取得したかを示します。__PLUS_REDUX_STORE__ は最も豊富な情報を含みます(ベッドルーム数、座標、レビュー件数)。dom:lodging-card は信頼性が高い一方、情報は限定的です(一般的なケースで、名称、料金、URL を含みます)。dom:anchors は最後の手段としての ID と URL のスクレイピングです。この値が表示された場合はページ構造が変わっており、セレクターの更新が必要です(P2 タスクを登録してください)。

料金: SERP の料金文字列は pricePerNight と priceTotal に解析されます。実際のデータで確認済みです。VRBO の SERP に表示される合計金額には税金と手数料が含まれます(priceIncludesTaxes: true)。priceTotal は滞在全体の税込み総額で、pricePerNight は先頭に表示される1泊あたりの料金です。これにより、ホテル比較基準の税込み総額要件をそのまま満たします。なお、損害補償金や任意の追加料金が SERP の金額に含まれていない場合があるため、予約前に掲載ページの URL を開いて確認してください。

テスト

純粋なロジック(検索 URL の構築、Akamai のブロック/チャレンジ検出、SERP の価格解析、スケルトンのフィルタリング、リスティングの拡充)は、標準ライブラリの unittest テストでカバーされています。ブラウザー、ネットワーク、Patchright は不要です(patchright のインポートは遅延されます)。

python3 -m unittest discover -s skills/vrbo/tests -v   # or: python3 -m pytest skills/vrbo/tests

サードパーティー依存関係なしで、17 件のテストがあります。ブラウザー駆動の処理(Akamai の回避、DOM の抽出)は、住宅用回線へのライブ接続なしでは単体テストできません。実際の検索で手動で確認してください(上記の「使用方法」を参照)。リポジトリのスモークテスト(scripts/smoke-test.sh)では、このスキルのフロントマターと構造を別途検証します。

既知の不安定要因

  • Akamai は IP アドレスごとにレート制限されます。 Patchright を使用しても、データセンター/CI/VPN の IP アドレスは頻繁にブロックされます。最良の結果を得るには、住宅用回線で実行してください。再試行のたびに 429 が返される場合、スクリプトは明確なメッセージを出して 1 で終了します。これは環境によるブロックであり、コードのバグではありません。実際には、自宅/モバイル/ホテルの Wi-Fi の IP アドレスならブロックを回避できますが、同じ IP アドレスから短時間に繰り返し検索すると、429 が返され始めることがあります。検索の間隔を数分空け、短時間に連続して実行しないでください。
  • DOM セレクターは変更されることがあります。 VRBO/Expedia は data-stid デザインシステムを定期的に改訂しています。エクストラクターはまず埋め込み状態の Blob(最も安定)を試し、次に data-stid カード、最後に汎用的なアンカーのスクレイピングを試します。extractor が dom:anchors の場合は、Layer-1/2 セレクターを更新してください。

コメント