# io.github.Vortx-AI/eudr (remote · eudr.dev)

Compile EUDR Annex II Due Diligence Statements from operator, supplier, and plot geolocation.

- Trust score: 80/100 (high trust)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-22

## Components

- remote · `eudr.dev`: 80/100 (this document), [markdown](https://verifymcp.io/servers/vortx-ai-eudr/eudr.md), [page](https://verifymcp.io/servers/vortx-ai-eudr/eudr)

## Channel facts

- Endpoint: `https://eudr.dev/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-22.

- **Endpoint Security**: 94/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2527 tokens (~157/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 95/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 82% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 16 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 17 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### How do I install the io.github.Vortx-AI/eudr MCP server?

io.github.Vortx-AI/eudr is a hosted endpoint at https://eudr.dev/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http vortx-ai-eudr 'https://eudr.dev/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "vortx-ai-eudr": {
      "url": "https://eudr.dev/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "vortx-ai-eudr": {
      "type": "http",
      "url": "https://eudr.dev/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.vortx-ai-eudr]
url = "https://eudr.dev/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vortx-ai-eudr": {
      "type": "remote",
      "url": "https://eudr.dev/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add vortx-ai-eudr --url 'https://eudr.dev/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  vortx-ai-eudr:
    url: "https://eudr.dev/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "vortx-ai-eudr": {
      "Transport": "http",
      "Url": "https://eudr.dev/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add vortx-ai-eudr -t streamable-http -u 'https://eudr.dev/mcp'
```

### Other

```json
{
  "mcpServers": {
    "vortx-ai-eudr": {
      "type": "http",
      "url": "https://eudr.dev/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-22 (score 80)

First indexed and scored.

## MCP tools (16)

### `eudr_check_plots` (~388 tokens)

Check plots for forest loss after the EUDR cut-off

Check up to eight production plots for forest loss after 31 December 2020, the cut-off in Regulation (EU) 2023/1115. Takes GeoJSON boundaries, the commodity, and the country of production. Returns a per-plot verdict, the loss years observed, how much of each plot was inspected, and a handle for the underlying satellite evidence. This answers Article 3(a) only: it does not check land tenure, permits, consent, or chain of custody, and it lists those gaps on every response. This has side effects, though it writes nothing to the organisation's records and costs no credits: every call asks emem.dev to make freshly signed measurements, so repeating a check returns the same finding under new signatures, and mints a short-lived evidence handle held on this server for 24 hours, which eudr_fetch_evidence resolves and which a later check will not reproduce.

Input parameters:

- `commodity` (string, required): The Annex I commodity produced on the plot.
- `country` (string, required): ISO-3166-1 alpha-2 code of the country of production. It sets the benchmark risk tier.
- `geojson` (object): One plot, as a GeoJSON Polygon, MultiPolygon or Point in WGS84 (EPSG:4326). Article 2(28) requires six decimal places. A Point is admissible only for a plot under four hectares that is not forest. Su…
- `hs_code` (string): Optional HS code, 2 to 8 digits. Overrides the commodity-to-Annex-I mapping.
- `plots` (array): Several plots checked together, each keeping its own verdict. Use this when a consignment draws on more than one plot.
- `quantity_kg` (number): Optional net mass of the consignment. It does not affect the verdict.

Output parameters:

- `country_risk_tier` (string)
- `coverage` (object)
- `cut_off_date` (string)
- `deforestation_free` (boolean)
- `engine` (string)
- `evidence` (object): fact_count is always present. It is a count of facts that exist, not of facts shipped: the conversational surface carries the address rather than the list.
- `finding` (string)
- `next_action` (string)
- `observed` (object)
- `per_plot` (array)
- `risk_score` (number|null)
- `scope_note` (string)
- `unresolved_checks` (array)
- `verdict` (string)

### `eudr_fetch_evidence` (~137 tokens)

Page the signed facts behind a check

Retrieve the signed satellite facts behind a completed check, a page at a time, using the `evidence_cid` that check returned. Each entry is a content address that resolves at emem.dev and verifies offline against the responder's key. Use this when someone needs to audit or cite the evidence, not to summarise a result.

Input parameters:

- `evidence_cid` (string, required): The handle returned by eudr_check_plots.
- `limit` (integer): How many facts to return, up to 200. Defaults to 50.
- `offset` (integer): Index to start from. Defaults to 0.

Output parameters:

- `algorithm` (string|null)
- `evidence_cid` (string)
- `fact_cids` (array)
- `minted_at` (string)
- `next_offset` (integer|null)
- `note` (string)
- `offset` (integer)
- `resolve_one_at` (string)
- `responder_pubkey_b32` (string|null)
- `returned` (integer)
- `total` (integer)
- `verify_at` (string)

### `eudr_assess_evidence_gaps` (~108 tokens)

Find missing Article 9 information per supplier

Check what each supplier's file is still missing against Article 9(1) of Regulation (EU) 2023/1115, the closed list of information an operator must hold before filing. Returns the unmet items with their article reference and what to request, separating items that block filing from items that merely leave the file incomplete. This is a checklist over the fields you supply; it reads no documents and judges no evidence.

Input parameters:

- `suppliers` (array, required)

Output parameters:

- `basis` (string)
- `blocked_from_filing` (integer)
- `checked` (integer)
- `incomplete` (integer)
- `scope_note` (string)
- `summary` (string)
- `suppliers` (array): One row per supplier: status, gaps with their article limb and the request to send, blocking_gaps, held limbs, country tier.

### `eudr_lookup_reference` (~121 tokens)

Look up country risk tiers and Annex I commodities

Look up the country benchmark tier under Implementing Regulation (EU) 2025/1093, or the Annex I commodity to HS-code mapping under Regulation (EU) 2023/1115. Returns the table this engine actually evaluates against, with its source and the date it was verified.

Input parameters:

- `country` (string): With kind=country_risk, return just this country's tier instead of the whole table.
- `kind` (string, required): `country_risk` for the benchmark tiers, `commodities` for the Annex I mapping.

Output parameters:

- `basis` (string)
- `commodities` (array)
- `country` (string)
- `high_risk` (array)
- `kind` (string)
- `low_risk` (array)
- `note` (string)
- `reference` (object)
- `simplified_due_diligence_available` (boolean)
- `tier` (string)

### `eudr_verify_receipt` (~100 tokens)

Verify a signed statement receipt

Verify a statement receipt: re-derive its content address from the canonical payload and check the ed25519 signature. Use it on a receipt a counterparty hands you. A valid signature establishes who signed and that the bytes are unchanged; it does not establish that the claim inside is true.

Input parameters:

- `receipt` (object, required): The receipt as issued: schema, cid, payload, canonical_b64, signature_b64, signer, signed_at.

Output parameters:

- `cid` (string|null)
- `note` (string)
- `reason` (string)
- `signed_at` (string|null)
- `signer` (string|null)
- `valid` (boolean)

### `eudr_prepare_dds` (~175 tokens)

Start preparing a Due Diligence Statement

Compile and sign an Annex II Due Diligence Statement. This WRITES: it stores a compile task holding the operator and supplier details you pass, and sends the plot geometry, HS code, country and quantity to emem.dev to be measured and independently signed. Operator and supplier identity are not forwarded upstream. Returns a task handle; read the outcome with eudr_get_dds. Nothing is filed with any authority. Confirm the details with the user first. Costs 5 credits from the organisation's wallet, refunded automatically if the compile fails; every other tool here is free.

Input parameters:

- `geolocation` (object, required)
- `operator` (object, required)
- `producer` (object): The primary producer, where that is not the supplier.
- `product` (object, required)
- `supplier` (object, required)

Output parameters:

- `data_sent_upstream` (string)
- `data_stored_here` (string)
- `filed_with_any_authority` (boolean)
- `next_action` (string)
- `read_outcome_with` (string)
- `report_url` (string)
- `state` (string|null)
- `task_id` (string)

### `eudr_get_dds` (~79 tokens)

Read the outcome of a statement compile

Read the state of a compile started by eudr_prepare_dds. While it runs, returns the current state. Once finished, returns the verdict, the receipt's content address and signing key, and the link to the printable statement.

Input parameters:

- `task_id` (string, required): The task_id returned by eudr_prepare_dds.

Output parameters:

- `erased` (boolean)
- `error` (string|null)
- `next_action` (string)
- `note` (string)
- `receipt_cid` (string|null)
- `report_url` (string)
- `settled` (boolean)
- `signer_pubkey_b32` (string)
- `state` (string)
- `task_id` (string)
- `verdict` (string|null)
- `verify_at` (string)

### `eudr_execution_trace` (~112 tokens)

Show how a verdict was reached, step by step

The complete derivation chain behind a compiled statement, in order: polygon to grid addresses, signed measurements, the algorithm and the registries it was pinned against, cell verdicts to a consignment verdict, citations, and which of three independent keys signed what. A stage whose evidence is absent is reported as absent with its reason. Use it when someone asks how a result was reached rather than what it was.

Input parameters:

- `task_id` (string, required): The task_id of a compile that has produced a statement.

Output parameters:

- `full_statement` (string)
- `generated_at` (string)
- `not_established` (array)
- `schema` (string)
- `signing_parties` (object)
- `steps` (array): A step either ran (stage, what, consumed, produced, signed_by, reproduce) or did not, in which case it carries present:false and why_absent. An absent stage is emitted, never omitted.
- `task_id` (string)
- `verdict` (string|null)
- `verify` (string)

### `eudr_import_shipments` (~220 tokens)

Read shipments out of a spreadsheet or GS1 event feed

Parse a consignment list into structured shipments ready to check. Accepts a CSV export (the column set eudr.dev publishes) or a GS1 EPCIS 2.0 JSON-LD document. Returns one row per shipment with supplier, commodity, country, quantity and plot boundaries, plus a warning for every row that could not be read and the reason. Nothing is stored and nothing is submitted; this only reads the document you pass.

Input parameters:

- `document` (string, required): The document itself. CSV text including its header row, or the EPCIS document as JSON text.
- `format` (string, required): `csv` for the published column set, `epcis` for a GS1 EPCIS 2.0 JSON-LD document.
- `limit` (integer): How many shipments to return in full, including plot boundaries. Defaults to 8, which is what eudr_check_plots accepts in one call.
- `offset` (integer): Which shipment to start detailing from. Totals always cover the whole document.

Output parameters:

- `format` (string)
- `next_action` (string)
- `next_offset` (integer|null)
- `note` (string)
- `offset` (integer)
- `rows_returned` (integer)
- `rows_skipped` (integer)
- `shipments` (array)
- `shipments_read` (integer)
- `stored` (boolean)
- `warnings` (array)

### `eudr_export_statement` (~169 tokens)

Export a finished statement in the shape another system wants

Export a compiled statement as TRACES NT submission XML, signed Annex II JSON, or plot boundaries as GeoJSON. Exporting is not filing: nothing is submitted to any authority. TRACES export is refused for a non-negligible verdict, because Article 4(1) bars placing those goods and a non-filable assessment must not be handed out as a submission document.

Input parameters:

- `activity` (string): TRACES activity type. Defaults to the activity the statement was compiled with.
- `format` (string, required): `traces_xml` for the EUDR Information System submission shape, `annex_ii_json` for the signed statement, `plots_geojson` for the boundaries as a FeatureCollection.
- `task_id` (string, required): The task_id of a completed compile.

Output parameters:

- `activity` (string)
- `dds_reference` (string|null)
- `document`: The exported document. A string for traces_xml, an object for the other two.
- `download_url` (string)
- `filed_with_any_authority` (boolean)
- `format` (string)
- `next_action` (string)
- `receipt_cid` (string|null)
- `signer_pubkey_b32` (string)
- `task_id` (string)
- `verify_at` (string)

### `eudr_list_statements` (~116 tokens)

List the statements this organisation has compiled

List the Due Diligence Statements already in the signed-in organisation's account, newest first, with verdict, reference, commodity, country, quantity and date. Use this to answer what has been filed, what is outstanding, and what a past consignment concluded, rather than asking the user to re-enter details their account already holds.

Input parameters:

- `country` (string): Only statements for this country of production.
- `limit` (integer): How many to return. Defaults to 20.
- `verdict` (string)

Output parameters:

- `note` (string)
- `organisation` (string)
- `returned` (integer)
- `statements` (array)

### `eudr_compliance_status` (~72 tokens)

Summarise where this organisation stands

Summarise the signed-in organisation's position: how many statements are filable, how many are blocked by a non-negligible verdict, how many are unresolved, broken down by commodity and country, plus outstanding supplier evidence requests. Answers "where do we stand" without enumerating every record.

Output parameters:

- `by_commodity` (array)
- `by_country` (array)
- `next_action` (string)
- `organisation` (string)
- `scope_note` (string)
- `supplier_requests` (object)
- `totals` (object)

### `eudr_list_supplier_requests` (~47 tokens)

List outstanding supplier evidence requests

List the supplier evidence requests this organisation has issued: who was asked, whether they responded, and when each request expires. Answers which suppliers still owe plot boundaries and production details.

Output parameters:

- `note` (string)
- `organisation` (string)
- `pending` (integer)
- `requests` (array)
- `submitted` (integer)

### `eudr_request_supplier_evidence` (~158 tokens)

Ask a supplier for their plot evidence

Create a one-time link a supplier can use to submit their plot boundaries and production details straight into this organisation's account, without needing an account of their own. This writes: it creates a credential that lets whoever holds the link submit data to you, and returns that link once. Send it only to the intended supplier. No email is sent by this call.

Input parameters:

- `email` (string): Optional, recorded so you can see where the link was meant to go. It is not verified and nothing is sent to it.
- `supplier_name` (string, required): Your name for the counterparty, shown to them on the intake page.
- `valid_for_days` (integer): How long the link works. Defaults to 30.

Output parameters:

- `emailed` (boolean)
- `expires_at` (string)
- `intake_url` (string)
- `next_action` (string)
- `note` (string)
- `request_id` (string)
- `shown_once` (boolean)
- `supplier` (string)

### `eudr_account_usage` (~115 tokens)

Wallet balance and what it covers

Report this organisation's credit balance, how many signed statements it will cover, and what has been spent. Checking plots, looking up references, assessing supplier gaps and reading traces cost nothing and are always available — only compiling a signed statement draws the balance down. Use this before starting a batch of compiles so the user is not surprised part-way through. The first call for an organisation writes: it opens the wallet, grants the welcome credits and records that grant as the opening ledger line. Every call after that only reads.

Output parameters:

- `analyses_remaining` (integer)
- `balance_credits` (integer)
- `charged_unit` (string)
- `credits_per_analysis` (integer)
- `credits_received` (integer)
- `credits_spent` (integer)
- `free_of_charge` (array)
- `note` (string)
- `organisation` (string)
- `recent_activity` (array)
- `welcome_credits_granted_at` (string|null)

### `eudr_mitigation_status` (~168 tokens)

Article 11 mitigation: what is outstanding

Report the Article 11 risk-mitigation plans this organisation has open against flagged shipments: which steps are outstanding, which article each discharges, whether a step needs a person or can be re-run automatically, and what evidence has been recorded. A non-negligible verdict creates an obligation under Article 11 to act before the product is placed on the market; this answers how far that has got. Pass a shipment id for one plan, or omit it for everything still open. Read-only — recording a decision is a deliberate human act and is done on eudr.dev, because Article 11(3) requires the reasoning to be retained against a named person.

Input parameters:

- `shipment_id` (string): Optional. One shipment's plan; omit for every open plan.

Output parameters:

- `note` (string)
- `open_plans` (integer)
- `organisation` (string)
- `outstanding_steps` (integer)
- `plans` (array)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/vortx-ai-eudr/eudr#diagnostics

## Score history

- 2026-09-22: 80

## Common questions

### What is the io.github.Vortx-AI/eudr MCP server?

io.github.Vortx-AI/eudr is an MCP server listed in the public MCP registry as io.github.Vortx-AI/eudr. Compile EUDR Annex II Due Diligence Statements from operator, supplier, and plot geolocation. This page covers its hosted endpoint (https://eudr.dev/mcp).

### Is the io.github.Vortx-AI/eudr MCP server safe to use?

io.github.Vortx-AI/eudr scores 80 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.Vortx-AI/eudr MCP server expose?

io.github.Vortx-AI/eudr exposes 16 tools: eudr_check_plots, eudr_fetch_evidence, eudr_assess_evidence_gaps, eudr_lookup_reference, eudr_verify_receipt, and 11 more. Their descriptions and schemas cost roughly 2,285 tokens of context every time the server is loaded.

### Does the io.github.Vortx-AI/eudr MCP server require authentication?

Yes. io.github.Vortx-AI/eudr asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the io.github.Vortx-AI/eudr MCP server still maintained?

io.github.Vortx-AI/eudr is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://eudr.dev/mcp
- Repository: https://github.com/Vortx-AI/eudr-plugin
- Changelog RSS feed: https://verifymcp.io/servers/vortx-ai-eudr/eudr.xml
- Changelog JSON feed: https://verifymcp.io/servers/vortx-ai-eudr/eudr.json
- HTML version of this page: https://verifymcp.io/servers/vortx-ai-eudr/eudr
