MCP server for searching flight offers using the Amadeus API
Single tool server with mixed quality. Tool naming is clear and verb-based (search_flight_offers). Description is adequate (116 chars, within range). Schema is properly defined with types and descriptions for all 14 parameters. However, there are significant gaps in error handling guidance, output schema documentation, and parameter constraints are incomplete. The tool lacks enum constraints for travelClass despite known valid values (ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRST). Input validation exists in code but error messages are generic JSON responses without actionable recovery guidance. Output is raw API passthrough without pagination or field stripping, violating the strip-api-responses pattern. No structured output schema documented for the LLM.
Search for flight offers using the Amadeus API
Output schema not documented for LLM. Tool returns raw Amadeus API response (response.body) without documenting expected fields, structure, or pagination. LLMs cannot plan downstream actions without knowing what data is available.
Enum constraints missing for travelClass parameter. Description lists valid values ('ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRST') as text, not as formal JSON Schema enum. LLMs cannot validate against these constraints and may hallucinate invalid values.
Error responses lack actionable recovery guidance. When adults validation fails, tool returns JSON {"error": "Adults must be between 1 and 9"} without suggesting what the LLM should do next. Should guide: 'Invalid adults count. Please provide a number between 1 and 9.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 45 | - | v1 |
No pagination support. Tool returns up to 250 results (default max=250) with no next_cursor or pagination controls. Large result sets will bloat context and risk exhausting token budget. No mechanism for returning only essential fields.
Parameter format constraints undocumented. departureDate and returnDate expect ISO 8601 (YYYY-MM-DD) but lack formal pattern declaration. currencyCode expects ISO 4217 codes but format is not enforced. LLMs may pass malformed dates.
No bounds declared for numeric parameters. maxPrice has no documented minimum/maximum. max defaults to 250 but range is not specified. Unbounded parameters allow LLMs to pass absurd values (negative prices, max > 10000).
Generic validation error messages. ResponseError catch block returns raw Amadeus API error wrapped as {"error": str(error)}. Amadeus error messages are often technical or unhelpful to LLMs. Should translate to actionable guidance: invalid dates, unsupported routes, quota exceeded, etc.