Production-survival Python MCP server template — Tools, Resources, Prompts; Streamable HTTP transport; OpenTelemetry + Jaeger observability; JSON-RPC healthcheck; Docker compose stack; ADR-light decisions documented.
PantryMCP demonstrates solid fundamentals: all 4 tools have clear verb-noun naming (get_recipe, search_recipes, update_pantry, generate_meal_plan) and descriptions present. Input schemas are well-structured with type definitions and parameter descriptions. However, output schemas are not documented in the source code provided, and descriptions lack depth on error handling and recovery paths. The generate_meal_plan tool claims 'Long-running task with progress reporting' but progress feature is marked false, creating a spec mismatch. Parameter descriptions are adequate but could be more prescriptive about constraints (e.g., days range 0-30 is stated but not enforced in schema).
Generate a meal plan for the specified number of days. Long-running task with progress reporting. Searches for recipes matching your dietary preferences and composes a daily meal plan.
Fetch a recipe by ID from the PantryAPI.
Search for recipes by query, cuisine, with pagination support.
Bulk update pantry inventory items with quantities.
Output schemas not documented. Tools return data but LLMs cannot plan downstream calls without knowing response structure (e.g., does get_recipe return ingredients array? recipe_id field?). Violates pattern:tool requirement for documented return types.
generate_meal_plan description claims 'Long-running task with progress reporting' but progress feature is marked false in server metadata. This creates a spec mismatch, either implement progress reporting or remove the claim from description.
Parameter constraints stated in descriptions (e.g., 'days 0-30', 'limit default 10') are not enforced in JSON Schema. LLMs cannot read prose constraints reliably. Use schema minimum/maximum and enum fields.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
update_pantry accepts array of items but no error handling documented for partial failures (e.g., 3 of 5 items updated). Pattern:response-shaper requires per-item success/failure reporting.
search_recipes returns 'cursor' for pagination but no documentation of cursor format or total count. LLMs cannot reason about pagination without knowing result cardinality.