AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
MCP verified MIT Self-run

Eurlex Mcp Server

mcp-honeyfield-org-eurlex-mcp-server · by Honeyfield-Org

MCP server from Honeyfield-Org/eurlex-mcp-server.

No reviews yet
0 installs
41 views
0.0% view→install

Install

$ agentstack add mcp-honeyfield-org-eurlex-mcp-server

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No 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.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/mcp-honeyfield-org-eurlex-mcp-server)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude DesktopCursorWindsurf

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

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 →
Are you the author of Eurlex Mcp Server? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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 as Paragraph 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/ASK queries 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 null instead of Cellar's 9999-12-31 sentinel for open-ended validity), in-force status, authors, legal basis, EuroVoc descriptors, and directory codes
  • Flexible identifiers -- eurlex_fetch, eurlex_metadata, and eurlex_structure accept 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 structuredContent payload validated against a published outputSchema, alongside the JSON text block
  • Offset-based pagination -- eurlex_fetch, eurlex_consolidated, and eurlex_summary return next_offset so 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:

  • authors lists the resolved agent names (e.g. "European Parliament", "Council of the European Union") instead of an empty array.
  • legal_basis lists 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) are null when absent -- including Cellar's 9999-12-31 sentinel for acts with no defined end of validity, which is normalized to null.
  • directory_codes are human-readable ("{code-tail}: {label}", where code-tail is 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.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.