flights-mcp
服务介绍
查找航班 MCP 服务器
使用 Duffel API 搜索和检索航班信息的 MCP 服务器。
工作原理
视频演示
https://github.com/user-attachments/assets/c111aa4c-9559-4d74-a2f6-60e322c273d4
为什么这很有帮助
虽然像 Google Flights 这样的工具对于简单的旅行非常有用,但这个工具在处理复杂的旅行计划时表现出色。原因如下:
- 上下文记忆:Claude 记住了聊天中所有之前的航班搜索,因此您不需要打开多个标签页来比较价格。
- 灵活的日期搜索:轻松跨多个日期搜索以找到最佳价格,而无需手动检查每个日期。
- 复杂的行程:非常适合多城市旅行、单程航班或需要比较不同路线选项的情况,您可以直接询问!
- 自然对话:只需描述您想要的内容——不再需要点击日历界面或调整搜索参数,解析城市名称、日期和时间。
可以将其视为在您的聊天中拥有一个记住所有讨论内容并能立即搜索日期和路线的旅行代理。
功能
- 在多个目的地之间搜索航班
- 支持单程、往返和多城市航班查询
- 详细的航班报价信息
- 灵活的搜索参数(出发时间、舱位等级、乘客数量)
- 自动处理航班转机
- 在多个日期内搜索航班以找到最适合您旅行的航班(速度较慢)
前提条件
- Python 3.x
- Duffel API 实时密钥
获取您的 Duffel API 密钥
Duffel 要求进行账户验证并设置支付信息,但此 MCP 服务器仅使用 API 进行航班搜索——不会对您的账户进行实际预订或收费。
建议先使用 duffel_test 来体验该工具的强大功能。如果您最终喜欢它,可以通过以下验证过程使用实时密钥。
先试用测试模式(推荐)
您可以先从测试 API 密钥 (duffel_test) 开始,在完成整个验证过程之前尝试模拟数据的功能:
- 访问 Duffel 的注册页面
- 创建账户(公司名称可以选择“个人使用”)
- 导航到 More > Developer 找到您的测试 API 密钥(已提供一个)
获取实时 API 密钥
要访问真实的航班数据,请按照以下步骤操作:
- 在 Duffel 仪表板中,关闭左上角的“测试模式”
- 验证过程需要多个步骤——您需要反复切换测试模式:
- 第一次切换:验证您的电子邮件地址
- 再次切换:完成公司信息(个人使用也可以)
- 再次切换:添加支付信息(Duffel 要求,但此 MCP 服务器不会产生任何费用)
- 再次切换:完成任何剩余的验证步骤
- 最后一次切换:点击“同意并提交”后进入实时模式
- 完全验证后,转到 More > Developer > 创建实时令牌
- 复制您的实时 API 密钥
💡 提示:每次完成验证步骤后,都需要再次关闭测试模式才能继续下一步。继续切换直到完成所有要求。
⚠️ 重要注意事项:
- 您的支付信息由 Duffel 直接处理,MCP 服务器不访问或存储这些信息
- 此 MCP 服务器是只读的——只能搜索航班,不能预订
- 通过此集成不会对您的支付方式产生任何费用
- 所有敏感信息(包括 API 密钥)都保留在您的本地机器上
- 您可以从测试 API 密钥 (
duffel_test) 开始评估功能 - 验证过程可能需要一些时间——这是 Duffel 的标准要求
安全提示这台MCP服务器仅使用Duffel的搜索端点,无法进行预订或收费。您的支付信息仅用于Duffel的验证过程,MCP服务器不会访问或共享这些信息。
关于API使用限制的说明
- 请检查Duffel当前的价格和使用限制
- 根据您的需求提供不同的层级
- 建议在其网站上查看当前价格
安装
通过Smithery安装
要通过Smithery自动为Claude Desktop安装Find Flights:
bash
npx -y @smithery/cli install @ravinahp/travel-mcp --client claude
手动安装
克隆仓库:
bash
git clone https://github.com/ravinahp/flights-mcp
cd flights-mcp
使用uv安装依赖项:
bash
uv sync
注意:我们使用uv而不是pip,因为该项目使用pyproject.toml进行依赖管理。
配置为MCP服务器
要将此工具添加为MCP服务器,请修改您的Claude桌面配置文件。
配置文件位置:
- MacOS:
~/Library/Application\ Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%/Claude/claude_desktop_config.json
在您的JSON文件中添加以下配置:
json
{
"flights-mcp": {
"command": "uv",
"args": [
"--directory",
"/Users/YOUR_USERNAME/Code/flights-mcp",
"run",
"flights-mcp"
],
"env": {
"DUFFEL_API_KEY_LIVE": "your_duffel_live_api_key_here"
}
}
}
⚠️ 重要提示:
- 将
YOUR_USERNAME替换为您的实际系统用户名 - 将
your_duffel_live_api_key_here替换为您的实际Duffel Live API密钥 - 确保目录路径与您的本地安装相匹配
部署
构建
准备包:
bash
同步依赖并更新锁文件
uv sync
构建包
uv build
这将在dist/目录中创建分发文件。
调试
为了获得最佳调试体验,请使用MCP Inspector:
bash
npx @modelcontextprotocol/inspector uv --directory /path/to/find-flights-mcp run flights-mcp
Inspector提供:
- 实时请求/响应监控
- 输入/输出验证
- 错误跟踪
- 性能指标
可用工具
1. 搜索航班
python
@mcp.tool()
async def search_flights(params: FlightSearch) -> str:
"""根据参数搜索航班。"""
支持三种航班类型:
- 单程航班
- 往返航班
- 多城市航班
参数包括:
type: 航班类型('one_way', 'round_trip', 'multi_city')origin: 出发机场代码destination: 目的地机场代码departure_date: 出发日期(YYYY-MM-DD)- 可选参数:
return_date: 往返航班的返回日期adults: 成人乘客数量cabin_class: 优选舱位departure_time: 特定出发时间范围arrival_time: 特定到达时间范围max_connections: 最大连接次数
2. 获取报价详情
python
@mcp.tool()
async def get_offer_details(params: OfferDetails) -> str:
"""获取特定航班报价的详细信息。"""
使用其唯一ID检索特定航班报价的全面详细信息。
3. 搜索多城市航班
python
@mcp.tool(name="search_multi_city")
async def search_multi_city(params: MultiCityRequest) -> str:
"""搜索多城市航班。"""
专门用于复杂的多城市航班行程。
参数包括:
segments: 航段列表adults: 成人乘客数量cabin_class: 优选舱位max_connections: 最大连接次数
用例
一些示例(但请自己尝试!)您可以使用这些工具来查找具有各种复杂性的航班:
- “查找1月7日从SFO到NYC的单程航班,2位成人,商务舱”
- “搜索1月8日从LAX出发,1月15日返回伦敦的往返航班”
- “计划一个从纽约出发,1月7日到巴黎,1月10日到罗马,然后1月15日返回纽约的多城市旅行”
- “1月7日至1月15日期间从SFO到LAX最便宜的经济舱航班是什么?2位成人”
- 您甚至可以在多个日期内搜索航班,以找到最适合您行程的航班。目前,建议仅以此方式搜索单程或往返航班。例如:“在1月7日至1月10日期间,为2位成人找到从SFO到LAX最便宜的经济舱航班”
响应格式
这些工具返回JSON格式的响应,包含以下信息:
- 航班报价详情
- 价格信息
- 航段(路线)详情
- 航空公司信息
- 中转详情
错误处理
该服务包括强大的错误处理机制,用于处理以下情况:
- API请求失败
- 无效的机场代码
- 缺失或无效的API密钥
- 网络超时
- 无效的搜索参数
贡献
[如果适用,请添加贡献指南]
许可证
本项目根据MIT许可证发布 - 请参阅LICENSE文件获取详细信息。
性能说明
- 单程/往返航班搜索结果限制为50个报价
- 多城市搜索结果限制为10个报价
- 根据搜索类型,供应商超时设置为15-30秒
舱位等级
可用的舱位等级:
economy:标准经济舱premium_economy:高级经济舱business:商务舱first:头等舱
带有舱位等级的示例请求:
json
{
"params": {
"type": "one_way",
"adults": 1,
"origin": "SFO",
"destination": "LAX",
"departure_date": "2025-01-12",
"cabin_class": "business" // 指定所需的舱位等级
}
}