Barcode lookup, nutrition search, and product comparison for 3M+ crowd-sourced food products.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Look up food products by barcode, search by ingredient or nutrition filter, compare products side-by-side, and browse the canonical tag vocabulary via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://openfoodfacts.caseyjhand.com/mcp
Four tools for working with Open Food Facts β a free, crowd-sourced database of 3M+ packaged food products:
| Tool | Description |
|---|---|
off_get_product | Fetch a packaged food product by barcode. Returns name, brand, quantity, ingredients, allergens, additives, Nutri-Score, NOVA group, Green-Score, nutrition per 100g/serving, categories, labels, and data completeness. |
off_search_products | Search by text query and/or structured tag filters (category, brand, label, allergen, additive, Nutri-Score grade, NOVA group, country). Returns summary rows with barcodes for follow-up lookups. |
off_compare_products | Side-by-side nutrition and scoring comparison for 2β10 products by barcode. Returns a normalized table of energy, macros, salt, Nutri-Score, NOVA, and Green-Score. |
off_browse_taxonomy | Resolve a human term to the canonical tag ID (categories, labels, allergens, additives, countries, NOVA groups, Nutri-Score grades) that off_search_products filters on, against the live Open Food Facts taxonomy. |
off_get_productFetch a packaged food product by barcode (EAN-13 or UPC).
fields parameter restricts the response to a subset (e.g., scores only, or nutrition only)not_found error carrying a recovery hint β it is never returned as an empty resultoff_search_productsSearch Open Food Facts by text and/or structured tag filters.
categories_tag, brands_tag, labels_tag, allergens_tag, additives_tag, nutrition_grade (aβe), nova_group (1β4), countries_tagquery: "dark chocolate" + labels_tag: en:organic + countries_tag: en:france)off_browse_taxonomy to resolve human terms (e.g., "organic" β en:organic). brands_tag takes a brand slug and matches it exactly; open-ended brand wording belongs in queryadditives_tag filters only on searches with no text query β the text backend does not index additives, so pairing the two is rejected up front rather than returning an empty result set that looks like "no such product"page (1-based) and page_size (1β50, default 20)total is exact on tag-only searches. Text searches stop counting at 10,000 matches, and when that ceiling is hit the response says so with total_is_lower_bound: true and renders the count as 10000+ β add filters for an exact figurepage * page_size is rejected up front with the highest reachable page, not sent and retried. Tag-only searches publish no window, but deep pages are refused unpredictably, so narrowing the filters beats paging far inoff_get_product for full label dataoff_compare_productsSide-by-side nutrition and scoring comparison for 2β10 barcodes.
null β comparisons are not imputed or estimatednot_found list identifies barcodes with no contributor record (partial results are not an error)failed list identifies barcodes whose fetch failed, with the per-barcode reason β kept separate from not_found, which claims the opposite. A failed barcode never blocks the rows that resolvedoff_browse_taxonomyResolve a human term to the canonical Open Food Facts tag ID before building off_search_products filters.
categories, labels, allergens, additives, countries, nova_groups, nutrition_gradessearch term, the five open facets resolve against the live Open Food Facts taxonomy β tens of thousands of category tags, not a fixed local list. Matching is case-insensitive substring against tag ID or display name (e.g., "gluten" β en:no-gluten, en:gluten-free)"kombucha" β en:kombuchas) β pass the returned id through unchanged rather than constructing onenova_groups and nutrition_grades are closed vocabularies answered offline and returned complete. Their IDs are bare (1β4, aβe), matching what off_search_products acceptssearch lists only the offline sample. The upstream taxonomy endpoint suggests against a term and cannot enumerate a facet, so an unfiltered call is not a view of the full vocabulary and reports no facet totallimit controls results returned (1β100, default 20). There is no offset or page input β the upstream endpoint offers no cursor, so narrow the term insteadBuilt on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1Open Food Facts-specific:
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/openfoodfacts-mcp-server)<a href="https://allmcps.com/mcp/openfoodfacts-mcp-server"><img src="https://allmcps.com/api/badge/openfoodfacts-mcp-server?style=directory" alt="Openfoodfacts MCP Server on AllMCPs" /></a>