mcpField
P
pp-airbnb

pp-airbnb

github.com/mvanhornその他2.1k582 回インストール今日更新
リポジトリ

pp-airbnb について

pp-airbnb は、Airbnb と VRBO の掲載物件を調査・分析する Agent 向けの airbnb-pp-cli 用スキルです。読み取り専用コマンドで、複数サイトの価格比較、直接予約先の調査、価格追跡を行えます。

主な機能

  1. 01掲載サイトと直接予約の価格比較
  2. 02Airbnb と VRBO を横断した旅行計画
  3. 03他サイトで同じ物件を検索
  4. 04掲載物件の価格変動を追跡
  5. 05ホスト別の掲載物件を確認

活用シーン

  1. 01ホストの直接予約サイトで低価格を探す
  2. 02日程・人数・予算に沿って宿泊先を計画
  3. 03物件の値下がりを監視
  4. 04Airbnb と VRBO の同一物件を比較

インストール

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

$npx skills add https://github.com/mvanhorn/printing-press-library --skill pp-airbnb

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

詳細

Airbnb — Printing Press CLI

前提条件:CLI のインストール

このスキルは airbnb-pp-cli バイナリを使用します。このスキルのコマンドを実行する前に、CLI がインストールされていることを必ず確認してください。インストールされていない場合は、先にインストールします。

  1. Printing Press インストーラーを使ってインストールします。バイナリのインストール先は、macOS/Linux では $HOME/.local/bin、Windows では %LOCALAPPDATA%\Programs\PrintingPress\bin がデフォルトです。
    npx -y @mvanhorn/printing-press-library install airbnb --cli-only
    
  2. バージョンを確認します:airbnb-pp-cli --version
  3. 表示されたインストール先が、このスキルを実行するエージェント/ランタイムの $PATH に含まれていることを確認します。

npx によるインストールに失敗した場合(Node がない、オフラインなど)は、Go で直接インストールしてください(Go 1.26.6 以降が必要です)。

go install github.com/mvanhorn/printing-press-library/library/travel/airbnb/cmd/airbnb-pp-cli@latest

インストール後に --version が「command not found」と表示する場合、ランタイムからバイナリのディレクトリを $PATH 経由で参照できていません。確認に成功するまでは、スキルのコマンドを実行しないでください。

この CLI を使う場面

エージェントやユーザーが Airbnb のリスティング URL を指定した場合、Airbnb の手数料や直接予約による節約について質問した場合、「book direct」と言及した場合、または複数のリスティングをまたいだ旅行の計画を希望した場合に、この CLI を使用してください。最も安い選択肢を調べるのが基本です。そこからプランや比較へと機能を拡張できます。ローカルストアには、セッションをまたいでリスティング、ホスト、価格履歴が蓄積されるため、クエリを再実行するたびに、より速く、より充実した結果が得られます。

この CLI を使わない場面

作成、更新、削除、公開、コメント、賛成票の投票、招待、注文、メッセージ送信、予約、購入、またはリモート状態の変更が必要なリクエストには、この CLI を使用しないでください。この CLI が提供するのは、調査、エクスポート、同期、分析のための読み取り専用コマンドです。

独自の機能

この API に対して、ほかのツールでは利用できない機能です。

ホスト直接予約の裁定取引
  • cheapest — Airbnb または VRBO のリスティング URL を指定すると、ホストの直接予約サイトを見つけ、3 つの予約元のうち最も安い料金を報告します。

    ユーザーが Airbnb/VRBO のリスティングを指定した場合に使うツールです。OTA 手数料と直接予約を比較し、すぐに使える URL を含む構造化された結果を返します。

    airbnb-pp-cli cheapest 'https://www.airbnb.com/rooms/37124493?check_in=2026-05-16&check_out=2026-05-19' --agent
    
  • plan — 都市、日程、予算に基づいて Airbnb と VRBO を並行して検索し、上位の検索結果に対して cheapest を実行して、節約額順のリストを返します。

    エージェントに使いやすい旅行プランナーです。1 回の呼び出しで、両プラットフォームの結果を、直接予約 URL と節約額とともに順位付けして返します。

    airbnb-pp-cli plan 'Lake Tahoe' --checkin 2026-05-16 --checkout 2026-05-19 --guests 4 --budget 1500 --agent
    
  • compare — OTA の合計料金(清掃料金、サービス料、税金を含む)と直接予約の合計料金を並べて、金額と割合で節約額を示します。

    具体的な節約額を根拠に予約を推薦したいエージェントに適しています。

    airbnb-pp-cli compare 'https://www.airbnb.com/rooms/37124493' --checkin 2026-05-16 --checkout 2026-05-19 --json
    
  • find-twin — リスティングの写真を使って画像を逆検索し、直接予約サイトや別のプラットフォームに同じ物件がないか探します。

    ホスト情報の抽出に失敗した場合(ホスト名が曖昧な場合など)、画像の逆検索が最も信頼できる手がかりになります。

    airbnb-pp-cli find-twin 'https://www.airbnb.com/rooms/37124493' --json
    
