io.github.cyanheads/eur-lex-mcp-server
REMOTE · EUR-LEX.CASEYJHAND.COM · 2 COMPONENTS
Search EU legislation, CJEU case law, and treaties; traverse CELLAR graph; browse EuroVoc concepts.
Available components
Last scanned (2 hours ago)
Scores higher than 95% of remote servers
Reachable. Last reached 6 Nov 2026.
Category Education and Research
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability72
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 8115 tokens (~1014/item across 8 items; 7 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management97
- Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 7 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 9 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (13)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 6 Nov 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 4 Nov 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “eurlex_lookup_celex” rewrote its description, which is the text the model reads security
- Tool “eurlex_browse_subjects” rewrote its description, which is the text the model reads security
- Tool “eurlex_get_cases” rewrote its description, which is the text the model reads security
- Tool “eurlex_get_document” rewrote its description, which is the text the model reads security
- Tool “eurlex_get_relations” rewrote its description, which is the text the model reads security
- Schema quality: 878 → 1014 ▼ functional
- Server version: 0.20.0 → 0.20.1 functional
- “eurlex_get_cases” added an optional parameter “member_state” cosmetic
- “eurlex_get_cases” added an optional parameter “outcome” cosmetic
- “eurlex_get_cases” added an optional parameter “procedure_type” cosmetic
- “eurlex_get_cases” added an optional parameter “subject” cosmetic
- “eurlex_get_cases” reworded the description of “include_derivative” cosmetic
- “eurlex_get_relations” reworded the description of “limit” cosmetic
- “eurlex_get_relations” reworded the description of “offset” cosmetic
- “eurlex_get_relations” reworded the description of “relation_types” cosmetic
- “eurlex_lookup_celex” reworded the description of “identifier” cosmetic
- “eurlex_lookup_celex” reworded the description of “identifier_type” cosmetic
- “eurlex_search_documents” reworded the description of “document_type” cosmetic
- “eurlex_search_documents” reworded the description of “eurovoc_concept” cosmetic
- 26 Oct 26 0
- Schema quality: 991 → 878 ▲ functional
- New resource “eur-lex-guide” functional
- Server version: 0.19.2 → 0.20.0 functional
- 25 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “eurlex_get_relations” rewrote its description, which is the text the model reads security
- Tool “eurlex_get_document” rewrote its description, which is the text the model reads security
- Tool “eurlex_lookup_celex” rewrote its description, which is the text the model reads security
- Schema quality: 888 → 991 ▼ functional
- Server version: 0.19.1 → 0.19.2 functional
- “eurlex_get_relations” added an optional parameter “article” cosmetic
- “eurlex_lookup_celex” reworded the description of “identifier” cosmetic
- “eurlex_lookup_celex” reworded the description of “identifier_type” cosmetic
- “eurlex_get_relations” reworded the description of “relation_types” cosmetic
- 23 Oct 26 0
- Tool “eurlex_get_cases” rewrote its description, which is the text the model reads security
- Server version: 0.19.0 → 0.19.1 functional
- “eurlex_get_relations” reworded the description of “limit” cosmetic
- “eurlex_get_cases” reworded the description of “include_derivative” cosmetic
- “eurlex_get_cases” reworded the description of “case_type” cosmetic
- “eurlex_search_documents” reworded the description of “author_institution” cosmetic
- “eurlex_get_relations” reworded the description of “relation_types” cosmetic
- “eurlex_get_relations” reworded the description of “offset” cosmetic
- 15 Oct 26 −1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “eurlex_query_sparql” rewrote its description, which is the text the model reads security
- Tool “eurlex_get_relations” rewrote its description, which is the text the model reads security
- Schema quality: 754 → 878 ▼ functional
- Server version: 0.18.2 → 0.19.0 functional
- “eurlex_get_relations” added an optional parameter “member_states” cosmetic
- “eurlex_get_cases” reworded the description of “limit” cosmetic
- “eurlex_search_documents” reworded the description of “offset” cosmetic
- “eurlex_search_documents” reworded the description of “limit” cosmetic
- “eurlex_query_sparql” reworded the description of “timeout_hint” cosmetic
- “eurlex_query_sparql” reworded the description of “sparql_query” cosmetic
- “eurlex_lookup_celex” reworded the description of “identifier” cosmetic
- “eurlex_get_relations” reworded the description of “relation_types” cosmetic
- “eurlex_get_relations” reworded the description of “offset” cosmetic
- “eurlex_get_relations” reworded the description of “limit” cosmetic
- “eurlex_get_document” reworded the description of “work_uri” cosmetic
- “eurlex_get_document” reworded the description of “select” cosmetic
- “eurlex_get_document” reworded the description of “limit” cosmetic
- “eurlex_get_cases” reworded the description of “offset” cosmetic
- “eurlex_browse_subjects” reworded the description of “offset” cosmetic
- “eurlex_browse_subjects” reworded the description of “limit” cosmetic
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 27 Sept 26 0
- Judged manipulation: unverified → pass ▲ security
- Schema quality: unverified → excellent ▲ functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 6 Nov 2026 · Probed https://eur-lex.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of eur-lex.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| caseyjhand.com. | DS published | 2371 | 13 | Verified |
| eur-lex.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://eur-lex.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://eur-lex.caseyjhand.com/mcp | HTTPS enforced | 301 | https://eur-lex.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
eurlex_browse_subjects Browse EuroVoc Subjects ~354
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 Court judgments carry one, so search case law by subject with eurlex_get_cases subject. Matches both preferred and alternative (non-preferred) labels, so a common synonym reaches the concept it stands for. Returns each concept URI, its preferred label in the requested language, code, broader (parent) label, and the alternative label that matched when one did. Concepts with an exact label match come first, then those whose label or one of its words starts with the keyword, then other substring matches, each group ordered by preferred label.
| Name | Type | Req | Description |
|---|---|---|---|
| keyword | string | yes | Search term matched against EuroVoc preferred and alternative concept labels (e.g. "privacy", "agriculture", "product liability"). |
| language | string | – | Language code for concept labels (e.g. "en", "fr", "de"). Case-insensitive — "EN" and "en" behave identically. Defaults to English. |
| limit | integer | – | 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. |
| offset | integer | – | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The limit that was applied to this response. |
| concepts | array | – | Matching EuroVoc concepts, exact label matches first, then word-start matches, then other substring matches, each group ordered by preferred label. |
| error | object | – | Present when the call failed. Absent on success. |
| has_more | boolean | – | True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match. |
| limit_clamp | object | – | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | number | – | Offset for the next page. Present only when has_more is true. |
| notice | string | – | Guidance for the next call: on an empty first page, the keyword and language that matched nothing and how to broaden them; on a page with more rows, the offset to continue from; on a page ending at r… |
| offset | number | – | Pagination offset used for this response. |
| shown | number | – | Number of concepts returned in this response. |
| total | number | – | Number of concepts returned in this response. |
| truncated | boolean | – | True when an additional CELLAR row proves more concepts exist beyond this page. |
No examples provided.
eurlex_get_cases Search CJEU/GC Case Law ~1,666
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 view filed under it. By default only these primary records are returned; derivative judicial information notices, case abstracts, summaries, and corrigenda are excluded so distinct cases fill the page (set include_derivative to include them). Keyword matches English case titles (which carry party names) and CELEX strings; there is no full-text body search. member_state, procedure_type, outcome, and subject match the facts CELLAR records on each case, so a case it records none of a filtered fact for never matches. Returns each case with its CELEX number (whose sixth character names the court: C, T, or F), work URI, ECLI, date, and type; where CELLAR records them, its countries, procedure types with outcome, subjects, and procedure languages; and — parsed from the title where present — the formation, Advocate General, parties, referring court, subject matter, and case reference. The raw CELLAR title is returned only when those fields do not capture all of it.
| Name | Type | Req | Description |
|---|---|---|---|
| case_number | string | – | 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-97… |
| case_type | – | – | Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view). Omit to search all. |
| court | – | – | 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 ma… |
| date_from | – | – | Start of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound. |
| date_to | – | – | End of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound. |
| include_derivative | boolean | – | 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: the… |
| keyword | string | – | 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 th… |
| limit | integer | – | 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. |
| member_state | string | – | 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's… |
| offset | integer | – | 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 wi… |
| outcome | – | – | 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 annulmen… |
| procedure_type | – | – | Procedure type, as CELLAR classifies the case: preliminary_ruling (urgent references included), annulment, staff_case, appeal, failure_to_fulfil_obligations, damages, interim_measures, appeal_against… |
| subject | string | – | 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 insid… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The limit that was applied to this page. |
| cases | array | – | Matching case law records ordered by date descending, then by CELEX number ascending among records sharing a date, so pages are stable across calls. |
| error | object | – | Present when the call failed. Absent on success. |
| has_more | boolean | – | True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match. |
| limit_clamp | object | – | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | number | – | Offset for the next page. Present only when has_more is true. |
| notice | string | – | Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; when subject matched no subject label, that no case was searched; on a page with more row… |
| offset | number | – | Pagination offset used for this response. |
| query_echo | object | – | Echo of filters applied to this search. Useful for diagnosing empty results. |
| shown | number | – | Number of cases returned in this page. |
| total | number | – | Number of cases returned in this page (not a corpus-wide count). |
| truncated | boolean | – | True when an additional CELLAR row proves more cases exist beyond this page. |
No examples provided.
eurlex_get_document Get EU Document ~1,504
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 basis, EuroVoc subjects, in-force status and, for an act not in force, its repealing acts, end of validity, or pending entry into force; the legislative procedures the act belongs to, each with its status — adopted, withdrawn, pending, or not adopted — and the acts it produced; for case law, the ECLI, the formation, referring court, subject matter, and case reference parsed from the title, and the countries, procedure types with their outcome, subjects, and procedure languages CELLAR records) plus the body as HTML, Markdown, or Formex4 XML, defaulting to English with automatic fallback. Every body returned in one call is capped at 100,000 characters — paged and full windows page onward with offset/limit; use outline: true for a heading map and select to pull specific articles, chapters, recitals, or annexes of an act, or the headed sections and operative part of a judgment or order, reading a selected section on its own from the offset and chars in selected_sections.
| Name | Type | Req | Description |
|---|---|---|---|
| celex_number | – | – | CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri. |
| content_mode | string | – | 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; "me… |
| eli_uri | string | – | 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. |
| format | string | – | 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. |
| include_recitals | boolean | – | 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. |
| language | string | – | 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 is… |
| limit | integer | – | 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 limi… |
| offset | integer | – | 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 forma… |
| outline | boolean | – | 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 appe… |
| resolve | string | – | 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 consolidat… |
| select | object | – | 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 languag… |
| work_uri | string | – | 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 eurle… |
| Name | Type | Req | Description |
|---|---|---|---|
| advocates_general | array | – | Advocates General who delivered this case-law record, by surname as CELLAR records it (e.g. ["Jääskinen"]), sorted. A few Opinions of the Court list several. Absent for legislation and for case law w… |
| alternative_representations | array | – | Verified alternative PDF stream locations; no claim that they contain every omitted table. |
| author_institution | string | – | Primary (first) author, by the English label of its CELLAR authority code: an EU institution or body (e.g. "European Parliament", "Court of Justice", "European Union"), a member state on a national i… |
| author_institutions | array | – | All authors, labelled as in author_institution and listed once each, for acts adopted by more than one body (e.g. ["European Parliament", "Council of the European Union"]) or signed by several states… |
| base_act_celex | string | – | CELEX of the base act a consolidated text consolidates (e.g. 32024R1689), linked through CELLAR rather than derived from the consolidated CELEX. Its authors, in-force status, legal basis, and EuroVoc… |
| cap | integer | – | Maximum body characters allowed in the window. |
| case_reference | string | – | Case law: the case reference from the title (e.g. "Case C-131/12."). |
| celex_number | string | – | Confirmed CELEX number for the retrieved work. |
| consolidated_as_of | string | – | Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present whenever is_superseded is. |
| content | string | – | Body content of the act in the requested format and language. In "paged" mode this is the requested window; in "full" mode it starts at zero; under select it is the matched sections joined in documen… |
| content_available | boolean | – | Whether body content was fetched from EUR-Lex. False in "metadata_only" mode (no fetch attempted) — use content_mode to distinguish "not requested" from "unavailable upstream". |
| content_chars_returned | integer | – | Number of body characters returned in this response (equals content length). Present when a body was fetched and available. |
| content_chars_total | integer | – | Total character length of the full document body. Present when content was fetched and available; use with content_offset to page through the entire act. |
| content_format | string | – | Format of the returned content: "html", "markdown", or "xml". |
| content_mode | string | – | Content mode applied to this response: "metadata_only", "paged", or "full". |
| content_offset | integer | – | Character offset where the returned contiguous window begins. Present in "paged" and "full" modes. Absent for outline and select responses, whose content is not a contiguous span — read selected_sect… |
| content_omissions | object | – | Known source omissions; an available body can still omit substantive tables. |
| content_status | string | – | Body resolution status: "not_requested" for metadata-only calls, "available" when a body was resolved, or "unavailable" after ordinary resolution attempts returned no usable body. |
| content_unavailability_reason | string | – | Why content_status is "unavailable": no representation exists, the upstream request failed, or a multipart Formex body could not be assembled completely. |
| countries | array | – | Case law: countries CELLAR records the case as originating in, as ISO 3166-1 alpha-3 codes, sorted — the referring court's state on a preliminary reference, the defendant state on an action for failu… |
| current_consolidated_celex | string | – | CELEX of the act's newest consolidated version in effect (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve "current_consolidated". A consolidation dated in the future is… |
| date | string | – | Document date in ISO 8601 format (YYYY-MM-DD). Absent when CELLAR records no real document date — none, or the 1001-01-01 it records for an undated work. |
| dates_of_effect | array | – | Every date of effect CELLAR records for the act, sorted by date, one entry per date, type, and provision (a date can carry several, e.g. entry into force and application), whether past or ahead and w… |
| ecli | string | – | European Case Law Identifier of a case-law record (e.g. "ECLI:EU:C:2014:317"), as eurlex_lookup_celex reports it: the work's own, or the lowest another work holding the same CELEX records. Absent for… |
| eli | string | – | European Legislation Identifier of the work served (e.g. "http://data.europa.eu/eli/reg/2016/679/oj"); a consolidated text carries its own point-in-time ELI (e.g. "http://data.europa.eu/eli/reg/2016/… |
| end_of_validity | string | – | Date (YYYY-MM-DD) the act's validity ends or ended: past for an expired act, and possibly in the future for one not yet in force (read it with entry_into_force), so on its own it does not mean the ac… |
| entry_into_force | string | – | Earliest entry-into-force date (YYYY-MM-DD) of an act not yet in force. Present only when in_force is false and that date is after today (UTC); for a consolidated text, its base act's. Every recorded… |
| error | object | – | Present when the call failed. Absent on success. |
| eurovoc_subjects | array | – | EuroVoc subject classifications — for a consolidated text, its base act's. Absent when none are recorded. |
| formation | string | – | Case law: the formation that decided, from the title's leading segment, verbatim (e.g. "Grand Chamber"), or "President", "Vice-President", or "President of the Second Chamber" for an order issued by… |
| has_more | boolean | – | True when body content exists beyond the returned contiguous window. Continue in "paged" mode with offset = content_offset + content_chars_returned until false. Always false in "metadata_only" mode,… |
| in_force | boolean | – | Whether the act is currently in force — for a consolidated text, whether its base act is. When false, repealed_by, entry_into_force, and end_of_validity give the reason where CELLAR records one: an e… |
| is_superseded | boolean | – | Whether a newer consolidated version (an unofficial reading aid merging later amendments) than the text served is in effect, so this text may lack those amendments. False when the text served is the… |
| language | string | – | Language code of the returned content. |
| language_fallback | string | – | Human-readable note explaining the fallback that occurred (e.g. "Requested FR content unavailable; returned EN"). Present only when a fallback happened. |
| legal_basis | array | – | Legal basis acts for this work — for a consolidated text, its base act's. Absent when none are recorded. |
| limit_clamp | object | – | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| national_measure | object | – | National implementing measure publication citation and notification facts recorded on the served work. Missing facts are omitted; no source URL is inferred. |
| notice | string | – | How to retrieve the remaining document content; when select.annexes asked for "ANNEX" on an act whose annexes are numbered, which numbers select one; when work_uri names an expression or manifestatio… |
| oj_reference | string | – | Official Journal reference the act was published under, e.g. "OJ L 119, 4.5.2016, p. 1–88", "OJ 13, 21.2.1962, p. 204–211" (before 1968, no series letter), "OJ L 42I, …" (an issue class other than R)… |
| outline | array | – | Structural outline of the act. Present only when outline is true; an empty array means no structure was detected. |
| procedure_languages | array | – | Case law: languages of the case, as the two-letter codes language takes, sorted. Absent for legislation, and for case law with none recorded, as on about half of the Court of Justice AG opinions and… |
| procedure_types | array | – | Case law: the court procedure types CELLAR classifies the case under, as English labels with the outcome where recorded (e.g. "Reference for a preliminary ruling", "Appeal - unfounded"), sorted; what… |
| procedures | array | – | The interinstitutional (legislative) procedures the act belongs to, sorted by reference: a proposal's own procedure, or the procedure that adopted an act. A work can belong to several. Distinct from… |
| referring_court | string | – | Case law: the national court that referred a preliminary ruling, from the title (e.g. "Audiencia Nacional"). Absent on direct actions and appeals. |
| repealed_by | array | – | CELEX numbers of the acts that explicitly repeal this one, the relation eurlex_get_relations names repealed_by (implicit repeals are listed there as implicitly_repealed_by). Present only when in_forc… |
| requested_celex | string | – | The originally requested CELEX, echoed when resolve "current_consolidated" served a different consolidated version. celex_number holds the CELEX actually served. Absent when the served work is the on… |
| requested_language | string | – | Originally requested language code when English fallback changed the effective language reported in language. |
| resource_type | string | – | Human-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works. |
| selected_sections | array | – | Source address of each distinct section the selection located, in document order. Present only when select was used. A section nested inside another selected section keeps its own entry, though its t… |
| selection | object | – | Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, a nested section's text once inside its enclosing section, capped at… |
| shown | integer | – | Number of body characters returned. |
| structure_detected | boolean | – | Whether any structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure, or for case law no section heading or operative par… |
| subject_matter | string | – | Case law: the subject-matter keyword list from the title (e.g. "Personal data – Protection of individuals …"). Free text, unlike subjects, CELLAR's subject classification. |
| subjects | array | – | Case law: subjects of CELLAR's case-law subject classification, as English labels, sorted; what the subject filter of eurlex_get_cases matches. A controlled vocabulary, unlike the title's subject_mat… |
| title | string | – | Document title in the language the body is served in (see language), or in English when CELLAR records no title in that language. Case law is titled in English whatever the language, parsed from its… |
| transposition_deadlines | array | – | A directive's deadlines for transposition into national law, sorted. For a consolidated text, its base act's. Absent when none is recorded. |
| truncated | boolean | – | True when the returned body window was capped. |
| work_uri | string | – | CELLAR work URI. |
No examples provided.
eurlex_get_relations Get CELLAR Relationship Graph ~970
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 states with none), its legal basis and the works adopted under it, the proposal it adopts (or, for a proposal, the act that adopted it), the CJEU rulings interpreting it (or, for a ruling, the acts it interprets), and works that cite it. Amendment, repeal, interpretation, and adoption rows carry the provisions CELLAR records each edge as targeting, and article narrows interpreted_by to the rulings on one article. Returns direct relations only, paginated per relation type and direction. Requires a CELEX number or CELLAR work URI.
| Name | Type | Req | Description |
|---|---|---|---|
| article | string | – | 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 c… |
| celex_number | – | – | CELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri. |
| limit | integer | – | 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 dire… |
| member_states | array | – | 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_offset… |
| offset | integer | – | 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-first,… |
| relation_types | array | – | 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, le… |
| work_uri | string | – | 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 for… |
| Name | Type | Req | Description |
|---|---|---|---|
| article | string | – | The article interpreted_by rows were narrowed to, normalized from the article input: the number without a prefix or leading zeros, any letter in lower case (17, 28c). Absent when no article filter wa… |
| cap | number | – | The per-direction cap. It bounds each relation type and each direction independently, so it is not an upper bound on shown: a page spanning several types and both directions can return more relations… |
| celex_number | string | – | CELEX number of the source work whose relations were traversed — the celex_number input, or the CELEX resolved from work_uri when the addressed work carries exactly one. Absent when the addressed wor… |
| empty_relation_types | array | – | Requested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genu… |
| error | object | – | Present when the call failed. Absent on success. |
| has_more | boolean | – | True when an additional valid row proves at least one requested relation type/direction has more rows. False on a retained page that ends at row 10,000, the last one CELLAR sorts; its notice names th… |
| limit_clamp | object | – | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| member_states | array | – | The member states national_transposition rows were narrowed to, as ISO 3166-1 alpha-3 codes, normalized from member_states and de-duplicated. Absent when no member_states filter was given. |
| next_offset | number | – | Offset plus the limit served per relation type and direction (the applied value when limit_clamp is present). Present only when has_more is true; pass it as offset to continue. |
| notice | string | – | Guidance for the next call: on an empty first page, how to widen the traversal; on a first page where member_states matched no national_transposition measures, the codes it named; with article, that… |
| offset | number | – | Pagination offset applied to this response (per relation type and direction). |
| relations | array | – | Direct CDM relations for the requested work. |
| requested_relation_types | array | – | The relation types this request traversed — the explicit relation_types list, or all types when it was omitted. Diff against the types present in relations[], or read empty_relation_types, to confirm… |
| shown | number | – | Number of relations returned in this page, summed across every relation type and direction — not the count for any single type or direction. |
| total | number | – | Number of relations returned in this page (not a corpus-wide count). |
| transposition_summary | object | – | Every national_transposition measure in scope tallied per member state, from one count over all of them rather than this page's rows, so limit does not bound it and total does not count it. Present o… |
| truncated | boolean | – | True when an additional valid row proves at least one relation type/direction has more related works — page with offset. |
| work_uri | string | – | CELLAR URI of the source work (the work_uri input, or resolved from the CELEX). |
No examples provided.
eurlex_lookup_celex Resolve EU Legal Citation ~1,243
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 Commission document number (e.g. "COM(2021) 206 final", also SEC, SWD, JOIN), or an interinstitutional procedure reference (e.g. "2021/0106(COD)", resolved to the act that initiated it) — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, date, and the ECLI of a case that carries one. A CELEX that CELLAR holds under several works resolves to the one the EUR-Lex content resolver serves. An ECLI shared by several records (a judgment and its abstract or extract, or a joined AG opinion) resolves to the primary record with the lowest CELEX. An OJ reference whose first page starts several acts, a document number CELLAR holds in several parts, and a procedure with several initiating acts return found false, the notice naming each CELEX.
| Name | Type | Req | Description |
|---|---|---|---|
| identifier | string | yes | 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:31… |
| identifier_type | string | – | 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 proc… |
| Name | Type | Req | Description |
|---|---|---|---|
| celex_number | string | – | Confirmed CELEX number for the resolved work. |
| date | string | – | Document date in ISO 8601 format (YYYY-MM-DD). Absent when CELLAR records no real document date — none, or the 1001-01-01 it records for an undated work. |
| ecli | string | – | European Case Law Identifier of the case (e.g. "ECLI:EU:C:2014:317"), as CELLAR stores it — the resolved work's own, or the one another work holding the same CELEX records. Present for case law that… |
| error | object | – | Present when the call failed. Absent on success. |
| found | boolean | – | True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, OJ citation, Official Journal reference, Commission document number, or procedure reference matches no w… |
| notice | string | – | Present only when found is false: the CELEX, ELI, ECLI, OJ reference, Commission document number, or procedure looked up, the accepted forms, and the search to use instead; for an OJ reference whose… |
| resource_type | string | – | Human-readable document category resolved from the CDM resource type (e.g. "Regulation", "Directive", "Judgment"). An authority value with no known label falls back to its code (e.g. "BUDGET"). Absen… |
| work_uri | string | – | CELLAR work URI (stable resource identifier). |
No examples provided.
eurlex_query_sparql Raw CELLAR SPARQL Query ~389
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 server row cap (100 by default). The cdm:, skos:, and xsd: prefixes are auto-injected.
| Name | Type | Req | Description |
|---|---|---|---|
| sparql_query | string | yes | 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 t… |
| timeout_hint | integer | – | Optional client-side timeout in milliseconds (1000–55000). The server default (55000 unless the deployment configures another value) applies when omitted. |
| Name | Type | Req | Description |
|---|---|---|---|
| bindings | array | – | Raw SPARQL binding rows. To extract a value from a row: row["varName"]?.value. Use the variables array to iterate in query order. |
| cap | number | – | The server-enforced result ceiling that was applied. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | On a truncated result: how to page past the row cap with ORDER BY and OFFSET, and the 10,000-row limit on a sorted query. On a zero-row result whose query has an untyped string literal as a triple ob… |
| shown | number | – | Number of binding rows returned in this response. |
| total | number | – | Number of binding rows returned (at most the server's row cap, 100 by default). |
| truncated | boolean | – | True when the server's row cap (the deployment's configured cap, 100 by default; cap gives the value applied) limited the rows and more may exist upstream — page on with ORDER BY in the query and OFF… |
| variables | array | – | Variable names from the SELECT head, in query order. |
No examples provided.
eurlex_search_documents Search EU Documents ~1,145
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 excluded by default so primary acts fill the page (set include_corrigenda to include them). Returns a page of CELEX numbers, work URIs, type labels, dates, and titles, newest first, each flagged with is_consolidated and is_corrigendum. At least one filter is required.
| Name | Type | Req | Description |
|---|---|---|---|
| author_institution | string | – | 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 eu… |
| date_from | – | – | Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound. |
| date_to | – | – | End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound. |
| document_type | – | – | 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 CELLA… |
| eurovoc_concept | – | – | 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-c… |
| in_force | boolean | – | 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 records… |
| include_consolidated | boolean | – | 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_co… |
| include_corrigenda | boolean | – | 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 e… |
| keyword | string | – | 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) matches… |
| limit | integer | – | 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. |
| offset | integer | – | 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 wi… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The limit that was applied to this page. |
| documents | array | – | Matching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls. |
| error | object | – | Present when the call failed. Absent on success. |
| has_more | boolean | – | True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match. |
| limit_clamp | object | – | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | number | – | Offset for the next page. Present only when has_more is true. |
| notice | string | – | Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them, or, for eurovoc_concept with document_type JUDG or OPIN_AG, how to search case law by sub… |
| offset | number | – | Pagination offset used for this response. |
| query_echo | object | – | Echo of filters applied to this search. Useful for diagnosing empty results. |
| shown | number | – | Number of documents returned in this page. |
| total | number | – | Number of documents returned in this page (not a corpus-wide count). |
| truncated | boolean | – | True when an additional CELLAR row proves more documents exist beyond this page. |
No examples provided.
How do I install the io.github.cyanheads/eur-lex-mcp-server server?
io.github.cyanheads/eur-lex-mcp-server is a hosted endpoint at https://eur-lex.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · eur-lex.caseyjhand.com
claude mcp add --transport http cyanheads-eur-lex-mcp-server 'https://eur-lex.caseyjhand.com/mcp'
What is the io.github.cyanheads/eur-lex-mcp-server server?
io.github.cyanheads/eur-lex-mcp-server is listed in the public MCP registry as io.github.cyanheads/eur-lex-mcp-server. Search EU legislation, CJEU case law, and treaties; traverse CELLAR graph; browse EuroVoc concepts. This page covers its hosted endpoint (https://eur-lex.caseyjhand.com/mcp).
Is the io.github.cyanheads/eur-lex-mcp-server server safe to use?
io.github.cyanheads/eur-lex-mcp-server scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/eur-lex-mcp-server server expose?
io.github.cyanheads/eur-lex-mcp-server exposes 7 tools: eurlex_lookup_celex, eurlex_browse_subjects, eurlex_search_documents, eurlex_get_cases, eurlex_get_document, and 2 more. Their descriptions and schemas cost roughly 7,271 tokens of context every time the server is loaded.
Does the io.github.cyanheads/eur-lex-mcp-server server require authentication?
No. We connected to io.github.cyanheads/eur-lex-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/eur-lex-mcp-server server still maintained?
io.github.cyanheads/eur-lex-mcp-server is still listed as active in the MCP registry. We last reached this channel on 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the io.github.cyanheads/eur-lex-mcp-server server?
VerifyMCP ran 13 checks on io.github.cyanheads/eur-lex-mcp-server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.