# Reported issues for openfoodfacts-mcp-server

Pod holds 17 of 17 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to [openfoodfacts-mcp-server](/mcp/openfoodfacts-mcp-server).

## Most discussed

### bug(off_get_product): field subsets drop dependent fields and misreport them

### Server version

0.3.3

### mcp-ts-core version

^0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`off_get_product`'s `fields` subset is forwarded to Open Food Facts verbatim, so a field the response needs to be readable is never fetched when the caller did not name it. The text response then attributes the gap to Open Food Facts, which has the data.

Three cases, all from the same cause:

1. `fields: ["nutriments"]` returns…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/23) · 2026-08-11 · closed · 3 comments

### bug(off_search_products): text queries match only English name fields, missing products named in other languages

### Server version

0.3.5

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

The text search sends no `langs`, so [search-a-licious](https://github.com/openfoodfacts/search-a-licious) falls back to `["en"]` and matches `query` only against the English subfields of product and generic names, categories, and labels, plus `brands`. A product named only in French, German, Russian, or another language is…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/47) · 2026-09-23 · closed · 1 comment

### bug(barcode): off_get_product and off_compare_products reject 4–7 and 15–40 digit codes Open Food Facts serves

### Server version

0.3.5

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`off_get_product` and `off_compare_products` validate barcodes against `^\d{8,14}$`, so codes Open Food Facts serves are rejected before any request is sent. `off_search_products` returns those codes as `barcode` and tells callers to pass them to `off_get_product`. [Product…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/46) · 2026-09-23 · closed · 1 comment

### bug(off_search_products): tag-only searches refuse every page past 10, but the tool sends them and calls the limit unpredictable

### Server version

0.3.4

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

Tag-only searches (no `query`, no `nutrient_filters`) go to `/api/v2/search`, which refuses every page past 10 for clients that are not logged in. [Product Opener](https://github.com/openfoodfacts/openfoodfacts-server/blob/main/lib/ProductOpener/Display.pm) answers `page > 10` from an unidentified user with HTTP 401 and a rendered…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/44) · 2026-09-22 · closed · 1 comment

### feat(off_search_products): allergen/trace exclusion, vegan-verdict, and multi-label filters

### Use case

Allergy and diet shoppers ask for "nut-free chocolate sold in the US" or "vegan protein bars". `off_search_products` can only select products that *declare* one allergen. It cannot exclude an allergen or a "may contain" trace, filter on the vegan/vegetarian/palm-oil verdicts `off_get_product` returns, or require two labels. The workaround is screening every candidate with `off_get_product`, about one page per minute at the 15/min product budget.

Related: #32, #39

### Proposed…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/41) · 2026-09-22 · closed · 1 comment

### bug(off_get_product): parsed ingredients drop nested sub-ingredients

### Server version

0.3.4

### mcp-ts-core version

0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`off_get_product` keeps only the top level of the parsed `ingredients` tree. Open Food Facts nests sub-ingredients in `ingredients[].ingredients`, but `RawIngredient` does not declare that array and `buildProductOutput` never reads it. Nested entries are missing from `structuredContent` and `content[]`, with no sign the list was…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/40) · 2026-09-22 · closed · 1 comment

### bug(off_search_products): text path matches tag values literally, so a value the tag path accepts returns an exact zero

### Server version

0.3.4

### mcp-ts-core version

0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`/api/v2/search` canonicalizes tag values: case, synonyms, plurals, and a missing language prefix. The text backend's `*_tags` fields are exact-match keywords, and `buildTextSearchQuery` quotes the value verbatim. So a value that works on a tag-only search returns an exact `total: 0` once `query` or `nutrient_filters` is added. The…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/39) · 2026-09-22 · closed · 1 comment

### bug(off_search_products): multi-word query terms are OR-ed, so total counts products matching any word

### Server version

0.3.4

### mcp-ts-core version

0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

The text backend ORs the words of a multi-word `query`. `total` counts products matching *any* word, and a word that matches nothing is dropped silently, which contradicts "results match the query text". The deployed [search-a-licious](https://github.com/openfoodfacts/search-a-licious) (the v1.4.0 query path) sends bare words to…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/38) · 2026-09-22 · closed · 1 comment

## Most recent

### bug(openfoodfacts-service): an HTML-bodied 4xx is blamed on load shedding, and a 501 is retried as transient

### Server version

0.3.4

### mcp-ts-core version

0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

Upstream-failure classification lets the retry flag and the message disagree. An HTML-bodied 401 is correctly non-retryable: [Product Opener](https://github.com/openfoodfacts/openfoodfacts-server/blob/main/lib/ProductOpener/Display.pm) answers anonymous clients 401 with a rendered error page for every search page past 10. The…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/37) · 2026-09-18 · closed · 1 comment

### bug(off_search_products): a hit with no code yields barcode "", hidden by a double type cast

### Server version

0.3.3

### mcp-ts-core version

0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### Description

`RawProduct` declares no `code`, so the barcode moves through two unchecked casts: `...({ code: hit.code } as unknown as Partial<RawProduct>)` in `openfoodfacts-service.ts`, and `((p as unknown as Record<string, unknown>).code as string) ?? ''` in `search-products.tool.ts`. A row without `code` becomes `barcode: ""`, which `off_get_product`…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/35) · 2026-09-17 · closed · 1 comment

### feat(off_search_products): honor sort_by on text searches

### Use case

"The most-scanned hummus", "the newest oat drinks matching barista" — ordering questions that also need free text cannot be answered. `off_search_products` accepts `sort_by`, but it is dropped whenever `query` is set: the handler forwards it to the service and the text-search request is built without it. The schema tells callers text searches are relevance-ranked and ignore the option, and nothing in the response marks the sort as unapplied.

The text backend does sort.…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/33) · 2026-09-17 · closed · 1 comment

### bug(off_search_products): text searches read an index frozen at December 2024

### Server version

0.3.2

### mcp-ts-core version

^0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

Every `off_search_products` call that carries `query` is served by search.openfoodfacts.org, whose index stops in December 2024. Tag-only calls go to `/api/v2/search`, which is current. So the same filters answer differently depending on whether free text is present, products contributed since the cutoff are missing from every…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/31) · 2026-09-17 · closed · 1 comment

