Plan a complete Japan trip — ingest your existing picks, discover neighborhoods, research restaurants and activities, and compile everything into Google Sheets, CSV, or Markdown.
Automatically plan a complete Japan trip: discover the best neighborhoods, research restaurants and activities, and compile everything into a single organized output.
/japan-trip Tokyo 7 days → Markdown output (default)
/japan-trip Osaka 5 days --csv → CSV output
/japan-trip Kyoto 3 days --sheet SHEET_ID → Google Sheets output
/japan-trip Tokyo 10 days --interests "ramen, nightlife, vintage shopping"
/japan-trip Tokyo 7 days --from my-picks.csv → Start from existing picks
/japan-trip Tokyo 7 days --from SHEET_ID → Import from Google Sheet
/japan-trip Tokyo 7 days --from NOTION_URL → Import from Notion page/database
--from SOURCE: Import existing picks to build around (see Importing Existing Picks below)--interests "...": Optional focus areas to emphasize (e.g., "fine dining, temples, anime, nightlife")--csv: Output as CSV files--sheet SPREADSHEET_ID: Output to Google Sheets (requires gws CLI)If no output flag is provided, defaults to Markdown.
--from)The --from flag lets you bring your own saved restaurants, activities, or wishlist items. The skill will treat these as anchors — keeping them in the final output and filling in gaps around them with new recommendations.
Supported sources:
| Source | Format | Example |
|---|---|---|
| CSV file | Local .csv or .tsv file | --from my-japan-picks.csv |
| Excel file | Local .xlsx file | --from japan-wishlist.xlsx |
| Markdown file | Local .md file with tables or lists | --from saved-recs.md |
| Google Sheet | Spreadsheet ID (44-char string) | --from 1qwgFBNKK1RsYmkkt06... |
| Notion | Notion page or database URL | --from https://notion.so/... |
| Plain text | Any text file with names/places | --from notes.txt |
The import is flexible — it will parse whatever structure it finds. At minimum it needs place names. Any additional info (category, area, notes, links) will be preserved and carried into the output. Columns/fields don't need to match the output schema exactly; the skill will map them intelligently.
--from provided)If the user provided --from, read and parse their existing picks before doing anything else.
.csv, .tsv, .xlsx, .md, .txt): Use the Read tool to read the file contents. For .xlsx files, use xlsx2csv or python3 to convert to readable format first.gws CLI to read all tabs:
PARAMS='{"spreadsheetId":"SHEET_ID","range":"Sheet1"}'
gws sheets spreadsheets values get --params "$PARAMS"
Read each tab to get all data.notion.so): Use the Notion MCP tools if available — notion-fetch to read the page/database content. If Notion MCP is not available, use WebFetch to attempt to read the page.Parse the imported data flexibly. Look for:
Create a structured list of existing picks. For each pick, note:
★ prefix in the Name column so the user can distinguish their original picks from new recommendations. Preserve any original notes from the user alongside new research notes.Spawn an Agent to determine which neighborhoods/areas to cover based on the city and trip duration.
The agent should:
--interests was provided, weight neighborhood selection toward those interestsReturn a structured list like:
- Shinjuku: nightlife, entertainment, ramen, department stores
- Asakusa: temples, traditional culture, street food
- Shibuya: shopping, trendy restaurants, youth culture
- Tsukiji/Toyosu: seafood, market food, sushi
...
For each neighborhood from Step 1, spawn an Agent (run these in parallel) to research BOTH restaurants AND activities.
If there are existing picks from Step 0 for this neighborhood, pass them to the agent so it can:
Each agent should search:
For each restaurant, gather:
Aim for 10-15 restaurants per neighborhood with a mix of budget, mid-range, and splurge across different food categories. Always include desserts/sweets spots.
For each activity/attraction, gather:
Aim for 8-12 activities per neighborhood. Include a mix of:
For any restaurants or activities missing addresses from Step 2, spawn an Agent to look up the missing addresses. Include building names in Japanese when available.
Output based on the user's chosen format. Organize by neighborhood, with restaurants and activities separated within each neighborhood section.
Write to ./japan-trip/[City] Trip Plan.md.
Format:
# [CITY] Trip Plan ([DURATION])
## Shinjuku
### 🍜 Restaurants
#### Ramen
| Name | Known For | Price | Address | Maps | Link | Reservations | Status | Notes |
|------|-----------|-------|---------|------|------|--------------|--------|-------|
| Restaurant Name | Signature dish | ¥1,000 | Address | [Maps](url) | [Tabelog](url) | No | | Detailed notes... |
#### Sushi
...
#### 🍡 Desserts & Sweets
...
### 🏯 Activities
#### Temples & Shrines
| Name | What It Is | Duration | Cost | Address | Best Time | Maps | Link | Status | Notes |
|------|-----------|----------|------|---------|-----------|------|------|--------|-------|
| Meiji Shrine | Major Shinto shrine in forested grounds | 1-2 hours | Free | ... | Morning | [Maps](url) | [Site](url) | | Notes... |
#### Shopping
...
---
## Shibuya
...
Leave Status columns empty — the user uses these to track visits/bookings.
--csv)Write two files per area to ./japan-trip/:
[City] - [Area] Restaurants.csv[City] - [Area] Activities.csvRestaurant columns: Category,Name,Known For,Price,Address,Google Maps,Reservation/Review Link,Reservations,Status,Notes
Activity columns: Category,Name,What It Is,Duration,Cost,Address,Best Time,Google Maps,Website/Booking Link,Status,Notes
Properly escape commas and quotes in field values. Leave Status empty.
--sheet SPREADSHEET_ID)Use the gws CLI to write results to the provided spreadsheet.
For each neighborhood, create two tabs:
[Area] Restaurants — restaurant data[Area] Activities — activity dataAlso create a Trip Overview tab as the first tab with:
[CITY] TRIP PLAN — [DURATION]Neighborhood | Known For | # Restaurants | # ActivitiesRow 1: [AREA] RESTAURANTS
Row 2: (blank)
Row 3: [Category emoji] CATEGORY NAME
Row 4: Name | Known For | Price | Address | Google Maps | Link | Reservations | Status | Notes
Row 5+: Data rows
(blank row between categories)
Row 1: [AREA] ACTIVITIES
Row 2: (blank)
Row 3: [Category emoji] CATEGORY NAME
Row 4: Name | What It Is | Duration | Cost | Address | Best Time | Google Maps | Link | Status | Notes
Row 5+: Data rows
(blank row between categories)
Leave Status columns empty.
Restaurants: Ramen 🍜, Yakiniku 🥩, Sushi 🍣, Izakaya/Bars 🍺, Tonkatsu/Soba/Teishoku 🥢, Teppanyaki/Fine Dining 🔥, Desserts & Sweets 🍡, Cafe ☕, Other 🍽️
Activities: Temples & Shrines 🏯, Museums 🏛️, Shopping 🛍️, Nightlife 🌙, Parks & Nature 🌸, Markets 🏪, Entertainment 🎮, Day Trips 🚃, Experiences 🎭, Other 📍
For each entry, include two links:
Google Maps — construct as: https://www.google.com/maps/search/?api=1&query=NAME+AREA+CITY
+)Website/Booking link — use the best available:
https://www.google.com/search?q=NAME+AREA+CITYAlways pass params via a variable to avoid ! escaping issues:
PARAMS='{"spreadsheetId":"SHEET_ID","range":"TabName!A1","valueInputOption":"RAW"}'
gws sheets spreadsheets values update --params "$PARAMS" --json '{"values":[...]}'
PARAMS='{"spreadsheetId":"SHEET_ID"}'
gws sheets spreadsheets batchUpdate --params "$PARAMS" --json '{"requests":[{"addSheet":{"properties":{"title":"Tab Name"}}}]}'
PARAMS='{"spreadsheetId":"SHEET_ID","range":"Tab Name!A1","valueInputOption":"RAW"}'
gws sheets spreadsheets values update --params "$PARAMS" --json '{"values":[["col1","col2"],["col1","col2"]]}'
PARAMS='{"spreadsheetId":"SHEET_ID","range":"Tab Name!A1:Z1000"}'
gws sheets spreadsheets values clear --params "$PARAMS"
PARAMS='{"spreadsheetId":"SHEET_ID","range":"Tab Name"}'
gws sheets spreadsheets values get --params "$PARAMS"