关于 Letsfg
Letsfg 是面向 AI Agent 的旅行搜索与预订 MCP 服务,支持机票和酒店。其服务端引擎汇总不同卖家与航空公司的报价,并由 LetsFG 预订代理处理预订。
主要功能
- 01搜索机票和酒店
- 02比较不同卖家报价
- 03预订机票并获取航空公司 PNR
- 04按报价信息预订酒店
- 05通过 MCP 连接免费搜索
适用场景
- 01查找不同航空公司的航班
- 02比较指定日期的酒店价格
- 03通过 AI Agent 预订机票
- 04通过 Agent 预订酒店
MCP 相关
AI 客户端可连接 https://letsfg.co/mcp,搜索机票和酒店并发起预订。连接令牌支持免费搜索;预订前需登记付款方式。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://letsfg.co/developers/api/mcpclaude mcp add --transport http LetsFG https://letsfg.co/developers/api/mcp{"mcpServers":{"LetsFG":{"type":"http","url":"https://letsfg.co/developers/api/mcp"}}}在 Cursor 中打开{"servers":{"LetsFG":{"type":"http","url":"https://letsfg.co/developers/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"LetsFG":{"type":"http","url":"https://letsfg.co/developers/api/mcp"}}}{"mcpServers":{"LetsFG":{"serverUrl":"https://letsfg.co/developers/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
14| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| origin | string | 是 | 出发地的 IATA 代码(例如,'LON'、'JFK')。如果只有名称,请使用 resolve_location。 |
| destination | string | 是 | 到达地的 IATA 代码(例如,'BCN'、'LAX') |
| date_from | string | 是 | 出发日期 YYYY-MM-DD |
| return_from | string | 否 | 返程日期 YYYY-MM-DD(单程时省略) |
| adults | integer | 否 | 成人数量(默认值:1) |
| children | integer | 否 | 儿童人数(2-11 岁) |
| cabin_class | enum | 否 | M=经济舱,W=高端经济舱,C=商务舱,F=头等舱M | W | C | F |
| currency | string | 否 | 价格显示所用的 ISO 4217 货币代码——旅客本国货币(EUR、USD、GBP、BRL、PLN 等) |
| max_results | integer | 否 | 要返回的报价数量上限 |
| departure_time_from | string | 否 | 最早出发时间 HH:MM(例如,'06:00') |
| departure_time_to | string | 否 | 最晚出发时间 HH:MM(例如,'14:00') |
详细介绍
我们是 LetsFG——一个旅行者社区。
找航班或酒店,不该意味着要打开 47 个标签页,或花 3 个小时搜索。
也不该让你觉得,只要再多等一会儿,就能拿到更好的价格。
所以我们为此打造了一些东西。
总价一目了然。不追踪。不会因为你看了两次,价格就上涨。
加入社区,帮助大家找到更便宜的航班,把消息传播出去。
⭐ 为仓库点亮星标,分享给朋友 ✈️
航班和酒店。两者都能预订。
覆盖全球所有航空公司。真实价格。一次函数调用。
LetsFG 为你的 AI Agent 提供航班和酒店搜索及预订超能力。我们的服务端引擎会扫描全球,寻找最优惠的价格。搜索免费。预订是真实的:票价会从你的卡上预留,LetsFG 预订专员会购买机票,你会收到航空公司的 PNR。
同一航班的价格低 $20–$50,因为你无需承担 OTA 溢价,也不会受到 Cookie 跟踪和动态涨价的影响。
Claude: LetsFG 已加入 Claude 的连接器目录:直接在那里添加,无需粘贴 URL。其他 Agent: 将 https://letsfg.co/mcp 添加为 MCP 服务。批准连接后会打开 letsfg.co/connect:轻点一下即可,无需银行卡。首次预订时才会要求提供银行卡,并通过一笔金额为 0.00 的 Revolut 验证完成设置(不会扣款,也无需 Revolut 账户)。该令牌可用于免费搜索和预订。脚本: 将同一令牌作为 Authorization: Bearer 发送到 PFS 端点。开发者 API: 面向高频商业用途的独立付费产品;大多数 Agent 不需要它。→ 开始使用
支持者
真实价格:LetsFG 与 Google Flights 对比
我们在同一天(2026-08-05)分别使用 Google Flights 和 LetsFG 搜索了 5 条航线,出发日期均为 2026-09-16。同一家航空公司、经停次数相同——LetsFG 每次都更便宜:
| 航线 | 航空公司 | Google Flights | LetsFG | 为你省下 |
|---|---|---|---|---|
| LAX → Paris (CDG) | JetBlue,经停 1 次 | $363 | $334 | $29 |
| SFO → London (LHR) | JetBlue,经停 1 次 | $349 | $333 | $16 |
| LA → New York (JFK) | JetBlue,直飞 | $174 | $157 | $17 |
| London → Singapore (SIN) | Shenzhen Airlines,经停 1 次 | $395 | $380 | $15 |
| Chicago → Dubai (DXB) | Air Canada + Emirates,经停 2 次 | $517 | $461 | $56 |
5 条航线总共便宜 $133,这是经过验证的对比结果(2026-08-05)。无论你搜索多少次,LetsFG 返回的价格都相同,因为它不会跟踪你。
为什么会有差价? LetsFG 会比较同一航班在多个销售渠道的价格——Skyscanner、Kayak、Momondo,以及航空公司官网(Ryanair、United、Southwest、EasyJet、Spirit、Norwegian、AirAsia 等)——并显示最低价。不会跟踪 Cookie:无论你搜索多少次,返回的价格都相同。
真实酒店价格:LetsFG 与 Booking.com 对比
同一家酒店、同一房型、同样入住 2 晚、同样的免费取消政策——在同一天(2026-08-05)查询,入住日期为 2026-09-16:
| 酒店 | Booking.com | LetsFG | 为您省下 |
|---|---|---|---|
| Hotel Boss, Warsaw | $206 | $169 | $37 |
| ibis Styles Paris Gare de l'Est | $663 | $525 | $138 |
| Copthorne Tara Hotel, London Kensington | $379 | $347 | $32 |
经核实的对比显示,3 家酒店总共便宜 $207(2026-08-05):将每家酒店自己的免费取消价格,与 Booking.com 在相同日期和房型下的免费取消价格进行比较。预订时以 PLN 报价,按当日汇率换算为 USD。
为什么会有差价? LetsFG 的价格不会随需求变化,也不会因搜索者不同而上涨,并且没有忠诚度计划交叉补贴。预订时,费用会预授权到您的银行卡,而非直接扣款;只有酒店确认后才会扣款。以上对比双方均采用免费取消价格;LetsFG 也提供不可退款价格,每个报价都会注明是否可退款。
立即试用——无需安装
个人用户: 使用 letsfg.co,在浏览器中即时搜索航班:
搜索任意航线、比较实时结果,并预订您想要的航班——无需安装。
Agent / 脚本(免费服务端): 添加支付方式(不会扣款)以获取 Bearer token → 使用 POST /api/search 和 POST /api/agent-book。这是由 letsfg.co 引擎驱动的 PFS — Programmatic Flight Search。搜索免费;token 有效期较短,会自动刷新。完整指南请参阅 letsfg.co/for-agents。
准备好将其集成到自己的 Agent 中后,请继续阅读。
使用 LetsFG 的三种方式
| 路径 1 — MCP / CLI / SDK | 路径 2 — PFS(通过 letsfg.co 使用 Programmatic Flight Search) | 路径 3 — Developer API | |
|---|---|---|---|
| 最适合 | AI Agent(Claude、ChatGPT、Cursor、Windsurf)、个人使用——最简单的入门方式 | 使用 Bearer token 直接调用 API 的脚本 / Agent | 需要预付费的高流量商业集成。大多数 Agent 不应使用此方式 |
| 速度 | 8–10 s 获得首批结果 | 8–10 s 获得首批结果 | 2–5 s(发现)· 8–10 s 获得首批结果(完整搜索) |
| 搜索费用 | 免费(连接一次:点按一次,无需银行卡) | 免费(连接一次:点按一次,无需银行卡) | 搜索至预订:每次预订后有 200 次免费搜索,之后每次 $0.01 |
| 预订 | book_flight — 票价预授权到您的银行卡,Agent 购买机票,获得真实 PNR | POST /api/agent-book — 相同流程 | POST /flights/book — 相同流程,无预订费 |
| 设置 | 添加 https://letsfg.co/mcp 作为 MCP 服务并批准(点按一次,无需银行卡) | 使用同一 token,以 Authorization: Bearer 发送——见下文 | letsfg.co/developers |
| 运行位置 | 我们的服务器(SDK 在本地进行排序) | 我们的服务器 | 我们的服务器 |
-
MCP / CLI / SDK(路径 1): 在 Claude、ChatGPT、Cursor 或 Windsurf 中添加
https://letsfg.co/mcp作为 MCP 服务并批准连接。授权步骤会打开 letsfg.co/connect:点按一次,无需银行卡。首次预订时需要提供银行卡(任意银行卡,或 Revolut Pay / Google Pay),通过 0.00 Revolut 设置流程完成:不会扣款,无需 Revolut 账户,银行卡信息会发送给 Revolut,绝不会发送给 LetsFG。获取的 token 可免费搜索;添加银行卡后,同一 token 也可用于预订。Python 和 JS SDK 会从LETSFG_BEARER_TOKEN或~/.letsfg/config.json读取该 token,并在本地应用开源排序算法。(letsfg auth会在终端中运行同一连接流程:将自身注册为 OAuth 客户端,在浏览器中打开 letsfg.co/connect 以供用户批准,并保存 token。) -
PFS — 程序化航班搜索(路径 2): 适用于直接调用 API 的脚本和 Agent。letsfg.co 默认仅供人类使用(Cloudflare Turnstile + 机器人防护),因此,连接流程提供的令牌是唯一可供程序化访问的方式。每次请求都要携带该令牌:
- 搜索:使用
Authorization: Bearer <token>调用POST https://letsfg.co/api/search→{ search_id } - 轮询:调用
GET https://letsfg.co/api/results/<search_id>(不会计入速率限制) - 预订:调用
POST https://letsfg.co/api/agent-book→ 在数秒内获得{ booking_ref } - 等待:每隔 20–30 s 使用
{ booking_ref }调用POST https://letsfg.co/api/agent-book/status,直到状态变为completed(PNR)、failed(已释放预订,不会扣款)或needs_attention
POST /api/agent-access/request仍会以 JSON 返回402、add_card_url和这些步骤,因此从该端点开始的 Agent 最终会进入同一流程。MPP 通道(使用钱包,无需银行卡)保持不变:响应WWW-Authenticate: Payment挑战(一次性支付 $0.01),并使用Authorization: Payment验证。Stripesetup_url/ SetupIntent 通道已于 2026-09-02 停用,发放的所有令牌也已撤销;请前往 letsfg.co/connect 重新连接。完整指南和响应架构:letsfg.co/for-agents。 - 搜索:使用
-
开发者 API(路径 3): 在 letsfg.co/developers 提供服务器端搜索和预订。先搜索、后预订(每次预订后可免费搜索 200 次,之后每次 $0.01)、通过已连接的 Revolut 付款方式进行实际预订、完整的自然语言查询解析、可在一次调用中查询 20 个目的地的
/discover端点(2–5 s)、酒店,以及免费的沙盒/sandbox/flights/*,可端到端模拟预订(状态、问题、失败和实际耗时)。完整文档:letsfg.co/developers/api/docs。
免费服务器端搜索: 使用路径 1 或 PFS——在 letsfg.co/connect 连接一次(一键操作,无需银行卡),即可在我们的服务器上免费搜索。无需 Playwright,除 SDK 外也无需在本地安装其他内容。
在自有产品中进行预订: 使用开发者 API(路径 3)——先搜索、后预订,调用POST /flights/book,且不收取预订费或交易费。酒店服务既支持连接流程提供的令牌,也支持开发者 API 密钥。
定价
| 使用方式 | 搜索 | 预订航班 | 预订酒店 | 运行位置? |
|---|---|---|---|---|
| MCP Server | ✅ 免费(在 letsfg.co/connect 连接一次,无需银行卡) | 价格会被预授权,在生成真实 PNR 后扣款。无单独费用 | 价格会被预授权,在酒店确认后扣款。无预订费 | 我们的服务器 |
| CLI / Python SDK / npm | ✅ 免费(使用同一令牌) | 同上 | 同上 | 我们的服务器 |
| PFS(通过 letsfg.co 调用原始 API) | ✅ 免费(使用同一令牌,或通过 MPP 一次性支付 $0.01) | 同上 | 价格会被预授权,在酒店确认后扣款。无预订费 | 我们的服务器 |
| Developer API | 每次预订可免费搜索 200 次,之后每次 $0.01 | 价格会被预授权,在生成真实 PNR 后扣款。无预订费、无交易费 | 价格会被预授权,在酒店确认后扣款。无预订费 | 我们的服务器 |
MCP / CLI / SDK / PFS = 搜索免费,可真实预订,无单独费用。 连接一次(点一下,无需银行卡),搜索就免费。首次预订时才需要提供银行卡,通过 Revolut 进行 0.00 的设置(不会扣款)。无需积分,也无需解锁。预订流程与网站结账完全一致:book_flight / POST /api/agent-book 会预授权你看到的价格,LetsFG 预订 Agent 会向卖家购买机票,只有在生成真实航空公司 PNR 后才会扣款。如果预订失败,会解除预授权,不会扣款。你看到的价格就是你支付的价格;预订时不会额外收费。
酒店 = 按报价价格预授权,之后扣款,所有渠道均如此。 预订时会在你的银行卡上预授权全额,LetsFG 会预订酒店并付款,只有在酒店确认后才会扣款;预订失败则会解除预授权。没有预订费、押金或付款链接。所有房价类型均可预订,每条报价都会注明是否可退款以及退款截止时间。详见下文的酒店。
Developer API = 商业用途,搜索转预订。 letsfg.co/developers 会直接预订航班——POST /flights/book 会在你绑定的 Revolut 付款方式上预授权票价,LetsFG 预订 Agent 会购买机票,流程与其他渠道完全相同。搜索不会按调用次数计费:每次预订后可免费搜索 200 次,预订后计数器会重置。超过后,可购买 500 次搜索的套餐,价格为 $5.00(每次 $0.01)。此外没有预订费,也没有交易费:搜索返回的金额就是实际扣款金额。最低充值金额:$5。
月度按次搜索套餐($0.50 / $0.20 / $0.10)已于 2026-09-08 停用,Stripe 也同时停用。付款通过 Revolut 处理:
POST /agents/connect-payment会返回一个一次性链接,用于保存银行卡;连接时不会扣款。
💡 认识经常旅行的人? 了解 LetsFG 的人越多,我们覆盖的航空公司就越多——所有人的体验也会更好。⭐ Star · 分享给朋友
开发者为何给这个仓库点星
| Google Flights / Expedia | LetsFG | |
|---|---|---|
| 价格 | 因网站和搜索而异 | 重复搜索时价格稳定。经核实,截至 2026-08-05,5 条航线合计便宜 $133。 |
| 覆盖范围 | 单个网站的来源 | 全球所有航空公司——OTA、廉价航空公司、全服务航空公司 |
| 速度 | 30 秒以上(页面加载、广告、重定向) | CLI/PFS:8–10 秒出首批结果 · API discover:2–5 秒 |
| 重复搜索会涨价吗? | 会 | 绝不会 |
| 能在 AI Agent 中使用吗? | 无 API | MCP · CLI · PFS(连接一次,免费)· Developer API(预付费) |
| 预订 | 重定向到 OTA 结账页面 | 真实航空公司 PNR,电子机票发送至收件箱 |
| 舱位等级筛选 | 无 | 经济舱、高级经济舱、商务舱、头等舱 |
| 使用成本 | 因网站而异 | CLI/PFS:搜索免费;无预订费、无交易费。Developer API:每次预订后可免费搜索 200 次,之后每次搜索 $0.01;无预订费、无交易费。 |
开始使用
所有服务都运行在我们的服务器上。一次连接即可使用 MCP、各类 SDK 和原始 API。
🔌 MCP — 连接一次,即可搜索和预订
添加远程服务并批准连接。授权步骤会打开 letsfg.co/connect:点一下即可,无需银行卡,随后就能使用。首次预订时才会要求提供银行卡(设置费用为 0.00,不会扣款)。
# Claude Code
claude mcp add --transport http letsfg https://letsfg.co/mcp
// Cursor (~/.cursor/mcp.json) — Windsurf uses "serverUrl" instead of "url"
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } }
Claude:LetsFG 已收录在 Claude 官方连接器目录中。打开 claude.ai/directory/letsfg,添加并批准连接。无需粘贴 URL。添加后,也可以在 Claude Desktop 和 Claude 手机应用中使用。
ChatGPT:在浏览器中前往 chatgpt.com 添加(ChatGPT 手机应用无法添加):Plugins > Add > Add custom MCP server,URL 为 https://letsfg.co/mcp,身份验证选择 OAuth,勾选 I understand,然后选择 Create as a plugin。添加后,也可以在 ChatGPT 手机应用中使用。
然后在聊天中输入:“帮我找 6 月 15 日从伦敦到巴塞罗那最便宜的航班并预订”。search_flights 会返回报价;book_flight 会用你的银行卡锁定票价并启动 LetsFG 预订 Agent;get_flight_booking 会在订单生成后返回 PNR(需 4–11 分钟)。
🖥️ 命令行 / SDK — 使用同一令牌,在本地运行排名
pip install letsfg
export LETSFG_BEARER_TOKEN=<token from the connect flow>
letsfg search LHR BCN 2026-06-15
letsfg search LHR JFK 2026-06-15 --cabin C # cabin class: M economy, W premium, C business, F first
SDK 会从 LETSFG_BEARER_TOKEN 或 ~/.letsfg/config.json 读取令牌。letsfg auth 会自行执行连接流程:注册为 OAuth 客户端,打开 https://letsfg.co/connect 供用户批准,并将令牌写入 ~/.letsfg/config.json。添加 --no-browser 可打印 URL,而不打开浏览器。
🔌 PFS — 程序化航班搜索(免费,服务端运行)
通过任意脚本在我们的服务端运行 LetsFG 的完整搜索流程。访问需要连接流程中获取的令牌: letsfg.co 仅供人工访问(使用 Cloudflare Turnstile),因此该令牌是唯一的程序化访问方式。只需点一下即可连接,无需银行卡;首次预订时才会要求提供银行卡。
# 1. Search with the token
curl -X POST https://letsfg.co/api/search \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"origin":"LHR","destination":"BCN","date_from":"2026-06-15"}'
# → {"search_id":"ws_abc123","status":"searching"}
# 2. Poll until done (keep going while split_ticket_pending is true)
curl https://letsfg.co/api/results/ws_abc123 -H "Authorization: Bearer <token>"
# 3. Book — the fare is HELD on the card, a LetsFG agent buys the ticket
curl -X POST https://letsfg.co/api/agent-book \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{"search_id":"ws_abc123","offer_id":"wo_abc123","contact_email":"[email protected]",
"passenger":{"given_name":"Ada","family_name":"Lovelace","born_on":"1990-04-01","gender":"f",
"nationality":"GB","phone_number":"+447700900000","phone_country":"GB",
"address_line1":"1 Analytical Way","address_city":"London","address_postal":"N1 9GU","address_country":"GB"}}'
# → {"booking_ref":"eyJ..."} within seconds
# 4. Wait for the PNR (every 20–30 s; a booking takes 4–11 minutes)
curl -X POST https://letsfg.co/api/agent-book/status \
-H "Authorization: Bearer <token>" -H "Content-Type: application/json" \
-d '{"booking_ref":"eyJ..."}'
# → {"state":"completed","pnr":"ABC123","charged_amount":93,"currency":"EUR"}
failed 表示已释放预留,且未扣款;needs_attention 表示 LetsFG 的工作人员正在核查,请勿再次预订。缺少乘客信息时会返回 missing_fields,且不会扣款。未提供银行卡时,端点会返回 payment_method_required 和 add_card_url。完整指南和响应架构:letsfg.co/for-agents。
⚡ 开发者 API — 服务端搜索、预订和酒店
面向高流量商业集成的独立产品;大多数 Agent 不应使用。搜索后可直接预订,结果几秒内返回,并可通过 POST /flights/book 实际预订——此外还有 /discover(一次调用可查询 20 个目的地)、异步轮询、自然语言查询解析、酒店,以及可端到端完成预订的免费沙盒(响应、状态、问题和耗时均与生产环境一致,不涉及真实资金)——先在这里构建你的预订流程。
# Register, then search with your API key
curl -X POST https://letsfg.co/developers/api/v1/agents/register \
-H "Content-Type: application/json" \
-d '{"agent_name":"my-agent","email":"[email protected]"}'
curl -X POST https://letsfg.co/developers/api/v1/flights/search \
-H "X-API-Key: letsfg_..." \
-H "Content-Type: application/json" \
-d '{"origin":"LHR","destination":"BCN","date_from":"2026-06-15"}'
定价:每次预订后可免费搜索 200 次,之后每 500 次收费 $5.00(每次 $0.01)。无预订费,无交易费。最低充值金额为 $5。可先在沙盒中免费测试,包括预订。完整文档:letsfg.co/developers/api/docs。
完整搜索 → 预订流程(MCP / PFS Agent 路径,无解锁步骤)
search_flights LON → BCN, 2026-04-01, return 2026-04-08
get_flight_results (while more offers are still landing)
book_flight search_id + offer_id + one traveller's real details + contact_email
→ booking_ref in seconds; price HELD on the connected card
get_flight_booking every 20–30 s → completed (PNR, charged_amount) | failed (hold released) | needs_attention
通过原始 HTTP 调用时,相同的四个步骤是 POST /api/search、GET /api/results/<id>、POST /api/agent-book、POST /api/agent-book/status。
letsfg unlock 已于 2026-09-08 停用,其路由会返回 410 Gone。
两种方式都不需要解锁步骤:预订会锁定票价,只有获得真实 PNR 后才会扣款;这正是此前设置解锁步骤的目的。请参阅
CLI 命令。
适用于你的 Agent 运行的所有环境
MCP 服务(Claude / ChatGPT / Cursor / Windsurf / OpenClaw)
使用托管服务。它会替你携带令牌,而 book_flight 会实际预订机票。
{
"mcpServers": {
"letsfg": {
"url": "https://letsfg.co/mcp"
}
}
}
当客户端询问时,请批准连接;同意步骤会打开 letsfg.co/connect:轻点一下即可,无需银行卡。首次预订时才会要求提供银行卡(设置费用为 0.00,不会扣款)。工具:search_flights、get_flight_results、book_flight、get_flight_booking,以及酒店工具。
如果提供令牌 LETSFG_BEARER_TOKEN,stdio 包(npx -y letsfg-mcp)也能正常工作;它的 authenticate 工具会返回当前的连接说明。
可选:改用 Developer API(先搜索再预订、POST /flights/book、酒店)
{
"mcpServers": {
"letsfg": {
"command": "npx",
"args": ["-y", "letsfg-mcp"],
"env": {
"LETSFG_API_KEY": "letsfg_your_api_key"
}
}
}
}
这是一个面向高流量商业用途的独立付费产品——大多数 Agent 应使用上面的免费连接流程,而不必选择此方案。刻意设置此方案的用户可以在 letsfg.co/developers 获取密钥。
5 分钟快速入门:Claude · Cursor · Windsurf
Python SDK
from letsfg import LetsFG
bt = LetsFG() # reads LETSFG_API_KEY from env
flights = bt.search("LHR", "JFK", "2026-04-15")
print(f"{flights.total_results} offers, cheapest: {flights.cheapest.summary()}")
JavaScript SDK
import { LetsFG } from 'letsfg';
const bt = new LetsFG({ apiKey: 'letsfg_...' });
const flights = await bt.search('LHR', 'JFK', '2026-04-15');
console.log(`${flights.totalResults} offers`);
Python SDK(云端搜索)
from letsfg.local import search_local
# Reads LETSFG_BEARER_TOKEN env var or ~/.letsfg/config.json (the token from the connect flow)
result = await search_local("GDN", "BCN", "2026-06-15")
for offer in result.offers[:5]:
print(f"{offer.airlines[0]}: {offer.currency} {offer.price}")
⇄ 拆分机票——两张机票,一趟旅程
将长途行程作为一趟旅程搜索,返回的会是一张全程票,因为所有人都在转售同一张机票。通过枢纽机场将行程拆成两段独立航程搜索,每段航程都能从该航段最便宜的选项中预订——无论是哪家航空公司、哪家销售商。通常这会选中两家不同的航空公司(短途航段通常是廉价航空公司,长途航段则是另一家航空公司),但唯一的规则就是“每段航程都选最便宜的”。没有人会把这种组合当作一张机票出售,因此也没人会为它报价——这正是它更便宜的原因。
LetsFG 会为你生成这样的行程,并与全程票一起返回。拆分机票优惠会明确标记,绝不会伪装:
| 字段 | 拆分机票优惠中的值 |
|---|---|
split_ticket | "true" |
combo_type | "virtual_interlining" |
self_transfer | "unprotected" |
for o in offers:
if o.get("split_ticket") == "true":
print(o["price"], "— two separate tickets, self-transfer not protected")
在展示价格前,请先查看 self_transfer。 unprotected 表示两张机票互不关联:如果第一趟航班晚点导致错过转机,第二家航空公司不承担任何责任——不会重新预订、不会退款,也不提供照料义务。这就是你为节省费用而接受的条件,旅客必须知晓。我们只会在转机时间确实充裕时生成拆分行程,并会在优惠中说明这一点——但如果 Agent 只转述价格却不说明条件,就是在误导旅客。
此探测有触发门槛。 两次额外的连接器扇出会产生实际费用,因此只有在全程票足够贵、行程足够长,且市场上存在可拆分行程的地点时,才会尝试拆分。大多数搜索不会触发此功能;即使触发,也不一定能找到更省钱的方案。
结果会在 completed 后出现。 请参阅轮询:completed 并非终点。
运行位置。 letsfg.co 及其背后的 Agent 通道——包括 CLI、Python 和 JS SDK,以及 MCP 服务。付费 Developer API 由不同的后端提供;它会返回 self_transfer,但拆分机票优惠不属于其服务范围。
实际节省金额
| 航线 | 最便宜的单程票 | 拆分——两张票 | 节省金额 | 经由 | 两家航空公司 | 中转时间 |
|---|---|---|---|---|---|---|
| 斯图加特 → 上海 | $552 | $461 | $91 (16%) | 布达佩斯 | Wizz Air + Qatar Airways | 6 h |
| 卡托维兹 → 迪拜 | $283 | $216 | $67 (24%) | 伊斯坦布尔 | Wizz Air + Pegasus | 15 h |
| 重庆 → 格但斯克 | $429 | $387 | $42 (10%) | 斯德哥尔摩 | China Eastern + Ryanair | 10 h |
| 维尔纽斯 → 曼谷 | $370 | $337 | $33 (9%) | 雅典 | Ryanair + Air Arabia | 5 h |
| 上海 → 维尔纽斯 | $406 | $377 | $29 (7%) | 伦敦 | Shenzhen Airlines + Wizz Air | 12 h |
数据于 2026 年 8 月通过实时搜索测得(1 名成人,单程,约提前 2 个月)。每个拆分行程都包含两张独立机票(此处为两家不同航空公司的机票),且自行中转没有保障——如果第一趟航班晚点,第二家航空公司没有义务为你负责。价格不断变化;这些结果无法完全复现。在搜索的 26 条长途航线上,有 5 条的拆分行程比最便宜的单程票更便宜——这种优势出现在没有廉价长途直飞航班的二线城市。使用 tools/split-comparison.py 重新生成。
以上数据来自真实搜索,并且可以复现:脚本会运行任何人都能运行的同一项公开搜索,将最便宜的拆分行程与同一结果集中的最便宜单程票进行比较,并将原始报价写入
split-comparison.json,以便核查任意一行。没有产生拆分行程的航线也会一并报告,而不会悄悄略过——大多数搜索根本不会触发拆分查询,如果表格对此避而不谈,就会歪曲这种情况的发生频率。
✦ 搜索结果中的 Starlink Wi-Fi
报价会以两个准确的等级说明航班是否配备 Starlink。确定的结论(confirmed_all)表示航空公司已为该机型的所有飞机完成安装。保留条件的结论(likely_all)表示该机型的部署确有其事,但尚未完成——截至 2026 年 8 月,United 机队的覆盖率约为 29%——因此这只是一个参考信号,而非承诺。没有该字段表示没有相关信息,并不代表没有 Wi-Fi。
for o in offers:
if o.get("starlink") == "confirmed_all":
print(f"{o['owner_airline']} {o['price']} — Starlink on every leg")
完整语义见:docs/api-search.md。
🏨 酒店——全新上线,现已开放预订
你的 Agent 现在可以预订酒店,而不只是航班。使用相同的凭证和已登记的银行卡。
预订酒店前,请先更新 SDK。 酒店预订需要 letsfg 2026.5.101 或更高版本(Python)、 letsfg 2026.5.74 或更高版本(JavaScript/TypeScript),或 letsfg-mcp 2026.5.77 或更高版本。更早的版本会发送已于 2026-09-11 弃用的预订费用字段(
expected_balance,没有expected_cost),API 会拒绝它们发起的所有酒店预订。使用pip install -U letsfg、npm install letsfg@latest或npx -y letsfg-mcp@latest更新。托管 MCPhttps://letsfg.co/mcp无需更新。
from letsfg import LetsFG
lfg = LetsFG() # reads LETSFG_API_KEY — the SDK's hotel methods take a Developer API key
city = lfg.hotel_destinations("Warsaw")[0]
stays = lfg.search_hotels(
city_id=city["Id"], city_name=city["Name"],
check_in="2026-11-10", check_out="2026-11-12", adults=2,
)
hotel = stays["hotels"][0]
offer = hotel["offers"][0]
print(hotel["name"], offer["price"], offer["currency"],
"refundable" if offer["refundable"] else "non-refundable")
booking = lfg.book_hotel_and_wait(
session_id=offer["session_id"],
hotel_code=hotel["hotel_code"],
combination_id_v2=offer["combination_id_v2"],
expected_price=offer["price"],
expected_cost=offer["expected_cost"],
currency=offer["currency"],
fx_rate=offer["fx_rate"],
city_id=city["Id"], city_name=city["Name"],
check_in="2026-11-10", check_out="2026-11-12",
guests=[{"title": "Mr", "first_name": "Jan", "last_name": "Kowalski"}, # one entry per guest:
{"title": "Ms", "first_name": "Anna", "last_name": "Kowalska"}], # adults=2 -> two names
email="[email protected]", phone="512345678",
)
print(booking["status"], booking.get("confirmation"), booking.get("total_price"), booking.get("currency"))
如何付款
预订时冻结款项,酒店确认后扣款。 预订时会在你的银行卡上冻结全部
price,但不会立即扣款。LetsFG 会自行预订房间并向供应商付款;只有酒店确认后才会扣除冻结款项。如果预订因任何原因失败(房价已失效、价格变动或供应商拒绝),冻结款项会解除,不会产生任何扣款。没有预订费、押金或付款链接。
price 是包含所有费用的总价,以你搜索时使用的 currency 计价(默认 USD)。
在 free_cancellation_until 之前取消可全额退款的预订,即可获得全额退款。若取消会产生费用,端点会拒绝取消;酒店自身的阶梯式取消政策会列在预订的 terms 中,因此你可以提前查看费用。
构建前值得了解的事项
- 搜索酒店无需银行卡,预订则需要。 搜索酒店会在供应商处开启一个真实会话,因此未绑定银行卡的账户每天可搜索酒店的次数有限。预订前会先要求提供银行卡,之后才会保留房间:
book_hotel会返回添加银行卡的链接,和book_flight一样。授权预订航班的银行卡也可授权预订酒店——无需单独注册酒店服务。 - 每种房价类型都可能是可售、可退款或不可退款的。 每个报价都包含
refundable和free_cancellation_until;预订不可退款房价前,请向住客展示这些信息。 - 预订是异步的。
book_hotel返回的是booking_job_id,而非预订结果——实际处理需要几分钟。轮询hotel_booking(job_id),直到status为succeeded、failed或attention;也可以调用book_hotel_and_wait。attention表示 LetsFG 的工作人员正在向供应商确认结果:房间会继续保留,不会扣款,而且你不得再次预订。 - 原样传回报价。 按报价返回的内容原样发送
expected_price、expected_cost、currency和fx_rate;任何不一致都会在房间保留之前以price_mismatch拒绝。 - 填写每位住客的姓名。
guests需要为房间内每个人提供一项,包括儿童:先填写成人,再按child_ages中的顺序填写儿童。姓名数量少于搜索时的人数会导致预订失败,且请求不会发送到酒店,房间保留也会被取消。 - 任务运行期间不要重新预订。 请轮询任务。使用相同的
idempotency_key重试时,会返回现有任务,而不会重复预订。 - 无论结果如何,我们都会通知住客。 住客会收到确认邮件;如果预订失败或需要核实,也会收到相应消息。
price是住客支付的金额。expected_cost是供应商给出的金额,仅用于传回——切勿将其作为报价。
JavaScript
import { LetsFG } from 'letsfg';
const lfg = new LetsFG({ apiKey: process.env.LETSFG_API_KEY });
const [city] = await lfg.hotelDestinations('Warsaw');
const stays = await lfg.searchHotels({
cityId: city.Id, cityName: city.Name,
checkIn: '2026-11-10', checkOut: '2026-11-12', adults: 2,
});
const booking = await lfg.bookHotelAndWait({ /* ...offer + guest details... */ });
console.log(booking.status, booking.confirmation, booking.total_price, booking.currency);
MCP
新增五个工具,按调用顺序排列:resolve_hotel_city →
search_hotels → book_hotel → get_hotel_booking → cancel_hotel_booking。
🖥️ Omarchy 桌面插件
在 Omarchy 栏中搜索全球所有航空公司。输入两个机场代码和日期,按下 Search,再点击报价即可打开。面板位于此代码库中——根目录下的 manifest.json、BarWidget.qml、Panel.qml 和 Model.js——它使用与 CLI 和 MCP 服务相同的引擎,并按照 sdk/js/src/ranking.ts 中同一开源排名算法进行排序。