### bug(off_browse_taxonomy): embedded tag IDs are not canonical, so resolved filters match nothing

### Server version

0.3.2

### mcp-ts-core version

^0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`off_browse_taxonomy` merges its embedded vocabulary ahead of live suggestions, and 52 of the embedded tag IDs are not canonical keys in the published [Open Food Facts taxonomies](https://static.openfoodfacts.org/data/taxonomies/). The tool tells callers to pass the returned `id` to `off_search_products` unchanged. When they do,…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/30) · 2026-09-17 · closed · 1 comment

### bug(off_compare_products): do not label all-failed batches as not found

### Server version

0.3.3

### mcp-ts-core version

^0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

When no barcode in an `off_compare_products` batch resolves to a product, `format()` appends `No products found. Try off_get_product on individual barcodes to verify.` — one line covering three different settlements.

After an all-failed batch the text first says the barcodes were not checked, then says no products were found, and…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/29) · 2026-08-11 · closed · 1 comment

### bug(format): escape crowd-sourced text for Markdown contexts

### Server version

0.3.3

### mcp-ts-core version

^0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

Every `format()` interpolates crowd-sourced Open Food Facts text straight into Markdown — headings, bold-label lines, bullets, an inline code span, a fixed code fence, and two tables. A value carrying Markdown syntax changes the rendered structure rather than being displayed, so text the server presents as data can present itself…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/27) · 2026-08-11 · closed · 1 comment

### bug(error-contracts): remove raw HTML from structured errors

### Server version

0.3.3

### mcp-ts-core version

^0.13.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`toContractError()` builds the public failure by spreading the framework fetch error's whole `data` object (`src/services/openfoodfacts/openfoodfacts-service.ts:197`). That object carries the captured upstream response body twice — as `body` and as its legacy alias `responseBody` — so when Open Food Facts answers with a rendered…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/26) · 2026-08-11 · closed · 1 comment

### bug(off_search_products): distinguish exhausted pages from zero matches

### Server version

0.3.2

### mcp-ts-core version

^0.12.3

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

HTTP (Streamable HTTP)

### Description

`off_search_products` treats every empty page as a zero-match search. The handler's empty branch and `format()` both key on `products.length === 0`, so a page past the end of a large result set is reported as "no products found" with broadening guidance, next to a positive `total` in the same response.

Both backends reach that…

[Read the thread](https://github.com/cyanheads/openfoodfacts-mcp-server/issues/24) · 2026-08-11 · closed · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/openfoodfacts-mcp-server/issues).
