MCP server exposing flight history read/write tools for personal flight tracking database. Provides tools to manage flights, trips, aircraft, badges and flight history with integration to FlightAware for aircraft registration lookup.
Three read-only tools with complete input schemas and descriptions. Naming follows verb_noun pattern (list_, get_, search_). Descriptions are detailed (100-200 chars) and explain filtering behavior. However, output schemas are not documented in the visible code, LLMs cannot predict response structure. Parameters lack enums for constrained values (e.g., 'status' accepts 'approved'|'draft'|'any' but is free-form string). No error handling guidance visible. Tool composition is reasonable (list vs get vs search), but missing pagination metadata in descriptions.
Fetch a single flight by id, including AirNav history if present. `group` says whether the record is one of several for the same flight and which of them (the newest, `primary_id`) statistics and lists report.
List flights with optional filters. `origin` / `destination` match against airport codes or city names (ilike). `q` is a free-text search across flight number, airline, airport, city, aircraft, registration and trip name; it also matches values held only by an older duplicate of a flight. `status` is 'approved' (default), 'draft' (inbox), or 'any'. Flights sharing a `grouping_id` are one flight recorded more than once. Only the group's primary (newest) record is returned and counted in `total` unless `include_group_members` is true. Every flight carries a `group` entry (grouping_id, primary_id, is_primary, member_ids), or null when it is not grouped.
Free-text search across flights — shorthand for list_flights(q=...).
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Visible code shows tool definitions but no return type annotations or response examples.
Constrained parameters use free-form strings instead of enums. 'status' accepts 'approved'|'draft'|'any' but is typed as Optional[str]. LLMs may hallucinate invalid values like 'pending' or 'active'.
Pagination parameters (limit, offset) lack documented bounds. Rubric baseline: numeric params should specify min/max (e.g., limit 1 - 500). Current code shows limit default 50, max 500 in docstring but not in schema.
No error handling guidance. Tools return dict[str, Any] but no documentation of error cases, recovery steps, or what fields indicate failure. LLMs cannot self-correct on invalid input.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
search_flights is a thin wrapper around list_flights(q=...). Rubric: avoid multiple tools doing the same thing differently. This adds cognitive load without clear differentiation.