安装
omarchy plugin add https://github.com/LetsFG/LetsFG.git --enable
然后在 Omarchy 栏设置中,将 LetsFG Flights 添加到栏的某个分区。面板会从 ~/.letsfg/config.json 读取你的 LetsFG 令牌(由 letsfg auth 写入),并自行续期;你也可以通过面板连接 letsfg.co/connect——轻点一下,无需银行卡。请参阅
OMARCHY-PLUGIN.md。
移除
omarchy plugin remove io.github.letsfg.flights
这只会移除插件。令牌归你所有——如果想将其删除,请自行删除
~/.letsfg/config.json。
此插件不包含任何 API 密钥。 它使用你创建且可撤销的令牌进行身份验证,不会索要银行卡信息,也不会自行启动搜索——没有后台轮询、价格监控或刷新计时器。它可能联系的所有主机、读取或写入的所有文件,以及它发送的匿名安装 ID(用于帮助我们了解是否有人在使用插件),都在 OMARCHY-PLUGIN.md 中完整说明。
需要 Omarchy Quattro shell。与此代码库的其余部分一样,采用 MIT 许可证。与 Omarchy 或 37signals 无关联,也未获其赞助或认可。
安装
| 软件包 | 命令 | 可获得的内容 |
|---|---|---|
| Remote MCP | https://letsfg.co/mcp | 无需安装。在 letsfg.co/connect 批准连接(点按一次,无需银行卡),即可搜索和预订 |
| Python SDK + CLI | pip install letsfg | SDK + CLI(通过连接流程获取令牌,并存储在 LETSFG_BEARER_TOKEN 中) |
| MCP Server (stdio) | npx letsfg-mcp | 为不支持 Remote MCP 的客户端提供本地服务;需要 LETSFG_BEARER_TOKEN |
| JS/TS SDK | npm install -g letsfg | SDK + CLI + 开源排序引擎 |
| Agent Skill | npx skills add LetsFG/LetsFG | 为任意 AI Agent 安装航班搜索技能(skills.sh) |
| Smithery | smithery.ai/servers/letsfg | 一键安装 MCP |
| Omarchy 插件 | omarchy plugin add https://github.com/LetsFG/LetsFG.git --enable | 在 Omarchy 栏中搜索航班(详情) |
CLI 命令
| 命令 | 说明 |
|---|---|
letsfg auth | 在 letsfg.co/connect 连接(点按一次,无需银行卡)并存储令牌(自动注册,采用 PKCE + loopback 重定向,并打开浏览器)。--no-browser 会打印 URL |
letsfg search <origin> <dest> <date> | 搜索航班(使用连接流程获取的令牌即可免费使用) |
letsfg register | [仅限开发者 API] 为付费预付额度产品注册账户——不属于 Agent 流程 |
letsfg connect-payment | [仅限开发者 API] 打印一次性链接,用于将银行卡关联到付费账户;不会扣款。letsfg setup-payment 仍作为别名保留——它曾调用的 Stripe 路由已于 2026-09-08 停用,并返回 410 Gone |
letsfg recover --email <email> | 通过电子邮件找回丢失的 API 密钥 |
letsfg locations <query> | 将城市/机场解析为 IATA 代码 |
letsfg unlock <offer_id> | 已于 2026-09-08 停用——该路由返回 410 Gone。两种流程都无需解锁步骤;请使用 letsfg book |
letsfg book <offer_id> | 预订航班:在已关联的银行卡上冻结票价,由 LetsFG Agent 购买机票,并返回用于查询状态的 booking_ref |
letsfg me | 查看个人资料和使用统计 |
所有命令都接受 --json 以输出结构化数据,并接受 --api-key 以覆盖环境变量。
工作原理
CLI / SDK / MCP(免费,由云端提供支持)
Connect the MCP (once, one tap at letsfg.co/connect) → token → Search (free) → Book (card asked for at the first booking; hold → agent → PNR)
- 身份验证 — 将
https://letsfg.co/mcp添加为 MCP 服务并批准连接。OAuth 授权步骤会打开 letsfg.co/connect:点按一次,无需银行卡。首次预订时才会要求提供银行卡,并进行 0.00 Revolut 设置。连接不会产生任何扣款。SDK 会从LETSFG_BEARER_TOKEN或~/.letsfg/config.json中读取令牌。 - 搜索 —
letsfg search LHR BCN 2026-06-15会调用POST https://letsfg.co/api/search,轮询直至完成(首批结果需 8–10 秒),并在本地应用开源排序算法。 - 预订 —
POST /api/agent-book会冻结银行卡上显示的价格并启动 LetsFG 预订 Agent;POST /api/agent-book/status会在 4–11 分钟后返回带有 PNR 的completed,或者返回failed并解除冻结。预订时不会收取额外费用。
轮询:completed 并不代表结束
搜索通常需要 8–10 秒才会返回首批结果。立即轮询 GET /api/results/<search_id>,之后每 2 秒轮询一次——如果先休眠再进入循环,那么对于本来比休眠时间还快的搜索,就会被强行拖慢。
当 status 不再是 searching 时,连接器扇出已完成,但报价集合可能仍在增加。分票探测会在扇出完成后派发,其结果随后才会合并,因此,搜索中最便宜的行程往往在状态变为终态时还不存在。响应会说明这一点:
| 标志 | 值为 true 时的含义 |
|---|---|
split_ticket_pending | 分票探测仍在运行 |
gf_enrich_pending | Google Flights 补充结果尚未合并 |
只要其中任一标志为 true,就继续轮询,并限制等待时间——标志若一直不清除,不应让你的 Agent 挂起。达到等待上限时,使用已返回的所有结果。
Python 和 JS SDK 以及 MCP 服务已实现此逻辑,等待上限为 90 秒——这与服务用于判断结果已稳定的时间窗口相同。
因此,触发分票探测的搜索可能明显超过“8–10 秒返回首批结果”的快速路径;你等待的是分票报价。若你更希望快速得到结果,可设置 LETSFG_WAIT_FOR_SPLIT=0。
大多数搜索都不会触发探测,因此首次轮询时这两个标志通常都已为 false,不会增加耗时。
PFS——原始 API(与 CLI 相同,不含封装)
Connected at letsfg.co/connect -> Bearer token -> POST /api/search -> poll GET /api/results/<id> -> POST /api/agent-book -> poll POST /api/agent-book/status
- 获取 Bearer 令牌——通过 MCP OAuth 流程连接;授权步骤位于 letsfg.co/connect(点按一次,无需银行卡;首次预订时会要求提供银行卡或使用 Revolut Pay,金额为 0.00,不会扣款)。
POST /api/agent-access/request会以402响应返回add_card_url和操作步骤。MPP 钱包通道(一次性支付 $0.01)通过POST /api/agent-access/verify验证,并使用Authorization: Payment。 - 搜索——向
https://letsfg.co/api/search发送POST请求,并携带Authorization: Bearer <token>。返回{ search_id }。立即轮询GET /api/results/<search_id>,之后每 2 秒轮询一次,直到status不再是searching。然后,只要split_ticket_pending或gf_enrich_pending为true,就继续轮询——分票报价会在状态变为终态后合并。 - 预订——
POST /api/agent-book→booking_ref;轮询POST /api/agent-book/status,直到状态为completed(PNR)或failed(已释放预留,不会扣款)。
开发者 API——服务端搜索与预订
Register → Connect a Revolut method → Search (200 free per booking) → POST /flights/book → poll to a PNR
- 发现——向
POST /flights/discover发送最多 20 个目的地,获取按价格从低到高排序的参考价格。耗费 1 个点数,耗时 2–5 秒。用于确定选项排序,再决定是否执行完整搜索。 - 完整搜索——调用
POST /flights/search(阻塞)或/flights/search/async(非阻塞并轮询)。耗费 1 个点数,通常需要 8–10 秒返回首批结果。 - 预订——每个报价都包含航空公司的直接
booking_url。无需支付 LetsFG 费用,也无需经过结账步骤。
虚拟联程
服务端引擎会组合不同航空公司的单程票价,构建跨航司往返行程。与单独在任一家航空公司预订往返行程相比,瑞安航空去程 + Wizz Air 返程可节省 30–50%。
全城机场扩展
搜索城市代码时,LetsFG 会自动搜索该城市的所有机场。LON 会扩展为 LHR、LGW、STN、LTN、SEN、LCY。NYC 会扩展为 JFK、EWR、LGA。全球 25 个以上主要城市均支持此功能。
架构
CLI / SDK / MCP / PFS
CLI / SDK / MCP / AI Agent
│ Connected at letsfg.co/connect (one tap) -> Bearer token
▼
POST letsfg.co/api/search (bot-protected, token required)
│
▼
letsfg.co server-side search engine
│
▼
GET /api/results/<search_id> (poll every 2 s; keep going while split_ticket_pending)
│
▼
Ranking applied locally (sdk/js/src/ranking.ts, open-source)
│
▼
Results + booking via POST /api/agent-book (hold on card -> LetsFG agent -> PNR)
开发者 API
Product / Team / Agent
│ API key + a connected Revolut method
▼
letsfg.co/developers/api/v1
├─ /flights/discover (indicative prices, 20 dest, 2–5 s)
├─ /flights/search (full search, 8–10 s to first results)
├─ /flights/search/async (non-blocking + poll)
├─ /flights/parse-query (Gemini NL parsing, free)
├─ /flights/book (holds the fare on the connected method)
├─ /flights/bookings/{id} (poll to a real PNR, 4–11 min)
└─ /sandbox/flights/* (free: search + simulated booking, same schema)
│
▼
Real airline PNR - the hold is captured only once it exists
涵盖的航空公司
| 地区 | 航空公司 |
|---|---|
| 欧洲 | Ryanair, Wizz Air, EasyJet, Norwegian, Vueling, Eurowings, Transavia, Pegasus, Turkish Airlines, Condor, SunExpress, Volotea, Smartwings, Jet2, LOT Polish Airlines, Finnair, SAS, Aegean, Aer Lingus, ITA Airways, TAP Portugal, Icelandair, PLAY |
| 中东和非洲 | Emirates, Etihad, Qatar Airways, flydubai, Air Arabia, flynas, Salam Air, Air Peace, FlySafair, EgyptAir, Ethiopian Airlines, Kenya Airways, Royal Air Maroc, South African Airways |
| 亚太地区 | AirAsia, AirAsia X, IndiGo, SpiceJet, Akasa Air, Air India, Air India Express, Alliance Air, Star Air, EaseMyTrip OTA, VietJet, Cebu Pacific, Scoot, Jetstar, Peach, Spring Airlines, Lucky Air, 9 Air, Nok Air, Batik Air, Jeju Air, T'way Air, ZIPAIR, Skymark, H.I.S. Travel OTA, Singapore Airlines, Cathay Pacific, Malaysian Airlines, Thai Airways, Korean Air, ANA, JAL, Qantas, Virgin Australia, Bangkok Airways, Air New Zealand, Garuda Indonesia, Philippine Airlines, US-Bangla, Biman Bangladesh |
| 美洲 | Southwest, JetBlue, Frontier, Spirit, Allegiant, Avelo, Breeze, Sun Country, Flair, Porter, WestJet, Volaris, VivaAerobus, GOL, Azul, LATAM, JetSmart, Flybondi, Arajet, Wingo, Sky Airline, Copa, Avianca |
| 大洋洲 | Rex, Bonza, Link Airways, Air Vanuatu, Fiji Airways |
Star 历史
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。