Food additive regulations of Japan, the EU and the US, side by side, with sources (free tier).
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Find the additives named on a label (same as HTTP POST /v1/labels/analyze). Splits the additive section into tokens and returns, per token, the substances it resolves to (SubstanceSummary: facts on their own axis), plus known interactions between the detected substances. Cutting the additive section out of the label is the caller's job; sending the whole ingredient section is allowed. Matching is exact against the alias vocabulary in scope: a token with matches: [] is unresolved, which (open world) does not distinguish "not an additive" from "an additive not known here". `axis` and `lang` must be one of the accepted pairs: JP+ja, US+en, EU+nl, EU+fr, EU+de, EU+es, EU+pl, EU+el, EU+bg. Not a safety judgement: every record is a draft and needs verification.
Regulatory axis the label or name belongs to: JP, EU or US.
Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr.
The additive (or whole ingredient) section of one label: one raw string (split at 、 , , / for Japanese and , ; . : for Latin script, at bracket depth zero; whitespace is not a separator), or an array of already-split items (tokens[i] corresponds to item i).
Find the additives named on a label (same as HTTP POST /v1/labels/analyze). Splits the additive section into tokens and returns, per token, the substances it resolves to (SubstanceSummary: facts on their own axis), plus known interactions between the detected substances. Cutting the additive section out of the label is the caller's job; sending the whole ingredient section is allowed. Matching is exact against the alias vocabulary in scope: a token with matches: [] is unresolved, which (open world) does not distinguish "not an additive" from "an additive not known here". `axis` and `lang` must be one of the accepted pairs: JP+ja, US+en, EU+nl, EU+fr, EU+de, EU+es, EU+pl, EU+el, EU+bg. Not a safety judgement: every record is a draft and needs verification.
| Argument | Type | Description |
|---|---|---|
| axis* | string | Regulatory axis the label or name belongs to: JP, EU or US. |
| lang* | string | Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr. |
| text* | any | The additive (or whole ingredient) section of one label: one raw string (split at 、 , , / for Japanese and , ; . : for Latin script, at bracket depth zero; whitespace is not a separator), or an array of already-split items (tokens[i] corresponds to item i). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"text",
"axis",
"lang"
],
"properties": {
"axis": {
"type": "string",
"description": "Regulatory axis the label or name belongs to: JP, EU or US."
},
"lang": {
"type": "string",
"description": "Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr."
},
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "The additive (or whole ingredient) section of one label: one raw string (split at 、 , , / for Japanese and , ; . : for Latin script, at bracket depth zero; whitespace is not a separator), or an array of already-split items (tokens[i] corresponds to item i)."
}
}
}(Paid; not available through MCP.) Same input as analyze_label, but each detected substance carries the cross-axis derivation. This tool does not return that data: it returns the HTTP endpoint (POST /v1/labels/analyze/diff with the same JSON body, 0.01 USDC per request via x402 on Base) to call instead.
| Argument | Type | Description |
|---|---|---|
| axis* | string | Regulatory axis the label or name belongs to: JP, EU or US. |
| lang* | string | Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr. |
| text* | any | The additive (or whole ingredient) section of one label: one raw string (split at 、 , , / for Japanese and , ; . : for Latin script, at bracket depth zero; whitespace is not a separator), or an array of already-split items (tokens[i] corresponds to item i). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"text",
"axis",
"lang"
],
"properties": {
"axis": {
"type": "string",
"description": "Regulatory axis the label or name belongs to: JP, EU or US."
},
"lang": {
"type": "string",
"description": "Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr."
},
"text": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "The additive (or whole ingredient) section of one label: one raw string (split at 、 , , / for Japanese and , ; . : for Latin script, at bracket depth zero; whitespace is not a separator), or an array of already-split items (tokens[i] corresponds to item i)."
}
}
}One substance with everything its own roster says (same as HTTP GET /v1/substances/{id}): identifiers, category, aliases, translations, the source-ledger row, groups, and — depending on the axis — Japanese use standards, EU/Codex conditions of use, mandatory labelling statements, the roster's definition text or the CFR citation. Facts from the substance's own axis only; nothing here crosses an axis (that is get_substance_diff, paid, HTTP only). Axis-specific keys are present only where the roster has that concept, and an empty list means something (use_standards: [] = no use standard; use_conditions: [] = no permitted food category). Not a safety judgement: every record is a draft and needs verification.
| Argument | Type | Description |
|---|---|---|
| id* | string | Substance id as returned by search_substances or analyze_label, e.g. eu:e951, jp:designated-aspartame, us:cfr-172-804. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Substance id as returned by search_substances or analyze_label, e.g. eu:e951, jp:designated-aspartame, us:cfr-172-804."
}
}
}(Paid; not available through MCP.) For every axis other than the substance's own, what that axis says (with a per-cell source) kept separate from what was derived from it; when nothing can be concluded, a refusal says why and what would settle it. This tool does not return that data: it returns the HTTP endpoint (GET /v1/substances/{id}/diff, 0.01 USDC per request via x402 on Base) to call instead.
| Argument | Type | Description |
|---|---|---|
| id* | string | Substance id as returned by search_substances or analyze_label, e.g. eu:e951, jp:designated-aspartame, us:cfr-172-804. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Substance id as returned by search_substances or analyze_label, e.g. eu:e951, jp:designated-aspartame, us:cfr-172-804."
}
}
}Look up substances by name on one regulatory axis (same as HTTP GET /v1/substances?name=…). The name is normalised (NFKC, whitespace removed, lower-cased) and matched **exactly** against the names and aliases the axis itself uses in that language (E numbers and official names for EU, 品目名 and label terms for JP, CFR names for US) — no partial or fuzzy matching. The official name is an alias of itself. Returns the matching substances (SubstanceSummary: facts from their own roster only) and, per row, what text matched. `axis` and `lang` must be one of the accepted pairs: JP+ja, US+en, EU+nl, EU+fr, EU+de, EU+es, EU+pl, EU+el, EU+bg. Not a safety judgement: every record is a draft and needs verification.
| Argument | Type | Description |
|---|---|---|
| axis* | string | Regulatory axis the label or name belongs to: JP, EU or US. |
| lang* | string | Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr. |
| name* | string | The name to look up, as printed on a label or roster. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"axis",
"lang"
],
"properties": {
"axis": {
"type": "string",
"description": "Regulatory axis the label or name belongs to: JP, EU or US."
},
"lang": {
"type": "string",
"description": "Language of the name or label text (ISO 639-1), e.g. ja, en, de, fr."
},
"name": {
"type": "string",
"description": "The name to look up, as printed on a label or roster."
}
}
}