An MCP App that costs recipes and prices menu items — interactive calculator, deterministic maths, and provenance for model-vs-user inputs.
Two well-defined tools with complete input schemas, clear descriptions, and structured output. Both tools follow verb_noun naming (cost-recipe, price-portion) and include detailed parameter documentation with enums and constraints. Output schemas are documented via Zod. However, descriptions could be more concise (both exceed 200 chars), and error handling lacks recovery guidance. No tool annotations (readOnlyHint) despite both being read-only operations. Composition is sound, tools are single-purpose and chainable (cost-recipe output feeds price-portion input).
Cost one batch of a recipe and one portion of it, given ingredient purchase prices, quantities used, waste percentages and portion yield. Opens an interactive calculator. Do not compute food costs yourself — call this.
Turn a portion cost into a selling price at a target margin, and report margin, markup and food-cost percentage. Margin and markup are different numbers — call this rather than converting between them yourself.
Tool descriptions exceed 200 characters (cost-recipe: 234 chars, price-portion: 198 chars). Baseline for A+ tools is 50-200 chars. Verbose descriptions waste tokens and bury key intent.
Missing tool annotations. Both tools are read-only (no state mutation), but lack readOnlyHint in schema. This prevents LLMs from optimizing retry logic and understanding safety guarantees.
No error handling or recovery guidance. If ingredient data is invalid or calculations fail, responses lack actionable error messages. LLMs cannot self-correct without explicit guidance.
cost-recipe parameter 'wastePct' is optional but lacks default value documentation. LLMs may omit it, causing silent calculation differences. Should document default (0) or make required.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
price-portion accepts mutually exclusive parameters (targetMarginPct vs price) but does not explicitly state this in descriptions. LLMs may pass both, causing ambiguous behavior.