MCP server for seats.aero award flight availability API
The server provides 5 well-named, read-only tools with clear purpose. All tools have descriptive text (194-350 chars, within baseline). Input schemas use Zod with comprehensive type coverage and parameter descriptions. However, output schemas are undocumented, responses are returned as raw JSON strings without explicit field definitions, breaking the agent's ability to reason about downstream tool chaining. Error handling is minimal (generic API error messages), and there is no guidance on retryability, field structure, or what to do when results are empty. Parameter descriptions mention ranges (e.g. 'take 10-1000') but lack formal enum constraints for categorical parameters like 'cabin' and 'order_by'. The tools themselves follow single-responsibility and good composition patterns (each queries a distinct API endpoint), with natural-language-friendly identifiers (airport codes, dates). This is a solid B-/C+ server, good naming and descriptions, but incomplete output documentation and weak error handling prevent it from reaching B territory.
Get bulk award availability data for a specific mileage program source. Returns all cached availability for the specified program, optionally filtered by cabin, dates, and regions.
Get all available routes for a specific mileage program. Returns origin/destination airport pairs with their regions and distances. Useful for discovering what routes are tracked by seats.aero for a given program.
Get detailed flight-level trip information for a specific availability result. Returns individual flight segments, booking links, durations, mileage costs, and coordinates. Use the availability ID from search_availability or bulk_availability results.
Perform a real-time live search for award availability. Unlike cached search, this queries the mileage program directly for up-to-the-minute results. More accurate but slower and uses more API quota. Returns detailed trip/segment information including mileage costs, taxes, and booking details.
Search for cached award flight availability between airports. This searches seats.aero's cached data which is updated regularly. Returns availability with mileage costs across economy (Y), premium economy (W), business (J), and first (F) cabins.
Output schemas are completely undocumented. All tools return raw JSON responses wrapped in a generic content text field with no field definitions, data types, or structure documentation. Agents cannot infer what fields will be present, their types, or how to extract the data needed for downstream tool calls.
Parameter 'cabin' accepts multiple formats ('economy', 'premium', 'business', 'first') but is declared as a free-form string. No enum constraint is provided. LLMs may hallucinate invalid values like 'first_class' or 'business_class'. Same issue affects 'order_by' (should enumerate 'departure_date' | 'lowest_mileage'), 'origin_region', 'destination_region'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 62 | - | v1 |
Error handling is minimal. When the API returns a non-200 status, the tool throws a generic error with status code and raw response text. No guidance on retryability (is it a rate limit? auth failure? invalid input?), no recovery suggestions, no categorization of errors. LLMs cannot determine if retry, user correction, or alternative tool is needed.
No pagination guidance in tool descriptions. 'take' parameter accepts 10-1000 results but no explicit statement that results will be paginated or how to use 'cursor'. Agents may not understand that large result sets require multiple calls.
Parameter descriptions include example values (e.g. '"SFO" or "SFO,LAX"', '"united,aeroplan"') which LLMs tend to reuse literally. Replace with formal constraints and remove examples.
API key is retrieved via getApiKey() which throws if SEATS_AERO_API_KEY env var is missing. While proper secret injection via environment variables, there is no validation that the key is non-empty and correctly formatted, and no guidance in error messages on how to obtain a key (e.g. 'Get your API key from seats.aero Pro subscription').