cyanheads avatar

Eur Lex Mcp Server

cyanheads/eur-lex-mcp-server

Plugs Claude directly into the European Union's CELLAR database and EUR-Lex content APIs. Seven tools cover the full research workflow: keyword search across 2.7 million legislative acts with EuroVoc subject filtering, full-text retrieval in 24 languages, CELEX and ELI citation resolution, CJEU case law search, and graph traversal for amendments, consolidations, and legal basis chains. Raw SPARQL access included when you need custom CDM ontology queries. Built on the public CELLAR endpoint, so no API key required. Reach for this when you're doing EU regulatory analysis, tracking transposition measures, or need structured access to treaties and directives instead of scraping HTML.

GitHub stars
12
tools
7
transport
STDIO, HTTP
env vars
11
last updated
Nov 9, 2026

Install

From registry metadata
$ npx add-mcp https://eur-lex.caseyjhand.com/mcp --name eur-lex

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http eur-lex https://eur-lex.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 7 tools

Verified live against the running server on Nov 6, 2026.

eurlex_lookup_celexResolve an EU legal citation — a CELEX number, ELI URI, ECLI, an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC"), an Official Journal reference naming its issue, date, and first page (e.g. "OJ L 119, 4.5.2016, p. 1"), a Commissi...2 params

Resolve an EU legal citation — a CELEX number, ELI URI, ECLI, an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC"), an Official Journal reference naming its issue, date, and first page (e.g. "OJ L 119, 4.5.2016, p. 1"), a Commissi...

Parameters* required
identifier*string
The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), an ECLI (e.g. ECLI:EU:C:2014:...
identifier_typestring
Format of the identifier. "auto" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), an OJ citation, an Official Journal reference, a Commission document number, or a pr...one of celex · eli · ecli · autodefault: auto
eurlex_browse_subjectsSearch the EuroVoc thesaurus, resolving a keyword into concept URIs usable in the eurovoc_concept subject filter of eurlex_search_documents. CELLAR indexes no judgment, order, or Advocate General opinion of the Court of Justice or General Court by EuroVoc concept; only EFTA Co...4 params

Search the EuroVoc thesaurus, resolving a keyword into concept URIs usable in the eurovoc_concept subject filter of eurlex_search_documents. CELLAR indexes no judgment, order, or Advocate General opinion of the Court of Justice or General Court by EuroVoc concept; only EFTA Co...

Parameters* required
keyword*string
Search term matched against EuroVoc preferred and alternative concept labels (e.g. "privacy", "agriculture", "product liability").
languagestring
Language code for concept labels (e.g. "en", "fr", "de"). Case-insensitive — "EN" and "en" behave identically. Defaults to English.default: en
limitinteger
Maximum number of EuroVoc concepts to return, served up to 50 per call; a larger value (up to 10,000) is served at 50 and reported in limit_clamp. Defaults to 20.default: 20
offsetinteger
Pagination offset — number of concepts to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000.default: 0
eurlex_search_documentsSearch EU legislation, treaties, and preparatory acts across the CELLAR corpus by document type, date range, EuroVoc subject, author institution, and in-force status. Keyword matches English titles and CELEX strings only — there is no full-text body search. Corrigenda are excl...11 params

Search EU legislation, treaties, and preparatory acts across the CELLAR corpus by document type, date range, EuroVoc subject, author institution, and in-force status. Keyword matches English titles and CELEX strings only — there is no full-text body search. Corrigenda are excl...

Parameters* required
author_institutionstring
Author name (e.g. "European Parliament", "Council", "European Commission", "Supremo Tribunal de Justiça"), matched as a phrase against English authority labels or national-court names — the labels...
date_fromvalue
Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound.
date_tovalue
End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound.
document_typevalue
Document category: REG=Regulations, DIR=Directives, DEC=Decisions, TREATY=Treaties, JUDG=Judgments, OPIN_AG=AG Opinions, PROP=Proposals, REC=Recommendations. Each category includes its explicit CEL...
eurovoc_conceptvalue
EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Only EuroVoc concept URIs are accepted; https://eurovoc.europa.eu/… and an upper...
in_forceboolean
Restrict by in-force status: true returns only acts currently in force; false returns acts not in force — repealed, expired, or not yet in force (eurlex_get_document names which, where CELLAR recor...
include_consolidatedboolean
When true and document_type is set, also match consolidated texts whose basic act belongs to that document category. No effect when document_type is omitted. Consolidated rows are always tagged is_...default: false
include_corrigendaboolean
Include corrigenda — separate correction works, co-typed CORRIGENDUM alongside the base type of the act they correct, carrying a "…R(nn)" CELEX and usually no English title. Default false: they are...default: false
keywordstring
Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) match...
limitinteger
Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20.default: 20
offsetinteger
Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to...default: 0
eurlex_get_casesSearch CJEU and General Court case law — judgments, orders, and Advocate General opinions and views — by case number, court, case type, member state, procedure type and outcome, subject, keyword, and date range. A case number reaches every judgment, order, AG opinion, and AG v...13 params

