Unified flight comparison across all sources. Searches cash prices (Duffel, Ignav), award availability (seats.aero), and portal pricing (Chase UR, Amex MR) in parallel. Applies transfer partner optimization automatically. Outputs one comparison table with recommendations.
Search every available source for a route and present one unified comparison. Combines cash pricing, award availability, portal pay-with-points, and transfer partner optimization into a single table.
This is an orchestration skill. It tells the agent which tools to run and how to combine results. No standalone script.
Run these in parallel where possible. Never fail silently. If a source errors, report it in the output so the user knows what's missing.
| Source | Skill | Speed | Notes |
|---|---|---|---|
| Duffel |
duffel| ~3s |
| Primary. Real GDS fares with fare classes. No Southwest. |
| Ignav | ignav | ~2s | Fast REST API. Good for price comparison. Booking links. |
| Google Flights | google-flights | ~10s | Browser-automated. All airlines including Southwest cash. Good cross-check. |
| Skiplagged | web search | ~5s | Hidden city ticketing. Often finds significantly cheaper fares. Search skiplagged.com/flights/{origin}/{dest}/{date}. |
| Kiwi.com | web search | ~5s | Creative routings, self-transfer combos, multi-city. Search kiwi.com. |
| Southwest | southwest | ~20s | Patchright, Docker only. Points + cash for all 4 fare classes. Only needed when SW flies the route. |
Skiplagged and Kiwi: Use web search (tavily or exa) to find their prices. They don't have MCP skills but their URLs are predictable. Always note that Skiplagged fares have restrictions (can't check bags, must use the "missed" connection city as destination).
Southwest: Check if SW flies the route first (major US domestic, Mexico, Caribbean, Central America). If yes, run the southwest skill. If no, skip and note "Southwest does not fly this route." Southwest returns BOTH cash prices AND Rapid Rewards points prices for all 4 fare classes (Wanna Get Away, WGA+, Anytime, Business Select). Include SW points in the comparison table as a separate currency. SW points are NOT transferable from UR/MR. They're earned directly or via Chase UR transfer (1:1). Companion Pass doubles the value.
SerpAPI is optional. Only use if the user asks for Google Hotels or destination discovery.
| Source | Skill | Speed | Notes |
|---|---|---|---|
| Seats.aero | seats-aero | ~5s | Cached award availability across 25+ programs. Primary award source. |
| Source | Skill | Speed | Notes |
|---|---|---|---|
| Chase UR | chase-travel | ~45s | Points Boost detection. 1.5x CSR multiplier at checkout. |
| Amex MR | amex-travel | ~45s | IAP discount detection on Platinum. |
Portal searches are slower (require browser login). Run them in parallel with each other, but don't block on them. Start cash + award searches first, present those results, then append portal results when ready.
Only run portal searches if the user has the relevant card or asks for portal pricing. Don't run Chase if they don't have a Sapphire card.
Run searches in parallel. Track which sources succeeded and which failed.
PARALLEL GROUP 1 (fast, ~3-5s):
- Duffel: cash prices with fare classes
- Ignav: cash prices with booking links
- Seats.aero: award availability by program
- Skiplagged: hidden city fares (web search)
- Kiwi.com: creative routings (web search)
PARALLEL GROUP 2 (browser-automated, ~10-45s, Docker):
- Google Flights: all airlines including Southwest cash
- Southwest: points + cash for all fare classes (if SW flies the route)
- Chase Travel: UR portal pricing + Points Boost
- Amex Travel: MR portal pricing + IAP discounts
For each source, capture:
For every seats.aero award result, calculate the effective cost in each transferable currency using data/transfer-partners.json:
For each award (e.g., United business at 88,000 miles):
1. Look up which currencies transfer to United: Chase UR (1:1), Bilt (1:1)
2. Calculate effective cost: 88,000 / 1.0 = 88,000 UR or 88,000 Bilt
3. Calculate opportunity cost using data/points-valuations.json:
88,000 UR × 1.7cpp floor = $1,496 equivalent
Include ALL viable transfer paths, not just the cheapest. The user may have more points in one currency than another.
Chase portal quotes at 1.0 cpp in listings. The CSR 1.5x is applied at checkout:
Listed: 539,683 points for a $5,397 flight
Effective: 539,683 ÷ 1.5 = 359,789 UR points actually deducted
True CPP: $5,397 / 359,789 = 1.5 cpp (by definition)
For Points Boost offers, the boost price replaces the standard:
Boost: 269,841 points for a $5,397 flight
Effective: 269,841 ÷ 1.5 = 179,894 UR points
True CPP: $5,397 / 179,894 = 3.0 cpp (excellent)
Amex portal is 1 cpp for flights (1 MR = 1 cent). IAP fares are discounted cash prices:
Standard: $5,044 = 504,400 MR points
IAP: $4,381 = 438,100 MR points (saves 66,300 MR)
Always use markdown tables. One table with all options sorted by effective cost.
| # | Option | Source | Price | Points | Currency | CPP | Rating |
|---|---|---|---|---|---|---|---|
| 1 | Cash (lowest) | Duffel | $4,200 | — | — | — | — |
| 2 | Flying Blue via Chase UR | seats.aero | $120 tax | 55,000 | Chase UR | 7.4 | Excellent |
| 3 | Aeroplan via Chase UR | seats.aero | $200 tax | 70,000 | Chase UR | 5.7 | Excellent |
| 4 | Chase Portal (Boost) | chase-travel | — | 180,000 | Chase UR | 3.0 | Excellent |
| 5 | Chase Portal (standard) | chase-travel | — | 360,000 | Chase UR | 1.5 | Baseline |
| 6 | Amex Portal (IAP) | amex-travel | — | 438,100 | Amex MR | 1.0 | Poor |
| 7 | Amex Portal (standard) | amex-travel | — | 504,400 | Amex MR | 0.83 | Poor |
| # | Option | Source | Price | Points | Currency | CPP | Rating |
|---|---|---|---|---|---|---|---|
| 1 | SW Wanna Get Away | southwest | $79 | 5,200 | SW RR | 1.52 | Good |
| 2 | Cash (lowest) | Duffel | $89 | — | — | — | — |
| 3 | SW WGA+ | southwest | $119 | 8,400 | SW RR | 1.42 | Fair |
| 4 | United via Chase UR | seats.aero | $5.60 tax | 5,000 | Chase UR | 1.67 | Good |
| 5 | Chase Portal | chase-travel | — | 8,900 | Chase UR | 1.5 | Baseline |
| 6 | SW Anytime | southwest | $219 | 16,800 | SW RR | 1.30 | Fair |
Note: SW points values shown use direct redemption CPP. If the user has Companion Pass, effective CPP doubles (two tickets for the points price of one).
Sources checked:
After the table, always provide:
NEVER fail silently. Every source must report its status.
If a source fails:
- ❌ Duffel: API error (rate limit exceeded). Cash prices from Ignav only.
- ❌ Chase Travel: Login failed (2FA timeout). No portal pricing available.
If ALL cash sources fail, say so explicitly. Don't present award-only results without noting the missing cash comparison.
If seats.aero returns no availability, say "No award availability found" instead of silently omitting the award section.
| File | Purpose |
|---|---|
data/transfer-partners.json | Credit card → loyalty program transfer ratios |
data/points-valuations.json | CPP floor/ceiling for calculating opportunity cost |
data/partner-awards.json | Cross-alliance booking options (VA→ANA, EY→AA, etc.) |
transfer-partners.json. Verify against issuer before large transfers.