Food Travel MCP Server that exposes restaurant search tools powered by Google Places API
Single tool with reasonable naming and basic schema present, but critical gaps in description quality, output schema documentation, and error handling guidance. The tool name 'search_restaurants' follows verb_noun convention and is clear. Input schema is visible with types and descriptions for all parameters. However, the tool description (107 chars) falls short of best practices, and there is NO documented output schema, LLMs cannot plan downstream calls without knowing what fields to expect. Error handling returns JSON blobs with 'success' and 'error' fields, but provides no recovery guidance. Parameter descriptions are present but lack detail on valid ranges, constraints, or dependency hints. No mention of pagination, result limits, or idempotency. The codebase shows basic error logging but no strategic error classification.
Search for restaurants based on location and preferences.
No documented output schema. Tool description says it returns 'List of restaurants with details like name, address, rating, etc.' but does not specify the structure, field types, or required fields. LLMs cannot extract data or plan follow-up calls without knowing what to expect.
Tool description is too short (107 chars) and lacks context for LLM selection. Does not explain WHEN to use this tool vs alternatives, or clarify that it searches restaurants only (not hotels, flights, etc.). Baseline average is 194 chars; best practice is 150-250.
Parameter descriptions lack actionable constraints. 'location' description does not specify acceptable formats beyond examples (e.g., does it accept 'NYC' or only full addresses?). 'radius_km' and 'max_results' have no min/max bounds stated, inviting LLMs to pass invalid values like radius_km=999999 or max_results=-1.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 47 | - | v1 |
No pagination support documented. Tool accepts 'max_results' but does not mention offset, page, or cursor parameters. If actual results exceed max_results, LLM has no way to fetch more. Returns only a flat count; no 'next_cursor' or pagination metadata.
Error responses do not guide recovery. Errors return a generic JSON with 'error: str(e)', e.g., 'InvalidInput: location must be a valid address'. LLM receives no hint on what to try next. Per pattern:recovery-guide, errors should suggest 'Try with a full address like "New York, NY" or coordinates like "40.7128,-74.0060".'
Missing tool annotation hints. No indication whether tool is read-only, destructive, or idempotent. The 'read_only' risk classification is declared in the source but not exposed via MCP toolAnnotations. Spec 2026-07-28 supports readOnlyHint, destructiveHint, idempotentHint, none are used.
No idempotency guarantee stated. If an LLM retries a search_restaurants call with identical params, will it return the same results or different results (e.g., due to real-time data changes)? Pattern:idempotent-operation requires this clarity.
No result limits enforced or documented. Tool description does not state a hard cap on results returned. If Google Places API returns 1000 restaurants, returning all of them would blow context windows. Best practice is to cap at 20-50 and offer pagination.