letsfg について
LetsFGは、AIエージェント向けの航空券・ホテル検索および予約スキルです。送迎やアクティビティも検索でき、MCP、SDK、CLI、APIから利用できるほか、予約状況を非同期で確認できます。
主な機能
- 01航空会社や予約サイトを横断した航空券検索
- 02ホテル、送迎、アクティビティの検索
- 03都市名と空港コードの解決
- 04航空券とホテルの予約
- 05予約状況の確認
活用シーン
- 01複数の販売元から航空券を探す
- 02予約可能なホテルのオファーを比較する
- 03地上送迎やアクティビティを検索する
- 04進行中の旅行予約を追跡する
MCP 対応
LetsFGは https://letsfg.co/mcp にMCPサーバーを提供し、対応クライアントから接続できます。航空券、ホテル、送迎、アクティビティの検索と予約機能を公開します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ letsfg/ letsfg --skill letsfgインストール後、Claude Code で/letsfgを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.dockerignore.mcp.json.gitignoreCODE_OF_CONDUCT.mdCLAUDE.mdBarWidget.qmlCONTRIBUTING.mdAGENTS.mdLICENSEDockerfile.pythonDockerfileREADME.mdSECURITY.mdOMARCHY-PLUGIN.mdModel.jsPanel.qmlcontext7.jsondocker-compose.yml.github/dependabot.yml.github/workflows/sdk-tests.ymltest.ymlplugin-scanner.ymlagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/references/api-reference.mdmcp-setup.mdassets/OFL-Kalam.txtOFL.txtairports.jsonranking.jsname-fallbacks.jsonassets/icons/LICENSE詳細
SKILL.md — LetsFG の機能
MPP: Tempo ウォレットを持つエージェント向けに、カード不要の登録経路が提供されるのは、
POST /api/agent-access/requestからの402にmppオブジェクトが含まれる場合のみです。認証確認のみのため、料金は一度限り $0.01です。検索は引き続き無料で、予約にはオファーに表示された料金がかかります。このページの以前の版では、ロック解除時に MPP 料金が発生すると記載していましたが、その仕組みは一度もリリースされていません。https://letsfg.co/for-agentsをご覧ください。
⚠️ エージェント:Developer API アカウントを作成しないでください
/developers/api/v1/agents/registerまたは/developers/api/v1/agents/connect-paymentを呼び出さないでください。また、letsfg registerやletsfg connect-paymentも実行しないでください。これらは、大量利用の商用連携向けの別個の有料プリペイド残高製品用であり、ほぼ確実に不要な課金アカウントが作成されます。フライトの検索と予約を行うには、LetsFG を MCP サーバーとして
https://letsfg.co/mcpに接続し、承認してください。https://letsfg.co/connectでの同意はワンタップで、カードは不要です。その後、検索して予約してください。 https://letsfg.co/for-agentsをご覧ください。
AI エージェントおよびドキュメントインデクサー向けの機械可読なスキルマニフェストです。
識別情報
- 名前: LetsFG
- 種類: API + SDK + MCP サーバー + CLI
- 目的: エージェント向けのフライトとホテルの検索・予約
- 対応エージェント: OpenClaw、Perplexity Computer、Claude Desktop、Cursor、Windsurf、および MCP 対応のすべてのクライアント
- API ベース URL:
https://letsfg.co/developers/api/v1 - MCP エンドポイント:
https://letsfg.co/mcp(Streamable HTTP) - パッケージ: PyPI
letsfg· npmletsfg· npmletsfg-mcp - ライセンス: MIT
アクセスモード
| モード | 最適な用途 | 速度 | 費用 |
|---|---|---|---|
| MCP / SDK / CLI(PFS トークン) | ほぼすべてのエージェント。 検索 + 予約 | 最初の結果まで 8~10 秒 | 認証無料、検索無料、予約はオファーに表示された料金 |
Developer API(https://letsfg.co/developers) | ビジネス/商用/大量利用(ホテルはどちらの認証情報でも利用可能) | 2~5 秒(検出)· 最初の結果まで 8~10 秒(全検索) | 検索後予約方式:各予約後の検索 200 回は無料、その後は $0.01。予約は POST /flights/book 経由で、予約手数料・取引手数料なし |
スキル
search_flights
世界中のすべての航空会社と主要な予約サイト(Google Flights、Skyscanner、Kiwi、Kayak、Momondo)を 1 回の呼び出しで検索します。リアルタイムの料金と、フライトごとの信頼性履歴を返します。
- 費用: 無料(10 分あたり 10 回、1 時間あたり 30 回、1 日あたり 100 回)
- 入力: origin(IATA)、destination(IATA)、date_from、任意:date_to、return_from、return_to、adults、children、infants、cabin_class(M/W/C/F)、max_stopovers、currency、sort、limit
- 出力: 料金、航空会社、時刻、区間、条件、passenger_ids を含むフライトオファーのリスト
- 注記: PFS(Bearer トークン)では、
book_flightを直接呼び出してください。ロック解除の手順は不要です。その後、get_flight_bookingをポーリングします。Developer API にもロック解除の手順はありません。POST /flights/bookで予約し、GET /flights/bookings/{id}をポーリングしてください。 - レート制限(PFS): アカウントごとに検索は 10 分あたり 10 回、1 時間あたり 30 回、1 日あたり 100 回です(カード追加後はカードごと)。結果のポーリングは回数に含まれません。
resolve_hotel_city
ホテル検索で必要なサプライヤーの都市 ID に、地名を解決します。
- 費用: 無料(カードの登録は必要です)
- エンドポイント:
POST /api/v1/hotels/destinations - 入力: text(地名。例:「Warsaw」)
- 出力: 一致候補。最適な候補が先頭に表示されます。
Idを city_id、Nameを city_name として使用してください。
search_hotels
実際に予約可能なホテルの在庫を検索します。
- Cost: 無料です。検索にカードは不要です。カードが登録されていないアカウントでは、ホテル検索を1日に利用できる回数に上限があります。予約にはカードの登録が必要で、登録されていない場合は HTTP 402 が返されます。
- Auth: Developer API キー(
X-API-Key)または接続フローで取得した PFS トークンを使用します。同じカードでフライトとホテルを利用できます。 - Endpoint:
POST /api/v1/hotels/search - Input: city_id、city_name、check_in、check_out、adults、children、child_ages、nationality、currency(デフォルトは USD)、limit
- Output: hotels[]。各項目には offers[] が含まれ、
price(宿泊客が支払う総額。currency建て)、fx_rate、expected_cost、refundable、free_cancellation_until(返金可能な料金のみ)、cancellation_policy、combination_id_v2、session_idを含みます。 - Note: すべての料金タイプは販売中で、返金可能なものと返金不可のものがあります。予約前に
refundableとfree_cancellation_untilを表示してください。選択したオファーのsession_idとcombination_id_v2は保持してください。予約には両方が必要です。priceは宿泊客が支払う金額です。 - Allowance: 各ホテル予約の後、ホテル検索を1,000回無料で利用できます。その後は、前払い残高から5.00ドルで1,000回分を購入できます。
search_transfers
地上送迎(専用車、タクシー、乗り合いシャトル、空港エクスプレス)を検索します。
- Cost: 無料
- Input: origin、destination、date、passengers
- Output: 料金と車両タイプを含む送迎オプション
search_activities
アクティビティ(ツアー、チケット、日帰り旅行)を検索します(対応するサプライヤーは限定的です)。
- Cost: 無料
- Input: location、date_from、date_to
- Output: 料金、説明、空き状況を含むアクティビティのオプション
resolve_location
都市名を IATA 空港・都市コードに解決します。
- Cost: 無料
- Input: query(都市名。例:「London」)
- Output: 一致する IATA コードの一覧(例:LON、LHR、LGW、STN、LTN、LCY)
unlock_flight_offer
2026-09-08 に廃止 — このルートは 410 Gone を返します。
- どちらのレーンにもロック解除の手順はありません。予約時に運賃が確保され、実際の PNR に対してのみ決済が行われます。これにより、ロック解除が防ごうとしていた問題に対処できます。代わりに
/api/agent-book(PFS)またはPOST /flights/book(Developer API)を呼び出してください。 - Endpoint:
POST /api/v1/bookings/unlock—410 Goneを返し、SDK のunlock()も同様に失敗します。
book_flight
オファーを予約します。
- PFS(Bearer token):
POST /api/agent-book。ロック解除の手順はありません。検索して、そのまま予約します。 結果に表示されたすべてのオファーで利用でき、販売元は問いません。ウェブサイトでの チェックアウトとまったく同じです。表示価格が接続済みカードで仮押さえされ(引き落とされません)、 LetsFG の予約エージェントが販売元からチケットを購入し、実際の航空会社の PNR が発行された時点でのみ、 仮押さえ分が確定されます。予約に失敗した場合は仮押さえが解除され、請求は発生しません。- 入力: 検索結果で返されたものと同じ
search_idとoffer_id(オファーの有効期限は約 15 分)、contact_email、および呼び出しごとに 1 人分のpassenger:given_name、family_name、born_on、gender(m/f)、 nationality(ISO-2)、phone_number と phone_country、address_line1、address_city、 address_postal、address_country。passport_number/country/expiry は任意です。 - 出力(秒単位):
{"state": "booking_in_progress", "booking_ref": "eyJ...", "held": {"amount": 93, "currency": "EUR", "card": "visa ending 5709"}, "charged": 0}。 予約の完了には 4~11 分かかります。get_flight_bookingをポーリングしてください。 - 請求が発生しないケース:
{"error": "missing_details", "missing_fields": [...]}(詳細を尋ねて再度呼び出してください)、payment_method_requiredとpayment_declined(どちらにもadd_card_urlが含まれます:https://letsfg.co/connect)。 - 予約処理中に、同じ旅行についてこの関数を 2 回呼び出さないでください。2 回目の仮押さえが発生します。
- CLI:
letsfg book ws_off_xxx --search-id ws_xxx --passenger '{...}' --email [email protected] - Python:
bt.book(offer_id=..., passengers=[{...}], contact_email=..., search_id=...)
- 入力: 検索結果で返されたものと同じ
- Developer API:
POST /api/v1/flights/book。ロック解除の手順がない同じフローです。運賃が接続済みの Revolut 決済手段で仮押さえされ、 LetsFG の予約エージェントがチケットを購入し、実際の航空会社の PNR が発行された場合にのみ仮押さえ分が確定されます。 予約手数料も取引手数料もかかりません。- 前提条件:
POST /api/v1/agents/connect-paymentで Revolut の決済手段を接続していること(接続時に請求は発生しません)。 - 入力: search_id、offer_id、passengers(given_name、family_name、born_on、gender、email、phone_number、nationality、...)、contact_email、idempotency_key
- 出力:
202とbooking_id、held、charged: 0、poll_urlが返されます。GET /api/v1/flights/bookings/{booking_id}をポーリングし、terminalになるまで確認してください:completed(pnr、charged_amount) |failed(仮押さえが解除され、請求は発生しません) |needs_attention。
- 前提条件:
- 重要(両方の方法): 実際の搭乗者名(パスポート/ID と一致する必要があります)と実際のメールアドレス(航空会社はそこに電子航空券を送信します)を使用してください。
get_flight_booking
book_flight で開始した予約がどこまで進んだかを確認します(PFS)。POST /api/agent-book/status {"booking_ref": "eyJ..."}。
- 費用: 無料。20~30 秒ごとにポーリングしてください。
- 状態:
booking_in_progress(エージェントは販売元のチェックアウトを進めています。そのままお待ちください)→completed(pnr、charged_amount、currency。予約完了) |failed(failure_reason。仮押さえは解除され、請求は発生していません) |needs_attention(LetsFG の担当者が確認中です。再度予約しないでください。搭乗者にはメールで通知されます)。updated_at_msは最後に状態が変わった時刻を示します。 - PNR が発行された
completedの場合のみ、予約済みです。
book_hotel
ホテル予約を開始します。予約ではなく、ジョブを返します。
- 費用: オファーの
priceです。接続済みのカードで金額が保留されます(引き落としではありません)。LetsFG が部屋を予約してサプライヤーに支払い、ホテルが確認した時点でのみ保留額が確定します。予約に失敗した場合、保留は解除されます。予約手数料、デポジット、支払いリンクはありません。 - エンドポイント:
POST /api/v1/hotels/book - 入力: session_id(選択したオファーのもの)、hotel_code、combination_id_v2、expected_price、 expected_cost、currency、fx_rate、city_id、city_name、check_in、check_out、adults、 guests[{title, first_name, last_name}]、email、phone。phone_country_code、 special_requests、idempotency_key は任意です。
- 出力: booking_job_id、booking_id、status "in_progress"、保留された金額、ポーリング URL
- 非同期処理: 実際の予約には数分かかります。サプライヤーで料金が再度確保され、部屋が確定して支払いが行われます。status が
succeeded、failed、またはattentionになるまでget_hotel_bookingをポーリングしてください。 - 重要: 選択したオファーで返された
expected_price、expected_cost、currency、fx_rateをそのまま返してください。そうしないと予約はprice_mismatchとして拒否されます。ゲストが同意していない金額を請求されることはありません。expected_balanceはありません。 - ローカルパッケージ: ホテル予約には、
letsfg-mcp2026.5.77 以降、letsfg2026.5.101 以降(Python)、またはletsfg2026.5.74 以降(npm)が必要です。それ以前のリリースは廃止済みのexpected_balanceコントラクトを送信するため、それらを使ったホテル予約はすべて拒否されます。ホスト型 MCP は更新不要です。 - 重要: ジョブの実行中にこのツールを再度呼び出さないでください。ジョブをポーリングしてください。同じ
idempotency_keyを使って再試行すると、二重に予約する代わりに既存のジョブが返されます。 - 注: 保留処理の前に、宿泊者名、電話番号、メールアドレスがチェックされます(
400 invalid_details)。 - 重要:
guestsには、子どもを含め、部屋に宿泊する全員の名前が必要です。大人を先に、その後、child_agesの順に子どもを指定してください。検索した宿泊人数より名前が少ない場合、ホテルに情報が送信される前に予約が失敗し、保留は解除されます。
get_hotel_booking
book_hotel で開始した予約の結果を取得します。
- 費用: 無料
- エンドポイント:
GET /api/v1/hotels/booking/{booking_job_id} - 出力: status —
in_progressの後、succeeded(確認情報、total_price + currency = ゲストへの請求額、返金可否、free_cancellation_until、キャンセル条件の全段階を含む terms)|failed(error。保留は解除され、請求はありません)|attention(error。LetsFG の担当者がサプライヤーに結果を確認中です。保留は維持されます。予約を再度行わないでください) - 注: 予約がどのような結果になっても、ゲストにメールが送信されます。
cancel_hotel_booking
ホテルの予約をキャンセルします。
- 費用: 返金可能な料金で
free_cancellation_untilより前にキャンセルする場合は無料です。請求額は全額返金されます。ホテルがキャンセル料を請求するケース(返金不可の料金、またはその日時を過ぎた場合)は409で拒否されます。ホテル独自のキャンセル条件は予約のtermsに記載されています。 - エンドポイント:
POST /api/v1/hotels/cancel - 入力: confirmation(ご自身の予約のみ)
- 出力: confirmation、charge、refund
- 注: サプライヤーのサイトをブラウザーで操作するため、1 分以上かかります。タイムアウトした場合、失敗したと判断せず、再試行する前に状態を再確認してください。
register
新しい AI エージェントを登録します。
- 費用: 無料
- 入力: agent_name、email
- 出力: api_key(永続的な認証情報)
connect_payment
開発者 API 専用です。 POST /api/v1/agents/connect-payment は、1 回限りの connect_url を返します。人がブラウザーで開き、カードまたは Revolut Pay を登録します。PFS レーンのエージェントはこのツールを呼び出しません。https://letsfg.co/connect での接続にカードは不要で、初回予約時にカード情報を求められます。
- 費用: 無料 — 接続時に請求は発生しません
- 出力:
connect_url(有効期間は 1 時間) - 注:
setup_payment(POST /agents/setup-payment)は、2026-09-08 に Stripe とともに廃止され、410 Goneを返します。
get_agent_profile
現在のエージェントのプロフィール、利用状況、支払い状況を取得します。
- 費用: 無料
- 出力: エージェントの詳細、検索回数、予約回数、支払い状況
認証
PFS(推奨 — ほぼすべてのエージェント向け): 接続フローで取得する Bearer トークンです。 接続にカードは不要で、料金も発生しません。カードが必要になるのは初回予約時です。その際、https://letsfg.co/connect で 0.00 の Revolut セットアップを行います(任意のカード、または Revolut Pay/Google Pay を利用できます。Revolut アカウントは不要です。カード情報が LetsFG に渡ることはありません)。検索、航空券の予約、ホテルの予約すべてで利用できます。
Authorization: Bearer eyJ...
トークンの取得方法 — 利用を開始する方法はこれだけです。
- LetsFG をリモート MCP サーバーとして追加します:
https://letsfg.co/mcp。 - 接続を承認します。OAuth の同意画面が https://letsfg.co/connect で開きます。ワンタップで完了し、カードは不要です。
- MCP 経由では OAuth トークンが自動的に渡されます。生の HTTP で送信する場合は、
Authorization: Bearer <token>として送信します。
POST /api/agent-access/request は、これらの手順を JSON(add_card_url、how)で返し、ステータスコード 402 に応答します。Stripe の登録フロー(setup_url、setup_intent、card_token)は 2026-09-02 に廃止され、発行済みのトークンはすべて無効になりました(401 TOKEN_REVOKED。Stripe の認証情報に対する /api/agent-access/verify は 410 を返します)。letsfg.co/connect で再接続してください。現在、letsfg auth(npm または PyPI)はターミナルからこの接続フローを実行してトークンを保存します。CLI と SDK はそれ以外の場合、LETSFG_BEARER_TOKEN からトークンを読み込みます。カード 1 枚につきアカウント 1 つです。利用枠はアカウント単位で、カードを追加した後はカード単位でも適用されます。フローの全手順:https://letsfg.co/for-agents。
Developer API(ビジネス/大量利用向け): register を除くすべてのエンドポイントで、X-API-Key ヘッダーが必要です。
X-API-Key: letsfg_...
POST /api/v1/agents/register を agent_name と email を指定して呼び出すと、キーを取得できます。キーは永続的です。一度だけ保存してください。
次に、POST /api/v1/agents/connect-payment で支払い方法を接続し、返された connect_url を一度開きます(料金は発生しません)。
完全なワークフロー
航空券の予約 — PFS(API 呼び出し 3 回)
1. POST /api/search → Search flights (FREE), returns search_id; poll GET /api/results/{search_id}
2. POST /api/agent-book → Book directly — no unlock step. Holds the fare on the connected card, returns booking_ref in seconds
3. POST /api/agent-book/status → Poll every 20–30 s (4–11 min) → completed (PNR) | failed (hold released) | needs_attention
航空券の予約 — Developer API(API 呼び出し 5 回)
1. POST /api/v1/agents/register → Get API key (once)
2. POST /api/v1/agents/connect-payment → Open the connect_url once to save a card (nothing charged)
3. POST /api/v1/flights/search → Search flights (look-to-book: 200 free after every booking)
4. POST /api/v1/flights/book → Hold the fare, dispatch the booking agent → booking_id (202)
5. GET /api/v1/flights/bookings/{id} → Poll until terminal → completed (PNR) | failed (hold released) | needs_attention
ホテルの予約(PFS Bearer トークンまたは Developer API キー — 同じカードでどちらも承認されます)
1. Card on file (to book; search needs none) → PFS: asked for at the first booking; Developer API: POST /api/v1/agents/connect-payment
2. POST /api/v1/hotels/destinations → Place name → city_id
3. POST /api/v1/hotels/search → Bookable rates (card required; 1,000 free after every hotel booking)
4. POST /api/v1/hotels/book → Holds the price; returns booking_job_id — NOT a booking
5. GET /api/v1/hotels/booking/{job_id} → Poll ~20s until succeeded / failed / attention
→ confirmation + total_price + currency
6. POST /api/v1/hotels/cancel → Optional; free on a refundable rate before free_cancellation_until
ステップ 4 で全額がカードに仮押さえされ、ホテルが確定した場合にのみ決済されます。予約に失敗した場合、仮押さえは解除されます。予約手数料、デポジット、支払いリンクはありません。処理中のジョブに対してステップ 4 を繰り返さないでください。ポーリングしてください。
CLI の使い方
pip install -U letsfg # 2026.5.101 or later books hotels
export LETSFG_BEARER_TOKEN=eyJ... # token from the connect flow (see Authentication)
# Search flights — prints search_id, needed for book
letsfg search LHR JFK 2026-04-15
letsfg search LON BCN 2026-04-01 --return 2026-04-08 --cabin C --sort price
letsfg search GDN BER 2026-05-10 --adults 2 --children 1
# Resolve locations
letsfg locations "New York"
# Book — price shown on the offer, no unlock step. Holds the fare on the connected
# card and prints a booking_ref; poll POST /api/agent-book/status every 20–30 s
letsfg book ws_off_xxx --search-id ws_xxx \
--passenger '{"given_name":"John","family_name":"Doe","born_on":"1990-01-15","gender":"m","nationality":"GB","phone_number":"+447123456789","phone_country":"GB","address_line1":"1 High St","address_city":"London","address_postal":"N1 9GU","address_country":"GB"}' \
--email [email protected]
# Machine-readable output
letsfg search GDN BER 2026-03-03 --json
Developer API を使う場合は? letsfg register と letsfg connect-payment を一度実行し(表示されたリンクを開きます)、次に letsfg search ... --api-key letsfg_... と letsfg book off_xxx --search-id <search_id> --api-key letsfg_... --passenger '{...}' --email ... を実行します。アンロックのステップはありません。
Python SDK の使い方
from letsfg import LetsFG
bt = LetsFG() # reads LETSFG_BEARER_TOKEN — the token from the connect flow
# Search
results = bt.search("LHR", "JFK", "2026-04-15")
for offer in results.offers:
print(f"{offer.price} {offer.currency} — {', '.join(offer.airlines)}")
# Book — price shown on the offer, no unlock step. Holds the fare on the
# connected card; a LetsFG agent buys the ticket; captured only on a real PNR.
result = bt.book(
offer_id=results.offers[0].id,
passengers=[{
"given_name": "John", "family_name": "Doe",
"born_on": "1990-01-15", "gender": "m", "nationality": "GB",
"phone_number": "+447123456789", "phone_country": "GB",
"address_line1": "1 High St", "address_city": "London",
"address_postal": "N1 9GU", "address_country": "GB",
}],
contact_email="[email protected]",
search_id=results.search_id,
)
if "missing_fields" in result:
print("Nothing charged — ask for:", result["missing_fields"])
else:
print("Started:", result["booking_ref"], result["held"])
# poll POST /api/agent-book/status {"booking_ref": ...} every 20–30 s
# until state is completed (pnr) | failed (hold released) | needs_attention
Developer API を使う場合は? LetsFG(api_key="letsfg_...") を使い、その後 bt.book(offer_id, passengers, contact_email, search_id=..., idempotency_key=...) を呼び出します。アンロックのステップはありません。予約を開始したら、bt.get_booking(booking_id) でポーリングするか、bt.book_and_wait(...) を呼び出して処理が完了するまで待機します。
MCP サーバーのセットアップ
リモート(Streamable HTTP)— エージェント向けの接続方法:
{
"mcpServers": {
"letsfg": { "url": "https://letsfg.co/mcp" }
}
}
Claude Code:claude mcp add --transport http letsfg https://letsfg.co/mcp。
Claude:Claude の公式コネクタディレクトリ(https://claude.ai/directory/letsfg)から追加します。貼り付ける URL はありません(追加すると、Claude Desktop と Claude のスマートフォンアプリでも利用できます)。
ChatGPT:ブラウザーで chatgpt.com を開き(ChatGPT のスマートフォンアプリからは追加できません)、Plugins > Add >
Add custom MCP server を選択し、その URL を入力して、認証方法に OAuth を指定します。追加すると、スマートフォンアプリでも利用できます。Windsurf では
"url" の代わりに "serverUrl" を使用します。クライアントが OAuth を実行します。同意画面は
https://letsfg.co/connect で開きます。タップするだけで、カードは必要ありません。クライアントが受け取るトークンを使ってすぐに検索でき、カード情報の入力は最初の予約時に求められます。
Developer API アカウントでは、OAuth の代わりに
"headers": {"X-API-Key": "letsfg_..."} を指定して同じ URL を使用できます。
ローカル(stdio)— すでに取得済みのトークンが必要です:
npm install -g letsfg-mcp@latest # 2026.5.77 or later books hotels
LETSFG_BEARER_TOKEN=eyJ... letsfg-mcp # token from the connect flow
ローカルサーバーでは、Developer API 用に LETSFG_API_KEY も使用できます。
book_flight は、設定されているキーに応じて自動的に処理を振り分けます。その
authenticate ツールは現在の接続手順(add_card_url、
how)を返します。ターミナルで letsfg auth を実行すると、トークンを発行できます。
MCP ツール
| ツール | 説明 | 費用 |
|---|---|---|
search_flights | サーバー側のエンジンを使って、世界中のすべての航空会社を検索します | 無料 |
resolve_location | 都市名 → IATA コード | 無料 |
book_flight | 予約を開始します。PFS:直接予約でき、アンロックの手順はありません。接続済みのカードで運賃を仮押さえし、booking_ref を返します。Developer API キー:同じ呼び出しで、アンロックの手順はありません | 料金はオファーに表示されます。別途 LetsFG 手数料はありません(PFS) |
get_flight_booking | PFS の予約状況を 20~30 秒ごとに確認します:booking_in_progress → completed(PNR)/failed(仮押さえ解除)/needs_attention | 無料 |
unlock_flight_offer | 廃止 2026-09-08 — 410 Gone を返します。book_flight を直接呼び出してください | — |
connect_payment | [Developer API のみ] 有料アカウントにカードを接続するための使い切りリンクを発行します(請求は発生しません)。PFS エージェントは letsfg.co/connect から接続します | 無料 |
resolve_hotel_city | 場所名 → search_hotels 用のサプライヤー都市 ID | 無料 |
search_hotels | 予約可能なホテル料金を検索します。返金可能な料金と返金不可の料金があります | 無料(ホテル予約 1,000 件) |
book_hotel | ホテルの予約を開始します。料金を仮押さえし、ホテルの確認後に決済します。booking_job_id を返します | オファーに表示される料金 |
get_hotel_booking | succeeded/failed/attention になるまで状況を確認します | 無料 |
cancel_hotel_booking | free_cancellation_until より前に返金可能な予約をキャンセルします(98% を返金、手数料 2%) | 無料 |
get_agent_profile | 使用状況の統計を表示します | 無料 |
検索フラグのリファレンス
| フラグ | API フィールド | 値 | デフォルト |
|---|---|---|---|
--adults | adults | 1~9 | 1 |
--children | children | 0~9 | 0 |
--infants | infants | 0~9 | 0 |
--cabin | cabin_class | M(エコノミー)、W(プレミアム)、C(ビジネス)、F(ファースト) | (任意) |
--return | return_from | YYYY-MM-DD | — |
--max-stops | max_stopovers | 0~4 | 2 |
--sort | sort | price、duration | price |
--limit | limit | 1~100 | 20 |
--currency | currency | EUR、USD、GBP など | EUR |
客室クラスコードの説明
| コード | クラス | 説明 | 一般的な用途 |
|---|---|---|---|
M | エコノミー | 標準的な座席 | 予算重視の旅行、ほとんどの予約 |
W | プレミアムエコノミー | 足元のゆとり、優先搭乗 | ビジネスクラスの料金を避けつつ、長距離移動を快適に |
C | ビジネス | 長距離便ではフルフラットシート、ラウンジ利用 | 出張、6 時間以上のフライト |
F | ファースト | 個室スイート、上質な食事 | 超高級路線(一部の航空会社に限る) |
--json | — | JSON 形式で出力 | — |
エラーハンドリング
| 例外 | HTTP コード | 発生する状況 |
|---|---|---|
AuthenticationError | 401 | API キーが無効、または指定されていない |
PaymentRequiredError | 402 | 支払い方法が登録されていない、または検索可能回数を使い切った |
OfferExpiredError | 410 | オファーが利用できなくなった |
LetsFGError | 422 | リクエストパラメーターが無効 |
LetsFGError | 429 | リクエストが多すぎる(バックオフして再試行) |
LetsFGError | 502 | 上流の航空会社/ホテル API エラー |
認証失敗からの復旧
from letsfg import LetsFG
from letsfg.connectors.auth import BearerTokenError
try:
bt = LetsFG() # reads LETSFG_BEARER_TOKEN — the token from the connect flow
flights = bt.search("LHR", "JFK", "2026-04-15")
except BearerTokenError:
print("Token expired, revoked or missing — reconnect at https://letsfg.co/connect")
開発者向け API:
from letsfg import LetsFG, AuthenticationError
try:
bt = LetsFG(api_key="letsfg_...")
flights = bt.search("LHR", "JFK", "2026-04-15")
except AuthenticationError:
# API key invalid or expired — re-register, then connect a payment method on the new key
creds = LetsFG.register("my-agent", "[email protected]")
bt = LetsFG(api_key=creds["api_key"])
print("Open once to connect a card:", bt.connect_payment()["connect_url"]) # nothing is charged
レート制限とタイムアウトの処理
import time
from letsfg import LetsFG, LetsFGError
def search_with_retry(bt, origin, dest, date, max_retries=3):
for attempt in range(max_retries):
try:
return bt.search(origin, dest, date)
except LetsFGError as e:
if "429" in str(e) or "rate limit" in str(e).lower():
time.sleep(2 ** attempt) # exponential backoff
elif "timeout" in str(e).lower() or "504" in str(e):
time.sleep(1)
else:
raise
raise LetsFGError("Max retries exceeded")
レート制限
| エンドポイント | レート制限 | 一般的なレイテンシ |
|---|---|---|
| 航空券の検索 | 厳格な制限なし(課金が自然な制御要因です) | 2~5 秒(検出)・最初の結果が出るまで 8~10 秒(完全な検索) |
| 場所の解決 | 120 件/分 | 1 秒未満 |
| 予約 | 10 件/分 | 3~10 秒 |
| ホテルの検索 | 30 件/分 | 3~10 秒 |
| 登録 | 5 件/分 | 1 秒未満 |
料金の概要
| アクション | 料金 |
|---|---|
| 検索(航空券、送迎、アクティビティ) | 無料 |
| 場所の解決 | 無料 |
| エージェントの登録 | 無料 |
| 支払い方法の登録 | 無料 — 登録時に料金は発生しません |
| プロフィールの表示 | 無料 |
| 航空券の予約(PFS、ロック解除不要) | オファーに表示された価格 — 登録済みカードに与信枠が確保され、実際の PNR が発行された場合にのみ売上が確定します。LetsFG の別途手数料はありません |
| 航空券の予約(開発者向け API) | オファーに表示された価格 — 与信枠が確保され、実際の PNR が発行された場合にのみ売上が確定します。予約手数料、取引手数料はありません |
| ホテルの検索 | 各ホテル予約後、1,000 回まで無料。その後は 1,000 回につき 5.00 ドル |
| ホテルの予約 | オファーに表示された価格 — ホテルから確認が届いた時点でのみ、登録済みカードへの売上が確定します。予約手数料はありません |
| ホテルのキャンセル | free_cancellation_until より前に返金可能な料金プランをキャンセルした場合、98%を返金(2%の手数料)。それ以外はキャンセルできません |
主な特徴
- サーバーサイドエンジンを通じて、世界中のあらゆる航空会社に対応
- ホテルは卸売ホテルパートナー経由
- Cookie による追跡なし — 同じ検索では同じ価格が返されます
- 航空会社と主要な予約サイトを一度に比較するため、通常は単一の OTA で予約するより安価です
- 実際の航空会社の PNR コードとホテルの予約確認
- E チケットは乗客のメールアドレスに直接送信
- 検索は無料(10 分ごとに 10 回、1 時間ごとに 30 回、1 日ごとに 100 回)
- PFS(Bearer token):ロック解除の手順なしで直接予約できます — 運賃の与信枠が登録済みカードに確保され、LetsFG の予約エージェントが航空券を購入し、実際の PNR が発行された場合にのみ売上が確定します。予約に失敗した場合は与信枠が解放され、請求は発生しません
- 開発者向け API:
POST /flights/book— 同じ与信枠確保後に売上を確定するフローを使用し、その後GET /flights/bookings/{id}をポーリングします。検索は検索後予約方式です(各予約後に 200 回まで無料)。予約手数料や取引手数料はありません - ブラウザーではなく、マシン向けに設計された API