MCP server for Aviasales/Travelpayouts Flight Search API
This is a well-constructed flight search MCP server with 13 tools, all with complete input schemas and descriptions. Naming follows verb_noun conventions consistently (search_flights, get_prices_calendar, lookup_airlines, etc.). Descriptions are action-oriented and typically 80-180 characters, explaining what each tool does and when to use it. All parameters have type definitions and descriptions. The server includes proper error handling with timeout logic (30s default, MAX_RETRY_DELAY=30s), retry logic with exponential backoff, and quota monitoring. Tool annotations (_READ_ONLY hints) are correctly applied to all 13 tools. However, there are gaps: (1) output schemas are not explicitly documented in the source (return types are not visible), (2) some parameter descriptions reference external APIs without full context (e.g., 'Travelpayouts quota'), (3) no structured error recovery guidance in tool descriptions, (4) parameter descriptions could include more format/constraint examples. The server uses fastmcp with proper async/await patterns, config-driven settings, and clean separation of concerns. The codebase is production-grade (Python 3.12+, type hints, tests, linting), but tool documentation is incomplete on the output side.
Find the nearest airports to geographic coordinates (latitude, longitude). Useful when a place has no city airport code of its own.
Find alternative (nearby) airports from the origin with cheaper flights to the same destination.
Discover the most popular flight routes from a city to other cities (includes all airports in that city).
Get the cheapest tickets across a range of departure and return dates (one week to one month of flexibility).
Get the most recently searched and found prices for a route (real-time data from the last 48 hours).
Discover the most popular (most searched) flight routes from an origin airport.
Output schemas are not documented. Tool descriptions state what parameters are accepted but do not document the structure, fields, or types of returned data. LLMs cannot plan downstream tool calls or extract results without knowing what fields to expect.
Error handling descriptions are missing from tool docstrings. Tools mention they may fail (e.g., API timeouts, quota limits) in the server code, but tool descriptions do not guide the LLM on what errors to expect or how to recover (retry, try alternative parameters, call a lookup tool first).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 73 | <=2025-11-25 | v2 |
Get calendar heatmap of prices for every day in a month — find the cheapest dates to depart and return.
Look up airlines by name or IATA code.
Look up airports by name, IATA code, or city code.
Look up cities by name or IATA code — use this to turn a city name into a code.
Look up countries by name or two-letter code.
Search for flights by price range instead of by route — find all routes cheaper than a budget.
Search for flights on a specific route with optional filters (direct flights, transfer limits, date range, price range, airline).
Parameter descriptions lack format constraints and examples. E.g., 'departure_at' accepts 'YYYY-MM-DD' or 'YYYY-MM' but descriptions do not explicitly state both formats are allowed or provide guidance on which to use when. Descriptions like 'Departure airport IATA code (e.g. 'MOW', 'BKK')' include example values that LLMs may reuse literally.
Pagination and result limits are accepted but not consistently documented. Tools like 'lookup_airlines' accept 'limit' (1-500, default 50) but other tools (e.g., 'get_popular_directions') do not clearly state the maximum result count or how to page through large result sets.
Parameter dependencies are not documented. E.g., 'return_at' is optional and used for round-trip searches, but descriptions do not state whether passing 'return_at' without 'departure_at' is valid, or what happens if only 'return_at' is provided. Undocumented parameter relationships cause silent misuse.