Corporate travel MCP that searches flights, applies travel policy, and ranks recommendations.
Strong foundation with well-structured schemas and detailed descriptions. All 5 tools have clear input schemas with type constraints (enums, regex patterns, min/max). Descriptions are comprehensive (100-400+ chars) and explain WHAT, WHEN, and WHY. However, output schemas are not documented, LLMs cannot predict response structure. Tool naming is clear but 'search_and_recommend_flights' violates single-responsibility (combines search + ranking + policy evaluation). Error handling guidance is minimal. Security considerations (policy override mechanism) are well-documented but no explicit error recovery patterns.
Evaluates a specific flight (by id from the last search_flights call) against a policy JSON file and returns compliance, violations, and whether it needs approval.
Searches Google Flights and evaluates every result against a policy file, returning only compliant options (plus a summary of how many were rejected and why), sorted by price.
Searches Google Flights for a route, labels every result as in-policy or out-of-policy, scores and ranks them by your travel preferences (nonstop, alliance, red-eye avoidance, cheapest/fastest/balanced), and returns them best-match-first. Does NOT visit any airline or OTA site and does not attempt to book anything — it returns a Google Flights results link for you to complete the booking yourself. This is a technology demonstration of policy-aware flight recommendations, not a production booking agent. Before calling this without policyOverride/preferencesOverride, check whether the user has their own local policy.json and/or user_preferences.json (e.g. in their home directory or a project folder they mention) — if so, read it and pass its contents via policyOverride/preferencesOverride so results reflect their personal policy rather than this shared server's default. This is the intended way for different users to bring their own policy without changing the server for everyone else.
Searches Google Flights for a route and returns structured flight options (airline, times, stops, price). Does not check policy or book anything.
Output schemas not documented. LLMs cannot predict response structure (flight objects, fields, pagination). Responses must include: flight_id, airline, departure_time, arrival_time, price, stops, policy_status, violations_list.
Tool 'search_and_recommend_flights' combines three responsibilities: search + policy evaluation + ranking. Should split into separate tools (search_flights already exists; add rank_flights_by_preference and evaluate_policy_compliance as distinct tools).
No error recovery guidance. Tools lack actionable error messages. E.g., if policy.json is missing, return 'Policy file not found at ./policy.json. Provide policyOverride parameter or set POLICY_PATH env var.' instead of a bare error.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
Re-validates the chosen flight against policy, then drives Google Flights through fare selection to the airline/OTA site and best-effort fills traveler details. ALWAYS stops before any payment field or purchase button — it never enters payment info or completes a purchase. Returns a report of what was filled, what wasn't, and the URL/screenshot where a human needs to take over. If the flight is out of policy, booking is refused unless acknowledgeOutOfPolicy is explicitly set to true.
start_booking is a WRITE tool (modifies browser state, fills forms) but lacks idempotency guarantees or confirmation step. If called twice with same flightId, could trigger duplicate form submissions. Add idempotentHint annotation and document retry behavior.
Parameters 'policyPath' and 'policyOverride' are mutually exclusive but not documented as such. LLMs may pass both, causing ambiguity. Add explicit note: 'Either policyPath (file) OR policyOverride (inline JSON), not both.'