クロスプラットフォーム
  • match — Airbnb(または VRBO)のリスティングを指定すると、ジオコーディング、アメニティ、写真を手がかりに、もう一方のプラットフォームで同じ物件を探します。

    プラットフォーム間の価格差は実際に存在します。同じコンドミニアムでも、VRBO では 15 パーセント安い場合があります。このツールで見つけられます。

    airbnb-pp-cli match 'https://www.airbnb.com/rooms/37124493' --json
    
蓄積されるローカル状態
  • watch — 保存したリスティングを目標価格とともにウォッチリストに追加します。watch check は各リスティングを再スクレイピングし、実際の価格が返ってきたときに日付付きの価格スナップショットを記録し、本物の値下がりで終了コード 7 を返します。サブコマンド: add、list、remove、check。

    ユーザーが特定のリスティングを検討していて、値下がりを待っているときに使用します。watch check を毎日スケジュール実行し、終了コード 7 で対応します。対象期間に利用可能な価格がないリスティングは no_price として報告され、ヒットになることはありません(誤った終了コード 7 は発生しません)。削除するには watch remove <listing-url-or-id> を使用します。

    airbnb-pp-cli watch add 'https://www.airbnb.com/rooms/37124493' --max-price 350 --checkin 2026-05-16 --checkout 2026-05-19
    airbnb-pp-cli watch remove 37124493
    
  • host portfolio — ホストまたは物件管理会社の名前を指定すると、Airbnb と VRBO 全体でそれらに属する既知のリスティングをすべて一覧表示します。

    一括パターンを発見します: この都市でどの PMC が運営しているか、どれが直接サイトを持つか、どこにアービトラージの焦点を当てるか。

    airbnb-pp-cli host portfolio 'Vacasa' --json --select listings.title,listings.location
    
  • wishlist diff — Airbnb のウィッシュリストの価格変動を経時的に追跡し、保存されたどのリスティングが下落したか、いくら下落したか、どの期間で下落したかを報告します。

    ユーザーが数か月前にリスティングを保存して忘れてしまった場合。予約前に価格変動を可視化し、行動できるようにします。

    airbnb-pp-cli wishlist diff --since 2026-04-01 --json
    
  • fingerprint — 写真 + アメニティ + ホスト + 都市から生成される安定したハッシュ。match による重複排除に使用され、パワーユーザーのエクスポートワークフロー向けに公開されています。

    リスティングに対して独自の外部結合を構築できます。セッションをまたいでも安定しています。

    airbnb-pp-cli fingerprint 'https://www.airbnb.com/rooms/37124493'
    

ディスカバリーシグナル

この CLI は、ブラウザで観測されたトラフィックコンテキストを基に生成されました。

  • キャプチャ範囲: 合計 299 件のネットワークエントリのうち 66 件の API エントリ
  • プロトコル: rpc_envelope(信頼度 80%)、rest_json(信頼度 75%)
  • 認証シグナル: api_key — ヘッダー: X-Airbnb-API-Key、X-Goog-Api-Key
  • 生成ヒント: has_rpc_envelope、weak_schema_confidence
  • 候補コマンドのアイデア: create_GetViewportInfo — 観測された POST /$rpc/google.internal.maps.mapsjs.v1.MapsJsInternalService/GetViewportInfo トラフィックから導出。; create_StaysPdpSections — 観測された POST /api/v3/StaysPdpSections/{hash} トラフィックから導出。; create_get_data_layer_variables — 観測された POST /api/v2/get-data-layer-variables トラフィックから導出。; create_js — 観測された POST /js/ トラフィックから導出。; create_marketing_event_tracking — 観測された POST /api/v2/marketing_event_tracking トラフィックから導出。; create_messages — 観測された POST /tracking/jitney/logging/messages トラフィックから導出。; create_realtimeconversion — 観測された POST /track/realtimeconversion トラフィックから導出。; get_GetConsentFlagsQuery — 観測された GET /api/v3/GetConsentFlagsQuery/{hash} トラフィックから導出。
  • 注意事項: empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。; empty_payload: API らしいリクエストが空または null のペイロードを返しました。スキーマの信頼度が弱いです。

