eurlex-mcp-server
Search and retrieve EU law via the EUR-Lex Cellar API, providing tools for searching legal acts, fetching full text, metadata, citation graphs, EuroVoc-based discovery, and consolidated versions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@eurlex-mcp-serverFind EU regulations about artificial intelligence from 2024"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
eurlex-mcp-server
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 documents cite the Digital Services Act?"
"Search for directives about renewable energy"
"Get the consolidated version of Regulation 2016/679 (GDPR)"
Related MCP server: Entscheidsuche MCP Server
Features
6 specialized tools for searching, fetching, and analyzing EU legal documents
EuroVoc thesaurus search -- find documents by EU taxonomy concepts
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 codesOffset-based pagination --
eurlex_fetchandeurlex_consolidatedreturnnext_offsetso long documents can be read in successive callsMulti-language -- supports English, German, and French
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-serverOr with npx:
npx -y eurlex-mcp-serverConfiguration
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-serverVS 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 |
| no (but strongly recommended for public deployments) | Comma-separated list of allowed |
| no | Comma-separated list of allowed |
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.atThis 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
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 |
| string | yes | -- | Title substring to match (3-500 chars), e.g. |
| string | no |
| Document type filter: |
| string | no |
| Language for titles and full text: |
| number | no |
| Max results (1-50) |
| string | no | -- | Filter from date, format: |
| string | no | -- | Filter to date, format: |
eurlex_fetch
Retrieve the full text of a document by its CELEX identifier. 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 |
| string | yes | -- | CELEX identifier, e.g. |
| string | no |
| Language: |
| string | no |
| Output format: |
| number | no |
| Max characters returned per call (1000-50000) |
| number | no |
| Character offset into the processed document, for pagination |
eurlex_metadata
Retrieve structured metadata for a document: document/entry-into-force/end-of-validity dates, in-force status, authors, legal basis, EuroVoc descriptors, and directory codes.
Parameter | Type | Required | Default | Description |
| string | yes | -- | CELEX identifier, e.g. |
| string | no |
| Language for titles and EuroVoc labels: |
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 |
| string | yes | -- | CELEX identifier, e.g. |
| string | no |
| Language for titles: |
| string | no |
|
|
| number | no |
| 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.
eurlex_by_eurovoc
Find documents by EuroVoc thesaurus concept (label or URI).
Parameter | Type | Required | Default | Description |
| string | yes | -- | EuroVoc concept: label (e.g. |
| string | no |
| Document type filter (same values as |
| string | no |
| Language: |
| number | no |
| 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 |
| string | no* | -- | CELEX ID of the original act, e.g. |
| string | no* | -- | Document type: |
| number | no* | -- | Year of the act (1950-2100), e.g. |
| number | no* | -- | Document number, e.g. |
| string | no |
| Language: |
| string | no |
| Output format: |
| number | no |
| Max characters returned per call (1000-50000) |
| number | no |
| Character offset into the processed document, for pagination |
* Exactly one of celex_id or the doc_type+year+number triple must be provided.
CELEX Number Schema
CELEX identifiers uniquely identify EU legal documents. The format is:
[sector][year][type][number]Sector (1 digit):
3= legislation,6= case law,5= preparatory actsYear (4 digits): year of the document
Type (1-2 letters):
R= regulation,L= directive,D= decision,J= judgment, etc.Number: sequential number
Examples:
CELEX | Document |
| AI Act (Regulation 2024/1689) |
| GDPR (Regulation 2016/679) |
| Digital Services Act (Regulation 2022/2065) |
| Court of Justice case C-131/14 |
Development
Setup
git clone https://github.com/Honeyfield-Org/eurlex-mcp-server.git
cd eurlex-mcp-server
pnpm install
pnpm buildCommands
Command | Description |
| Start dev server with hot reload |
| Compile TypeScript |
| Run unit tests |
| Run tests in watch mode |
| Run integration tests (hits real API) |
| Start production server |
Testing
pnpm test # unit tests
pnpm test:integration # integration tests (hits real API)Limitations
Rate limits: The EUR-Lex Cellar API is public but may throttle excessive requests.
Document availability: Not all documents have full text in all languages.
Consolidated versions: Only available for regulations, directives, and decisions.
Response size: Full text is returned per call in
max_charsslices (default 20,000 characters) to stay within LLM context limits -- useoffset/next_offsetoneurlex_fetch/eurlex_consolidatedto read the rest.SPARQL timeouts: Complex queries may occasionally time out on the Cellar endpoint despite the built-in retry with backoff; narrow broad
eurlex_search/eurlex_by_eurovocqueries withresource_typeor date filters if this happens.Search ordering:
eurlex_searchresults are sorted newest-first within the fetched sample only -- for very broad queries this is not guaranteed to be the single globally newest match.
Contributing
See CONTRIBUTING.md for development setup, architecture overview, and submission guidelines.
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Appeared in Searches
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Honeyfield-Org/eurlex-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server