A multi-service MCP server system for travel planning that orchestrates flight search, hotel search, weather forecasts, and itinerary RAG retrieval. Exposes four independent MCP services (flight, hotel, weather, RAG) that communicate via stdio and are coordinated by a central orchestrator.
Server has 5 tools with complete input schemas and descriptions. Naming follows verb_noun convention (search_*, get_*). Descriptions are present and contextual (avg ~120 chars), meeting baseline minimums. However, output schemas are not documented in the visible code, only inferred from Pydantic model validation. Parameter descriptions are adequate but lack constraint details (ranges, formats, enums). Error handling is minimal, no recovery guidance or categorization visible. No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only. Missing idempotency guarantees and rate-limit guidance.
Estimate typical weather for a location on a given calendar date, based on historical averages from the past N years. Use this for dates more than 16 days from today. This is a historical average, NOT a forecast.
Fetch the weather forecast for a location at a specific date and time. Only covers dates within 16 days from today — dates further out will return an error field explaining that, use get_historical_weather_average instead.
Search Google Flights via SerpApi between two locations.
Search hotels via SerpApi's Google Hotels engine for a destination and date range.
Retrieve top-k relevant travel/itinerary chunks from the Supabase pgvector knowledge base.
Output schemas not documented. Tool descriptions mention return types (FlightSearchResult, HotelSearchResult, etc.) but no schema definitions visible in source. LLMs cannot plan downstream calls without knowing response structure.
No tool annotations despite all tools being read-only. Missing readOnlyHint declarations prevent agents from understanding which tools are safe to call speculatively.
Parameter descriptions lack constraint details. E.g., 'adults' accepts 1-9 but description does not state min/max. 'flight_type' accepts '1' or '2' but no enum constraint visible. LLMs may pass invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2025-06-18+ | v2 |
No error handling guidance. If SerpApi fails, weather API returns 'dates further out', or Supabase is unavailable, no recovery hints provided. Descriptions mention limitations (e.g., 'Only covers dates within 16 days') but no actionable error responses.
No pagination or result-limiting documented. search_flights and search_hotels may return large result sets; no limit, offset, or cursor parameters visible. Risk of context window exhaustion.