Look up food products by barcode, search by keyword, tag, allergen, or nutrition filter, compare products side-by-side, and browse the canonical tag vocabulary via MCP. STDIO or Streamable HTTP.
Strong tool definitions with comprehensive descriptions (194 - 1024 chars), well-structured JSON schemas, and clear parameter documentation. All four tools follow verb_noun naming (off_get_product, off_search_products, off_compare_products, off_browse_taxonomy). Descriptions are LLM-optimized, explaining WHAT, WHEN, and WHY. Parameters include type definitions, enums, and constraints. Output schemas are documented. Error handling is present but could be more prescriptive about recovery paths. No security issues detected (read-only tools, no secrets in params). Minor gaps: some parameter descriptions could be more concise; error classification not explicit in tool descriptions.
Resolve a human term to the canonical Open Food Facts tag ID that off_search_products filters on. Covers categories, labels/certifications, allergens, additives, countries, NOVA groups, and Nutri-Score grades. Pass a search term to resolve against the Open Food Facts vocabulary, which holds tens of thousands of tags; omitting it returns only a small reference list for each facet except NOVA groups and Nutri-Score grades, which are complete. Most tag IDs use the "en:" prefix (e.g. "en:organic", "en:no-gluten", "en:crustaceans"); NOVA groups return bare digits "1"-"4" and Nutri-Score grades bare letters "a"-"e". Pass the id through to off_search_products exactly as returned. Category tags are frequently plural ("kombucha" resolves to "en:kombuchas"), so use the returned id rather than constructing one.
Side-by-side nutrition and scoring comparison for 2–10 products by barcode. Returns a normalized table of energy (kcal/100g), fat, saturated fat, sugars, salt, protein, fiber, Nutri-Score, NOVA group, and Green-Score. Designed for "which of these cereals is healthiest?" or "compare these pasta brands" workflows. Missing nutrition data for any product is preserved as absent — comparisons are not imputed. A batch is not all-or-nothing: barcodes that resolve are returned even when others fail, with confirmed-missing barcodes listed in not_found and failed fetches listed separately in failed. Scores carry regional formula caveats. Data under ODbL 1.0 — cite Open Food Facts in downstream use.
Fetch a complete food product record by barcode from Open Food Facts. Returns product name, brands, nutrition facts, ingredients with allergen/vegan/vegetarian status, Nutri-Score, NOVA group, Green-Score, and data completeness. Designed for detailed label inspection and allergen checking. Missing nutrition data is preserved as absent — no imputation. Scores carry regional formula caveats. Data under ODbL 1.0 — cite Open Food Facts in downstream use.
off_search_products: nutrient_filters parameter lacks explicit enum or pattern validation for nutrient field names (sugars_100g, fat_100g, etc.). LLMs may hallucinate invalid nutrient names.
Error responses lack explicit recovery guidance. When a barcode is not found or a tag is invalid, descriptions state the problem but do not guide the LLM to alternative tools (e.g., 'Try off_search_products with a partial name').
off_search_products: Complex parameter interdependencies (query vs tag-only search, additives_tag only on tag-only searches) are documented in description but not enforced via schema constraints. LLMs may pass invalid combinations.
off_browse_taxonomy: Omitting 'search' parameter returns only a 'small reference list' per description, but the actual size and structure are not specified. LLMs cannot predict output size.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 83 | 2026-07-28+ | v2 |
Search Open Food Facts by full-text query, structured tag filters, or both at once. Returns a summary list with barcodes, product names, brands, Nutri-Score, NOVA group, and categories — enough for triage and selection, not full label data. Use off_get_product on the returned barcodes for complete details. A text query and tag filters combine: every word of the query must match the product name, generic name, categories, labels, or brand, and every filter provided must hold (e.g. query "dark chocolate" with labels_tag "en:organic" and countries_tag "en:france" returns organic chocolate sold in France); numeric nutrient_filters express per-100 g thresholds such as sugars below 8 g and combine the same way; additives_tag is the one exception, filtering only on searches carrying neither query nor nutrient_filters. Tag filter values are canonical tag IDs (e.g. "en:organic", "en:no-gluten") — use off_browse_taxonomy to resolve human terms to tag IDs. A case variant, synonym, or singular of a tag is resolved to its canonical ID where Open Food Facts recognizes it; anything else is matched exactly. exclude_allergens and exclude_traces drop products that declare an allergen or a "may contain" trace, but a product with no allergen or trace data entered passes them, so confirm a candidate with off_get_product before relying on it. At least one search parameter is required. The two paths read different indexes: a search carrying query is answered by the text index, a snapshot that lags the live database, while a tag-only search reads the live database and is current — so a recently contributed product can be missing from a text search and present in the same search without query. Data is crowd-sourced; result count reflects contributed products, not all products in the market. Data under ODbL 1.0 — cite Open Food Facts in downstream use.
All tools return data under ODbL 1.0 license with a citation requirement, but no tool description explicitly states this is a legal/compliance constraint the LLM must communicate to users.