UPC/PLU product lookup MCP server with Open Food Facts database integration for barcode and produce lookups
Three tools with clear verb-noun naming (lookup_*, search_*) and reasonable descriptions (120-180 chars). All have input schemas with type definitions. However, parameter descriptions lack actionable constraints (e.g., barcode length rules, PLU format details are in description but not formalized). Output schema is undocumented, LLMs cannot predict response structure. Error handling is basic (generic text responses, no recovery guidance). No tool annotations (readOnlyHint, idempotentHint). Missing pagination for search_product despite potentially large result sets.
Look up a fruit or vegetable by PLU (Price Look-Up) code. PLU codes are 4-5 digit numbers used at grocery store produce sections. E.g., 4011=yellow banana, 4062=lemon.
Look up a product by UPC, EAN, or GTIN barcode. Returns product name, brand, nutrition facts, ingredients, packaging, origin, eco-score, and image. Uses the Open Food Facts database (4M+ products).
Search the Open Food Facts database by product name, brand, or category. Returns matching products with barcodes you can pass to lookup_upc for full details.
Output schema undocumented. LLMs cannot predict response structure (markdown text vs structured fields). Violates pattern:tool requirement that output schema be documented.
Parameter constraints not formalized in schema. Barcode length (8-14 digits) and PLU format (4-5 digits) are validated in code but not declared as minLength/maxLength in inputSchema. LLMs cannot read code validation.
search_product lacks pagination. limit parameter caps at 10, but no offset/page or next_cursor returned. Large result sets will be truncated silently, and LLM cannot fetch additional results.
No tool annotations. All three tools are read-only and idempotent, but lack readOnlyHint and idempotentHint in schema. Agents cannot infer safety properties without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Error responses are plain text, not structured. No recovery guidance (e.g., 'Try search_product() first'). Violates pattern:recovery-guide, errors should tell LLM what to do next.