A virtual travel game engine that lets AI companions take you on virtual trips to 164 real destinations with authentic prices, stories, and photos. Supports solo or group travel with economy modes (free/caretaker/simple) and health-tracking-based currency system.
Travel-mcp has 14 tools with reasonable naming (verb_noun pattern) and descriptions present for all. However, critical gaps undermine quality: (1) Input schemas are visible in code but lack formal JSON Schema type declarations for most parameters, parameters are documented in descriptions but not in structured schema objects. (2) Descriptions are present but often verbose and context-heavy (e.g., start_trip description is 180+ chars with Chinese text and mode-specific behavior), making them harder for LLMs to parse. (3) No output schemas documented, tools return complex nested state objects (trip details, wallet ledger) without field-level documentation. (4) Error handling is minimal, no recovery guidance, no categorization of retryable vs fatal errors. (5) Parameters like 'dest' accept multiple formats (ID, Chinese name, local name) but this polymorphism is underdocumented in schema. (6) No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear WRITE vs READ_ONLY risk classifications in the spec.
Log self-care activities (喝水/吃药/运动/早睡/吃得健康/其他) to earn travel budget in caretaker mode. Idempotent per activity per day.
End current trip early and return home. Calculates refund for unused days and settles XP/rewards.
Complete current trip normally after all days. Settles XP, cashback, and bonuses.
Get details of the current active trip: destination, day, spots, party, style, spending.
Get detailed information about a specific destination including attractions, specialties, and cost breakdown.
Get all sent postcards with recipient, message, photo, and timestamp.
Get all collected souvenirs from solo trips with names, hints, and acquisition timestamps.
Input schemas lack formal JSON Schema type declarations. Parameters are documented in descriptions but not in structured schema objects with 'type', 'enum', 'minLength', etc. This forces LLMs to parse natural language constraints instead of reading machine-readable schemas.
No output schemas documented. Tools return complex nested objects (e.g., get_current_trip returns trip state with day, spots, spending, party, style) but field-level structure is not documented. LLMs cannot plan downstream calls or extract required data reliably.
Polymorphic 'dest' parameter accepts ID, Chinese name, or local name but this flexibility is not formalized in schema. The _resolve_dest() function handles fuzzy matching, but LLMs have no way to know which format is preferred or what happens on ambiguity.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
Get history of completed trips with stats: destination, days, party type, style, spending, XP earned.
Get current wallet status: balance, XP, and recent ledger entries.
List all 164 available travel destinations with details: ID, Chinese name, local name, tier, region, and cost reference.
Advance to the next day of current trip. Returns new day's spots and updates state.
Send a postcard from current trip destination to a recipient. Costs 2 USD, includes photo and message.
Send companion on solo trip to a destination while you stay home. Returns with souvenir and postcard after virtual travel time.
Start a new trip to a destination with specified party type (solo/together) and travel style (青旅背包/舒适/轻奢/豪奢). Deducts trip cost from wallet in caretaker/simple modes.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Code marks tools as WRITE vs READ_ONLY, but this is not exposed in tool definitions. LLMs cannot distinguish safe reads from destructive writes without reading descriptions.
Error handling is minimal. No recovery guidance, no error categorization (retryable vs fatal), no actionable error messages. E.g., if _resolve_dest() returns no match, the tool likely fails silently or returns a generic error without suggesting alternatives.