Skip to content

Repository files navigation

Vietnam Roadtrips — Visual travel planner powered by AI

Chat with your AI. Get a shareable link. No login. No friction.

trips.naai.studio


The idea

Western travel culture loves roadtrips — hopping between towns, experiencing local food, sleeping somewhere new every night. Vietnam is perfect for this: the country stretches 1,650 km from north to south, packed with distinct provinces, each with its own cuisine, landscapes, and rhythm.

Most AIs can plan a great multi-stop Vietnam itinerary — but the output is a wall of text. Vietnam Roadtrips gives that plan a visual home: an interactive timeline with a live map, estimated time at each attraction, transport between stops, food recommendations, and cost estimates. All rendered beautifully from a single shareable link.


Quick start — Add the MCP to your AI

No installation needed. Connect your AI directly to the server:

https://trips.naai.studio/mcp

Pick your AI client below:

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "vietnam-roadtrips": {
      "url": "https://trips.naai.studio/mcp"
    }
  }
}

Restart Claude Desktop.

Claude Code

Run in terminal:

claude mcp add vietnam-roadtrips --transport http https://trips.naai.studio/mcp

Or add manually to ~/.claude/claude_desktop_config.json (same JSON as Claude Desktop above).

Cursor

Edit ~/.cursor/mcp.json:

{
  "mcpServers": {
    "vietnam-roadtrips": {
      "url": "https://trips.naai.studio/mcp"
    }
  }
}
Windsurf

Edit ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "vietnam-roadtrips": {
      "url": "https://trips.naai.studio/mcp"
    }
  }
}
Gemini CLI

Edit ~/.gemini/settings.json:

{
  "mcpServers": {
    "vietnam-roadtrips": {
      "url": "https://trips.naai.studio/mcp"
    }
  }
}
Antigravity

Add in the MCP settings panel:

{
  "mcpServers": {
    "vietnam-roadtrips": {
      "url": "https://trips.naai.studio/mcp"
    }
  }
}
OpenAI Codex CLI

Edit ~/.codex/config.toml:

[mcp_servers.vietnam-roadtrips]
url = "https://trips.naai.studio/mcp"
Zed

Open Settings → context_servers and add:

{
  "context_servers": {
    "vietnam-roadtrips": {
      "source": "custom",
      "command": {
        "path": "npx",
        "args": ["-y", "@modelcontextprotocol/inspector", "https://trips.naai.studio/mcp"]
      }
    }
  }
}

Zed doesn't natively support HTTP MCP yet. The workaround above uses the MCP inspector as a bridge. Check Zed's MCP docs for updates.

Continue.dev

Create .continue/mcpServers/vietnam-roadtrips.yaml:

name: vietnam-roadtrips
url: https://trips.naai.studio/mcp

Try it

Once connected, paste this into your AI:

Plan a 7-day Vietnam roadtrip from Hanoi heading south: Ninh Binh (2 nights),
Phong Nha (2 nights), Hue (1 night), Da Nang (2 nights). Group of 2 adults.
End of April 2026.

For each stop: add the top 3–4 attractions with estimated visit duration and
ticket prices, local food specialties, rough accommodation budget per night,
and transport from the previous stop (bus/train, estimated fare and travel time).

Use slug "hanoi-south-apr26" and push everything to Vietnam Roadtrips.
Return the share link when done.

Your AI will return something like:

Here's your trip: https://trips.naai.studio/?session=a3f8c2e1d4b7

Open it. Share it. Done.

Continue editing later

The share link is the edit handle for AI workflows. If you want to continue editing an existing AI-created trip in a later chat, give the AI the original share link:

Continue editing this Vietnam Roadtrips plan:
https://trips.naai.studio/?session=a3f8c2e1d4b7

Add one extra night in Da Lat and update the cost estimates.

All edit tools accept either shareUrl, sessionId, or planSlug. For public editing, prefer shareUrl because it points to the exact session plan.


What the app shows

Each stop on your itinerary gets its own card on a vertical timeline, connected by transport info. Click any stop to expand:

  • Map — all attractions pinned with geographic coordinates
  • Activities — attractions, food, stays, transport, timing, duration, and prices
  • Location overview — generated from the detailed activities in that stop
  • Cost overview — running total from activity costs only

MCP tools reference

