MCP server for searching flights using Google Flights API via SerpAPI and Duffel API
This server has 4 tools with partial schemas and descriptions, but significant gaps in quality. All tools have basic descriptions (10-100+ chars), and most have input schemas with type definitions, but lack critical depth. Parameters are largely undescribed or under-specified. No output schemas are documented. Error handling is minimal, most tools just raise generic exceptions. The tool names are reasonably verb-forward (search_*, get_*, create_*), but parameter naming is inconsistent (departure_id vs from/to in legs array). Critical issue: tools are mixing concerns (search_multi_city accepts free-form legs array instead of structured parameters like origin/destination), and there is no guidance on when to use one tool vs another. The server exposes external API calls directly without adequate input validation or error recovery. Overall, the implementation is functional but would not pass code review for a production agent toolkit.
Create a Duffel Offer Request and return offers (each has an id you can book). For one-way set only the outbound slice; for round-trip include both slices.
Get details for a specific flight.
Search for flights between two airports.
Search for multi-city/complex itinerary flights using SERP API
Output schemas are not documented. No tool explicitly specifies what fields are returned or their types. LLMs cannot infer whether a response contains flight_id, offer_id, price, or availability, forcing them to guess downstream parameter names and risk failed tool chains.
Parameter descriptions are missing or trivial. 'departure_id' just says 'Departure airport code', no guidance on format (3-letter IATA?), examples, or error recovery if an invalid code is passed. 'legs' array has no description of the nested structure or what happens if dates are malformed.
get_flight_details accepts only 'flight_id' but does not explain how to obtain a flight_id (search_flights output?) or what format it expects. This forces an LLM to assume flight_id exists in search results without confirmation, risking malformed calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
search_multi_city and search_flights appear to solve overlapping problems (round-trip flights). The distinction is unclear, when should an LLM choose search_multi_city over search_flights with return_date? No guidance on composition or trade-offs.
Error handling is minimal. Tools raise generic 'API Error: {status} - {text}' exceptions without actionable recovery guidance. An LLM receiving an HTTP 400 from SerpAPI has no idea whether to retry, fix parameters, or abort. No error classification (retryable, user-fixable, fatal).
API keys (SERPAPI_API_KEY, DUFFEL_TOKEN) are loaded from environment variables inside tool functions, which is correct for server-side injection. However, if an API key is missing or invalid, the tool raises an exception inside the tool logic rather than failing early, this delays error discovery.
search_multi_city requires 'legs' as a list of dicts with 'from', 'to', 'date' keys, but no formal schema validation. If an LLM passes {"from": null, "to": null, "date": "invalid"}, the tool will fail at API call time with a cryptic error instead of validating inputs upfront.
Parameter defaults are reasonable (economy, 1 adult) but travel_class mapping is incomplete. search_flights hardcodes 'business' → '3' but only mentions 'economy' in description. What about premium_economy or first class? LLMs may pass unsupported values.