protogrid

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

eur-lex-mcp-server

R0· no sign-in

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

v0.19.0 · active · repository · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality84good
Trust94of 100
Uptime, 30 days100%
Latency p50173 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "eur-lex-mcp-server": {
      "type": "http",
      "url": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}
claude mcp add --transport http eur-lex-mcp-server https://eur-lex.caseyjhand.com/mcp
[mcp_servers.eur-lex-mcp-server]
url = "https://eur-lex.caseyjhand.com/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "eur-lex-mcp-server": {
      "type": "remote",
      "url": "https://eur-lex.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "eur-lex-mcp-server": {
      "type": "http",
      "url": "https://eur-lex.caseyjhand.com/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=eur-lex-mcp-server&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vZXVyLWxleC5jYXNleWpoYW5kLmNvbS9tY3AifQ%3D%3D"
}
{
  "servers": {
    "eur-lex-mcp-server": {
      "type": "http",
      "url": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}
{
  "mcpServers": {
    "eur-lex-mcp-server": {
      "httpUrl": "https://eur-lex.caseyjhand.com/mcp"
    }
  }
}
extensions:
  "eur-lex-mcp-server":
    enabled: true
    name: "eur-lex-mcp-server"
    type: streamable_http
    uri: "https://eur-lex.caseyjhand.com/mcp"
    timeout: 300

Quality 84 / 100good

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene86 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations7 of 7 tools declare readOnlyHint or destructiveHint
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: eurlex_browse_subjects (destructiveHint); eurlex_search_documents (destructiveHint, idempotentHint); eurlex_lookup_celex (destructiveHint); …
  • pass
    tools.token_costabout 7,532 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes28 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15

7 tools, about 7,532 tokens to load them all · tool set 9599a8f8c889 · tools last changed 2026-10-15 · checked 2026-10-20 17:02 UTC

Tool changes

  • eurlex_query_sparqlchangeddescription, input schema, output schema
    before

    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.

    after · 90% of words in common

    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.

  • eurlex_get_relationschangeddescription, input schema, output schema
    before

    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.

    after · 85% of words in common

    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.

  • eurlex_get_documentchangedinput schema, output schema
  • eurlex_get_caseschangedinput schema, output schema
  • eurlex_search_documentschangedinput schema, output schema
  • eurlex_browse_subjectschangedinput schema, output schema
  • eurlex_lookup_celexchangedinput schema, output schema
  • eurlex_query_sparqlchangedinput schema, output schema
  • eurlex_get_relationschangedoutput schema
  • eurlex_get_documentchangeddescription, input schema, output schema
    before

    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, 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) 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.

    after · 85% of words in common

    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.

Showing the latest 10. Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 94 / 100

provenance80
liveness100
freshness100
hygiene100

+repository +namespace-matches-repo +reachable +uptime-100% +updated-6d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Dependencies

@cyanheads/[email protected] npmthis version is not known to the dependency resolver

@cyanheads/[email protected] npmthis version is not known to the dependency resolver

Dependency graphs from deps.dev; advisories from OSV.dev, including the GitHub Advisory Database and the PyPI Advisory Database; all CC BY 4.0. The graph is what a clean install of this version resolves today; nothing was installed or run. How it is checked.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://eur-lex.caseyjhand.com/mcp streamable-httpnoneyes100%173 ms2026-07-282026-10-20
packageregistryversionruntimesecrets
@cyanheads/eur-lex-mcp-servernpm0.19.0npx
@cyanheads/eur-lex-mcp-servernpm0.19.0npx

Tools (7)

eurlex_browse_subjectsread-onlySearch 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.
eurlex_get_casesread-onlySearch 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.
eurlex_get_documentread-onlyFetch 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.
eurlex_get_relationsread-onlyTraverse 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.
eurlex_lookup_celexread-onlyResolve 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.
eurlex_query_sparqlread-onlyRun 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.
eurlex_search_documentsread-onlySearch 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.

Schemas: list_tools.

Similar MCP servers

More from io.github.cyanheads

And 140 more from this publisher.

Official server.json
{
  "name": "io.github.cyanheads/eur-lex-mcp-server",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://eur-lex.caseyjhand.com/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "0.19.0",
  "packages": [
    {
      "version": "0.19.0",
      "transport": {
        "type": "stdio"
      },
      "identifier": "@cyanheads/eur-lex-mcp-server",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "CELLAR_SPARQL_ENDPOINT",
          "format": "string",
          "default": "http://publications.europa.eu/webapi/rdf/sparql",
          "description": "CELLAR SPARQL endpoint URL override (e.g., for a local Virtuoso mirror)."
        },
        {
          "name": "EURLEX_CONTENT_BASE_URL",
          "format": "string",
          "default": "http://publications.europa.eu",
          "description": "Base URL of the EU Publications Office CELLAR content-negotiation resolver that serves act full text; override e.g. for a local mirror."
        },
        {
          "name": "SPARQL_QUERY_TIMEOUT_MS",
          "format": "string",
          "default": "55000",
          "description": "Client-side timeout for SPARQL requests in milliseconds."
        },
        {
          "name": "MAX_SPARQL_RESULTS",
          "format": "string",
          "default": "100",
          "description": "Enforced ceiling on LIMIT in all generated SPARQL queries."
        },
        {
          "name": "MCP_LOG_LEVEL",
          "format": "string",
          "default": "info",
          "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
        }
      ]
    },
    {
      "version": "0.19.0",
      "transport": {
        "url": "http://localhost:3010/mcp",
        "type": "streamable-http"
      },
      "identifier": "@cyanheads/eur-lex-mcp-server",
      "runtimeHint": "npx",
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "environmentVariables": [
        {
          "name": "MCP_TRANSPORT_TYPE",
          "value": "http",
          "format": "string",
          "description": "Selects the HTTP transport."
        },
        {
          "name": "MCP_HTTP_HOST",
          "format": "string",
          "default": "127.0.0.1",
          "description": "The hostname for the HTTP server."
        },
        {
          "name": "MCP_HTTP_PORT",
          "format": "string",
          "default": "3010",
          "description": "The port to run the HTTP server on."
        },
        {
          "name": "MCP_HTTP_ENDPOINT_PATH",
          "format": "string",
          "default": "/mcp",
          "description": "The endpoint path for the MCP server."
        },
        {
          "name": "MCP_PUBLIC_URL",
          "format": "string",
          "description": "Public origin for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com)."
        },
        {
          "name": "MCP_AUTH_MODE",
          "format": "string",
          "default": "none",
          "description": "Authentication mode to use: 'none', 'jwt', or 'oauth'."
        },
        {
          "name": "MCP_LOG_LEVEL",
          "format": "string",
          "default": "info",
          "description": "Sets the minimum log level for output (e.g., 'debug', 'info', 'warn')."
        },
        {
          "name": "CELLAR_SPARQL_ENDPOINT",
          "format": "string",
          "default": "http://publications.europa.eu/webapi/rdf/sparql",
          "description": "CELLAR SPARQL endpoint URL override (e.g., for a local Virtuoso mirror)."
        },
        {
          "name": "EURLEX_CONTENT_BASE_URL",
          "format": "string",
          "default": "http://publications.europa.eu",
          "description": "Base URL of the EU Publications Office CELLAR content-negotiation resolver that serves act full text; override e.g. for a local mirror."
        },
        {
          "name": "SPARQL_QUERY_TIMEOUT_MS",
          "format": "string",
          "default": "55000",
          "description": "Client-side timeout for SPARQL requests in milliseconds."
        },
        {
          "name": "MAX_SPARQL_RESULTS",
          "format": "string",
          "default": "100",
          "description": "Enforced ceiling on LIMIT in all generated SPARQL queries."
        }
      ]
    }
  ],
  "repository": {
    "url": "https://github.com/cyanheads/eur-lex-mcp-server",
    "source": "github"
  },
  "description": "Search EU legislation, CJEU case law, and treaties; traverse CELLAR graph; browse EuroVoc concepts."
}