Tool What it does
list_plans List available sample plans and their slugs
create_plan Create a new public session trip → returns shareUrl; slug is optional and safely de-duped
get_plan Read a trip by shareUrl, sessionId, or slug
add_location Add a stop with dates and province/map metadata
update_location Edit stop timing or map metadata
delete_location Remove a stop
reorder_locations Reorder stops and cascade dates
add_sub_location Add an attraction inside a stop, including visit duration, map pin, ticket prices, and sort order
update_sub_location Edit an attraction
delete_sub_location Remove an attraction
reorder_sub_locations Reorder attractions inside a stop
update_plan Rename or change the slug
delete_plan Delete the plan

Plans created via MCP are session-isolated — they don't appear in the main site listing and are only accessible via your unique share link.

Admin/prod editing through MCP

MCP supports two editing modes:

  • Without an admin password, write tools create and edit session plans only. These are shared by ?session=....
  • With an admin password, write tools can create and edit the canonical prod/admin plans by slug. Pass adminPassword in the tool arguments for that call, or use the stdio tool set_admin_password once for the current MCP process.

Do not store the admin password in checked-in MCP config. For local stdio MCP, prefer environment variables:

{
  "mcpServers": {
    "vietnam-roadtrips-prod": {
      "command": "npx",
      "args": ["tsx", "/absolute/path/to/vietnam-travel/api/src/mcp.ts"],
      "env": {
        "REMOTE_API_URL": "https://trips.naai.studio",
        "ADMIN_PASSWORD": "<set outside git>"
      }
    }
  }
}

Activity detail and cost data belongs in sub_locations: use activityType (sightseeing, accommodation, food, transport, other) plus pricingMode (per_person, per_room, per_group), unitPrice, quantity, surcharge, adultPrice, childPrice, participant counts, actualCost, scheduledDate, scheduledTime, and durationDays. actualCost records real spend separately from estimate fields. Location-level description, food, activity list, and cost fields are legacy storage only and should not be used for new edits.

Deploy does not move data between environments. Prod, local, and other deployments each keep their own SQLite DB; use Admin/CLI/MCP against the target environment when editing plan data.

CLI

The API package includes a JSON-first CLI for Codex or other automation.

# Read public data
npm --prefix api run cli -- list-plans --api-url https://trips.naai.studio
npm --prefix api run cli -- show-plan ha-noi-nghe-an-ninh-binh-ha-long-ha-noi --api-url https://trips.naai.studio

# Write prod/admin data. Keep the password in the shell environment, not in files.
TRAVEL_ADMIN_PASSWORD=... npm --prefix api run cli -- add-activity ha-long 12 \
  --api-url https://trips.naai.studio \
  --json '{"name":"Khach san","activityType":"accommodation","pricingMode":"per_room","unitPrice":900000,"quantity":1,"surcharge":0,"durationDays":2}'

Core CLI commands: create-plan, update-plan, delete-plan, add-location, update-location, delete-location, reorder-locations, add-activity, update-activity, delete-activity, reorder-activities, get-plan, and show-plan.


Self-hosting

Run your own instance
# 1. Clone and install
git clone https://github.com/leolionart/vietnam-travel.git
cd vietnam-travel
cd api && npm install

# 2. Configure
cp .env.example .env   # set DB_PATH, ADMIN_PASSWORD, JWT_SECRET, APP_URL

# 3. Run API server (port 7321) — MCP available at http://localhost:7321/mcp
npm run dev

# 4. Build and serve the frontend
cd ../public && npm install && npm run dev   # port 3000

Environment variables

Variable Required Description
JWT_SECRET JWT signing secret
ADMIN_PASSWORD Admin panel password
APP_URL Public URL (default: https://trips.naai.studio)
DB_PATH SQLite file path (default: ./travel.db)
PORT API port (default: 7321)

Docker

cp .env.example .env
mkdir -p data
docker compose up -d

Local stdio MCP (for self-hosters)

If you prefer the classic stdio approach, point the MCP at your local server:

{
  "mcpServers": {
    "vietnam-roadtrips": {
      "command": "npx",
      "args": ["tsx", "/absolute/path/to/vietnam-travel/api/src/mcp.ts"],
      "env": {
        "REMOTE_API_URL": "http://localhost:7321"
      }
    }
  }
}

Built by leolionart

About

A tool for AI to visualize plans on a map, a plan table, and an interactive interface with your travel plan. Helps easily share with friends and collaboratively refine the travel plan.

Topics

Resources

Stars

16 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages