Releases: cyanheads/eur-lex-mcp-server
Release list
v0.9.8: SPARQL result cap enforces the outermost LIMIT
SPARQL result cap enforces the outermost LIMIT
Fixed:
eurlex_query_sparqlresult cap now bounds the outermost (brace-depth 0)LIMITinstead of the first in the query text, so a subselect no longer leaves the outer query uncapped or gets a caller-supplied innerLIMITsilently rewritten (#63). Enforcement is scoped to the raw escape hatch; internal self-bounded queries are unchanged.
383 tests pass; bun run devcheck clean.
v0.9.7: query_echo effective result-shaping flags
query_echo effective result-shaping flags
Added:
query_echoechoes effectiveinclude_consolidated(eurlex_search_documents) andinclude_derivative(eurlex_get_cases) after defaults, instructuredContentandcontent[](#57)
Changed:
eurlex_get_casesexcludes standaloneCORRIGENDUMworks by default;include_derivativere-admits them (#55)docs/design.mdand README reconciled to the CELLAR content-negotiation path andbif:containskeyword search (#59)
377 tests pass; bun run devcheck clean.
v0.9.6: SPARQL input hardening; query_sparql cap disclosure + full-term output
SPARQL input hardening; query_sparql cap disclosure + full-term output
Caller-supplied SPARQL literals and IRIs across every tool and resource now route through shared escaping and validation, closing the paths that leaked raw Virtuoso SP030 compiler errors.
Security:
- escapeSparqlLiteral escapes \n/\r/\t; the two eurlex://document resources and the browse_subjects / get_cases / search_documents keyword sites now call it instead of a quote-only pass (#61, #62)
- isSafeSparqlIri (http prefix, rejects /[\s<>"]/) guards work_uri on get_document + get_relations and eurovoc_concept on search_documents, replacing three divergent hand-rolled guards (#53, #60)
Added:
- eurlex_query_sparql discloses a capped result via an enrichment block (truncated / shown / cap) (#52)
Fixed:
- eurlex_query_sparql text output renders full SPARQL terms — , "lex"@en, "lex"^^xsd:date — instead of bare values (#54)
Dependency bumps:
- @biomejs/biome (dev) 2.5.2 → 2.5.3
- @types/node (dev) 26.1.0 → 26.1.1
- ignore (dev) ^7.0.5 → ^7.0.6
371 tests pass; bun run devcheck clean.
v0.9.5: offset pagination, full SPARQL text output, supply-chain refresh
offset pagination, full SPARQL text output, supply-chain refresh
Added:
eurlex_browse_subjectsoffsetinput + output field for paging EuroVoc concepts (#51)
Changed:
eurlex_browse_subjectsreturns distinct concepts ordered alphabetically by label — GROUP BY + deterministic ORDER BY collapses the polyhierarchy/multi-notation row explosion; drops the inaccurate "ordered by relevance" wording (#51)
Fixed:
eurlex_query_sparqltext output rendered only the first 20 rows whilestructuredContentcarried the full set —content[]now renders every returned row (#50)
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.10 → ^0.10.14node-html-parser^8.0.4 → ^9.0.0@socketsecurity/bun-security-scanneradded ^1.1.2@biomejs/biome^2.5.2 → 2.5.2,@types/node^26.1.0 → 26.1.0 (pinned exact)packageManagerbun@1.3.11 → bun@1.3.14
292 tests pass; bun run devcheck clean.
v0.9.4: case-insensitive language codes, format-specific offset docs
case-insensitive language codes, format-specific offset docs
eurlex_browse_subjects accepts case-insensitive language codes; eurlex_get_document documentation clarifies format-specific offsets and reworks is_superseded wording.
Changed:
eurlex_browse_subjectsaccepts case-insensitive language codes, matching the pattern already used byeurlex_get_document(#46)eurlex_get_documentdocuments that offset/outline/select paging is format-specific — keepformatconstant when paging from an outline offset (#48)eurlex_get_documentreworksis_supersededwording to lead with "a newer consolidated version exists" and disclaim repeal/replacement (#49)
289 tests pass; bun run devcheck clean (zero Biome warnings); bun run rebuild succeeds.
v0.9.3: derivative case-law filtering, honest relation truncation
derivative case-law filtering, honest relation truncation
eurlex_get_cases excludes derivative case-law records from the default search; eurlex_get_relations fixes a false consolidated_version truncation signal and reports which requested relation types came back empty.
Added:
eurlex_get_casesinclude_derivativeinput (default false) — re-admits judicial information notices, case abstracts, and case summaries (#44)eurlex_get_relationsrequested_relation_types/empty_relation_typesoutput fields — page-scoped emptiness signal (#47)
Changed:
cdm-labels.tsresolves INFO_JUDICIAL, INFO_JUR, ABSTRACT_JUR, SUM_JUR to human labels instead of raw codes (#44)
Dependency bumps:
tsc-alias^1.8.17 → ^1.9.0
Fixed:
eurlex_get_casesdefault search no longer crowded out by derivative records — a SPARQL FILTER NOT EXISTS excludes them from the untyped/default path (#44)eurlex_get_relationsfalseconsolidated_versiontruncation — the CELEX validity filter is pushed into the SPARQL query and the truncation counter counts post-filter rows (#45)
288 tests pass; bun run devcheck clean (zero Biome warnings); bun run rebuild succeeds.
v0.9.2: concise single-string definition descriptions
concise single-string definition descriptions
Description-language cleanup — no schema or behavior change.
Changed:
- Every tool, resource, and prompt
descriptionand.describe()field rewritten as a single concise string, dropping the multi-line'…' + '…'concatenation pattern. createApp({ instructions })is now a template literal instead of concatenated string segments; content unchanged.
272 tests pass; bun run devcheck clean.
v0.9.1: Leaner tool descriptions, no duplicate prompt sections
Leaner tool descriptions, no duplicate prompt sections
Tool/resource descriptions lead with capability, with cross-tool workflow guidance relocated to server instructions; eurlex_comparative_analysis merges an overlapping focus into its existing axis instead of duplicating it.
Changed:
- Tool and resource descriptions (#36) — eurlex_browse_subjects, eurlex_search_documents, eurlex_get_relations, eurlex_get_document, eurlex_get_cases, eurlex_lookup_celex, eurlex_query_sparql, and both document resources lead with capability and output instead of cross-tool workflow coaching
createApp({ instructions })(#36) — gains workflow-orientation and identifier-format sections carrying the guidance trimmed from descriptions
Fixed:
eurlex_comparative_analysisduplicate focus sections (#37) — an overlapping focus now retitles its matched axis instead of appending a duplicate "Deep dive" section
272 tests pass; bun run devcheck clean.
v0.9.0: Ordered relation paging, authority-label resolution
Ordered relation paging, authority-label resolution
eurlex_get_relations pages related works with offset/limit and orders incoming edges newest-first; eurlex_document_resource resolves authority URIs to labels.
Added:
eurlex_get_relationsoffset + limit inputs (#39) — limit (1-100, default 100) sets the per-relation-type, per-direction cap; offset pages past it.eurlex_get_relationstruncation disclosure (#39) — ctx.enrich.truncated fires when a direction fills its cap; also surfaced on the eurlex://document/{celexNumber}/relations resource.author_institutionsoutput on eurlex://document/{celexNumber} (#35) — full de-duplicated set of co-legislating author institution labels.
Fixed:
eurlex_get_relationsincoming citations silently dropped the newest (#39) — each query now runs ORDER BY DESC(?relatedDate); the symmetric cites relation splits into independently-capped UNION subqueries per direction.eurlex_get_documentformat() truncated EuroVoc subjects to 5 (#41) — the text channel now renders the full list.resource_type/author_institutionreturned raw CDM authority URIs on eurlex://document/{celexNumber} (#35) — now resolved to human-readable labels. Breaking: code parsing these as URIs must adapt.cdm-labelsimplementing/delegated regulation keys transposed (#43) — RESOURCE_TYPE_LABELS keyed them IMPL_REG/DEL_REG; CELLAR emits REG_IMPL/REG_DEL.
266 tests pass; bun run devcheck clean.
v0.8.2: resource-type case filtering, structured case titles
resource-type case filtering, structured case titles
Patch release addressing three tracked issues.
Added:
eurlex_get_casescase titles parsed intodisplay_title,parties,subject_matter, andcase_referenceviaparseCaseLawTitle(); rawtitlepreserved (#40)
Fixed:
case_typefilter now tests the CDM resource-type (JUDG/ORDER/OPIN_AG), excluding ABSTRACT_JUR/SUM_JUR sibling works that shared the parent's CELEX type letters (#38)parseCaseLawTitle()case-reference anchor now accepts CELLAR's plural joined-case form ("Cases X and Y.") (#42)
252 tests pass; bun run devcheck clean.