MCP server setup
Give Claude, Cursor or any MCP client the checker's tools: a free local server that keeps files on your computer, and a hosted one for your saved projects.
The Model Context Protocol (MCP) lets an AI assistant use tools. With ours, you can ask it to "check the files in this folder and fix what can be fixed", "why does plot 12 fail?" or "which of our projects are not ready to file?", and it runs the same rules as the checker instead of guessing at the regulation.
There are two servers. They share the same file tools, so the answers match.
| Local | Hosted | |
|---|---|---|
| Runs | On your computer, in the command-line tool | On our servers |
| Your files | Read from one folder you choose; never leave your computer | Sent with each call; processed and not stored unless saved to a project |
| Extra tools | None | Saved projects, statement status |
| Plan | Free | Team or Consultant (with the API) |
Local server
Start it from the command-line tool, naming the one folder it may read and write:
eudr-check mcp --root ~/plots
It reads files in that folder only, writes new files there only, and never overwrites a
file. Nothing goes over the network. Add --forest to offer the forest check, which asks
the JRC's and Global Forest Watch's map servers for squares of their maps (never your
file), as eudr-check --forest does.
Claude Code
claude mcp add eudr -- eudr-check mcp --root ~/plots
Claude Desktop: in claude_desktop_config.json:
{
"mcpServers": {
"eudr": { "command": "eudr-check", "args": ["mcp", "--root", "/Users/you/plots"] }
}
}
| Tool | What it does |
|---|---|
validate_file read-only | Check an EUDR geolocation file (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile) against the rules the EU Information System applies to due diligence statements. Returns every problem with its rule id, a plain-language explanation, how to fix it, and whether an automatic fix exists. A pre-submission check, not a legal compliance determination. |
fix_file | Apply automatic fixes to an EUDR geolocation file and re-check it. By default runs every fix that is safe in bulk (closing rings, rounding coordinates, correcting country codes, renaming properties…). Fixes that redraw a plot's boundary only run with accept_geometry_changes, and never beyond the area guard. Returns the change log (every change, with hectares before and after) and the findings that remain. |
convert_file | Convert KML, KMZ, GPX, CSV or a zipped shapefile to GeoJSON in WGS 84 degrees, reprojecting when needed. Every decision the converter made is listed in notes. If the coordinate system cannot be determined, the error lists the likely EPSG codes: ask again with crs. |
explain_rule read-only | Explain one validation rule by its id (e.g. GEOM-003) or slug: what it checks, why it matters for a due diligence statement, how to fix it, and the official sources it rests on. |
list_rules read-only | List every validation rule with its permanent id, severity (error = the Information System rejects the file), category and whether it can be fixed automatically. |
list_fixes read-only | List the automatic fixes fix_file can apply, which rules each answers, whether it is safe in bulk, and whether it changes a plot's area. |
check_forest read-only | For each plot: the share that was forest on 31 December 2020 on the EU's own map (JRC Global Forest Cover 2020 V4), and tree cover lost since 2021 on land that was forest in 2020 (Hansen Global Forest Change v1.13). Plots are flagged for review, never judged: these are risk indicators for the operator's own assessment, not a verdict on compliance. Only fixed map squares are requested from the map servers, never the plots. |
Hosted server
The hosted server works with clients that can send a header: Claude Code, Cursor, VS Code and others. It uses an API key from Settings → API and MCP, and the same limits as the API: requests a minute, and distinct plots a month.
The server's address is the API's base URL with /api/mcp in place of /api/v1; the
examples use $EUDR_MCP for it and $EUDR_KEY for your key. Settings → API and MCP shows
the command with the address filled in.
Claude Code
claude mcp add --transport http eudr $EUDR_MCP --header "Authorization: Bearer $EUDR_KEY"
Cursor: in .cursor/mcp.json:
{ "mcpServers": { "eudr": { "url": "<EUDR_MCP>", "headers": { "Authorization": "Bearer <EUDR_KEY>" } } } }
VS Code: in .vscode/mcp.json:
{ "servers": { "eudr": { "type": "http", "url": "<EUDR_MCP>", "headers": { "Authorization": "Bearer <EUDR_KEY>" } } } }
Files can be passed as text, as base64 (KMZ, zipped shapefiles), or as a saved project's id. A fixed or converted file can be saved as a new version of a project.
| Tool | What it does |
|---|---|
validate_file read-only | Check an EUDR geolocation file (GeoJSON, KML, KMZ, GPX, CSV or a zipped shapefile) against the rules the EU Information System applies to due diligence statements. Returns every problem with its rule id, a plain-language explanation, how to fix it, and whether an automatic fix exists. A pre-submission check, not a legal compliance determination. |
fix_file | Apply automatic fixes to an EUDR geolocation file and re-check it. By default runs every fix that is safe in bulk (closing rings, rounding coordinates, correcting country codes, renaming properties…). Fixes that redraw a plot's boundary only run with accept_geometry_changes, and never beyond the area guard. Returns the change log (every change, with hectares before and after) and the findings that remain. |
convert_file | Convert KML, KMZ, GPX, CSV or a zipped shapefile to GeoJSON in WGS 84 degrees, reprojecting when needed. Every decision the converter made is listed in notes. If the coordinate system cannot be determined, the error lists the likely EPSG codes: ask again with crs. |
explain_rule read-only | Explain one validation rule by its id (e.g. GEOM-003) or slug: what it checks, why it matters for a due diligence statement, how to fix it, and the official sources it rests on. |
list_rules read-only | List every validation rule with its permanent id, severity (error = the Information System rejects the file), category and whether it can be fixed automatically. |
list_fixes read-only | List the automatic fixes fix_file can apply, which rules each answers, whether it is safe in bulk, and whether it changes a plot's area. |
check_forest read-only | For each plot: the share that was forest on 31 December 2020 on the EU's own map (JRC Global Forest Cover 2020 V4), and tree cover lost since 2021 on land that was forest in 2020 (Hansen Global Forest Change v1.13). Plots are flagged for review, never judged: these are risk indicators for the operator's own assessment, not a verdict on compliance. Only fixed map squares are requested from the map servers, never the plots. |
whoami read-only | The workspace this key belongs to, its plan, and how many of the month's metered plots and this minute's requests are left. |
list_projects read-only | The workspace's saved projects, most recently changed first, with the current version's plot, error and warning counts. |
get_project read-only | One project: its versions (with plot, error and warning counts) and the due diligence statements filed from it. |
preview_statement read-only | What a due diligence statement filed from this project's current version would carry: plots, producers, countries, and anything that would stop it. Does not file anything: filing is the operator's declaration and is done by a person in the app (the returned url) or by a program over the REST API. |
get_statement read-only | A filed due diligence statement: its status in the EU Information System and, once available, its reference and verification numbers. The status is fetched when the Information System allows (30 minutes after filing, then every 5 minutes); otherwise the stored status and when to ask again. |
list_alerts read-only | Plots of monitored projects with satellite deforestation alerts on land that was forest in 2020, checked weekly. Each case has a confidence (confirmed, likely, unconfirmed, not_relevant) from the sources that agree, how the alerts held over the weeks, and Sentinel-2 and Sentinel-1 imagery. Open cases by default. An alert is an indicator to review, not a finding; reviewing and closing one is a person's decision, made in the app or over the REST API with a note. |
get_alert read-only | One alert case: how much of the plot's 2020 forest has alerts, their dates and confidence, which systems watch the plot, the Sentinel-2 images' dates, and its review history. |
Filing is not a tool. Filing a due diligence statement is the operator's declaration
that due diligence was exercised, so a person confirms it. An assistant can prepare it with
preview_statement and follow it with get_statement; the filing itself happens in the
app, or through the API with an explicit confirmation.
Protocol
Both servers speak MCP revisions 2024-11-05 to 2025-11-25 and offer tools only. The hosted one uses the Streamable HTTP transport without sessions: every request is a POST that gets a JSON answer. Results carry a short summary for the model and the full data as structured content, in the same shapes as the API.