@Cyanheads/Eur Lex Server
БесплатноНе проверенSearch EU legislation, CJEU case law, and treaties; traverse the CELLAR relationship graph; resolve EuroVoc concepts via MCP.
Описание
Search EU legislation, CJEU case law, and treaties; traverse the CELLAR relationship graph; resolve EuroVoc concepts via MCP.
README
@cyanheads/eur-lex-mcp-server
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
Overview
EU legislation, CJEU case law, and treaties over the EU Publications Office's CELLAR semantic repository and the EUR-Lex content API. Search documents and case law, fetch full text, resolve citations, traverse the amendment and citation graph, and browse the EuroVoc thesaurus from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
Tools
| Tool | Description |
|---|---|
eurlex_search_documents |
Search EU legislation, treaties, and preparatory acts by type, date, EuroVoc subject, author institution, and in-force status |
eurlex_get_document |
Fetch metadata and full text (HTML, Markdown, or Formex4 XML) for an act by CELEX, ELI, or work URI |
eurlex_lookup_celex |
Resolve a CELEX number or ELI URI to its canonical CELLAR work |
eurlex_get_cases |
Search CJEU and General Court case law by case number, court, case type, and date range |
eurlex_get_relations |
Traverse the CELLAR relationship graph — amendments, repeals, consolidations, legal basis, citations, transpositions |
eurlex_browse_subjects |
Search the EuroVoc thesaurus to resolve terms to concept URIs |
eurlex_query_sparql |
Run a raw, read-only SPARQL SELECT against the CELLAR endpoint |
Resources
| Resource | Description |
|---|---|
eurlex://document/{celexNumber} |
Metadata snapshot for a CELLAR work |
eurlex://document/{celexNumber}/relations |
One-hop relationship summary for a CELLAR work |
All resource data is also reachable via tools.
Prompts
| Prompt | Description |
|---|---|
eurlex_comparative_analysis |
Frame a comparative EU/US legal analysis for a policy domain |
Capability reference
eurlex_search_documents tool
- Keyword matches English titles via the full-text index, or CELEX substrings — no full-text body search; at least one filter is required
document_type(REG,DIR,DEC,TREATY,JUDG,OPIN_AG,PROP,REC) expands to its full CELLAR authority family;include_consolidatedfolds in consolidated texts of that category- Date range (
date_from/date_to), EuroVoc concept URI (fromeurlex_browse_subjects), author institution, and in-force-only filters - Pagination via
offsetandlimit(max 100); each result flagsis_consolidated - Typed errors:
no_filters,invalid_date_range,no_results
eurlex_get_document tool
- Accepts exactly one of
celex_number,eli_uri, orwork_uri - Body as
html(default),markdown(server-side converted), orxml(Formex4); all 24 EUR-Lex language codes, case-insensitive, defaulting to and falling back to English content_mode"paged"(default, offset/limit window),"full"(first window from zero), or"metadata_only"; paged and full windows both cap at 100,000 characters, withcontent_chars_total/has_moreto page the restoutline: truereturns chapter/article/annex/recital headings with offsets;select(e.g.{ articles: "1,5,17" }) returns just those sectionsresolve: "current_consolidated"serves the newest consolidated version instead of the requested base act;is_superseded/current_consolidated_celex/consolidated_as_offlag a stale base act either way- Typed
content_challengeerror when EUR-Lex returns a WAF bot-challenge instead of text
eurlex_lookup_celex tool
- Accepts a CELEX number or ELI URI;
identifier_typeauto-detects the format or can be set explicitly - Returns work URI, confirmed CELEX number, resource type, and date —
found: falsefor a well-formed identifier that matches no work ambiguous_identifiererror when auto-detection can't classify the input
eurlex_get_cases tool
- Filters:
case_number(C-131/12/T-131/12),court(CJEUorGC),case_type(judgment,order,ag_opinion), keyword, and date range - Primary records only by default — judicial information notices, abstracts, summaries, and corrigenda excluded;
include_derivativeincludes them - Party names, subject matter, and case reference are parsed from the raw CELLAR title into
display_title,parties,subject_matter,case_reference - Pagination via
offsetandlimit(max 100)
eurlex_get_relations tool
- Accepts exactly one of
celex_numberorwork_uri relation_typesfilters to a subset ofcites,amends,amended_by,repeals,repealed_by,implicitly_repeals,implicitly_repealed_by,legal_basis,consolidated_version,national_transposition; omit for all- One-hop only, paginated per relation type and direction via
offset/limit(max 100, default 100) - Each relation carries
relation_type,direction(outgoing/incoming),related_work_uri, andrelated_celex_numberwhen known empty_relation_typesdistinguishes "no edges of this type" from "edges paged out of this window";no_relationsfires only when the first page is empty
eurlex_browse_subjects tool
- Matches both preferred and alternative (non-preferred) EuroVoc labels, so a common synonym resolves to the concept it stands for
- Returns concept URI, preferred label, code, broader (parent) label, and the alternative label that matched when one did
- Supports all EU official languages via
language; defaults to English - Pagination via
offsetandlimit(max 50)
eurlex_query_sparql tool
- Read-only SELECT only — update forms and ASK/CONSTRUCT/DESCRIBE are rejected before execution
cdm:,skos:, andxsd:prefixes are auto-injected; results capped at 100 rows- Optional
timeout_hint(1000–55000 ms); the Virtuoso endpoint enforces a 60-second hard limit - Typed errors:
not_read_only,sparql_error,sparql_timeout
eurlex://document/{celexNumber} resource
- Metadata snapshot as
application/json— resource type, author institution(s), date, title, in-force flag, legal basis, EuroVoc subjects celexNumbercomes fromeurlex_search_documents,eurlex_get_cases, oreurlex_lookup_celex
eurlex://document/{celexNumber}/relations resource
- One-hop relationship summary — amendment chain, consolidations, national transposition, legal basis, citations — capped at 25 per relation type
truncatedplus acontinuationpointer toeurlex_get_relationswhen more relations exist
eurlex_comparative_analysis prompt
- Arguments:
domainrequired;focusoptional, folded into its matching analysis axis or added as its own section - Returns a research plan chaining
eurlex_browse_subjects→eurlex_search_documents→eurlex_get_document→eurlex_get_relationsfor the EU side andcourtlistener_search_opinionsfor the US side, plus a six-axis analysis framework
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
EUR-Lex-specific:
- No API key required — CELLAR SPARQL and the EUR-Lex REST content endpoints are both publicly accessible
- SPARQL is POSTed with CDM prefix declarations built in; server-side LIMIT enforcement (max 100) guards against Virtuoso timeouts
- Act text is fetched via CELLAR content negotiation (
/resource/celex/{CELEX}); HTML and Formex4 XML pass through, Markdown is converted server-side - Virtuoso errors (HTTP 200 with a
Virtuoso 37000 Errorbody) are classified and re-raised asServiceUnavailableorInvalidParams - Automatic English fallback when a requested translation is unavailable, with requested/effective language reported
Agent-friendly output:
- EuroVoc prerequisite guidance in server-level instructions — agents are directed to
eurlex_browse_subjectsbefore concept-filtered searches eurlex_lookup_celexconfirms CELEX/ELI existence upfront, preventing downstream errors in document or relation fetchescontent_status,content_unavailability_reason, and requested/effective language fields distinguish skipped, available, absent, upstream-failed, and incomplete content without string parsing- Typed
reasoncodes on every tool's error contract let agents branch on outcomes programmatically
Getting started
Public Hosted Instance
A public instance is available at https://eur-lex.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"eur-lex-mcp-server": {
"type": "streamable-http",
"url": "https://eur-lex.caseyjhand.com/mcp"
}
}
}
Self-Hosted / Local
Add the following to your MCP client configuration file. No API key is required.
{
"mcpServers": {
"eur-lex-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/eur-lex-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"eur-lex-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/eur-lex-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"eur-lex-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/eur-lex-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- No API key needed — EUR-Lex and CELLAR are publicly accessible.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/eur-lex-mcp-server.git
- Navigate into the directory:
cd eur-lex-mcp-server
- Install dependencies:
bun install
- Configure environment (optional):
cp .env.example .env
# All server-specific vars have sensible defaults — no required vars
Configuration
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.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t eur-lex-mcp-server .
docker run --rm -p 3010:3010 eur-lex-mcp-server
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.
Project structure
| 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/. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools and resources via the barrels in
src/mcp-server/*/definitions/index.ts - Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Установка @Cyanheads/Eur Lex Server
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/cyanheads/eur-lex-mcp-serverFAQ
@Cyanheads/Eur Lex Server MCP бесплатный?
Да, @Cyanheads/Eur Lex Server MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для @Cyanheads/Eur Lex Server?
Нет, @Cyanheads/Eur Lex Server работает без API-ключей и переменных окружения.
@Cyanheads/Eur Lex Server — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить @Cyanheads/Eur Lex Server в Claude Desktop, Claude Code или Cursor?
Открой @Cyanheads/Eur Lex Server на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
GitHub
PRs, issues, code search, CI status
автор: GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
автор: mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
автор: duxiaohuiSupabase
Database, auth and storage
автор: SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare @Cyanheads/Eur Lex Server with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории development
