Flight search
Skill clairem0/technically-curious-skills/travel/flight-search
Search for flights across preferred airlines by scraping Google Flights. Presents structured comparison tables by leg with flight numbers, times, and prices. Use when the user says "find flights", "search flights", "flights from X to Y", or needs to compare flight options.From its SKILL.md
npx -y skills add clairem0/technically-curious-skills --skill flight-searchAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.0 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Flight Search
Search for flights across your preferred airlines by scraping Google Flights. Returns a comparison table per leg with real flight numbers, sorted by direct flights first then connecting, by departure time.
Connectors
| Connector | Required | Purpose |
|---|---|---|
| Web scraper | Yes | Scrape Google Flights with JSON extraction |
Examples below use Firecrawl MCP syntax. Adapt the scraping calls for your tool.
Configuration
Load
config.mdfor airline preferences. Loadenv.mdfor shared values.
Edit config.md with your preferred and excluded airlines.
Workflow
Step 1: Parse the Request
Extract from the user's message:
| Input | Required? | Default |
|---|---|---|
| Origin(s) | Yes | — |
| Destination | Yes | — |
| Date(s) | Yes | — |
| Travelers | No | 1 |
| Constraints | No | Nonstop preferred, any time |
Multi-leg / multi-origin support: Users often book trips where travelers come from different cities. Parse each leg separately.
Example: "flights from Denver to San Francisco Thu Aug 13, Alex from NYC, both return to Austin Sun Aug 16" → Leg 1: DEN → SFO, Aug 13 (Traveler 1) → Leg 2: JFK → SFO, Aug 13 (Traveler 2) → Leg 3: SFO → AUS, Aug 16 (both)
Echo back before searching:
Searching flights:
- Leg 1: DEN → SFO — Thu Aug 13
- Leg 2: JFK → SFO — Thu Aug 13
- Leg 3: SFO → AUS — Sun Aug 16
Preferred airlines: [from config]. Excluding: [from config].
Step 2: Search Google Flights
For each leg, scrape Google Flights using your web scraper.
Build the URL:
https://www.google.com/travel/flights?q=flights+from+{ORIGIN}+to+{DEST}+on+{YYYY-MM-DD}
For nonstop-only results, add +nonstop:
https://www.google.com/travel/flights?q=nonstop+flights+from+{ORIGIN}+to+{DEST}+on+{YYYY-MM-DD}
Scrape with JSON extraction:
{
"url": "<google_flights_url>",
"formats": ["json"],
"jsonOptions": {
"prompt": "Extract all flight options showing airline, full flight number with numeric part (e.g. UA 1234 not just UA), departure time, arrival time, number of stops, layover details if connecting, duration, and price",
"schema": {
"type": "object",
"properties": {
"flights": {
"type": "array",
"items": {
"type": "object",
"properties": {
"airline": {"type": "string"},
"flight_number": {"type": "string"},
"departure_time": {"type": "string"},
"arrival_time": {"type": "string"},
"stops": {"type": "string"},
"duration": {"type": "string"},
"price": {"type": "string"}
}
}
}
}
}
},
"waitFor": 10000
}
Run legs in parallel when possible (use multiple tool calls in one message).
Step 3: Filter and Sort Results
For each leg's results:
- Filter — Only keep flights on preferred airlines (from config). Drop excluded airlines.
- Group — Direct/nonstop flights first, then connecting flights.
- Sort — Within each group, sort by departure time ascending.
- Limit — Show top 5-7 options per leg. If more exist, note "N more options available."
Step 4: Present Results
One markdown table per leg:
## DEN → SFO — Thu Aug 13
| # | Airline | Flight | Depart | Arrive | Stops | Duration | Price |
|---|---------|--------|--------|--------|-------|----------|-------|
| 1 | United | UA 1234 | 8:00a | 9:33a | Nonstop | 1h 33m | $275 |
| 2 | United | UA 5678 | 11:58a | 1:29p | Nonstop | 1h 31m | $275 |
| 3 | Delta | DL 910/2282 | 7:05a | 10:49a | 1 (SLC 56m) | 3h 44m | $295 |
After all tables: "Which flights look good? You can say things like 'leg 1 option 2, leg 3 option 1' or ask me to search different dates."
Step 5: Done
The user books directly on the airline website using the flight details from the table.
Note on prices: Google Flights prices are point-in-time snapshots. Note: "Prices as of [time]. They can change within hours."
Error Handling
| Scenario | Response |
|---|---|
| Google Flights scrape returns empty | Retry once with waitFor: 15000. If still empty, try KAYAK as fallback: https://www.kayak.com/flights/{ORIGIN}-{DEST}/{YYYY-MM-DD}?sort=bestflight_a |
| No preferred airlines on route | Show what's available: "No [preferred airlines] on this route. Here's what's available:" |
| Partial data (missing prices or times) | Present what we have, flag missing fields with "—" |
| Date is in the past | Catch before searching: "That date has passed. Did you mean [next occurrence]?" |
| Flight numbers missing | Google Flights usually includes them. If missing, present without and note "flight numbers not available for this route — check the airline site." |
Customization Notes
How to adapt this skill to your own setup.
- Airline preferences — Edit
config.mdto set your preferred and excluded airlines. - Scraper swap — Replace Firecrawl calls with your web scraper's equivalent. The key requirement is JSON extraction from a JavaScript-heavy page.
- KAYAK fallback — If Google Flights doesn't work well in your region, swap to KAYAK URLs as the primary source. Note that KAYAK doesn't reliably show flight numbers.
- Booking automation — This skill stops at presenting results. If you want to automate booking, you'd need browser automation (Chrome MCP) to navigate the airline's checkout flow.
- One-way vs round-trip — This skill searches one-way legs by default (more flexible). To search round-trip, modify Step 2 to include return dates in the URL.