mcpField
T
trip-planner

trip-planner

github.com/foogunlana生产力138 次安装23 周前更新
代码仓库

关于 trip-planner

面向希望用自然语言规划航班的人群。它会为缺失信息填入并展示假设,搜索航班选项并提供预订链接,也支持多城市行程。

主要功能

  1. 01解析自然语言行程需求
  2. 02展示假设并支持修正
  3. 03搜索并推荐航班
  4. 04按性价比、最低价和最快分类
  5. 05处理多城市行程

适用场景

  1. 01仅提供目的地时查找航班
  2. 02按日期和预算比较选项
  3. 03拆分规划多城市航段
  4. 04将偏好保存到配置文件

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/foogunlana/skills --skill trip-planner

安装后在 Claude Code 中输入/trip-planner确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/templates/
trip-recommendation.md
references/
branding.md
config-guide.md
future.md

详细介绍

旅行规划器

一项可将自然语言转化为航班推荐的技能——优先采用假设,而非提问。

先做假设。展示推理过程。预订航班。

核心设计原则

凡事都做假设,并展示一切。 用户只需纠正错误之处,而不用补充缺失的信息。唯一的硬性要求是目的地——其他所有内容都有合理的默认值。

两种流程

条件流程
不存在 .claude/trip-planner.md引导流程 — 立即搜索,然后快速设置
存在 .claude/trip-planner.md常规流程 — 快速:解析、假设、搜索、推荐

引导流程(仅首次运行)

检测: 检查 .claude/trip-planner.md 是否存在。如果没有配置文件,则运行此流程。否则跳转至常规流程。

目标: 立即提供航班推荐,然后校准偏好。

步骤 1:欢迎(如果用户已描述行程,则跳过)

读取 references/branding.md 并逐字显示:

  1. 标志
  2. 出发地引言
  3. 工作流图
  4. 核心概念

然后检查:用户是否已在消息中描述行程?

  • 是 → 使用用户提供的信息直接跳至步骤 2
  • 否 → 显示:
Where are you headed? Just describe your trip naturally:

"I need to fly to Tokyo next month for a week"
"London to Paris, March 15-18, 2 adults"
"Cheapest flights to Barcelona in April"

等待用户输入。

步骤 2:解析并做出假设

提取用户所说的信息,然后用默认值补全其他所有内容。

根据用户输入运行假设引擎(见下文),并在尚无配置的引导流程中使用以下回退默认值:

  • 出发地:LHR
  • 舱位:经济舱
  • 乘客:1 名成人
  • 预算:灵活
  • 经停:不限
  • 货币:GBP

显示假设卡片:

## Assumptions

| Field | Value | Source |
|-------|-------|--------|
| Destination | Tokyo (NRT/HND) | You said |
| Origin | London (LHR) | Default |
| Dates | Mar 10 - Mar 17, 2026 | "next month" + 7 days |
| Passengers | 1 adult | Default |
| Class | Economy | Default |
| Budget | Flexible | Default |
| Stops | Any | Default |

Anything wrong? Say so and I'll re-search. Otherwise I'll find flights.

等待用户纠正或确认。

如果用户提出纠正 → 更新假设 → 重新显示卡片 → 再次等待。

如果用户确认(或表示没有问题)→ 继续步骤 3。

步骤 3:搜索并展示

使用已确认的假设运行搜索策略(见下文)。

使用 assets/templates/trip-recommendation.md 中的输出格式展示推荐结果。

然后提供修改选项:

Want to adjust anything? Change dates, class, budget — I'll re-search.

修改循环: 用户调整 → 重新搜索 → 重新展示。重复直到用户满意。

步骤 4:快速设置

用户对结果满意后:

Nice — that's your first search done.

Want to save your preferences so next time is faster? Quick 5 questions:

1. What's your home airport? (e.g. LHR, JFK, LAX)

2. Any preferred airlines? (comma-separated, or "none")

3. Default budget range per person? (e.g. "under 500", "flexible", "100-300")

4. Preferred class? (economy / premium economy / business / first)

5. Preferred booking platform? (skyscanner / google-flights / kayak)

解析回复,并为跳过的字段使用合理的默认值:

  • home_airport: "LHR"
  • preferred_airlines: []
  • budget: "flexible"
  • class: "economy"
  • platform: "skyscanner"

写入 .claude/trip-planner.md 配置(见下方的配置结构)。

Saved to .claude/trip-planner.md

Run /trip-planner anytime — just describe where you want to go.

引导流程结束后退出。


常规流程(后续每次运行)

