# `space.monon/additive-atlas` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/space.monon/additive-atlas
- JSON: https://anlyon.dev/api/v1/servers/space.monon/additive-atlas
- Version: 0.1.0 (active)
- Publisher: space.monon (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Metadata from the official MCP Registry, synced 2026-10-21T18:55:02.027Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Additive Atlas
Food additive regulations of Japan, the EU and the US, side by side, with sources (free tier).
```

Scanned 2026-10-21T19:20:40.867Z over streamable-http.

**5 tools: 5 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 0 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 0 | ask |
| Only reads | read | 5 | allow |

## Findings

No check matched anything in these tool definitions.


## Only reads (5)

Looks things up and changes nothing. Claude Code: allow.

### `analyze_label`

- The name "analyze_label" says "analyze": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `analyze_label_diff`

- The name "analyze_label_diff" says "analyze": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
(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.
```

### `get_substance`

- The name "get_substance" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
```

### `get_substance_diff`

- The name "get_substance_diff" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
(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.
```

### `search_substances`

- The name "search_substances" says "search": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
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.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `additive-atlas`:

```json
{
  "permissions": {
    "allow": [
      "mcp__additive-atlas__search_substances",
      "mcp__additive-atlas__get_substance",
      "mcp__additive-atlas__analyze_label",
      "mcp__additive-atlas__get_substance_diff",
      "mcp__additive-atlas__analyze_label_diff"
    ],
    "ask": [],
    "deny": []
  }
}
```
