Skip to content

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

by cyanheads · remote · local (npm) · no sign-in to list tools · v0.19.0 · published by GitHub user cyanheads

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

Changes · 1

7 tools: 1 change things and 6 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

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

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "eurlex_query_sparql" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "eurlex_query_sparql" says "query": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

7 tools

Changes things 1Claude Code: ask
  • 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.1 finding

    Why it is in this group

    • The name "eurlex_query_sparql" says "query": a word for reading.
    • The description's first verb is "run": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "eurlex_query_sparql" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"openWorldHint":true}; The name "eurlex_query_sparql" says "query": a word for reading.

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
Only reads 6Claude Code: allow
  • eurlex_browse_subjectsSearch the EuroVoc thesaurus, resolving a keyword into concept URIs usable in the eurovoc_concept subject filter of eurlex_search_documents.No findings

    Why it is in this group

    • The name "eurlex_browse_subjects" says "browse": a word for reading.
    Description, as the server wrote it
    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. 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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
    • idempotentHint: true
  • eurlex_get_casesSearch CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, court, case type, keyword, and date range.No findings

    Why it is in this group

    • The name "eurlex_get_cases" says "get": a word for reading.
    Description, as the server wrote it
    Search CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, court, case type, keyword, and date range. A case number reaches every judgment, order, and AG opinion 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. Returns each case with its CELEX number (whose sixth character names the court: C, T, or F), work URI, ECLI, date, and type, plus — 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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true
  • eurlex_get_documentFetch the metadata and full text of an EU act or case-law record by CELEX number, ELI URI, or work URI.No findings

    Why it is in this group

    • The name "eurlex_get_document" says "get": a word for reading.
    Description, as the server wrote it
    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, 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; for case law, the ECLI and the formation, referring court, subject matter, and case reference parsed from the title) 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.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • 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, nat…No findings

    Why it is in this group

    • The name "eurlex_get_relations" says "get": a word for reading.
    Description, as the server wrote it
    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 the works adopted under it, the CJEU rulings interpreting it (or, for a ruling, the acts it interprets), and works that cite it. Returns direct relations only, paginated per relation type and direction. Requires a CELEX number or CELLAR work URI.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • eurlex_lookup_celexResolve an EU legal citation — a CELEX number, ELI URI, ECLI, or an OJ citation naming its act type and year (e.g.No findings

    Why it is in this group

    • The name "eurlex_lookup_celex" says "lookup": a word for reading.
    Description, as the server wrote it
    Resolve an EU legal citation — a CELEX number, ELI URI, ECLI, or an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC") — 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.

    Annotations the server declares

    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • 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.No findings

    Why it is in this group

    • The name "eurlex_search_documents" says "search": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.19.0. Values in angle brackets are yours to fill in.

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

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__eur-lex__eurlex_lookup_celex",
      "mcp__eur-lex__eurlex_browse_subjects",
      "mcp__eur-lex__eurlex_search_documents",
      "mcp__eur-lex__eurlex_get_cases",
      "mcp__eur-lex__eurlex_get_document",
      "mcp__eur-lex__eurlex_get_relations"
    ],
    "ask": [
      "mcp__eur-lex__eurlex_query_sparql"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as eur-lex. Review it before you use it.