コマンドリファレンス

airbnb_listing — SSR HTML のスクレイピングによる Airbnb のリスティング(検索と詳細。openbnb パターン、認証不要)。

  • airbnb-pp-cli airbnb_listing get — SSR を介して Airbnb のリスティング詳細全体(設備、ハウスルール、所在地、注目ポイント、説明、ポリシー、ホスト)を取得します…
  • airbnb-pp-cli airbnb_listing search — 公開 SSR HTML ページ(openbnb パターン)を介して、所在地、日程、ゲスト数で Airbnb のリスティングを検索します。巡回します…

airbnb_wishlist — Airbnb のウィッシュリスト(ユーザーが保存したリスティングを読み取ります。認証ログイン --chrome が必要です)。

  • airbnb-pp-cli airbnb_wishlist items — 特定のウィッシュリストに含まれる項目を、リスティング ID を使って取得します。
  • airbnb-pp-cli airbnb_wishlist list — Airbnb の GraphQL 永続化クエリを介して、ユーザーのウィッシュリストを一覧表示します。

host — ホストの識別情報の抽出(ホスト直取引の要となります)。

  • airbnb-pp-cli host extract — 両プラットフォームのリスティング URL から、ホストのブランド名または表示名を抽出します。propertyManagement.name を使用します…
  • airbnb-pp-cli host portfolio — ローカルストアから、Airbnb と VRBO のいずれかまたは両方にある、1 人のホストまたは PMC の既知のリスティングをすべて一覧表示します。

vrbo_listing — /graphql と Akamai のウォームアップパターンによる VRBO のリスティング(検索と詳細)。

  • airbnb-pp-cli vrbo_listing get — propertyDetail GraphQL オペレーション(オペレーション名は実行時に検出)を介して、VRBO の物件詳細全体を取得します。以下略…
  • airbnb-pp-cli vrbo_listing search — propertySearch GraphQL オペレーションを介して、VRBO の物件を検索します。Akamai のウォームアップ(最初に GET / を実行し、1.5 秒待ってから POST)を使用します。

鮮度に関する契約

この CLI が出力するのは、登録済みのストア連携読み取りコマンドパスに限った、範囲を限定した鮮度管理です。--data-source auto モードでは、これらのパスは sync_state を確認し、ローカルデータを読み取る前に範囲を限定した更新を実行することがあります。--data-source local は更新を実行しません。--data-source live は API を読み取り、ローカルストアを変更しません。ソース選択を変更せずに鮮度フックをスキップするには、AIRBNB_PP_NO_AUTO_REFRESH=1 を設定します。

対象となるパス:

  • airbnb-pp-cli airbnb_wishlist
  • airbnb-pp-cli airbnb_wishlist items
  • airbnb-pp-cli airbnb_wishlist list

JSON 出力で生成されたプロベナンスエンベロープが使用される場合、鮮度メタデータは meta.freshness に表示されます。これは対象コマンドパスの現在のキャッシュの鮮度として扱ってください。履歴全体のバックフィルや、API 固有の情報補完を保証するものではありません。

適切なコマンドを見つける

実行したいことは分かっていても、どのコマンドを使うか分からない場合は、CLI に直接問い合わせます。

airbnb-pp-cli which "<capability in your own words>"

which は、自然言語による機能の問い合わせを、この CLI の厳選された機能インデックスから最適なコマンドに対応付けます。終了コード 0 は少なくとも 1 つの一致があったことを意味し、終了コード 2 は確信度の高い一致がなかったことを意味します。その場合は --help を使うか、より絞り込んだ問い合わせを行ってください。

レシピ

保存した Airbnb のリスティングを最も安く予約する方法を見つける
airbnb-pp-cli cheapest 'https://www.airbnb.com/rooms/37124493' --checkin 2026-05-16 --checkout 2026-05-19 --json --select savings,direct.url,direct.total,airbnb.total

ホスト抽出のトレース全体ではなく、節約額と価格比較のフィールドのみを返します。

両プラットフォームで 4 人のタホ旅行を計画する
airbnb-pp-cli plan 'Lake Tahoe' --checkin 2026-05-16 --checkout 2026-05-19 --guests 4 --budget 1500 --agent

