A collection of three FastMCP servers (search, booking, expense) for a multi-agent travel and expense management system. Part of the GEAP Workshop demonstrating multi-agent systems with ADK, MCP, evaluation, and observability on Google Cloud.
Server exposes 10 tools across three domains (search, booking, expense) with basic but incomplete definitions. All tools have names starting with action verbs and descriptions present. However, parameter descriptions are minimal (often just type + example), output schemas are not documented, and error handling lacks recovery guidance. Tool composition is reasonable (search → book → manage pattern), but descriptions average ~60 chars, below the 194-char baseline for A+ tools. No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification (READ_ONLY, WRITE, REVERSIBLE). Missing pagination for list_all_bookings and get_user_expenses despite returning unbounded lists.
Book a flight for a passenger.
Book a hotel for a guest.
Cancel an existing booking.
Check if an expense amount is within corporate policy limits.
Get details of an existing booking.
Get all expenses submitted by a specific user.
List all bookings in the system.
Output schemas not documented. Tools return dicts/lists but LLM cannot infer field structure. E.g., search_flights returns flight objects but no schema specifies fields like flight_id, airline, departure_time, price.
No pagination for list_all_bookings() and get_user_expenses(). Both return unbounded lists; no limit, offset, or cursor parameters. Violates pattern:paginated-result and risks context window exhaustion.
Tool annotations missing. Risk metadata (READ_ONLY, WRITE, REVERSIBLE) is documented in the spec but not exposed via readOnlyHint/destructiveHint/idempotentHint. LLM cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Search available flights by origin and destination airport codes.
Search available hotels by city name.
Submit an expense report for reimbursement.
Error handling lacks recovery guidance. cancel_booking and get_booking_details return {'error': '...'} but do not suggest next steps. E.g., 'Booking not found' should suggest 'Try list_all_bookings() to find valid IDs.'
Parameter descriptions are minimal. E.g., 'Expense category (meals, transport, lodging, supplies, entertainment)' lists examples but does not state whether the value is free-form or must match one of those strings. Should use enum constraint or explicit 'must be one of' language.