Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.cyanheads/eur-lex-mcp-server

REMOTE · EUR-LEX.CASEYJHAND.COM · 2 COMPONENTS · SCANNED SEP 21

Search EU legislation, CJEU case law, and treaties; traverse CELLAR graph; browse EuroVoc concepts.

0 this week 82 Trust /100
Trust breakdown (7 categories)

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 Security66
  • The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
  • Authorisation not fully verified: no authorisation is required to call this server, and 7 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe. See how to fix → View diagnostics → Unverified
  • 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
Schema Quality & AI Usability77
  • 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 3357 tokens (~479/item across 7 items; 7 tools + 0 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 Management100
  • No destabilizing schema changes in the last 30 days.Pass
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 8 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
Install

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

# add to Claude Code
claude mcp add --transport http cyanheads-eur-lex-mcp-server 'https://eur-lex.caseyjhand.com/mcp'
// .cursor/mcp.json
{
  "mcpServers": {
    "cyanheads-eur-lex-mcp-server": {
      "url": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cyanheads-eur-lex-mcp-server": {
      "type": "http",
      "url": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}
# ~/.codex/config.toml
[mcp_servers.cyanheads-eur-lex-mcp-server]
url = "https://eur-lex.caseyjhand.com/mcp"
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-eur-lex-mcp-server": {
      "type": "remote",
      "url": "https://eur-lex.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cyanheads-eur-lex-mcp-server --url 'https://eur-lex.caseyjhand.com/mcp' --transport streamable-http
# ~/.hermes/config.yaml
mcp_servers:
  cyanheads-eur-lex-mcp-server:
    url: "https://eur-lex.caseyjhand.com/mcp"
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cyanheads-eur-lex-mcp-server": {
      "Transport": "http",
      "Url": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}
# add to Vellum
assistant mcp add cyanheads-eur-lex-mcp-server -t streamable-http -u 'https://eur-lex.caseyjhand.com/mcp'
// mcp.json
{
  "mcpServers": {
    "cyanheads-eur-lex-mcp-server": {
      "type": "http",
      "url": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

Changelog

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.

  • 21 Sept 26 0
    • Tool “eurlex_search_documents” 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
    • Server version: 0.12.1 → 0.12.2 functional
    • “eurlex_search_documents” added an optional parameter “include_corrigenda” cosmetic
    • “eurlex_search_documents” reworded the description of “in_force” cosmetic
  • 16 Sept 26 0
    • Server version: 0.12.0 → 0.12.1 functional
  • 10 Sept 26 0
    • Tool “eurlex_browse_subjects” 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
    • Server version: 0.11.0 → 0.12.0 functional
    • Server version: 0.10.0 → 0.11.0 functional
    • “eurlex_browse_subjects” reworded the description of “keyword” cosmetic
    • “eurlex_get_relations” reworded the description of “limit” cosmetic
    • “eurlex_get_relations” reworded the description of “relation_types” cosmetic
    • “eurlex_get_relations” reworded the description of “work_uri” cosmetic
  • 9 Sept 26 0
    • Stability: 0.97 → pass security
  • 8 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 7 Sept 26 −1
    • Stability: pass → 0.93 functional
  • 31 Aug 26 0
    • Tool “eurlex_get_document” rewrote its description, which is the text the model reads security
    • Server version: 0.9.10 → 0.10.0 functional
    • Server version: 0.9.9 → 0.9.10 functional
    • “eurlex_get_document” reworded the description of “content_mode” cosmetic
    • “eurlex_get_document” reworded the description of “limit” cosmetic
    • “eurlex_get_document” reworded the description of “language” cosmetic
    • “eurlex_search_documents” reworded the description of “document_type” cosmetic
    • “eurlex_search_documents” reworded the description of “include_consolidated” cosmetic
  • 26 Aug 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
Diagnostics

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 21 Sept 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 4 Sept 2026 3 Dec 2026 ECDSA 256 ECDSA-SHA256 a6985204ed51ae050e7738aa6be668e9
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. present 19718 13 Verified
caseyjhand.com. present 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
MCP tools · 7 exposed · ~3,007 tokens

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 →

Tool Tokens
eurlex_browse_subjects ~221

Search the EuroVoc thesaurus, resolving a keyword into concept URIs usable in the eurovoc_concept subject filter of eurlex_search_documents. 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, ordered alphabetically by preferred label.

NameTypeReqDescription
keywordstringyesSearch term matched against EuroVoc preferred and alternative concept labels (e.g. "privacy", "agriculture", "product liability").
languagestringLanguage code for concept labels (e.g. "en", "fr", "de"). Case-insensitive — "EN" and "en" behave identically. Defaults to English.
limitintegerMaximum number of EuroVoc concepts to return (1–50). Defaults to 20.
offsetintegerPagination offset — number of concepts to skip. Defaults to 0.
NameTypeReqDescription
capnumberThe limit that was applied to this response.
conceptsarrayMatching EuroVoc concepts ordered alphabetically by label.
errorobjectPresent when the call failed. Absent on success.
has_morebooleanTrue only when CELLAR returned an additional valid row beyond this page.
next_offsetnumberOffset for the next page. Present only when has_more is true.
offsetnumberPagination offset used for this response.
shownnumberNumber of concepts returned in this response.
totalnumberNumber of concepts returned in this response.
truncatedbooleanTrue when an additional CELLAR row proves more concepts exist beyond this page.

No examples provided.

eurlex_get_cases ~429

Search CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, court, case type, keyword, and date range. 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. Returns each case with its court, date, and type, plus — parsed from the title where present — the parties, subject matter, and case reference.

NameTypeReqDescription
case_numberstringCase number in standard format: C-{num}/{year} for CJEU or T-{num}/{year} for General Court (e.g. C-131/12).
case_typeCase type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all.
courtCourt filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both.
date_fromStart of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound.
date_toEnd of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound.
include_derivativebooleanInclude derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, and AG opinions. Default false: these are exc…
keywordstringKeyword to match against case titles and CELEX strings.
limitintegerMaximum number of results to return (1–100). Defaults to 20.
offsetintegerPagination offset — number of results to skip. Defaults to 0.
NameTypeReqDescription
capnumberThe limit that was applied to this page.
casesarrayMatching case law records ordered by date descending.
errorobjectPresent when the call failed. Absent on success.
has_morebooleanTrue only when CELLAR returned an additional valid row beyond this page.
next_offsetnumberOffset for the next page. Present only when has_more is true.
offsetnumberPagination offset used for this response.
query_echoobjectEcho of filters applied to this search. Useful for diagnosing empty results.
shownnumberNumber of cases returned in this page.
totalnumberNumber of cases returned in this page (not a corpus-wide count).
truncatedbooleanTrue when an additional CELLAR row proves more cases exist beyond this page.

No examples provided.

eurlex_get_document ~898

Fetch the metadata and full text of an EU act by CELEX number, ELI URI, or work URI. Returns structured metadata (title, date, type, author institution, legal basis, EuroVoc subjects, in-force status) plus the act 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, reading a selected section on its own from the offset and chars in selected_sections.

NameTypeReqDescription
celex_numberCELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri.
content_modestringHow 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_uristringWork-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.
formatstringContent 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.
languagestringOne 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…
limitintegerMaximum characters to return in this window ("paged" mode only). Default 25000, max 100000. Follow has_more and the returned offsets until false to reconstruct the complete body.
offsetintegerCharacter 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…
outlinebooleanReturn a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with it…
resolvestringWhich version to serve for a base act with newer consolidated versions. "as_requested" (default) returns the exact CELEX requested; "current_consolidated" serves the newest consolidated version inste…
selectobjectReturn only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). Sections are located in the body of the requested format, so…
work_uristringCELLAR 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…
NameTypeReqDescription
author_institutionstringHuman-readable name of the primary (first) originating EU institution (e.g. "European Parliament", "Council of the EU"). For co-legislated acts, prefer author_institutions for the complete set. Absen…
author_institutionsarrayAll originating EU institutions, for co-legislated acts adopted by more than one body (e.g. ["European Parliament", "Council of the EU"]). Absent when none recorded.
capintegerMaximum body characters allowed in the window.
celex_numberstringConfirmed CELEX number for the retrieved work.
consolidated_as_ofstringConsolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present only when is_superseded is true.
contentstringBody 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_availablebooleanWhether 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_returnedintegerNumber of body characters returned in this response (equals content length). Present when a body was fetched and available.
content_chars_totalintegerTotal 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_formatstringFormat of the returned content: "html", "markdown", or "xml".
content_modestringContent mode applied to this response: "metadata_only", "paged", or "full".
content_offsetintegerCharacter 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_statusstringBody 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_reasonstringWhy content_status is "unavailable": no representation exists, the upstream request failed, or a multipart Formex body could not be assembled completely.
current_consolidated_celexstringCELEX of the newest consolidated version of the requested base act (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve "current_consolidated". Present only when is_superse…
datestringDocument date in ISO 8601 format (YYYY-MM-DD).
errorobjectPresent when the call failed. Absent on success.
eurovoc_subjectsarrayEuroVoc subject classifications. Absent when none are recorded.
has_morebooleanTrue 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_forcebooleanWhether the act is currently in force.
is_supersededbooleanTrue when a newer consolidated version of the requested base act exists (an unofficial reading aid merging later amendments), so the returned text may not include those amendments. Not a repeal/repla…
languagestringLanguage code of the returned content.
language_fallbackstringHuman-readable note explaining the fallback that occurred (e.g. "Requested FR content unavailable; returned EN"). Present only when a fallback happened.
legal_basisarrayLegal basis acts for this work. Absent when none are recorded.
noticestringHow to retrieve the remaining document content.
outlinearrayStructural outline of the act. Present only when outline is true; an empty array means no structure was detected.
requested_celexstringThe originally requested CELEX, echoed when resolve "current_consolidated" served a different (consolidated) work. celex_number holds the CELEX actually served. Absent when the served work is the one…
requested_languagestringOriginally requested language code when English fallback changed the effective language reported in language.
resource_typestringHuman-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works.
selected_sectionsarraySource address of each section the selection sliced, in document order. Present only when select was used. A selection is a set of disjoint slices, not a contiguous window, so these addresses — not c…
selectionobjectOutcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, capped at 100000 characters. When the cap cuts the join, a trailing…
shownintegerNumber of body characters returned.
structure_detectedbooleanWhether any act structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure — read it via offset/limit or content_mode "full…
titlestringDocument title in the requested language (absent for some older works and judgments).
truncatedbooleanTrue when the returned body window was capped.
work_uristringCELLAR work URI.

No examples provided.

eurlex_get_relations ~407

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, its legal basis, and works that cite it. Returns direct relations only, paginated per relation type and direction. Requires a CELEX number or CELLAR work URI.

NameTypeReqDescription
celex_numberCELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri.
limitintegerMaximum related works per relation type and direction (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones.
offsetintegerPagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works.
relation_typesarraySubset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), c…
work_uristringCELLAR 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…
NameTypeReqDescription
capnumberThe 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_numberstringCELEX 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_typesarrayRequested 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…
errorobjectPresent when the call failed. Absent on success.
has_morebooleanTrue only when at least one requested relation type/direction returned an additional valid row beyond this page.
next_offsetnumberOffset for the next page. Present only when has_more is true.
offsetnumberPagination offset applied to this response (per relation type and direction).
relationsarrayDirect CDM relations for the requested work.
requested_relation_typesarrayThe 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…
shownnumberNumber of relations returned in this page, summed across every relation type and direction — not the count for any single type or direction.
totalnumberNumber of relations returned in this page (not a corpus-wide count).
truncatedbooleanTrue when an additional valid row proves at least one relation type/direction has more related works — page with offset.
work_uristringCELLAR URI of the source work (the work_uri input, or resolved from the CELEX).

No examples provided.

eurlex_lookup_celex ~154

Resolve an EU legal citation — a CELEX number or ELI URI — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, and date.

NameTypeReqDescription
identifierstringyesThe EU legal citation to resolve: a CELEX number (e.g. 32016R0679) or a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix).
identifier_typestringFormat of the identifier. "auto" detects it automatically; supply "celex" or "eli" explicitly if detection fails.
NameTypeReqDescription
celex_numberstringConfirmed CELEX number for the resolved work.
datestringDocument date in ISO 8601 format (YYYY-MM-DD).
errorobjectPresent when the call failed. Absent on success.
foundbooleanTrue when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. Only an identifier_type "auto" value that, after trimming, is neither an ELI URI…
resource_typestringHuman-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_uristringCELLAR work URI (stable resource identifier).

No examples provided.

eurlex_query_sparql ~285

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 100. The cdm:, skos:, and xsd: prefixes are auto-injected.

NameTypeReqDescription
sparql_querystringyesA 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 100 if absent, or capped to 100.…
timeout_hintintegerOptional client-side timeout in milliseconds (1000–55000). Defaults apply when omitted; the endpoint hard limit is 60 seconds.
NameTypeReqDescription
bindingsarrayRaw SPARQL binding rows. To extract a value from a row: row["varName"]?.value. Use the variables array to iterate in query order.
capnumberThe server-enforced result ceiling that was applied.
errorobjectPresent when the call failed. Absent on success.
shownnumberNumber of binding rows returned in this response.
totalnumberNumber of binding rows returned (capped at 100 by the server).
truncatedbooleanTrue when the server-enforced result ceiling capped the rows and more may exist upstream — narrow the query with FILTERs to see the rest.
variablesarrayVariable names from the SELECT head, in query order.

No examples provided.

eurlex_search_documents ~613

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.

NameTypeReqDescription
author_institutionstringAuthor institution name (e.g. "European Parliament", "Council", "European Commission"), matched against the English names of EU corporate bodies.
date_fromStart of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound.
date_toEnd of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound.
document_typeDocument 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_conceptEuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Omit for no subject filter.
in_forcebooleanRestrict by in-force status: true returns only acts currently in force, false only acts no longer in force. Either way the act must carry the in-force property, which a minority of works do. Omit to…
include_consolidatedbooleanWhen 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_corrigendabooleanInclude 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…
keywordstringKeyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), or against CELEX substrings.
limitintegerMaximum number of results to return (1–100). Defaults to 20.
offsetintegerPagination offset — number of results to skip. Defaults to 0.
NameTypeReqDescription
capnumberThe limit that was applied to this page.
documentsarrayMatching EU documents ordered by date descending.
errorobjectPresent when the call failed. Absent on success.
has_morebooleanTrue only when CELLAR returned an additional valid row beyond this page.
next_offsetnumberOffset for the next page. Present only when has_more is true.
offsetnumberPagination offset used for this response.
query_echoobjectEcho of filters applied to this search. Useful for diagnosing empty results.
shownnumberNumber of documents returned in this page.
totalnumberNumber of documents returned in this page (not a corpus-wide count).
truncatedbooleanTrue when an additional CELLAR row proves more documents exist beyond this page.

No examples provided.

Common questions

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 82 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 3,007 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 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.