Airbnb、VRBO、直接予約先の探索を並行して行い、節約額の合計で順位付けします。

保存したリスティングの値下がりを監視する
airbnb-pp-cli watch add 'https://www.airbnb.com/rooms/37124493' --max-price 350 && airbnb-pp-cli watch check
airbnb-pp-cli watch remove 'https://www.airbnb.com/rooms/37124493'

ウォッチリストに追加してから、cron で確認します。実際にスクレイピングした価格がしきい値以下の場合に限り、終了コード 7 で終了します。指定した日程の利用可能な価格がないリスティングは no_price の下に報告されます(該当扱いにならず、終了コード 7 にもなりません)。watch remove には、リスティング URL または watch list で表示される ID のみを指定できます。

価格履歴を最新の状態に保つ
airbnb-pp-cli sync                                 # re-scrapes watchlist + known listings, persists fresh snapshots
airbnb-pp-cli sync --resources airbnb_wishlist     # auth-gated wishlist sync (needs auth login --chrome)

sync は、ストアがすでに把握している情報(ウォッチリストの項目と、以前にスクレイピングしたリスティング)を再スクレイピングし、新しい価格スナップショットを書き込みます。ストアが空の場合は empty_store を報告し、ネットワーク呼び出しは行いません。認証済みウィッシュリストの同期は --resources airbnb_wishlist を指定して明示的に有効にします。

Austin で Vacasa の物件を見つけて、直接予約する
airbnb-pp-cli host portfolio 'Vacasa' --city Austin --agent --select listings.title,listings.direct_url

1 つの PMC のポートフォリオを一括で探索し、直接予約用 URL も解決済みの状態で取得します。

深くネストされたレスポンスを比較する
airbnb-pp-cli airbnb get 37124493 --agent --select listing.title,listing.coordinate.latitude,listing.coordinate.longitude,pricingQuote.structuredStayDisplayPrice.primaryLine.price,pricingQuote.structuredStayDisplayPrice.secondaryLine.price

--select とドット区切りのパスを使って、Airbnb の深くネストされた SSR Apollo キャッシュから重要なフィールドだけを絞り込みます。

認証の設定

公開検索とリスティングの詳細には認証は不要です。認証が必要な機能(Airbnb のウィッシュリスト、旅行履歴)では、auth login --chrome を使って Cookie をインポートします。ウェブ検索バックエンドは切り替え可能です。Parallel.ai(有料、最適)、DuckDuckGo HTML(無料、デフォルト)、Brave Search API(無料枠)、または Tavily(無料枠)を使用できます。

airbnb-pp-cli doctor を実行して設定を確認します。

エージェントモード

任意のコマンドに --agent を追加します。次のオプションに展開されます:--json --compact --no-input --no-color --yes。

  • パイプ可能 — JSON は stdout に、エラーは stderr に出力されます

  • フィルター可能 — --select でフィールドの一部を保持します。ドット区切りのパスでネストされた構造にアクセスし、配列では各要素を順にたどります。冗長な API でコンテキストを小さく保つうえで重要です:

    airbnb-pp-cli airbnb_listing get --agent --select id,name,status
    
  • プレビュー可能 — --dry-run でリクエストを送信せずに表示します

  • オフライン対応 — 同期/検索コマンドでは、利用可能な場合にローカル SQLite ストアを使用できます

  • 非対話型 — プロンプトは表示されず、すべての入力をフラグで指定します

  • 読み取り専用 — 作成、更新、削除、公開、コメント、賛成票、招待、注文、送信、その他の変更を伴うリクエストには、この CLI を使用しないでください

レスポンスエンベロープ

ローカルストアまたは API から読み取るコマンドは、出力を出所情報のエンベロープでラップします:

{
  "meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
  "results": <data>
}

データには .results を解析し、ライブデータかローカルデータかを確認するには .meta.source を参照してください。人間が読みやすい N results (live) の概要は、stdout が端末の場合にのみ stderr に出力されます。パイプまたはエージェント経由の利用では、stdout に純粋な JSON が出力されます。

エージェントからのフィードバック

この CLI に問題があることに(あなた自身、またはエージェントが)気づいたら、記録してください:

airbnb-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
airbnb-pp-cli feedback --stdin < notes.txt
airbnb-pp-cli feedback list --json --limit 10

エントリはローカルの ~/.airbnb-pp-cli/feedback.jsonl に保存されます。AIRBNB_PP_FEEDBACK_ENDPOINT が設定され、さらに --send が渡されるか AIRBNB_PP_FEEDBACK_AUTO_SEND=true が設定されない限り、POST されることはありません。デフォルトの動作はローカルのみです。

