Install
$ agentstack add mcp-honeyfield-org-eurlex-mcp-server ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
eurlex-mcp-server
[](https://github.com/Honeyfield-Org/eurlex-mcp-server/actions/workflows/ci.yml) [](https://www.npmjs.com/package/eurlex-mcp-server) [](LICENSE) [](https://nodejs.org/) [](https://modelcontextprotocol.io/)
Search and retrieve EU law via the EUR-Lex Cellar API -- an MCP server that gives AI assistants direct access to EU regulations, directives, court decisions, and more. No API key required.
What You Can Do
Ask your AI assistant questions like:
- "Find EU regulations about artificial intelligence from 2024"
- "Show me the full text of the AI Act (32024R1689)"
- "What EuroVoc topics are assigned to the GDPR?"
- "Which EU acts are about cybersecurity as a topic, even if the word isn't in the title?"
- "Which documents cite the Digital Services Act?"
- "Search for directives about renewable energy"
- "Get the consolidated version of Regulation 2016/679 (GDPR)"
- "Which CJEU judgments interpret the GDPR?"
- "Look up the Court of Justice ruling with ECLI ECLI:EU:C:2014:317"
- "How did Germany transpose the NIS2 Directive?"
- "Outline the AI Act, then show me just Article 5"
- "Give me the plain-language summary of the Digital Services Act"
Features
- 11 specialized tools for searching, fetching, and analyzing EU legal documents (see [Tool Reference](#tool-reference))
- EuroVoc thesaurus search -- find documents by EU taxonomy concepts, with automatic label fallback across all 24 languages
- CJEU case law -- find judgments, orders, and Advocate General opinions by ECLI, CELEX, party/title, or the act they interpret
- National transposition measures (NIM) -- list how member states transposed a given directive into national law
- Document outline + targeted reading -- get an act's table of contents with plain-text offsets, then jump straight to a specific article with
eurlex_fetch; for CJEU case law (CELEX sector 6) the outline also lists each numbered judgment paragraph asParagraph N, so you can jump to a specific paragraph the same way (paragraph detection is language-independent) - Plain-language summaries -- retrieve the EU's LEGISSUM summary of an act
- Raw SPARQL escape hatch -- run read-only
SELECT/ASKqueries directly against Cellar for questions the other tools can't express - Consolidated versions -- retrieve the latest in-force text of regulations, directives, and decisions, identified by CELEX ID or by doc type + year + number
- Citation graph -- explore which documents cite or are cited by a given act, with a balanced split between the two directions
- Structured metadata -- dates (with
nullinstead of Cellar's9999-12-31sentinel for open-ended validity), in-force status, authors, legal basis, EuroVoc descriptors, and directory codes - Flexible identifiers --
eurlex_fetch,eurlex_metadata, andeurlex_structureaccept a CELEX ID, an ELI (e.g.reg/2016/679), or a post-2023 Official Journal reference (e.g.OJ:L_202401689) - Structured output -- every tool returns a machine-readable
structuredContentpayload validated against a publishedoutputSchema, alongside the JSON text block - Offset-based pagination --
eurlex_fetch,eurlex_consolidated, andeurlex_summaryreturnnext_offsetso long documents can be read in successive calls - All 24 official EU languages -- request titles and full text in any official EU language (default German)
- No API key required -- uses the public EUR-Lex Cellar SPARQL endpoint
- Resilient by default -- automatic retry with backoff on transient Cellar errors, and in-process caching of EuroVoc labels, consolidated-CELEX lookups, and metadata to cut latency on repeat requests
Quick Start
pnpm dlx eurlex-mcp-server
Or with npx:
npx -y eurlex-mcp-server
Configuration
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"eurlex": {
"command": "npx",
"args": ["-y", "eurlex-mcp-server"]
}
}
}
Claude Code
claude mcp add eurlex-mcp-server -- npx -y eurlex-mcp-server
VS Code
Add to .vscode/mcp.json:
{
"servers": {
"eurlex": {
"command": "npx",
"args": ["-y", "eurlex-mcp-server"]
}
}
}
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"eurlex": {
"command": "npx",
"args": ["-y", "eurlex-mcp-server"]
}
}
}
Windsurf
Add to ~/.windsurf/mcp.json:
{
"mcpServers": {
"eurlex": {
"command": "npx",
"args": ["-y", "eurlex-mcp-server"]
}
}
}
HTTP Transport (Remote Deployments)
When running the server over HTTP (pnpm start:http / dist/http.js) instead of stdio, it's exposed to any client that can reach it over the network. To protect against DNS rebinding attacks, set these environment variables:
| Variable | Required | Description | |----------|----------|--------------| | MCP_ALLOWED_HOSTS | no (but strongly recommended for public deployments) | Comma-separated list of allowed Host header values. Must match the header exactly, including the port if the server isn't reachable on the default HTTP(S) port. | | MCP_ALLOWED_ORIGINS | no | Comma-separated list of allowed Origin header values. Only enforced when MCP_ALLOWED_ORIGINS is set together with MCP_ALLOWED_HOSTS. |
Important: If your server runs behind a reverse proxy or load balancer, ensure it forwards the original Host header unmodified (e.g. nginx proxy_set_header Host $host;), otherwise MCP_ALLOWED_HOSTS validation will reject all legitimate traffic — the SDK compares the raw Host header as an exact string.
Production example:
MCP_ALLOWED_HOSTS=mcp.honeyfield.at
This protection is opt-in. If MCP_ALLOWED_HOSTS is not set, the server starts as before and logs a one-line startup warning (MCP_ALLOWED_HOSTS not set — DNS rebinding protection disabled). Any public deployment should set MCP_ALLOWED_HOSTS to its public hostname(s).
Tool Reference
The server exposes 11 read-only tools. Every tool returns both a JSON text block and a machine-readable structuredContent payload validated against a published outputSchema, so MCP clients can consume either representation. Tools that return titles or document text accept a language parameter taking any of the 24 official EU languages as a Cellar 3-letter code (default DEU): BUL, SPA, CES, DAN, DEU, EST, ELL, ENG, FRA, GLE, HRV, ITA, LAV, LIT, HUN, MLT, NLD, POL, POR, RON, SLK, SLV, FIN, SWE.
| Tool | Purpose | |------|---------| | eurlex_search | Title-substring search over legislation | | eurlex_fetch | Full text of an act (by CELEX / ELI / OJ reference) | | eurlex_metadata | Structured metadata for an act | | eurlex_citations | Citation graph (cites / cited-by / amends / …) | | eurlex_by_eurovoc | Thematic search by EuroVoc concept | | eurlex_consolidated | Latest in-force consolidated text | | eurlex_case_law | CJEU judgments, orders, and AG opinions | | eurlex_transposition | National transposition measures for a directive | | eurlex_structure | Document outline with plain-text offsets | | eurlex_summary | Plain-language LEGISSUM summary | | eurlex_sparql | Raw read-only SPARQL escape hatch |
eurlex_search
Searches EU legal acts by title substring -- a contiguous, case-insensitive phrase match against the document title, not tokenized full-text search. For thematic discovery (the term may not appear in the title) use eurlex_by_eurovoc instead. Results are sorted newest-first within the fetched sample: for very broad single-word queries this is not guaranteed to be the globally newest match -- narrow with resource_type or date_from/date_to if that matters. The response no longer echoes the internal SPARQL query.
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | query | string | yes | -- | Title substring to match (3-500 chars), e.g. "artificial intelligence high risk" | | resource_type | string | no | "any" | Document type filter: REG, DIR, DEC, JUDG, REG_IMPL, REG_DEL, DIR_IMPL, DIR_DEL, DEC_IMPL, DEC_DEL, ORDER, OPIN_AG, RECO, any | | language | string | no | "DEU" | Language for titles and full text: any of the 24 official EU languages (Cellar 3-letter code, e.g. DEU, ENG, FRA, POL, SPA) | | limit | number | no | 10 | Max results (1-50) | | date_from | string | no | -- | Filter from date, format: YYYY-MM-DD | | date_to | string | no | -- | Filter to date, format: YYYY-MM-DD |
eurlex_fetch
Retrieve the full text of a document, identified by exactly one of celex_id, eli, or oj_ref. Long documents are paginated: the response includes returned_chars, total_chars, and next_offset (pass it as the next call's offset to keep reading; next_offset is null once there's nothing left).
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | celex_id | string | no\ | -- | CELEX identifier, e.g. "32024R1689" for the AI Act | | eli | string | no\ | -- | European Legislation Identifier, short (reg/2016/679) or full (http://data.europa.eu/eli/reg/2016/679/oj); resolved to a CELEX via Cellar | | oj_ref | string | no\* | -- | Post-2023 Official Journal reference, e.g. "OJ:L_202401689" (AI Act); resolved to a CELEX via Cellar | | language | string | no | "DEU" | Language: any of the 24 official EU languages (Cellar 3-letter code, e.g. DEU, ENG, FRA, POL, SPA) | | format | string | no | "xhtml" | Output format: xhtml (structured) or plain (tags stripped, whitespace collapsed, entities decoded) | | max_chars | number | no | 20000 | Max characters returned per call (1000-50000) | | offset | number | no | 0 | Character offset into the processed document, for pagination |
\* Provide exactly one of celex_id, eli, or oj_ref.
eurlex_metadata
Retrieve structured metadata for a document: document/entry-into-force/end-of-validity/transposition dates, in-force status, authors, legal basis, EuroVoc descriptors, and directory codes. Identified by exactly one of celex_id, eli, or oj_ref (same identifier inputs as eurlex_fetch).
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | celex_id | string | no\ | -- | CELEX identifier, e.g. "32024R1689" | | eli | string | no\ | -- | European Legislation Identifier, short or full form; resolved to a CELEX via Cellar | | oj_ref | string | no\* | -- | Post-2023 Official Journal reference, e.g. "OJ:L_202401689"; resolved to a CELEX via Cellar | | language | string | no | "DEU" | Language for titles and EuroVoc labels: any of the 24 official EU languages (Cellar 3-letter code, e.g. DEU, ENG, FRA, POL, SPA) |
\* Provide exactly one of celex_id, eli, or oj_ref.
Notes on the response:
authorslists the resolved agent names (e.g. "European Parliament", "Council of the European Union") instead of an empty array.legal_basislists the CELEX IDs of the acts this document is based on.- Date fields (
date_document,date_entry_into_force,date_end_of_validity,date_transposition) arenullwhen absent -- including Cellar's9999-12-31sentinel for acts with no defined end of validity, which is normalized tonull. directory_codesare human-readable ("{code-tail}: {label}", wherecode-tailis the fragment after the last/of the directory-code URI), not raw URIs.
eurlex_citations
Explore the citation graph of a document -- which acts it cites, which acts cite it, and amends/based-on/repeals relations.
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | celex_id | string | yes | -- | CELEX identifier, e.g. "32024R1689" | | language | string | no | "DEU" | Language for titles: any of the 24 official EU languages (Cellar 3-letter code, e.g. DEU, ENG, FRA, POL, SPA) | | direction | string | no | "both" | cites (outgoing), cited_by (incoming), or both | | limit | number | no | 20 | Max results (1-100) |
With direction: "both", the two directions are queried and split evenly (roughly limit / 2 each) so that a burst of recent cited_by entries can't crowd out cites results. The response includes a counts: { cites, cited_by } object reporting how many of each were actually found.
eurlexbyeurovoc
Find documents by EuroVoc thesaurus concept (label or URI).
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | concept | string | yes | -- | EuroVoc concept: label (e.g. "artificial intelligence") or URI (e.g. "http://eurovoc.europa.eu/4424") | | resource_type | string | no | "any" | Document type filter (same values as eurlex_search) | | language | string | no | "DEU" | Language: any of the 24 official EU languages (Cellar 3-letter code, e.g. DEU, ENG, FRA, POL, SPA) | | limit | number | no | 10 | Max results (1-50) |
eurlex_consolidated
Retrieve the consolidated (in-force) version of a regulation, directive, or decision. Identify the act with either celex_id or doc_type + year + number -- provide exactly one of the two forms. Like eurlex_fetch, the content is paginated via offset/max_chars/next_offset. The response also includes consolidated_celex (e.g. "02016R0679-20160504") and consolidation_date ("2016-05-04", parsed from that CELEX's date suffix; null if the resolved CELEX has none).
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | celex_id | string | no | -- | CELEX ID of the original act, e.g. "32016R0679" (GDPR). Alternative to doc_type+year+number; must be a sector-3 CELEX (3YYYY[R\|L\|D]NNNN) | | doc_type | string | no | -- | Document type: reg (regulation), dir (directive), dec (decision). Alternative to celex_id; provide together with year and number | | year | number | no | -- | Year of the act (1950-2100), e.g. 2024. Required together with doc_type and number when celex_id is not used | | number | number | no | -- | Document number, e.g. 1689. Required together with doc_type and year when celex_id is not used | | language | string | no | "DEU" | Language: any of the 24 official EU languages (Cellar 3-letter code, e.g. DEU, ENG, FRA, POL, SPA) | | format | string | no | "xhtml" | Output format: xhtml or plain | | max_chars | number | no | 20000 | Max characters returned per call (1000-50000) | | offset | number | no | 0 | Character offset into the processed document, for pagination |
\* Exactly one of celex_id or the doc_type+year+number triple must be provided.
eurlexcaselaw
Search Court of Justice of the EU case law -- judgments, orders, and Advocate General opinions of the Court of Justice and the General Court. Provide at least one of query, celex_id, ecli, or related_celex (they may be combined). Each result gives celex, ecli, title, date, type, and eurlex_url. Use this for case law; eurlex_search covers only legislation.
| Parameter | Type | Required | Default | Description | |-----------|------|----------|---------|-------------| | query | string | no\ | -- | Title/party substring (3-500 chars). CJEU titles start with a "Judgment of the Court …" prefix, so party names appear after it | | celex_id | string | no\ | -- | Sector-6 CELEX of a specific ruling, e.g. "62012CJ0131" (Google Spain) | | ecli | string | no\* | -- | European Case Law Identifier, e.g. `"ECLI:EU:C:201
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Honeyfield-Org
- Source: Honeyfield-Org/eurlex-mcp-server
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.