The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Eur Lex MCP Server listing page.
Search EU legislation, CJEU case law, and treaties; traverse the CELLAR relationship graph; resolve EuroVoc concepts via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://eur-lex.caseyjhand.com/mcp
Seven tools covering EU legal research — document discovery, content retrieval, citation resolution, case law, relationship graph traversal, EuroVoc thesaurus lookup, and raw SPARQL access:
| Tool | Description |
|---|---|
eurlex_search_documents | Search EU legislation, treaties, and preparatory acts across the CELLAR corpus. Filters by document category, date range, EuroVoc concept, author institution, and in-force status; consolidated texts can be folded in through the selected basic-act family. |
eurlex_get_document | Fetch structured metadata and full text (HTML, Markdown, or Formex4 XML) for a work by CELEX number, ELI URI, or CELLAR work URI. |
eurlex_lookup_celex | Resolve an EU legal citation — a CELEX number or an ELI URI — to the canonical CELLAR work. |
eurlex_get_cases | Search CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, party name, subject, or date range. |
eurlex_get_relations | Traverse the CELLAR relationship graph: amendment chain, consolidated versions, legal basis, citation network, and national transposition measures. |
eurlex_browse_subjects | Search the EuroVoc multilingual thesaurus to resolve human-readable terms to EuroVoc concept IDs — required before using the eurovoc_concept filter in eurlex_search_documents. |
eurlex_query_sparql | Execute a raw SPARQL SELECT query against the CELLAR Virtuoso endpoint. Results capped at 100; use only when curated tools don't cover the needed CDM ontology traversal. |
eurlex_search_documentsSearch EU legislation, treaties, preparatory acts, and more across the 2.7M+ work CELLAR corpus.
REG, DIR, DEC, TREATY, and more), with each category expanding to its reviewed CELLAR authority familydate_from, date_to)eurlex_browse_subjects first to resolve concept IDsoffset and configurable limit (max 100)eurlex_get_documenteurlex_get_documentFetch the notice and full text of an EU legal act.
32016R0679), ELI URIs, or CELLAR work URIsformat: "markdown" converts the act body to clean Markdown server-side (recitals and numbered points as readable text, genuine data tables as GFM)"paged" windows and "full" windows are capped at 100,000 characters; content_mode "paged" (default) returns the requested character window (offset + limit), while "full" returns the first window from offset zero. Both include content_chars_total, content_offset, content_chars_returned, and has_more, so repeated paged calls can reconstruct the complete body without loss; "metadata_only" skips the body, while structural outline/selection behavior is unchangedoutline: true returns the act's chapters, articles, annexes, and recitals as a heading list (each with its character offset), and select (e.g. { articles: "1,5,17" }) returns just those sections' text — degrading cleanly to the paging floor for acts with no detectable structure (e.g. case law)eurlex_lookup_celexResolve EU legal identifiers to canonical CELLAR works.
identifier_type: "auto" (default); set explicitly when auto-detection failseurlex_get_document or eurlex_get_relationseurlex_get_casesSearch CJEU and General Court case law.
CJEU or GC), and case type (judgment, order, ag_opinion)include_derivative to include themeurlex_search_documents — case law (CELEX sector 6) has its own search parameters and practitioner workflowseurlex_get_relationsTraverse the CELLAR relationship graph for a given work.
cdm:work_cites_work in both directions)eurlex_query_sparqleurlex_browse_subjectsResolve human-readable terms to EuroVoc concept IDs.
eurovoc_concept filter in eurlex_search_documents| Type | Name | Description |
|---|---|---|
| Resource | eurlex://document/{celexNumber} | Metadata snapshot for a CELLAR work — type, date, title, author institution, in-force flag |
| Resource | eurlex://document/{celexNumber}/relations | Relationship summary for a work: amendment chain, consolidations, legal basis, cited-by count |
| Prompt | eurlex_comparative_analysis | Frames a comparative legal analysis across EU and US law for a given policy domain |
All resource data is also reachable via tools. Resources provide stable-URI injectable context for agents that support MCP resources.
Built on @cyanheads/mcp-ts-core:
none, jwt, oauthin-memory, filesystem, Supabase, Cloudflare KV/R2/D1EUR-Lex-specific:
CellarSparqlService POSTs application/x-www-form-urlencoded SPARQL with CDM prefix declarations built in; server-side LIMIT enforcement (max 100) prevents Virtuoso timeout abuseEurLexContentService fetches act text from the CELLAR content-negotiation resolver (/resource/celex/{CELEX} with Accept / Accept-Language headers); HTML and Formex4 XML pass through, Markdown is converted server-side from the HTML bodyVirtuoso 37000 Error body is parsed and re-raised as ServiceUnavailable (transient/timeout) or InvalidParams (syntax error)content_status and a typed unavailability cause, while a WAF challenge remains a typed content_challenge errorreason codes let agents branch on outcomes without parsing textAgent-friendly output:
eurlex_browse_subjects before attempting concept-filtered searcheseurlex_lookup_celex surfaces CELEX confirmation and work existence upfront, preventing downstream errors in document or relation fetchescontent_status, content_unavailability_reason, and requested/effective language fields let agents distinguish skipped, available, absent, upstream-failed, and incomplete multipart content without string parsingA public instance is available at https://eur-lex.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
Add the following to your MCP client configuration file. No API key is required.
Or with npx (no Bun required):
Or with Docker:
For Streamable HTTP, set the transport and start the server:
All configuration is validated at startup via Zod schemas in src/config/server-config.ts.
| Variable | Description | Default |
|---|---|---|
CELLAR_SPARQL_ENDPOINT | CELLAR SPARQL endpoint URL override (e.g., for a local Virtuoso mirror). | http://publications.europa.eu/webapi/rdf/sparql |
EURLEX_CONTENT_BASE_URL | EU Publications Office CELLAR content resolver base URL override. | http://publications.europa.eu |
SPARQL_QUERY_TIMEOUT_MS | Client-side timeout for SPARQL requests in milliseconds. | 55000 |
MAX_SPARQL_RESULTS | Enforced ceiling on LIMIT in all generated SPARQL queries. | 100 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_SESSION_MODE | Session handling: stateful, stateless, or auto (auto resolves to stateful). | stateless |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
Run checks and tests:
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/eur-lex-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools, resources, and prompts; initializes services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/services/cellar-sparql | CELLAR SPARQL service — POST client, binding mapper, LIMIT enforcement, CDM PREFIX declarations. |
src/services/eurlex-content | CELLAR content service — content-negotiation GET client for /resource/celex/{CELEX} (Accept / Accept-Language) with English language fallback. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Seven tools across document search, retrieval, resolution, case law, relations, EuroVoc, and raw SPARQL. |
src/mcp-server/resources | Resource definitions (*.resource.ts). Metadata and relations resources. |
src/mcp-server/prompts | Prompt definitions (*.prompt.ts). Comparative analysis prompt. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/*/definitions/index.tsIssues and pull requests are welcome. Run checks and tests before submitting:
Apache-2.0 — see LICENSE for details.