バグ報告ではなく、意外だったことを書いてください。短く、具体的に、1 行で記録します。それが積み重なっていくものです。

出力の送信先

すべてのコマンドで --deliver <sink> を指定できます。出力は stdout に加えて、または stdout の代わりに、指定した送信先に出力されます。これにより、エージェントは手動でパイプをつながなくてもコマンド結果を振り分けられます。対応する送信先は 3 種類です:

送信先動作
stdoutデフォルト。stdout のみに書き込みます
file:<path>出力を <path> にアトミックに書き込みます(一時ファイル+リネーム)
webhook:<url>出力本文を URL に POST します(--compact の場合、application/json または application/x-ndjson)

不明なスキームは、サポート対象の一覧を示す構造化エラーとともに拒否されます。Webhook の失敗時はゼロ以外の終了コードが返され、URL と HTTP ステータスが stderr に記録されます。

名前付きプロファイル

プロファイルは、保存して再利用できるフラグ値のセットです。スケジュールされたエージェントが、毎回同じ設定で同じコマンドを呼び出す場合に使用します。これは HeyGen の「Beacon」パターンです。

airbnb-pp-cli profile save briefing --json
airbnb-pp-cli --profile briefing airbnb_listing get
airbnb-pp-cli profile list --json
airbnb-pp-cli profile show briefing
airbnb-pp-cli profile delete briefing --yes

明示的なフラグは常にプロファイル値より優先され、プロファイル値はデフォルトより優先されます。agent-context は、利用可能なすべてのプロファイルを available_profiles の下に一覧表示するため、情報を調べるエージェントは実行時にプロファイルを検出できます。

終了コード

コード意味
0成功
2使用方法のエラー(引数が不正)
3リソースが見つかりません
4認証が必要です
5API エラー(上流の問題)
7レート制限中(待機して再試行してください)
8ボットチャレンジ(datadome/Akamai)。待機するか、airbnb-pp-cli auth login --chrome で Cookie を更新してください
10設定エラー

レート制限

--rate-limit N(グローバルフラグ)は、リクエストレートを毎秒 N 件に制限します。スクレイプ経路(search、get、cheapest、plan、compare)と GraphQL 経路(価格取得の BookingPrice、wishlist list、wishlist items)の両方に適用されます。

  • デフォルト(フラグ未指定):ベースラインは 0.5 rps です。後退することはありません。
  • --rate-limit N(N > 0):新しい上限として設定します。
  • --rate-limit 0:レート制限を無効にします。

リミッターは適応型です。429 または datadome/Akamai のチャレンジを検出すると、現在のレートを半分にして上限を記録します。10 回連続で成功すると、発見済みの上限の 90% を上限として、レートを 25% ずつ引き上げます。リトライ時のスリープには 25% のジッターを加え、クライアント群が同時に動作しないようにします。

チャレンジが継続して発生すると、CLI は修正のヒントを含む型付きの BotChallengeError を返します(datadome の場合は Cookie の更新、Akamai の場合はセンサーのクールダウンを待機)。失敗時に CLI が偽のデータを生成することはありません。

引数の解析

$ARGUMENTS を解析します。

  1. 空、help、または --help → airbnb-pp-cli --help の出力を表示します
  2. install で始まる場合 → mcp で終わる場合は MCP のインストール、それ以外の場合は上記の前提条件を確認します
  3. それ以外 → 直接使用(--agent を付けて CLI コマンドとして実行します)

MCP サーバーのインストール

  1. MCP サーバーをインストールします。
    go install github.com/mvanhorn/printing-press-library/library/travel/airbnb/cmd/airbnb-pp-mcp@latest
    
  2. Claude Code に登録します。
    claude mcp add airbnb-pp-mcp -- airbnb-pp-mcp
    
  3. 確認します:claude mcp list

直接使用

  1. インストール済みか確認します:which airbnb-pp-cli 見つからない場合は、インストールを提案します(このスキルの冒頭にある前提条件を参照してください)。
  2. ユーザーのクエリに最適なコマンドを、上記の独自機能とコマンドリファレンスから選びます。
  3. --agent フラグを付けて実行します。
    airbnb-pp-cli <command> [subcommand] [args] --agent
    
  4. 曖昧な場合は、サブコマンドのヘルプを確認します:airbnb-pp-cli <command> --help。

コメント