An MCP server that lets AI agents search flights and stays through the Duffel API. A developer-first replacement for Amadeus Self-Service.
Three tools with clear verb-noun naming (search_flights, get_offer, search_stays) and solid descriptions (150-180 chars each). All parameters have type definitions and descriptions. Schemas use Zod with proper enums and optional markers. Output structure is JSON-formatted but not formally documented in the tool definitions. Error handling returns actionable messages ('search_flights failed: <message>'). Main gaps: no output schema documentation, no pagination support despite potentially large result sets, no parameter constraints (min/max for numeric fields), and no idempotency hints for read-only operations.
Get the full, freshest detail for a single flight offer by id (from search_flights), including current price, conditions, and available services.
Search flight offers via Duffel. Give origin and destination as IATA codes (airport like 'LHR' or city/metro like 'NYC'), a departure_date (YYYY-MM-DD), and optionally a return_date for a round trip. Returns a ranked list of offers with price, airline, and segments.
Search accommodation via Duffel Stays around a location (latitude/longitude) for a date range. Requires Stays to be enabled on your Duffel account. Returns accommodations with rating and cheapest rate.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'ranked list of offers with price, airline, and segments') but do not formally specify the JSON structure, field types, or nesting. LLMs cannot reliably extract or chain results without explicit schema.
No pagination or result limits enforced in tool definitions. search_flights and search_stays accept a 'limit' parameter but lack documented max values, defaults, or guidance on handling large result sets. Returning hundreds of offers could exhaust context windows.
Numeric parameters lack min/max constraints. 'adults', 'limit', 'radius_km', 'max_connections' have no documented bounds. LLMs may pass absurd values (e.g., 1000 adults, -5 km radius) that break API calls or cause timeouts.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, idempotentHint). All three tools are read-only and idempotent, but this is not declared in the tool metadata. Clients cannot infer safety properties without explicit hints.
Date format validation not enforced. 'departure_date', 'return_date', 'check_in_date', 'check_out_date' are documented as YYYY-MM-DD but lack regex patterns or format constraints in schemas. LLMs may pass invalid dates (e.g., '2026-13-45').