快速处理——不提问,直接推荐:

  1. 从自然语言中解析意图
  2. 加载配置以获取默认值
  3. 运行假设引擎(补全所有缺失信息)
  4. 搜索航班
  5. 展示推荐结果及预订链接
步骤 1:解析意图

从用户消息中提取:

  • 目的地 — 城市名称、机场代码或国家
  • 日期 — 明确日期、相对日期(“下个月”)或模糊日期(“4 月”)
  • 预算 — 明确金额或限定词(“便宜”“不超过 300”)
  • 舱位 — 经济舱、高级经济舱、商务舱、头等舱
  • 乘客 — 人数和类型(成人、儿童、婴儿)
  • 偏好 — 直飞、指定航空公司、出行时段、中转偏好
  • 多城市行程 — 检测“A → B → C → A”或“然后”模式

如果用户只说了目的地,没有提供其他详情,也没关系——假设引擎会处理其余内容。

步骤 2:加载配置

读取 .claude/trip-planner.md,获取用户默认设置。

配置选项请参阅 references/config-guide.md。

回退默认值(配置缺失或不完整时):

  • name: ""
  • home_airport: "LHR"
  • class: "economy"
  • budget: "flexible"
  • currency: "GBP"
  • stops: "any"
  • preferred_airlines: []
  • platform: "skyscanner"
步骤 3:假设引擎

按照以下优先级顺序补全缺失字段:

  1. 用户明确输入——用户在此消息中说的内容
  2. 配置文件默认值——来自 .claude/trip-planner.md
  3. 结合上下文推断——根据旅行类型进行合理推测:
    • 城市短途游(欧洲短途航线)→ 3-4 天
    • 洲际旅行 → 7-10 天
    • 周末旅行 → 周五至周日
    • “Holiday” / “vacation” → 7 天
    • 提到了月份但没有日期 → 月中,日期灵活
  4. 智能默认值——最终回退选项:
    • 1 位成人
    • 经济舱
    • 预算灵活
    • 允许任意经停
    • 使用配置中的出发机场(或 LHR)
    • 日期:从今天起 4 周后,行程为 7 天

**获取当前日期:**运行 date 命令——不要依赖系统日期。

显示假设卡片(始终显示——每项假设都必须清晰可见):

## Assumptions

| Field | Value | Source |
|-------|-------|--------|
| Destination | {dest} | You said |
| Origin | {origin} | Config / Default |
| Dates | {dates} | {source} |
| Passengers | {pax} | {source} |
| Class | {class} | {source} |
| Budget | {budget} | {source} |
| Stops | {stops} | {source} |

Anything wrong? Otherwise I'll search.

等待用户更正或确认后再搜索。

如果用户更正 → 更新 → 重新显示卡片 → 等待。

步骤 4:搜索

根据已确认的假设运行搜索策略(见下文)。

步骤 5:呈现

使用 assets/templates/trip-recommendation.md 中的输出格式。

提供 3-5 个航班选项,涵盖以下三类:

  • 性价比最佳——价格、时长和便利性之间的最佳平衡
  • 最便宜——不考虑便利性,价格最低
  • 最快——总旅行时间最短

为每个选项提供直接预订链接。

然后提供更正选项:

Want to adjust anything? I can re-search with different dates, budget, or preferences.

**更正循环:**用户调整 → 根据更新从步骤 3 重新运行 → 重新呈现。


假设引擎——详情

每次搜索都会运行该引擎。它会根据不完整的输入生成一套完整的航班参数。

优先级顺序
User Input > Config > Context Inference > Smart Defaults
上下文推断规则
信号推断
欧洲城市 + 没有日期城市短途游:3-4 天
洲际旅行 + 没有日期7-10 天
提到“周末”周五晚上 → 周日晚上
“Holiday” / “vacation”7 天
仅提到月份,没有具体日期月中,并标记为日期灵活
“Christmas” / “Easter” / “New Year”使用标准节假日日期范围
“Summer” / “Winter”该季节的旺季月份
多城市行程中返回出发地往返行程,按比例分配各城市停留天数
提到“便宜” / “预算”按价格排序,并标记廉价航空
提到“直飞” / “不经停”仅筛选直飞航班
未提舱位等级 + 商务目的地仍假定为经济舱(不要推销升级)
目的地解析

用户提供城市名称时:

  • 映射到主要机场代码
  • 对于拥有多个机场的城市,全部纳入(例如,伦敦 → LHR/LGW/STN,东京 → NRT/HND,纽约 → JFK/EWR/LGA)
  • 对于国家或地区,映射到首都或最常用的旅游机场
