Skip to content

Releases: cyanheads/eur-lex-mcp-server

v0.9.8: SPARQL result cap enforces the outermost LIMIT

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 11:05
v0.9.8
6109a62

SPARQL result cap enforces the outermost LIMIT

Fixed:

  • eurlex_query_sparql result cap now bounds the outermost (brace-depth 0) LIMIT instead of the first in the query text, so a subselect no longer leaves the outer query uncapped or gets a caller-supplied inner LIMIT silently rewritten (#63). Enforcement is scoped to the raw escape hatch; internal self-bounded queries are unchanged.

383 tests pass; bun run devcheck clean.

CHANGELOG v0.9.8

v0.9.7: query_echo effective result-shaping flags

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 10:17
v0.9.7
9479207

query_echo effective result-shaping flags

Added:

  • query_echo echoes effective include_consolidated (eurlex_search_documents) and include_derivative (eurlex_get_cases) after defaults, in structuredContent and content[] (#57)

Changed:

  • eurlex_get_cases excludes standalone CORRIGENDUM works by default; include_derivative re-admits them (#55)
  • docs/design.md and README reconciled to the CELLAR content-negotiation path and bif:contains keyword search (#59)

377 tests pass; bun run devcheck clean.

CHANGELOG v0.9.7

v0.9.6: SPARQL input hardening; query_sparql cap disclosure + full-term output

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 09:18
v0.9.6
8503251

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.

CHANGELOG v0.9.6

v0.9.5: offset pagination, full SPARQL text output, supply-chain refresh

Choose a tag to compare

@cyanheads cyanheads released this 09 Jul 21:07
v0.9.5
55238f9

offset pagination, full SPARQL text output, supply-chain refresh

Added:

  • eurlex_browse_subjects offset input + output field for paging EuroVoc concepts (#51)

Changed:

  • eurlex_browse_subjects returns 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_sparql text output rendered only the first 20 rows while structuredContent carried the full set — content[] now renders every returned row (#50)

Dependency bumps:

  • @cyanheads/mcp-ts-core ^0.10.10 → ^0.10.14
  • node-html-parser ^8.0.4 → ^9.0.0
  • @socketsecurity/bun-security-scanner added ^1.1.2
  • @biomejs/biome ^2.5.2 → 2.5.2, @types/node ^26.1.0 → 26.1.0 (pinned exact)
  • packageManager bun@1.3.11 → bun@1.3.14

292 tests pass; bun run devcheck clean.

CHANGELOG v0.9.5

v0.9.4: case-insensitive language codes, format-specific offset docs

Choose a tag to compare

@cyanheads cyanheads released this 05 Jul 01:35
v0.9.4
009c889

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_subjects accepts case-insensitive language codes, matching the pattern already used by eurlex_get_document (#46)
  • eurlex_get_document documents that offset/outline/select paging is format-specific — keep format constant when paging from an outline offset (#48)
  • eurlex_get_document reworks is_superseded wording 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

Choose a tag to compare

@cyanheads cyanheads released this 04 Jul 19:22
v0.9.3
82e7f94

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_cases include_derivative input (default false) — re-admits judicial information notices, case abstracts, and case summaries (#44)
  • eurlex_get_relations requested_relation_types / empty_relation_types output fields — page-scoped emptiness signal (#47)

Changed:

  • cdm-labels.ts resolves 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_cases default search no longer crowded out by derivative records — a SPARQL FILTER NOT EXISTS excludes them from the untyped/default path (#44)
  • eurlex_get_relations false consolidated_version truncation — 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

Choose a tag to compare

@cyanheads cyanheads released this 04 Jul 02:45
v0.9.2
577a77a

concise single-string definition descriptions

Description-language cleanup — no schema or behavior change.

Changed:

  • Every tool, resource, and prompt description and .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

Choose a tag to compare

@cyanheads cyanheads released this 03 Jul 22:00
v0.9.1
05c745f

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_analysis duplicate 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

Choose a tag to compare

@cyanheads cyanheads released this 03 Jul 21:20
v0.9.0
965d3d9

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_relations offset + limit inputs (#39) — limit (1-100, default 100) sets the per-relation-type, per-direction cap; offset pages past it.
  • eurlex_get_relations truncation disclosure (#39) — ctx.enrich.truncated fires when a direction fills its cap; also surfaced on the eurlex://document/{celexNumber}/relations resource.
  • author_institutions output on eurlex://document/{celexNumber} (#35) — full de-duplicated set of co-legislating author institution labels.

Fixed:

  • eurlex_get_relations incoming 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_document format() truncated EuroVoc subjects to 5 (#41) — the text channel now renders the full list.
  • resource_type / author_institution returned raw CDM authority URIs on eurlex://document/{celexNumber} (#35) — now resolved to human-readable labels. Breaking: code parsing these as URIs must adapt.
  • cdm-labels implementing/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

Choose a tag to compare

@cyanheads cyanheads released this 03 Jul 20:04
v0.8.2
9c46033

resource-type case filtering, structured case titles

Patch release addressing three tracked issues.

Added:

  • eurlex_get_cases case titles parsed into display_title, parties, subject_matter, and case_reference via parseCaseLawTitle(); raw title preserved (#40)

Fixed:

  • case_type filter 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.