MCP server wrapping the Meals REST API with task-level tools for AI assistants
Two tools with clear, detailed descriptions (194 - 250 chars, well above the 34-char p10 baseline). Both have input schemas with typed parameters. However, output schemas are not documented in the visible code, and parameter descriptions lack constraint details (ranges, enums, format specs). Tool names follow verb_noun convention (ingest_recipe, reparse_recipe) but are domain-specific rather than generic action verbs. No error handling guidance visible. Descriptions explain WHAT and WHEN but lack recovery hints for failure cases.
Add a recipe from a URL. Cached recipes return instantly; new pages are parsed from their JSON-LD. Only public http(s) pages are fetched — a URL on a private network is refused. If the page has no structured data, or the site blocks the server's fetch, this tool tells you to read the page yourself and call submit_recipe instead.
Re-read a recipe from the page it came from, when the source has been corrected. Recipes are parsed once and reused forever, so this is the only way to pick up a change — and it is never automatic. The recipe keeps its id, its cooked history and its place in any meal, and the shopping list follows the new ingredients. A recipe the household has edited is refused unless force=True, because re-parsing would replace those corrections with whatever the page says now: ask before forcing it.
Output schemas not documented. LLMs cannot infer what fields ingest_recipe and reparse_recipe return, forcing them to guess downstream field names and risk broken tool chains.
Parameter descriptions lack constraint details. 'url' and 'recipe' parameters have no format specs, length limits, or examples. 'force' boolean has no guidance on when to set it true.
No error handling guidance. Descriptions mention 'refused' and 'tells you to read the page yourself' but do not explain what error code/message the LLM will receive or how to recover.
Tool names are domain-specific (ingest_recipe, reparse_recipe) rather than generic action verbs (fetch_recipe, update_recipe). This reduces discoverability when LLMs have many tools available.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No idempotency guarantees documented. reparse_recipe modifies state (updates ingredients, shopping list) but does not state whether repeated calls with the same input are safe.