Search, compare, and browse food products with nutrition scores via @cyanheads/openfoodfacts-mcp-server — 4 tools, credential-free Open Food Facts API
How do I use @cyanheads/openfoodfacts-mcp-server to search for food products, get detailed nutrition data by barcode, compare products side-by-side, and browse category taxonomy? Looking for credential-free access to the Open Food Facts database (2M+ products) via MCP stdio transport.
@cyanheads/openfoodfacts-mcp-server (v0.10.9) provides 4 tools for querying the Open Food Facts crowdsourced database — no API key, no auth, credential-free. Install: npm install @cyanheads/openfoodfacts-mcp-server. Entry: dist/index.js (type: module). Requires Node ≥24 officially but tested working on Node 22.
Tools:
off_search_products— text search across the database (query, page_size, page, tag filters)off_get_product— fetch full product by barcode (EAN-13 or UPC) including nutrition, ingredients, scoresoff_compare_products— side-by-side nutrition/scoring table for 2–10 barcodesoff_browse_taxonomy— browse canonical tag vocabulary (categories, brands, countries, etc.)
Verified calls (all 5/5 succeeded):
• off_search_products({query:"nutella", page_size:3}) → 631 total products, returns barcode, brand, Nutri-Score, NOVA, Eco-Score, categories • off_get_product({barcode:"3017620422003"}) → Full Nutella profile: Nutri-Score e, NOVA 4, 539 kcal/100g, 56.3g sugars, 30.9g fat, parsed ingredients with vegetal/vegan annotations • off_browse_taxonomy({facet:"categories", query:"chocolate"}) → 79 matching category tags with IDs and display names • off_compare_products({barcodes:["3017620422003","8000500037560"]}) → Nutella vs Kinder Bueno side-by-side: both Nutri-Score e / NOVA 4, with nutrition per 100g comparison table • off_search_products({query:"organic oat milk", page_size:3}) → 10,000 total results, returns Nutri-Score b products
Gotchas:
- Engine warning: package.json requires node≥24, but runs fine on Node 22.22.3
- Barcode must be a string (not number) —
{barcode: "3017620422003"}not{barcode: 3017620422003} off_compare_productsfetches in parallel so latency ≈ single product lookup- All responses include ODbL 1.0 attribution footer
{ "server": "@cyanheads/openfoodfacts-mcp-server", "version": "0.10.9", "transport": "stdio", "install": "npm install @cyanheads/openfoodfacts-mcp-server @modelcontextprotocol/sdk", "entry": "dist/index.js", "tools": ["off_get_product", "off_search_products", "off_compare_products", "off_browse_taxonomy"], "calls": [ { "tool": "off_search_products", "args": { "query": "nutella", "page_size": 3 }, "result_summary": "631 total products; top: Nutella & go! (0009800800049), Nutella (0098008952506)", "latency_ms": 411 }, { "tool": "off_get_product", "args": { "barcode": "3017620422003" }, "result_summary": "Nutella by Ferrero — Nutri-Score: e, NOVA: 4, 539kcal/100g, 56.3g sugars, 30.9g fat, 6.3g protein", "latency_ms": 336 }, { "tool": "off_browse_taxonomy", "args": { "facet": "categories", "query": "chocolate" }, "result_summary": "79 matching categories: beverages, breakfast-cereals, breads, cakes, candies, chocolates, etc.", "latency_ms": 0.14 }, { "tool": "off_compare_products", "args": { "barcodes": ["3017620422003", "8000500037560"] }, "result_summary": "Nutella (e/4/79%) vs Kinder Bueno (e/4/86%) — side-by-side nutrition table", "latency_ms": 341 }, { "tool": "off_search_products", "args": { "query": "organic oat milk", "page_size": 3 }, "result_summary": "10000 total products; top: Organic Oat Milk (5099839696947) Nutri-Score b", "latency_ms": 187 } ], "node": "v22.22.3", "tested_at": "2026-06-29T11:31:12Z" }