MCP server for shopping across multiple grocery vendors (Rami Levy, Keshet, Shufersal) with agent-based shopping assistance
The Groceries MCP server has significant definition quality issues. Tool naming is adequate (verb-noun pattern), but descriptions are extremely brief and lack the specificity needed for LLM decision-making. Parameter schemas are present but minimal, types are declared but descriptions are generic. Most critically: duplicate tool definitions (three identical 'search' tools), missing output schema documentation, no error handling guidance, and inadequate parameter descriptions. The server exposes write operations (add/remove cart items, user authorization) with minimal constraints or confirmation patterns. Schemas lack validation metadata (ranges, enums, constraints). This represents a typical community server with functional but low-quality definitions.
Add groceries to basket. Result is updated cart
Remove groceries from basket. Result is updated cart
Lookup for item on the provider site, search should be in hebrew
Lookup for item on the provider site, search should be in hebrew
Lookup for item on the provider site, search should be in hebrew
Allow the user to authorize - this should be done manually by the user
Three identical 'search' tools registered, violates single responsibility principle and creates ambiguity. LLM cannot distinguish which provider-specific search to invoke.
Parameter descriptions are generic and lack actionable constraints. 'Quantity to add' and 'Quantity to remove' do not specify units, ranges, or format. 'Product identifier' lacks guidance on how to obtain valid IDs (from search results?).
Tool descriptions are too brief (8-33 characters) to guide LLM selection. No explanation of when to use each tool, prerequisites, or side effects. Pattern baseline is 194 chars average; these are 80% shorter.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 9 | - | v1 |
No output schema documentation visible. The code returns JSON-formatted text, but there is no formal schema defining the structure, required fields, or types that the LLM should expect in responses.
Destructive operations (add_items_to_cart, remove_items_from_cart, user_authorization) lack confirmation or dry-run capability. No risk mitigation for accidental cart modifications or unauthorized user access.
No error handling guidance. Code returns success/failure as JSON text, but there is no documented error classification (retryable vs. fatal), recovery steps, or actionable error messages for the LLM.
'user_authorization' is vague: does it prompt the user manually, require OAuth, or set a flag? Description 'Allow the user to authorize - this should be done manually by the user' lacks clarity on how the LLM should invoke it or what result it produces.
'search' description says 'search should be in hebrew' but does not explain what happens if the query is in another language. Does the tool translate? Reject? Assume translation by caller? Ambiguous.
No pagination parameters documented. search() returns a 'items' list but no 'limit', 'offset', 'page', or 'total_count' fields are mentioned. Result capping behavior is unknown.
Quantity parameter type is 'string', not 'number'. This forces the LLM to convert numeric quantities to strings, increasing error likelihood and wasting reasoning cycles.