日期处理
  • 始终使用 date 命令获取当前日期
  • “下个月” → 下个月 1 日 + 行程时长
  • “3 月” → 3 月 15 日(月中)+ 行程时长,并标记为日期灵活
  • “3 月 15 日” → 确切日期 + 行程时长
  • “3 月 15-18 日” → 确切日期范围
  • “下个周末” → 即将到来的周五至周日
  • 完全没有日期 → 从今天起 4 周后出发,行程时长根据旅行类型确定

搜索策略

步骤 A:构建预订 URL

根据参数构建 Skyscanner URL(或配置中的平台):

https://www.skyscanner.net/transport/flights/{origin}/{dest}/{depart_date}/{return_date}/?adults={n}&cabinclass={class}&currency={currency}

Skyscanner URL 格式:

  • 日期:YYMMDD(例如,2026 年 3 月 15 日为 260315)
  • 出发地/目的地:机场代码小写形式(例如,lhr、nrt)
  • 舱位等级:economy、premiumeconomy、business、first

多城市行程需按航段分别构建 URL。

Google Flights URL(如果已配置):

https://www.google.com/travel/flights?q=flights+from+{origin}+to+{dest}+on+{date}
步骤 B:通过 WebSearch 搜索价格

每个航段运行 2-3 条 WebSearch 查询,收集当前价格信息:

查询模板:

  • "flights {origin} to {dest} {month} {year} price"
  • "cheap flights {origin} to {dest} {month} {year}"
  • "{airline} {origin} {dest} {month} {year} fare"(如果已设置首选航空公司)

解析结果,提取:

  • 执飞该航线的航空公司
  • 大致价格范围
  • 航班时长和经停信息
  • 提及的优惠或促销
步骤 C:WebFetch 预订页面(可选)

尝试对构建的 Skyscanner URL 使用 WebFetch,以获取实时价格。

  • **如果成功:**提取具体航班选项及价格
  • **如果被阻止或失败:**平稳回退到 WebSearch 数据。不要重试或报错——只需注明价格为近似值
步骤 D:汇总结果

合并 WebSearch 和 WebFetch(如果有)的数据:

  • 按航空公司、航线和大致时间去重
  • 分为三个类别排序:性价比最高、最便宜、最快
  • 为每个选项提供直接预订 URL
  • 如果数据仅来自 WebSearch 而非实时价格,则标记为“近似值”
多城市搜索

对于多城市行程(例如“伦敦 → 巴黎 → 罗马 → 伦敦”):

  1. 分解为单独的航段
  2. 独立搜索每个航段(可以并行运行 WebSearch 查询)
  3. 提供行程概览及各航段选项
  4. 计算所有航段的总费用
  5. 提供每个航段的单独预订链接,以及多城市搜索链接

配置结构

存储为用户工作目录中的 .claude/trip-planner.md。

name: "Jane"
home_airport: "LHR"

preferences:
  class: "economy"
  budget: "flexible"
  currency: "GBP"
  stops: "any"
  preferred_airlines: []
  time_preference: "any"    # morning / afternoon / evening / any

platform:
  primary: "skyscanner"     # skyscanner / google-flights / kayak

完整字段说明请参见 references/config-guide.md。


核心原则

  • **假设所有信息,并全部展示。**只要可以做出合理假设,就不要提问。始终展示你的假设,以便用户更正。
  • **唯一的硬性要求:目的地。**其他所有信息都有默认值。用户只说“飞往东京”,就足以生成完整建议。
  • **先提供价值,再进行设置。**先搜索,再询问配置。引导用户上手时就立即创造价值。
  • **更正优于提问。**展示假设,让用户修正错误之处。这样比一开始就提问更快。
  • **展示信息来源。**卡片中的每项假设都有“来源”列。每个价格都附有预订链接。
  • **平稳降级。**如果 WebFetch 失败,就回退到 WebSearch。如果 WebSearch 数据稀少,仍然展示已有信息并附上预订链接。
  • **始终获取当前日期。**运行 date 命令——不要依赖系统日期或知识截止日期。
  • **多城市搜索是核心功能。**而非事后补充。拆分行程、逐段搜索,并展示完整行程。

文件路径

类型路径
配置.claude/trip-planner.md
技能.claude/skills/trip-planner/SKILL.md
品牌规范references/branding.md
配置参考references/config-guide.md
未来增强功能references/future.md
输出模板assets/templates/trip-recommendation.md

评论

支持 Markdown