Search CJEU and General Court case law — judgments, orders, and Advocate General opinions and views — by case number, court, case type, member state, procedure type and outcome, subject, keyword, and date range. A case number reaches every judgment, order, AG opinion, and AG v...

Parameters* required
case_numberstring
Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form ("Case C-...
case_typevalue
Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view). Omit to search all.
courtvalue
Court filter, by the court letter at position 6 of the CELEX: CJEU (C) = Court of Justice of the EU, GC (T) = General Court. It does not narrow by record type: every primary record the court filed...
date_fromvalue
Start of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound.
date_tovalue
End of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound.
include_derivativeboolean
Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, AG opinions, and AG views. Default false: t...default: false
keywordstring
Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches...
limitinteger
Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20.default: 20
member_statestring
Member state the case originates in, as CELLAR records it: the referring court's state on a preliminary reference, the defendant state on an action for failure to fulfil obligations, the applicant'...
offsetinteger
Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to...default: 0
outcomevalue
Outcome CELLAR records with the procedure: successful, unfounded, inadmissible, or decision_unnecessary. With procedure_type, both hold on the same procedure (annulment with successful finds annulm...
procedure_typevalue
Procedure type, as CELLAR classifies the case: preliminary_ruling (urgent references included), annulment, staff_case, appeal, failure_to_fulfil_obligations, damages, interim_measures, appeal_again...
subjectstring
Subject phrase matched against the English labels of CELLAR's case-law subject classification: the search covers every subject whose label contains each word of the phrase, in any case and also ins...
eurlex_get_documentFetch the metadata and full text of an EU act or case-law record by CELEX number, ELI URI, or work URI. Returns structured metadata (title, date, type, ELI, Official Journal reference, typed dates of effect, transposition deadlines, author institution, Advocates General, legal...12 params

Fetch the metadata and full text of an EU act or case-law record by CELEX number, ELI URI, or work URI. Returns structured metadata (title, date, type, ELI, Official Journal reference, typed dates of effect, transposition deadlines, author institution, Advocates General, legal...

Parameters* required
celex_numbervalue
CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri.
content_modestring
How much of the body to return. "paged" (default) returns an offset/limit window; "full" requests from the start and returns at most 100000 characters with continuation metadata when more exists; "...one of metadata_only · paged · fulldefault: paged
eli_uristring
Work-level ELI URI of the act to fetch (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri.
formatstring
Content format: "html" for the act text as served by EUR-Lex (default), "markdown" for that HTML converted to clean Markdown server-side, or "xml" for Formex4 structured XML.one of html · xml · markdowndefault: html
include_recitalsboolean
List every recital as its own outline entry, with its own offset, instead of one entry for the run. Applies only when outline is true; select reaches a single recital either way.default: false
languagestring
One of the 24 supported two-letter EUR-Lex language codes (e.g. EN, FR, DE), accepted case-insensitively and normalized to uppercase. Defaults to EN, and falls back to EN if the requested language...default: EN
limitinteger
Maximum characters to return in this window ("paged" mode only; select ignores it). Default 25000; a window holds at most 100000 characters, so a larger value is served at 100000 and reported in li...default: 25000
offsetinteger
Character offset into the body where the returned window starts ("paged" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call. Offsets are for...default: 0
outlineboolean
Return a structural outline of the act — chapters, sections, articles, annexes, and the preamble's recitals as a heading list, each with its character offset — instead of body text. The recitals ap...default: false
resolvestring
Which version to serve. "as_requested" (default) returns the exact CELEX requested; "current_consolidated" serves the newest consolidated version in effect of the requested act — or, for a consolid...one of as_requested · current_consolidateddefault: as_requested
selectobject
Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent; a number may carry an English kind word or one in the langu...
work_uristring
CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eur...
eurlex_get_relationsTraverse the one-hop CDM relationship graph of an EU act: what it amends or is amended by, what it repeals or is repealed by (explicit and implicit), its consolidated versions, national transposition measures (on a first page also counted per member state, naming the member st...7 params

Traverse the one-hop CDM relationship graph of an EU act: what it amends or is amended by, what it repeals or is repealed by (explicit and implicit), its consolidated versions, national transposition measures (on a first page also counted per member state, naming the member st...

Parameters* required
articlestring
Narrow interpreted_by to the rulings with a recorded provision in this article of the act: an article number with at most one letter (17, 6a), optionally prefixed "Article", "Art." or "Art", in any...
celex_numbervalue
CELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri.
limitinteger
Maximum related works per relation type and direction, served up to 100 per call (default 10); a larger value (up to 10,000) is served at 100 and reported in limit_clamp. It bounds each type and di...default: 10
member_statesarray
Narrow national_transposition rows to the measures of these member states — the 27 member states plus the United Kingdom, by alpha-3 or two-letter code, in any case. Paging, has_more, and next_offs...
offsetinteger
Pagination offset applied per relation type and direction — related works to skip (default 0). Continue at the returned next_offset, the offset plus the limit served; incoming edges are newest-firs...default: 0
relation_typesarray
Subset of relation types to return; omit for all fifteen, equivalent to listing them explicitly. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by,...
work_uristring
CELLAR work resource URI to traverse (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1). Used directly as the addressed work; its CELEX identity is resolved f...
eurlex_query_sparqlRun a raw, read-only SPARQL SELECT against the CELLAR Virtuoso endpoint — an escape hatch for CDM ontology traversals the curated tools do not cover. Only SELECT is accepted; update forms and ASK/CONSTRUCT/DESCRIBE are rejected before execution, and results are capped at the s...2 params

Run a raw, read-only SPARQL SELECT against the CELLAR Virtuoso endpoint — an escape hatch for CDM ontology traversals the curated tools do not cover. Only SELECT is accepted; update forms and ASK/CONSTRUCT/DESCRIBE are rejected before execution, and results are capped at the s...

Parameters* required
sparql_query*string
A read-only SPARQL SELECT query. Leading comments and PREFIX/BASE declarations are allowed; the cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at the server row cap (100 unless...
timeout_hintinteger
Optional client-side timeout in milliseconds (1000–55000). The server default (55000 unless the deployment configures another value) applies when omitted.

Sponsors

Configuration

CELLAR_SPARQL_ENDPOINTdefault: http://publications.europa.eu/webapi/rdf/sparql

CELLAR SPARQL endpoint URL override (e.g., for a local Virtuoso mirror).

EURLEX_CONTENT_BASE_URLdefault: http://publications.europa.eu

Base URL of the EU Publications Office CELLAR content-negotiation resolver that serves act full text; override e.g. for a local mirror.

SPARQL_QUERY_TIMEOUT_MSdefault: 55000

Client-side timeout for SPARQL requests in milliseconds.

MAX_SPARQL_RESULTSdefault: 100

Enforced ceiling on LIMIT in all generated SPARQL queries.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_PUBLIC_URL

Public origin for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/eur-lex-mcp-server

Search EU legislation, CJEU case law, and treaties; traverse the CELLAR relationship graph; resolve EuroVoc concepts via MCP. STDIO or Streamable HTTP.

7 Tools • 2 Resources • 1 Prompt

Details

Repository
github.com/cyanheads/eur-lex-mcp-server
Category
Search & Web Crawling
Package
@cyanheads/eur-lex-mcp-server
Transport
STDIO, HTTP
Registry
MCP registry, active
Resources
1
Prompts
1
Tools verified
Nov 6, 2026

More from cyanheads

Related Search & Web Crawling MCP servers

View all
1danielblomma avatarCortexdanielblomma/cortexLocal repo context for coding assistants with semantic search and graph relationships.12stars
2icyhot09 avatarOpenGrok MCP Servericyhot09/opengrok-mcp-serverMCP server bridging OpenGrok search engine with AI for instant context across massive codebases.11stars
3kylastech avatarKylas CRMkylastech/kylas-crm-mcp-serverMCP server for Kylas CRM: create, search, and manage leads. Requires KYLAS_API_KEY.11stars
4serkan-ozal avatarSerkan Ozal Driflyte Mcp Serverserkan-ozal/driflyte-mcp-serverDiscover available topics and explore up-to-date, topic-tagged web content. Search to surface the…10stars
5haseebkhalid1507 avatarVelociraghaseebkhalid1507/velociragLightning-fast RAG for AI agents. 4-layer fusion, ONNX Runtime, sub-200ms search.10stars
6simonsysun avatarSeekLinksimonsysun/seeklinkLocal read-only semantic search for Markdown vaults through MCP.10stars