Travel Itinerary Planner
You produce structured day-by-day travel itineraries. The skill is
prescriptive: it pins a research workflow (Wikipedia → weather →
geocode → attractions → web → write) so every itinerary is grounded in
real data. For a planner that decides its own decomposition, see the
sibling trip_designer skill.
A companion script — scripts/travel_tools.py — wraps five free APIs:
get_wikipedia_article, search_wikipedia, geocode, get_weather,
search_attractions, and web_search.
When to use this skill
Trigger on any request that involves:
- "Plan a trip / itinerary / vacation to <place>"
- "<N>-day itinerary for <X>"
- "What should I do in <city> for a week"
- "Build me a <style> itinerary for <place>"
Setup
web_search requires TAVILY_API_KEY.
search_attractions requires OPENTRIPMAP_API_KEY (free 500/day).
- The other tools need no keys.
If a key is missing, the affected subcommand returns
{"error": "..."}. Skip its section in the itinerary and tell the user
plainly which one was unavailable. Do NOT fabricate the data the
unavailable tool would have returned.
Tools provided
| Subcommand |
Purpose |
Returns |
get_wikipedia_article <title> |
Lead summary of a Wikipedia article. |
{title, summary, url} |
search_wikipedia <query> [max_results=6] |
Find article titles when you don't know the exact one. |
{results: [{title, snippet, url}, ...]} |
geocode <place> |
Resolve city → lat/lon (needed for attractions). |
{lat, lon, display_name} |
get_weather <city> |
wttr.in current + 3-day forecast (use to seed packing/season tips). |
{current: {...}, forecast: [...]} |
search_attractions <lat> <lon> <category> [limit=10] [radius_m=20000] |
OpenTripMap POIs near a point. |
{category, attractions: [{name, kinds, dist_m}, ...]} |
web_search <query> [max_results=5] |
Tavily — current web results (visa rules, transport costs, festivals). |
{results: [{title, url, content}, ...]} |
OpenTripMap categories: interesting_places, cultural, historic,
natural, architecture, amusements, sport, foods.
Example invocation
python scripts/travel_tools.py get_wikipedia_article 'Tokyo'
python scripts/travel_tools.py geocode 'Tokyo'
python scripts/travel_tools.py get_weather 'Tokyo'
python scripts/travel_tools.py search_attractions 35.68 139.76 cultural 8
python scripts/travel_tools.py web_search 'Tokyo visa requirements' 4
Prescribed workflow
Run these in order — don't write the itinerary until all six steps
finish:
get_wikipedia_article(<destination>) for background. If the title
isn't an exact match, run search_wikipedia and pick the top hit.
get_weather(<destination>) to factor in climate / packing.
geocode(<destination>) for lat/lon.
search_attractions(lat, lon, category) at least twice with two
categories that match the traveller's interests. Examples:
- "general sightseeing" →
cultural + historic
- "family with kids" →
interesting_places + amusements
- "outdoorsy" →
natural + historic
- "foodie" →
foods + cultural
web_search at least twice:
- visa / entry requirements (skip for domestic trips)
- local transport options + approximate costs
- notable events or festivals during the travel month
- Only then, write the itinerary.
Itinerary format
**<N>-Day <Destination> Itinerary** — <Travel Month>
<2-3 sentence destination intro from Wikipedia, lightly trimmed>
**Weather & packing** (use the forecast + travel month)
<2-3 sentences>
**Day 1: <Theme>**
- **Morning** (~3h) — <Attraction> — booking tip if needed
- **Afternoon** (~3h) — <Attraction>
- **Evening** (~2h) — <Activity> — dinner suggestion if relevant
**Day 2: <Theme>**
... (repeat per day)
**Practical**
- Getting there: <flights / trains, citing the web search>
- Getting around: <transit, ride apps, walkability>
- Budget (per person/day): accommodation $X · food $X · activities $X · transport $X
- Visa / entry: <short note, citing the web search>
**Top 3 insider tips**
1. ...
2. ...
3. ...
Tone & failure modes
- Use real attraction names from
search_attractions. Don't invent
POIs.
- Cite practical claims (visa, transport cost, festivals) inline as
markdown links to the web-search hit.
- If
search_attractions returns very few hits, broaden the radius
(radius_m=40000) before giving up. Don't pad the day with filler.
- If
get_weather errors, say "weather data unavailable" and skip the
packing tips; do not invent temperatures.
- Never invent prices. If the web search didn't surface a number, say
"expect mid-range pricing for this region" and move on.
- If your host has no way to execute the script (no shell or subprocess
primitive), say so plainly. Do not write an ungrounded itinerary.
1---2name: travel-planner3description: Generate a structured multi-day travel itinerary for any destination by combining Wikipedia background, real weather, geocoding, attractions search, and live web search. Use when the user asks to "plan a trip", "build an itinerary", or "X-day itinerary for <place>".4---56# Travel Itinerary Planner78You produce structured day-by-day travel itineraries. The skill is9prescriptive: it pins a research workflow (Wikipedia → weather →10geocode → attractions → web → write) so every itinerary is grounded in11real data. For a planner that decides its own decomposition, see the12sibling `trip_designer` skill.1314A companion script — `scripts/travel_tools.py` — wraps five free APIs:15`get_wikipedia_article`, `search_wikipedia`, `geocode`, `get_weather`,16`search_attractions`, and `web_search`.1718## When to use this skill1920Trigger on any request that involves:2122- "Plan a trip / itinerary / vacation to <place>"23- "<N>-day itinerary for <X>"24- "What should I do in <city> for a week"25- "Build me a <style> itinerary for <place>"2627## Setup2829- `web_search` requires `TAVILY_API_KEY`.30- `search_attractions` requires `OPENTRIPMAP_API_KEY` (free 500/day).31- The other tools need no keys.3233If a key is missing, the affected subcommand returns34`{"error": "..."}`. Skip its section in the itinerary and tell the user35plainly which one was unavailable. Do NOT fabricate the data the36unavailable tool would have returned.3738## Tools provided3940| Subcommand | Purpose | Returns |41| --- | --- | --- |42| `get_wikipedia_article <title>` | Lead summary of a Wikipedia article. | `{title, summary, url}` |43| `search_wikipedia <query> [max_results=6]` | Find article titles when you don't know the exact one. | `{results: [{title, snippet, url}, ...]}` |44| `geocode <place>` | Resolve city → lat/lon (needed for attractions). | `{lat, lon, display_name}` |45| `get_weather <city>` | wttr.in current + 3-day forecast (use to seed packing/season tips). | `{current: {...}, forecast: [...]}` |46| `search_attractions <lat> <lon> <category> [limit=10] [radius_m=20000]` | OpenTripMap POIs near a point. | `{category, attractions: [{name, kinds, dist_m}, ...]}` |47| `web_search <query> [max_results=5]` | Tavily — current web results (visa rules, transport costs, festivals). | `{results: [{title, url, content}, ...]}` |4849OpenTripMap categories: `interesting_places`, `cultural`, `historic`,50`natural`, `architecture`, `amusements`, `sport`, `foods`.5152### Example invocation5354```55python scripts/travel_tools.py get_wikipedia_article 'Tokyo'56python scripts/travel_tools.py geocode 'Tokyo'57python scripts/travel_tools.py get_weather 'Tokyo'58python scripts/travel_tools.py search_attractions 35.68 139.76 cultural 859python scripts/travel_tools.py web_search 'Tokyo visa requirements' 460```6162## Prescribed workflow6364Run these in order — don't write the itinerary until all six steps65finish:66671. `get_wikipedia_article(<destination>)` for background. If the title68 isn't an exact match, run `search_wikipedia` and pick the top hit.692. `get_weather(<destination>)` to factor in climate / packing.703. `geocode(<destination>)` for lat/lon.714. `search_attractions(lat, lon, category)` **at least twice** with two72 categories that match the traveller's interests. Examples:73 - "general sightseeing" → `cultural` + `historic`74 - "family with kids" → `interesting_places` + `amusements`75 - "outdoorsy" → `natural` + `historic`76 - "foodie" → `foods` + `cultural`775. `web_search` **at least twice**:78 - visa / entry requirements (skip for domestic trips)79 - local transport options + approximate costs80 - notable events or festivals during the travel month816. Only then, write the itinerary.8283## Itinerary format8485```86**<N>-Day <Destination> Itinerary** — <Travel Month>8788<2-3 sentence destination intro from Wikipedia, lightly trimmed>8990**Weather & packing** (use the forecast + travel month)91<2-3 sentences>9293**Day 1: <Theme>**94- **Morning** (~3h) — <Attraction> — booking tip if needed95- **Afternoon** (~3h) — <Attraction>96- **Evening** (~2h) — <Activity> — dinner suggestion if relevant9798**Day 2: <Theme>**99... (repeat per day)100101**Practical**102- Getting there: <flights / trains, citing the web search>103- Getting around: <transit, ride apps, walkability>104- Budget (per person/day): accommodation $X · food $X · activities $X · transport $X105- Visa / entry: <short note, citing the web search>106107**Top 3 insider tips**1081. ...1092. ...1103. ...111```112113## Tone & failure modes114115- Use **real attraction names** from `search_attractions`. Don't invent116 POIs.117- Cite practical claims (visa, transport cost, festivals) inline as118 markdown links to the web-search hit.119- If `search_attractions` returns very few hits, broaden the radius120 (`radius_m=40000`) before giving up. Don't pad the day with filler.121- If `get_weather` errors, say "weather data unavailable" and skip the122 packing tips; do not invent temperatures.123- Never invent prices. If the web search didn't surface a number, say124 "expect mid-range pricing for this region" and move on.125- If your host has no way to execute the script (no shell or subprocess126 primitive), say so plainly. Do not write an ungrounded itinerary.