Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/eur-lex-mcp-server
GitHub Stars
7
Server Listing
@cyanheads/eur-lex-mcp-server

TDQS

A4.5/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct resource or operation: thesaurus browsing, case law search, document retrieval, relation traversal, citation resolution, raw SPARQL, and document search. There is no meaningful overlap, and complementary tools like lookup_celex and get_document clearly build on each other.

Naming Consistency5/5

All tool names follow the uniform eurlex_<verb>_<noun> pattern, with consistent snake_case throughout. The verbs (browse, get, lookup, search, query) are reasonably distinct and align with their noun objects, making the API predictable.

Tool Count5/5

Seven tools is well within the ideal range and each one earns its place in covering EU legal research workflows. The count feels neither padded nor sparse for the server's stated purpose.

Completeness4/5

The set covers the core lifecycle of finding and exploring EU legal documents: search legislation, browse subject vocabulary, resolve citations, fetch full text, and traverse relations. A minor gap is that case law search returns metadata but no obvious direct full-text retrieval for judgments, though query_sparql offers an escape hatch.

Available Tools

7 tools
eurlex_browse_subjectsBrowse EuroVoc SubjectsA
Read-onlyIdempotent
Inspect

Search 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, ordered alphabetically by preferred label.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of EuroVoc concepts to return (1–50). Defaults to 20.
offsetNoPagination offset — number of concepts to skip. Defaults to 0.
keywordYesSearch term matched against EuroVoc preferred and alternative concept labels (e.g. "privacy", "agriculture", "product liability").
languageNoLanguage code for concept labels (e.g. "en", "fr", "de"). Case-insensitive — "EN" and "en" behave identically. Defaults to English.en

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied to this response.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of concepts returned in this response.
totalNoNumber of concepts returned in this response.
offsetNoPagination offset used for this response.
conceptsNoMatching EuroVoc concepts ordered alphabetically by label.
has_moreNoTrue only when CELLAR returned an additional valid row beyond this page.
truncatedNoTrue when an additional CELLAR row proves more concepts exist beyond this page.
next_offsetNoOffset for the next page. Present only when has_more is true.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals useful behavior beyond the annotations: it matches both preferred and alternative labels, returns the matched alternative label when applicable, and orders results by preferred label. Annotations already convey read-only, idempotent, and open-world traits, and the description does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences, each earning its place: the first defines purpose and integration, the second explains matching behavior, and the third defines the returned fields and ordering. It is front-loaded with the most actionable information and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, downstream usage, matching behavior, and output fields, while the output schema handles detailed return structure. Annotations cover safety and open-world semantics. Nothing an agent needs to invoke this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage with clear descriptions, defaults, bounds, and examples for keyword, language, limit, and offset. The description reinforces the matching semantics of keyword and mentions the requested language, but it adds no new parameter-level detail beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the EuroVoc thesaurus and resolves keywords into concept URIs, pairing a specific verb with a defined resource. It also distinguishes its output from the sibling eurlex_search_documents by noting these URIs feed that tool's eurovoc_concept filter, so an agent can tell which role it plays.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool: when a keyword needs to be mapped to EuroVoc concept URIs for use as a subject filter in eurlex_search_documents. It provides clear context but does not explicitly name alternatives or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurlex_get_casesSearch CJEU/GC Case LawA
Read-only
Inspect

Search CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, court, case type, keyword, and date range. 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 court, date, and type, plus — parsed from the title where present — the parties, subject matter, and case reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
courtNoCourt filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both.
limitNoMaximum number of results to return (1–100). Defaults to 20.
offsetNoPagination offset — number of results to skip. Defaults to 0.
date_toNoEnd of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound.
keywordNoKeyword to match against case titles and CELEX strings.
case_typeNoCase type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all.
date_fromNoStart of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound.
case_numberNoCase number in standard format: C-{num}/{year} for CJEU or T-{num}/{year} for General Court (e.g. C-131/12).
include_derivativeNoInclude derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type).

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied to this page.
casesNoMatching case law records ordered by date descending.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of cases returned in this page.
totalNoNumber of cases returned in this page (not a corpus-wide count).
offsetNoPagination offset used for this response.
has_moreNoTrue only when CELLAR returned an additional valid row beyond this page.
truncatedNoTrue when an additional CELLAR row proves more cases exist beyond this page.
query_echoNoEcho of filters applied to this search. Useful for diagnosing empty results.
next_offsetNoOffset for the next page. Present only when has_more is true.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only carry readOnlyHint=true and openWorldHint=true. The description adds substantial behavioral context beyond them: the default exclusion of derivative records 'so distinct cases fill the page', the keyword scope limitation, and the caveat that parties/subject matter/case reference are 'parsed from the title where present.' It also clarifies that case_type being set returns a single primary type. All consistent with the read-only annotations — no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences front-load the purpose, then cover default filtering, keyword semantics, and return composition in order. For a 9-parameter tool with non-obvious default behavior (excluding derivative records), the length is justified — each sentence earns its place, though it is not as tight as it could be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (9 params, output schema present, annotations present), the description is thorough: purpose, default exclusion behavior, keyword limitations, and output composition are all covered. Pagination and date formats are already documented in the schema, and the return structure in the output schema, so nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema. It specifies what a keyword actually matches ('English case titles... and CELEX strings') and exactly what the result set carries ('court, date, and type, plus... the parties, subject matter, and case reference'). This supplements rather than repeats the schema's per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — 'Search CJEU and General Court case law — judgments, orders, and Advocate General opinions' — and enumerates the query dimensions (case number, court, case type, keyword, date range). It also differentiates itself from siblings by disclosing the scope boundary: 'there is no full-text body search.' The agent can clearly tell this apart from eurlex_search_documents without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when to use this tool: keyword matching is limited to 'English case titles... and CELEX strings' plus the explicit exclusion 'there is no full-text body search' — a de facto routing signal toward a sibling for full-text needs. However, it never names an alternative tool explicitly or gives a when-not-to-use statement, so the guidance is implicit rather than directive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurlex_get_documentGet EU DocumentA
Read-onlyIdempotent
Inspect

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, legal basis, EuroVoc subjects, in-force status) plus the act body as HTML, Markdown, or Formex4 XML, defaulting to English with automatic fallback. Ordinary offset-based paged windows and full-mode windows are capped at 100,000 characters; page with offset/limit to reconstruct larger acts, or use outline: true for a heading map and select to pull specific articles, chapters, recitals, or annexes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum characters to return in this window ("paged" mode only). Default 25000, max 100000. Follow has_more and the returned offsets until false to reconstruct the complete body.
formatNoContent format: "html" for the act text as served by EUR-Lex (default), "markdown" for that HTML converted to clean Markdown server-side, or "xml" for Formex4 structured XML.html
offsetNoCharacter offset into the body where the returned window starts ("paged" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call. Offsets are format-specific: an offset is only valid against the same format it was measured in — keep format constant when paging.
selectNoReturn only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode "metadata_only".
eli_uriNoWork-level ELI URI of the act to fetch (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri.
outlineNoReturn a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with its offset, keeping the same format: outline offsets are measured in the requested format's body and land in the wrong place under any other format. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode "metadata_only".
resolveNoWhich version to serve for a base act with newer consolidated versions. "as_requested" (default) returns the exact CELEX requested; "current_consolidated" serves the newest consolidated version instead (echoing the request in requested_celex), a no-op when none exists. Either way, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act.as_requested
languageNoOne of the 24 supported two-letter EUR-Lex language codes (e.g. EN, FR, DE), accepted case-insensitively and normalized to uppercase. Defaults to EN, and falls back to EN if the requested language is unavailable.EN
work_uriNoCELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. Provide exactly one of celex_number, eli_uri, or work_uri.
celex_numberNoCELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri.
content_modeNoHow much of the body to return. "paged" (default) returns an offset/limit window; "full" requests from the start and returns at most 100000 characters with continuation metadata when more exists; "metadata_only" skips the content fetch. offset and limit apply only to "paged".paged

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoMaximum body characters allowed in the window.
dateNoDocument date in ISO 8601 format (YYYY-MM-DD).
errorNoPresent when the call failed. Absent on success.
shownNoNumber of body characters returned.
titleNoDocument title in the requested language (absent for some older works and judgments).
noticeNoHow to retrieve the remaining document content.
contentNoBody content of the act in the requested format and language. In "paged" mode this is the requested window; in "full" mode it starts at zero and is capped at 100000 characters. Omitted in "metadata_only" mode, when the window is empty, or when content is unavailable.
outlineNoStructural outline of the act. Present only when outline is true; an empty array means no structure was detected.
has_moreNoTrue when body content exists beyond the returned window. Continue in "paged" mode with offset = content_offset + content_chars_returned until false. Always false in "metadata_only" mode.
in_forceNoWhether the act is currently in force.
languageNoLanguage code of the returned content.
work_uriNoCELLAR work URI.
selectionNoOutcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order.
truncatedNoTrue when the returned body window was capped.
legal_basisNoLegal basis acts for this work. Absent when none are recorded.
celex_numberNoConfirmed CELEX number for the retrieved work.
content_modeNoContent mode applied to this response: "metadata_only", "paged", or "full".
is_supersededNoTrue when a newer consolidated version of the requested base act exists (an unofficial reading aid merging later amendments), so the returned text may not include those amendments. Not a repeal/replacement signal — the base act remains the law and may still be in force (see in_force). Absent when the act has no consolidated version, or is itself one.
resource_typeNoHuman-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works.
content_formatNoFormat of the returned content: "html", "markdown", or "xml".
content_offsetNoCharacter offset where the returned content window begins. Present when a body was fetched and available.
content_statusNoBody resolution status: "not_requested" for metadata-only calls, "available" when a body was resolved, or "unavailable" after ordinary resolution attempts returned no usable body.
requested_celexNoThe originally requested CELEX, echoed when resolve "current_consolidated" served a different (consolidated) work. celex_number holds the CELEX actually served. Absent when the served work is the one requested.
eurovoc_subjectsNoEuroVoc subject classifications. Absent when none are recorded.
content_availableNoWhether body content was fetched from EUR-Lex. False in "metadata_only" mode (no fetch attempted) — use content_mode to distinguish "not requested" from "unavailable upstream".
language_fallbackNoHuman-readable note explaining the fallback that occurred (e.g. "Requested FR content unavailable; returned EN"). Present only when a fallback happened.
author_institutionNoHuman-readable name of the primary (first) originating EU institution (e.g. "European Parliament", "Council of the EU"). For co-legislated acts, prefer author_institutions for the complete set. Absent when not recorded.
consolidated_as_ofNoConsolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present only when is_superseded is true.
requested_languageNoOriginally requested language code when English fallback changed the effective language reported in language.
structure_detectedNoWhether any act structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure — read it via offset/limit or content_mode "full".
author_institutionsNoAll originating EU institutions, for co-legislated acts adopted by more than one body (e.g. ["European Parliament", "Council of the EU"]). Absent when none recorded.
content_chars_totalNoTotal character length of the full document body. Present when content was fetched and available; use with content_offset to page through the entire act.
content_chars_returnedNoNumber of body characters returned in this response (equals content length). Present when a body was fetched and available.
current_consolidated_celexNoCELEX of the newest consolidated version of the requested base act (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve "current_consolidated". Present only when is_superseded is true.
content_unavailability_reasonNoWhy content_status is "unavailable": no representation exists, the upstream request failed, or a multipart Formex body could not be assembled completely.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint and idempotentHint already supplied, the description still adds substantial behavioral detail: automatic fallback to English, 100,000-character cap on windows, continuation metadata, and the outline/select navigation model. Nothing contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three dense sentences: what the tool fetches, paging and size limits, and structural navigation. Each sentence earns its place, and the core verb is front-loaded in the first phrase.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with nested objects and a full output schema, the description gives the agent a complete sense of the primary flows: fetch, page, outline, select. Metadata-only mode and the resolve behavior are left to the schema, which is appropriate given the schema spill coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds workflow-level meaning: page with offset/limit to reconstruct larger acts and use outline/select to pull targeted sections. It reinforces how parameters behave as a cohesive system, even if the schema already covers each parameter individually.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: fetch the metadata and full text of an EU act by CELEX number, ELI URI, or work URI. It enumerates returned metadata fields and the body, which clearly distinguishes it from sibling tools like eurlex_search_documents or eurlex_get_relations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended context is evident: use this tool when you already know an act identifier and need the document content. It does not explicitly name sibling tools as alternatives or state when *not* to use them, so it lacks exclusion guidance despite clear contextual framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurlex_get_relationsGet CELLAR Relationship GraphA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum related works per relation type and direction (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones.
offsetNoPagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works.
work_uriNoCELLAR work resource URI to traverse (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1). Used directly as the addressed work; its CELEX identity is resolved for relation-specific act matching, and act-matched relation types stand down when the work carries several CELEX numbers — address such a work by celex_number to name the act you mean. Provide exactly one of celex_number or work_uri.
celex_numberNoCELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri.
relation_typesNoSubset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures).

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per-direction cap. It bounds each relation type and each direction independently, so it is not an upper bound on shown: a page spanning several types and both directions can return more relations than this number.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of relations returned in this page, summed across every relation type and direction — not the count for any single type or direction.
totalNoNumber of relations returned in this page (not a corpus-wide count).
offsetNoPagination offset applied to this response (per relation type and direction).
has_moreNoTrue only when at least one requested relation type/direction returned an additional valid row beyond this page.
work_uriNoCELLAR URI of the source work (the work_uri input, or resolved from the CELEX).
relationsNoDirect CDM relations for the requested work.
truncatedNoTrue when an additional valid row proves at least one relation type/direction has more related works — page with offset.
next_offsetNoOffset for the next page. Present only when has_more is true.
celex_numberNoCELEX number of the source work whose relations were traversed — the celex_number input, or the CELEX resolved from work_uri when the addressed work carries exactly one. Absent when the addressed work carries none, carries several, or its identity was not resolved because no requested relation type needs it.
empty_relation_typesNoRequested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genuinely has none of that relation — so absent-from-here does not prove absent-in-CELLAR. An empty first page throws no_relations; an exhausted non-zero page returns all requested types here.
requested_relation_typesNoThe relation types this request traversed — the explicit relation_types list, or all types when it was omitted. Diff against the types present in relations[], or read empty_relation_types, to confirm which requested types returned edges.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations supply readOnlyHint, openWorldHint, and idempotentHint; the description adds genuinely useful limits not inferable from the schema: it returns only direct (one-hop) relations, is paginated per relation type and direction, and requires one of two identifier forms. This exceeds the baseline for a read-only annotated tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences. The first states the operation and enumerates the relation categories; the second states scope and pagination. No filler or repetition of schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, relation types, the one-hop/direct restriction, pagination behavior, and identifier requirement. Sibling tools are distinct in purpose. With a rich schema and no required params, this is nearly complete; a minor gap is lack of mention that the two identifiers are mutually exclusive, though the schema states it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds a non-obvious clarification that exactly one of celex_number or work_uri must be provided, which the schema itself does not encode as a required/exclusive constraint. This is meaningful extra guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Traverse') and a precise resource (CELLAR relationship graph of an EU act), then enumerates the relationship categories (amendments, repeals, consolidations, transpositions, legal basis, citations). This clearly distinguishes the tool from siblings like eurlex_get_document or eurlex_get_cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool returns and the input requirement (CELEX number or CELLAR work URI), and its

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurlex_lookup_celexResolve EU Legal CitationA
Read-onlyIdempotent
Inspect

Resolve an EU legal citation — a CELEX number or ELI URI — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, and date.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesThe EU legal citation to resolve: a CELEX number (e.g. 32016R0679) or a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix).
identifier_typeNoFormat of the identifier. "auto" detects it automatically; supply "celex" or "eli" explicitly if detection fails.auto

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoDocument date in ISO 8601 format (YYYY-MM-DD).
errorNoPresent when the call failed. Absent on success.
foundNoTrue when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. Only an identifier_type "auto" value that, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase) raises ambiguous_identifier instead.
work_uriNoCELLAR work URI (stable resource identifier).
celex_numberNoConfirmed CELEX number for the resolved work.
resource_typeNoHuman-readable document category resolved from the CDM resource type (e.g. "Regulation", "Directive", "Judgment"). An authority value with no known label falls back to its code (e.g. "CONS_TEXT"). Absent for some works.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, openWorld, and idempotent hints, so the description adds value by disclosing the canonicalization behavior and the exact return payload (work URI, confirmed CELEX number, document type, and date). It conveys that the tool validates existence, which is a behavioral guarantee beyond the annotation hints. Missing error-handling for unregistered CELEX/ELI values is a minor gap but not severe given the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The main action ('Resolve an EU legal citation') is front-loaded, followed by concise scoping and return details. Every clause adds value and avoids the repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is an output schema, the description appropriately summarizes the resolved output. The instruction 'before you fetch or traverse it' indicates the tool's context of use, and the identifier types are explicit. It is complete for a straightforward lookup tool, and while it may not mention edge cases (e.g., invalid input), those are reasonably covered by annotations—and the rest by an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters are fully covered by the schema with descriptions and examples (identifier, identifier_type, and the enum). The description itself does not add new semantic meaning for the parameters beyond what is already in the schema, and it restates only the fact that CELEX and ELI are supported. The baseline score of 3 is appropriate when schema coverage is 100%.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Resolve an EU legal citation — a CELEX number or ELI URI — to its canonical CELLAR work'. This immediately distinguishes it from siblings like search_documents and get_document, and the phrase 'confirming it exists before you fetch or traverse it' clarifies that this is a resolution/normalization step rather than a retrieval tool. No ambiguity remains about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'before you fetch or traverse it' tells the agent that this tool is a prerequisite for other operations that take citations. It implies a workflow step without explicitly naming the alternative tools (e.g., search_documents when the citation is unknown). It gives a clear context but no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurlex_query_sparqlRaw CELLAR SPARQL QueryA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sparql_queryYesA read-only SPARQL SELECT query. Leading comments and PREFIX/BASE declarations are allowed; the cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at 100 if absent, or capped to 100. Key CDM predicates: cdm:resource_legal_id_celex (CELEX), cdm:work_date_document (date), cdm:work_has_resource-type (type), cdm:work_is_about_concept_eurovoc (EuroVoc subject), cdm:work_cites_work (citation). CELEX is an xsd:string literal — match it with FILTER(STR(?celex) = "…"). For text, use bif:contains with a single-quoted phrase.
timeout_hintNoOptional client-side timeout in milliseconds (1000–55000). Defaults apply when omitted; the endpoint hard limit is 60 seconds.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe server-enforced result ceiling that was applied.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of binding rows returned in this response.
totalNoNumber of binding rows returned (capped at 100 by the server).
bindingsNoRaw SPARQL binding rows. To extract a value from a row: row["varName"]?.value. Use the variables array to iterate in query order.
truncatedNoTrue when the server-enforced result ceiling capped the rows and more may exist upstream — narrow the query with FILTERs to see the rest.
variablesNoVariable names from the SELECT head, in query order.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint=true annotation, the description discloses concrete behavioral constraints: only SELECT is accepted, update/ASK/CONSTRUCT/DESCRIBE forms are rejected before execution, results are capped at 100, and cdm:, skos:, and xsd: prefixes are auto-injected. This gives an agent a clear execution model.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The main description is two tight sentences with the core constraint front-loaded. The parameter descriptions are detailed but directly useful, with no filler or repetition of schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a raw query tool, the description covers accepted query forms, rejected forms, result limits, auto-injected prefixes, and the most relevant CDM predicates. An output schema exists, so return-value details are not the description's responsibility. Nothing needed to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial value: it documents key CDM predicates (celex, dates, types, EuroVoc, citations), explains how to match CELEX literals with STR(), and recommends bif:contains for text queries. This goes well beyond the schema's bare parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource: running a raw SPARQL SELECT against the CELLAR Virtuoso endpoint. It also marks the tool as an escape hatch for CDM ontology traversals, which separates it from the curated sibling tools even without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly positions this tool as the fallback for cases the curated tools do not cover, which is strong when-to-use guidance. It does not explicitly name which sibling to prefer for simpler lookups, but the curated-vs-raw distinction is sufficient context for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eurlex_search_documentsSearch EU DocumentsA
Read-only
Inspect

Search 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. Returns a page of CELEX numbers, work URIs, type labels, dates, and titles, newest first, each flagged with is_consolidated. At least one filter is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (1–100). Defaults to 20.
offsetNoPagination offset — number of results to skip. Defaults to 0.
date_toNoEnd of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound.
keywordNoKeyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), or against CELEX substrings.
in_forceNoIf true, restrict to acts currently in force. Omit to return all regardless of in-force status.
date_fromNoStart of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound.
document_typeNoDocument category: REG=Regulations, DIR=Directives, DEC=Decisions, TREATY=Treaties, JUDG=Judgments, OPIN_AG=AG Opinions, PROP=Proposals, REC=Recommendations. Each category includes its explicit CELLAR authority variants (for example, delegated and implementing regulations). Omit to search all types. Consolidated texts are excluded unless include_consolidated is true.
eurovoc_conceptNoEuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Omit for no subject filter.
author_institutionNoAuthor institution name (e.g. "European Parliament", "Council", "European Commission"), matched against the English names of EU corporate bodies.
include_consolidatedNoWhen true and document_type is set, also match consolidated texts whose basic act belongs to that document category. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied to this page.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of documents returned in this page.
totalNoNumber of documents returned in this page (not a corpus-wide count).
offsetNoPagination offset used for this response.
has_moreNoTrue only when CELLAR returned an additional valid row beyond this page.
documentsNoMatching EU documents ordered by date descending.
truncatedNoTrue when an additional CELLAR row proves more documents exist beyond this page.
query_echoNoEcho of filters applied to this search. Useful for diagnosing empty results.
next_offsetNoOffset for the next page. Present only when has_more is true.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite annotations declaring readOnlyHint=true and openWorldHint=true, the description adds substantial behavioral detail: it specifies the response pagination (returns a page, newest first), the fields returned (CELEX numbers, work URIs, type labels, dates, titles, is_consolidated flag), and critical constraints (no full-text search, consolidated texts excluded unless include_consolidated is true, keyword treated as phrase). These details go well beyond the annotations and significantly aid correct invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: it opens with the core purpose, notes the key limitation, summarizes returns, and ends with a requirement. It avoids redundancy with the schema by not repeating all parameter descriptions. A minor point is that some details (e.g., consolidated exclusion) are also present in the schema, making the description slightly duplicative within the overall tool definition, but it remains appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 10 parameters, an output schema, and thorough schema descriptions, the description covers all critical operational aspects: it lists return fields, ordering, pagination, the mandatory filter requirement, and the no-full-text limitation. It lacks explicit note on rate limits or auth, but given openWorldHint and the presence of an output schema, no further information is essential for an agent to decide how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The top-level description repeats some parameter behaviors (e.g., keyword phrase handling, consolidated exclusion) but adds little new per-parameter meaning beyond what the schema already documents. The main added value is the cross-reference to eurlex_browse_subjects for eurovoc_concept and the overall return format, which does not directly enhance parameter understanding beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Search') and resource ('EU legislation, treaties, and preparatory acts across the CELLAR corpus') and enumerates the filter dimensions (document type, date range, EuroVoc subject, author institution, in-force status). It also clearly distinguishes from siblings by explicitly stating 'there is no full-text body search' and describing return content, making it unambiguous what this tool does and does not cover.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: it specifies the scope (titles and CELEX strings only) and the mandatory condition ('At least one filter is required'). It also gives a practical alternative hint for obtaining EuroVoc concepts ('obtained from eurlex_browse_subjects'). However, it does not explicitly name sibling tools for alternative search scenarios (e.g., if full-text body search were available), so it lacks explicit exclusions beyond the no-full-text note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updates
    • Changedeurlex_get_document12 fields changed
      • changedOutput schema / properties / eurovoc_subjects / description
        Previous value: -"EuroVoc subject classifications."New value: +"EuroVoc subject classifications. Absent when none are recorded."
      • addedOutput schema / properties / eurovoc_subjects / items / additionalProperties
        Added value: +false
      • changedOutput schema / properties / eurovoc_subjects / items / description
        Previous value: -"EuroVoc concept URI."New value: +"An EuroVoc subject: its concept URI plus its preferred label when available."
      • addedOutput schema / properties / eurovoc_subjects / items / properties
        Added value: +{
        +  "concept_uri": {
        +    "description": "EuroVoc concept URI (http://eurovoc.europa.eu/{id}), the exact value the eurovoc_concept filter of eurlex_search_documents accepts.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "EuroVoc preferred label in the requested language. Absent when the concept has no label in that language.",
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / eurovoc_subjects / items / required
        Added value: +[
        +  "concept_uri"
        +]
      • changedOutput schema / properties / eurovoc_subjects / items / type
        Previous value: -"string"New value: +"object"
      • changedOutput schema / properties / legal_basis / description
        Previous value: -"Legal basis acts for this work."New value: +"Legal basis acts for this work. Absent when none are recorded."
      • addedOutput schema / properties / legal_basis / items / additionalProperties
        Added value: +false
      • changedOutput schema / properties / legal_basis / items / description
        Previous value: -"CELEX number or URI of a legal basis act."New value: +"A legal basis act: its CELLAR work URI plus its CELEX number when recorded."
      • addedOutput schema / properties / legal_basis / items / properties
        Added value: +{
        +  "celex_number": {
        +    "description": "CELEX number of the legal basis act (e.g. 12012E016 for TFEU Article 16). Absent when CELLAR records no CELEX for the work.",
        +    "type": "string"
        +  },
        +  "work_uri": {
        +    "description": "CELLAR work URI of the legal basis act. When celex_number is present, pass either as work_uri or celex_number to eurlex_get_document to fetch that act; a basis with no CELEX is a CELLAR reference that may not resolve to a fetchable work.",
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / legal_basis / items / required
        Added value: +[
        +  "work_uri"
        +]
      • changedOutput schema / properties / legal_basis / items / type
        Previous value: -"string"New value: +"object"
    • Changedeurlex_lookup_celex1 field changed
      • changedOutput schema / properties / resource_type / description
        Previous value: -"CDM resource type URI indicating the document category (e.g. .../resource-type/REG for Regulation). Absent for some works."New value: +"Human-readable document category resolved from the CDM resource type (e.g. \"Regulation\", \"Directive\", \"Judgment\"). An authority value with no known label falls back to its code (e.g. \"CONS_TEXT\"). Absent for some works."
    • Changedeurlex_query_sparql1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_read_only`: The query is not a read-only SELECT — an update or non-SELECT query form was supplied. `sparql_error`: Virtuoso returned a syntax or semantic error — the query is malformed. `sparql_timeout`: Query exceeded the 60-second Virtuoso hard limit. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_read_only`: The query is not a read-only SELECT — an update or non-SELECT query form was supplied. `sparql_error`: Virtuoso returned a syntax or semantic error — the query is malformed. `sparql_timeout`: The query exceeded the client-side timeout (timeout_hint, default 55 s) or the 60-second Virtuoso execution limit. Neither is retried: the call fails inside the configured bound. Other values are possible when a failure originates below the handler."
  2. 6 tool updates
    • Changedeurlex_browse_subjects7 fields changed
      • changedInput schema / properties / keyword / description
        Previous value: -"Search term to match against EuroVoc concept labels (e.g. \"privacy\", \"agriculture\", \"trade\")."New value: +"Search term matched against EuroVoc preferred and alternative concept labels (e.g. \"privacy\", \"agriculture\", \"product liability\")."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "concepts",
        -      "total",
        -      "offset"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "concepts",
        +      "total",
        +      "offset",
        +      "has_more"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / concepts / items / properties / matched_label
        Added value: +{
        +  "description": "Alternative (non-preferred) EuroVoc label that matched the keyword, when the concept was reached through one. Absent when the keyword matched the preferred label alone.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_concepts`: No EuroVoc concepts matched the keyword in the requested language. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_concepts`: The first page (offset 0) was empty — no EuroVoc concepts matched the keyword in the requested language. A later page that comes back empty returns an empty success instead. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True only when CELLAR returned an additional valid row beyond this page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset for the next page. Present only when has_more is true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the returned list was capped at the limit and more concepts may exist."New value: +"True when an additional CELLAR row proves more concepts exist beyond this page."
    • Changedeurlex_get_cases6 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "cases",
        -      "total",
        -      "offset",
        -      "query_echo"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cases",
        +      "total",
        +      "offset",
        +      "has_more",
        +      "query_echo"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_results`: The query returned zero bindings — no matching cases in CELLAR sector 6. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `no_results`: The first page (offset 0) returned zero bindings — no matching cases in CELLAR sector 6. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_results",
        -  "sparql_error"
        -]New value: +[
        +  "invalid_date_range",
        +  "no_results",
        +  "sparql_error"
        +]
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True only when CELLAR returned an additional valid row beyond this page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset for the next page. Present only when has_more is true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the returned page was capped at the limit and more cases may exist."New value: +"True when an additional CELLAR row proves more cases exist beyond this page."
    • Changedeurlex_get_document2 fields changed
      • addedInput schema / properties / celex_number / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "CELEX number of the act (e.g. 32016R0679 for GDPR). Surrounding whitespace is trimmed and the value is uppercased before validation.",
        +    "pattern": "^[0-9A-Z][0-9A-Z()/_-]{5,}$",
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / celex_number / type
        Removed value: -"string"
    • Changedeurlex_get_relations17 fields changed
      • addedInput schema / properties / celex_number / anyOf
        Added value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "CELEX number of the work (e.g. 32016R0679). Surrounding whitespace is trimmed and the value is uppercased before validation.",
        +    "pattern": "^[0-9A-Z][0-9A-Z()/_-]{5,}$",
        +    "type": "string"
        +  }
        +]
      • removedInput schema / properties / celex_number / type
        Removed value: -"string"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum related works per relation type and direction (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones. When truncated is true, at least one direction filled its cap."New value: +"Maximum related works per relation type and direction (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones."
      • changedInput schema / properties / relation_types / description
        Previous value: -"Subset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), consolidated_version (consolidated texts of this act)."New value: +"Subset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures)."
      • changedInput schema / properties / relation_types / items / enum
        Previous value: -[
        -  "cites",
        -  "amends",
        -  "amended_by",
        -  "repeals",
        -  "repealed_by",
        -  "implicitly_repeals",
        -  "implicitly_repealed_by",
        -  "legal_basis",
        -  "consolidated_version"
        -]New value: +[
        +  "cites",
        +  "amends",
        +  "amended_by",
        +  "repeals",
        +  "repealed_by",
        +  "implicitly_repeals",
        +  "implicitly_repealed_by",
        +  "legal_basis",
        +  "consolidated_version",
        +  "national_transposition"
        +]
      • changedInput schema / properties / work_uri / description
        Previous value: -"CELLAR work resource URI to traverse (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1). Used directly without CELEX resolution. Provide exactly one of celex_number or work_uri."New value: +"CELLAR work resource URI to traverse (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1). Used directly as the addressed work; its CELEX identity is resolved for relation-specific act matching, and act-matched relation types stand down when the work carries several CELEX numbers — address such a work by celex_number to name the act you mean. Provide exactly one of celex_number or work_uri."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "work_uri",
        -      "relations",
        -      "total",
        -      "offset",
        -      "requested_relation_types",
        -      "empty_relation_types"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "work_uri",
        +      "relations",
        +      "total",
        +      "offset",
        +      "has_more",
        +      "requested_relation_types",
        +      "empty_relation_types"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / cap / description
        Previous value: -"The per-direction cap applied to this page."New value: +"The per-direction cap. It bounds each relation type and each direction independently, so it is not an upper bound on shown: a page spanning several types and both directions can return more relations than this number."
      • changedOutput schema / properties / celex_number / description
        Previous value: -"CELEX number of the source work whose relations were traversed. Absent when addressed directly by work_uri."New value: +"CELEX number of the source work whose relations were traversed — the celex_number input, or the CELEX resolved from work_uri when the addressed work carries exactly one. Absent when the addressed work carries none, carries several, or its identity was not resolved because no requested relation type needs it."
      • changedOutput schema / properties / empty_relation_types / description
        Previous value: -"Requested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genuinely has none of that relation — so absent-from-here does not prove absent-in-CELLAR. When every requested type is empty the tool throws no_relations instead."New value: +"Requested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genuinely has none of that relation — so absent-from-here does not prove absent-in-CELLAR. An empty first page throws no_relations; an exhausted non-zero page returns all requested types here."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `not_found`: CELEX number not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `no_relations`: Work exists but has no CDM relations of the requested types. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `not_found`: CELEX number not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `no_relations`: The first page (offset 0) was empty — the work exists but has no CDM relations of the requested types. A later page that comes back empty returns an empty success instead. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True only when at least one requested relation type/direction returned an additional valid row beyond this page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset for the next page. Present only when has_more is true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / relations / items / properties / relation_type / description
        Previous value: -"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, consolidated_version."New value: +"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, consolidated_version, national_transposition."
      • changedOutput schema / properties / shown / description
        Previous value: -"Number of relations returned in this page."New value: +"Number of relations returned in this page, summed across every relation type and direction — not the count for any single type or direction."
      • changedOutput schema / properties / total / description
        Previous value: -"Number of relations returned in this page (not a corpus-wide count). A direction that filled its cap sets truncated — page with offset for the rest."New value: +"Number of relations returned in this page (not a corpus-wide count)."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when at least one relation type/direction filled its per-direction cap and more related works may exist — page with offset."New value: +"True when an additional valid row proves at least one relation type/direction has more related works — page with offset."
    • Changedeurlex_lookup_celex2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier format could not be determined. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase), so no lookup branch applies. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / found / description
        Previous value: -"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. A malformed or undetectable identifier raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."
    • Changedeurlex_search_documents6 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "documents",
        -      "total",
        -      "offset",
        -      "query_echo"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "documents",
        +      "total",
        +      "offset",
        +      "has_more",
        +      "query_echo"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `no_results`: The query returned zero bindings — no matching documents in CELLAR. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `no_results`: The first page (offset 0) returned zero bindings — no matching documents in CELLAR. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_filters",
        -  "no_results",
        -  "sparql_error"
        -]New value: +[
        +  "no_filters",
        +  "invalid_date_range",
        +  "no_results",
        +  "sparql_error"
        +]
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "description": "True only when CELLAR returned an additional valid row beyond this page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / next_offset
        Added value: +{
        +  "description": "Offset for the next page. Present only when has_more is true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the returned page was capped at the limit and more documents may exist."New value: +"True when an additional CELLAR row proves more documents exist beyond this page."
  3. 1 tool update
    • Changedeurlex_get_document12 fields changed
      • changedInput schema / properties / content_mode / description
        Previous value: -"How much of the body to return. \"paged\" (default) returns a bounded character window (see offset/limit); \"full\" returns the entire body in one call (large acts can be hundreds of KB); \"metadata_only\" skips the content fetch. offset and limit apply only to \"paged\"."New value: +"How much of the body to return. \"paged\" (default) returns an offset/limit window; \"full\" requests from the start and returns at most 100000 characters with continuation metadata when more exists; \"metadata_only\" skips the content fetch. offset and limit apply only to \"paged\"."
      • changedInput schema / properties / language / description
        Previous value: -"Language code for document content (ISO 639-1 uppercase, e.g. EN, FR, DE). Defaults to EN, and falls back to EN if the requested language is unavailable."New value: +"One of the 24 supported two-letter EUR-Lex language codes (e.g. EN, FR, DE), accepted case-insensitively and normalized to uppercase. Defaults to EN, and falls back to EN if the requested language is unavailable."
      • changedInput schema / properties / language / pattern
        Previous value: -"^[A-Za-z]{2,3}$"New value: +"^(?:[Ee][Nn]|[Ff][Rr]|[Dd][Ee]|[Ee][Ss]|[Ii][Tt]|[Pp][Ll]|[Pp][Tt]|[Nn][Ll]|[Cc][Ss]|[Dd][Aa]|[Ee][Ll]|[Ee][Tt]|[Ff][Ii]|[Hh][Uu]|[Ll][Tt]|[Ll][Vv]|[Mm][Tt]|[Rr][Oo]|[Ss][Kk]|[Ss][Ll]|[Ss][Vv]|[Bb][Gg]|[Hh][Rr]|[Gg][Aa])$"
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum characters to return in this window (\"paged\" mode only). Default 25000, max 100000. For the entire body in one response, use content_mode \"full\"."New value: +"Maximum characters to return in this window (\"paged\" mode only). Default 25000, max 100000. Follow has_more and the returned offsets until false to reconstruct the complete body."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "celex_number",
        -      "content_mode",
        -      "content_available",
        -      "has_more",
        -      "language",
        -      "content_format"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "celex_number",
        +      "content_mode",
        +      "content_available",
        +      "content_status",
        +      "has_more",
        +      "language",
        +      "content_format"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / content / description
        Previous value: -"Body content of the act in the requested format and language. In \"paged\" mode a character window (see content_offset / content_chars_returned / has_more); in \"full\" mode the entire body; omitted in \"metadata_only\" mode, when the window is empty, or when content is unavailable."New value: +"Body content of the act in the requested format and language. In \"paged\" mode this is the requested window; in \"full\" mode it starts at zero and is capped at 100000 characters. Omitted in \"metadata_only\" mode, when the window is empty, or when content is unavailable."
      • addedOutput schema / properties / content_status
        Added value: +{
        +  "description": "Body resolution status: \"not_requested\" for metadata-only calls, \"available\" when a body was resolved, or \"unavailable\" after ordinary resolution attempts returned no usable body.",
        +  "enum": [
        +    "not_requested",
        +    "available",
        +    "unavailable"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / content_unavailability_reason
        Added value: +{
        +  "description": "Why content_status is \"unavailable\": no representation exists, the upstream request failed, or a multipart Formex body could not be assembled completely.",
        +  "enum": [
        +    "no_representation",
        +    "upstream_failure",
        +    "multipart_incomplete"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: None of celex_number, eli_uri, or work_uri was provided, or more than one was. `not_found`: The CELEX, ELI, or work URI resolves to no fetchable work — the work is absent from the corpus, or the CELLAR work carries no CELEX number. `language_unavailable`: Requested language has no content in EUR-Lex after fallback to English also failed. `content_fetch_failed`: EUR-Lex content API returned non-200 after language fallback attempts. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: None of celex_number, eli_uri, or work_uri was provided, or more than one was. `not_found`: The CELEX, ELI, or work URI resolves to no fetchable work — the work is absent from the corpus, or the CELLAR work carries no CELEX number. `content_challenge`: The primary content response is an AWS WAF bot-challenge interstitial rather than legal text. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_identifier_args",
        -  "not_found",
        -  "language_unavailable",
        -  "content_fetch_failed"
        -]New value: +[
        +  "invalid_identifier_args",
        +  "not_found",
        +  "content_challenge"
        +]
      • changedOutput schema / properties / has_more / description
        Previous value: -"True when body content exists beyond the returned window. Page forward with offset = content_offset + content_chars_returned, or request content_mode \"full\". Always false in \"metadata_only\" mode."New value: +"True when body content exists beyond the returned window. Continue in \"paged\" mode with offset = content_offset + content_chars_returned until false. Always false in \"metadata_only\" mode."
      • addedOutput schema / properties / requested_language
        Added value: +{
        +  "description": "Originally requested language code when English fallback changed the effective language reported in language.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedeurlex_search_documents3 fields changed
      • changedInput schema / properties / document_type / description
        Previous value: -"Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Omit to search all types. A type filter excludes consolidated texts (CONS_TEXT) — set include_consolidated to fold them back in."New value: +"Document category: REG=Regulations, DIR=Directives, DEC=Decisions, TREATY=Treaties, JUDG=Judgments, OPIN_AG=AG Opinions, PROP=Proposals, REC=Recommendations. Each category includes its explicit CELLAR authority variants (for example, delegated and implementing regulations). Omit to search all types. Consolidated texts are excluded unless include_consolidated is true."
      • changedInput schema / properties / include_consolidated / description
        Previous value: -"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that a plain type filter omits. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true."New value: +"When true and document_type is set, also match consolidated texts whose basic act belongs to that document category. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true."
      • changedOutput schema / properties / query_echo / properties / include_consolidated / description
        Previous value: -"Effective include_consolidated value after the false default is applied — whether consolidated texts (CONS_TEXT) of the document_type were folded in. Always present, since the default shapes which records can appear; has effect only when document_type is set."New value: +"Effective include_consolidated value after the false default is applied — whether consolidated texts whose basic act belongs to the document_type category were included. Always present, since the default shapes which records can appear; has effect only when document_type is set."
  5. 7 tool updates
    • Changedeurlex_browse_subjects6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "concepts",
        +      "total",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_concepts`: No EuroVoc concepts matched the keyword in the requested language. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_concepts"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "concepts",
        -  "total",
        -  "offset"
        -]
    • Changedeurlex_get_cases6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cases",
        +      "total",
        +      "offset",
        +      "query_echo"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_results`: The query returned zero bindings — no matching cases in CELLAR sector 6. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_results",
        +            "sparql_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cases",
        -  "total",
        -  "offset",
        -  "query_echo"
        -]
    • Changedeurlex_get_document10 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "celex_number",
        +      "content_mode",
        +      "content_available",
        +      "has_more",
        +      "language",
        +      "content_format"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "Maximum body characters allowed in the window.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: None of celex_number, eli_uri, or work_uri was provided, or more than one was. `not_found`: The CELEX, ELI, or work URI resolves to no fetchable work — the work is absent from the corpus, or the CELLAR work carries no CELEX number. `language_unavailable`: Requested language has no content in EUR-Lex after fallback to English also failed. `content_fetch_failed`: EUR-Lex content API returned non-200 after language fallback attempts. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_identifier_args",
        +            "not_found",
        +            "language_unavailable",
        +            "content_fetch_failed"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "How to retrieve the remaining document content.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of body characters returned.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the returned body window was capped.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "celex_number",
        -  "content_mode",
        -  "content_available",
        -  "has_more",
        -  "language",
        -  "content_format"
        -]
    • Changedeurlex_get_relations6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "work_uri",
        +      "relations",
        +      "total",
        +      "offset",
        +      "requested_relation_types",
        +      "empty_relation_types"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `not_found`: CELEX number not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `no_relations`: Work exists but has no CDM relations of the requested types. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_identifier_args",
        +            "not_found",
        +            "no_relations"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "work_uri",
        -  "relations",
        -  "total",
        -  "offset",
        -  "requested_relation_types",
        -  "empty_relation_types"
        -]
    • Changedeurlex_lookup_celex6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "found"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier format could not be determined. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "ambiguous_identifier"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "found"
        -]
    • Changedeurlex_query_sparql6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "bindings",
        +      "variables",
        +      "total"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_read_only`: The query is not a read-only SELECT — an update or non-SELECT query form was supplied. `sparql_error`: Virtuoso returned a syntax or semantic error — the query is malformed. `sparql_timeout`: Query exceeded the 60-second Virtuoso hard limit. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_read_only",
        +            "sparql_error",
        +            "sparql_timeout"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "bindings",
        -  "variables",
        -  "total"
        -]
    • Changedeurlex_search_documents6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "documents",
        +      "total",
        +      "offset",
        +      "query_echo"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `no_results`: The query returned zero bindings — no matching documents in CELLAR. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_filters",
        +            "no_results",
        +            "sparql_error"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "documents",
        -  "total",
        -  "offset",
        -  "query_echo"
        -]
  6. 2 tool updates
    • Changedeurlex_get_cases3 fields changed
      • changedInput schema / properties / include_derivative / description
        Previous value: -"Include derivative sector-6 records — judicial information notices, case abstracts, and case summaries — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)."New value: +"Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)."
      • addedOutput schema / properties / query_echo / properties / include_derivative
        Added value: +{
        +  "description": "Effective include_derivative value after the false default is applied — whether derivative sector-6 records (notices, abstracts, summaries, corrigenda) were admitted alongside primary cases. Always present, since the default shapes which records can appear.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / query_echo / required
        Added value: +[
        +  "include_derivative"
        +]
    • Changedeurlex_search_documents2 fields changed
      • addedOutput schema / properties / query_echo / properties / include_consolidated
        Added value: +{
        +  "description": "Effective include_consolidated value after the false default is applied — whether consolidated texts (CONS_TEXT) of the document_type were folded in. Always present, since the default shapes which records can appear; has effect only when document_type is set.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / query_echo / required
        Added value: +[
        +  "include_consolidated"
        +]
  7. 2 tool updates
    • Changedeurlex_query_sparql4 fields changed
      • changedOutput schema / properties / bindings / items / description
        Previous value: -"A single SPARQL result row. Each key is a SELECT variable name; each value is a SPARQL term object with \"type\" (e.g. \"uri\", \"literal\") and \"value\" (the string value) fields."New value: +"A single SPARQL result row. Each key is a SELECT variable name; each value is a SPARQL term object with \"type\" (\"uri\", \"literal\", or \"bnode\") and \"value\" (the string value), plus \"datatype\" (an IRI) on a typed literal or \"xml:lang\" (a language tag) on a language-tagged literal — the two are mutually exclusive. A variable left unbound by an OPTIONAL has no key in the row at all."
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The server-enforced result ceiling that was applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of binding rows returned in this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the server-enforced result ceiling capped the rows and more may exist upstream — narrow the query with FILTERs to see the rest.",
        +  "type": "boolean"
        +}
    • Changedeurlex_search_documents1 field changed
      • changedInput schema / properties / eurovoc_concept / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).",
        -    "pattern": "^http.*",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).",
        +    "type": "string"
        +  }
        +]
  8. 1 tool update
    • Changedeurlex_browse_subjects4 fields changed
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Pagination offset — number of concepts to skip. Defaults to 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / concepts / description
        Previous value: -"Matching EuroVoc concepts ordered by relevance of the label match."New value: +"Matching EuroVoc concepts ordered alphabetically by label."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Pagination offset used for this response.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "concepts",
        -  "total"
        -]New value: +[
        +  "concepts",
        +  "total",
        +  "offset"
        +]
  9. 2 tool updates
    • Changedeurlex_browse_subjects2 fields changed
      • changedInput schema / properties / language / description
        Previous value: -"Language code for concept labels (e.g. \"en\", \"fr\", \"de\"). Defaults to English."New value: +"Language code for concept labels (e.g. \"en\", \"fr\", \"de\"). Case-insensitive — \"EN\" and \"en\" behave identically. Defaults to English."
      • changedInput schema / properties / language / pattern
        Previous value: -"^[a-z]{2,3}$"New value: +"^[A-Za-z]{2,3}$"
    • Changedeurlex_get_document4 fields changed
      • changedInput schema / properties / offset / description
        Previous value: -"Character offset into the body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call."New value: +"Character offset into the body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call. Offsets are format-specific: an offset is only valid against the same format it was measured in — keep format constant when paging."
      • changedInput schema / properties / outline / description
        Previous value: -"Return a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with its offset. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode \"metadata_only\"."New value: +"Return a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with its offset, keeping the same format: outline offsets are measured in the requested format's body and land in the wrong place under any other format. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode \"metadata_only\"."
      • changedInput schema / properties / select / description
        Previous value: -"Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode \"metadata_only\"."New value: +"Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode \"metadata_only\"."
      • changedOutput schema / properties / is_superseded / description
        Previous value: -"True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself one."New value: +"True when a newer consolidated version of the requested base act exists (an unofficial reading aid merging later amendments), so the returned text may not include those amendments. Not a repeal/replacement signal — the base act remains the law and may still be in force (see in_force). Absent when the act has no consolidated version, or is itself one."
  10. 2 tool updates
    • Changedeurlex_get_cases1 field changed
      • addedInput schema / properties / include_derivative
        Added value: +{
        +  "default": false,
        +  "description": "Include derivative sector-6 records — judicial information notices, case abstracts, and case summaries — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type).",
        +  "type": "boolean"
        +}
    • Changedeurlex_get_relations3 fields changed
      • addedOutput schema / properties / empty_relation_types
        Added value: +{
        +  "description": "Requested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genuinely has none of that relation — so absent-from-here does not prove absent-in-CELLAR. When every requested type is empty the tool throws no_relations instead.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / requested_relation_types
        Added value: +{
        +  "description": "The relation types this request traversed — the explicit relation_types list, or all types when it was omitted. Diff against the types present in relations[], or read empty_relation_types, to confirm which requested types returned edges.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "work_uri",
        -  "relations",
        -  "total",
        -  "offset"
        -]New value: +[
        +  "work_uri",
        +  "relations",
        +  "total",
        +  "offset",
        +  "requested_relation_types",
        +  "empty_relation_types"
        +]
  11. 6 tool updates
    • Changedeurlex_get_cases6 fields changed
      • changedInput schema / properties / case_type / description
        Previous value: -"Case type filter: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Leave blank or omit to search all case types."New value: +"Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all."
      • changedInput schema / properties / court / description
        Previous value: -"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Leave blank or omit to search both courts."New value: +"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both."
      • changedOutput schema / properties / cases / items / properties / display_title / description
        Previous value: -"Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties (e.g. an Advocate General opinion). Parsed from title; absent when title is."New value: +"Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties. Parsed from title; absent when title is."
      • changedOutput schema / properties / cases / items / properties / parties / description
        Previous value: -"Parties to the case, parsed from the title (e.g. \"WhatsApp Ireland Ltd v European Data Protection Board.\"). Absent when the title carries no parties segment (e.g. AG opinions, some older cases)."New value: +"Parties to the case, parsed from the title (e.g. \"WhatsApp Ireland Ltd v European Data Protection Board.\"). Absent when the title carries no parties segment (e.g. AG opinions)."
      • changedOutput schema / properties / cases / items / properties / resource_type / description
        Previous value: -"Human-readable case type label (e.g. \"Judgment\", \"Order\", \"AG Opinion\"). Cases classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. Absent for some older cases."New value: +"Human-readable case type label (e.g. \"Judgment\", \"Order\", \"AG Opinion\"). Cases with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older cases."
      • changedOutput schema / properties / cases / items / properties / title / description
        Previous value: -"Raw English expression title as stored in CELLAR. For case law this is a \"#\"-delimited string (court+date, parties, subject-matter, case reference); the parsed segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."New value: +"Raw English expression title as stored in CELLAR — a \"#\"-delimited string (court+date, parties, subject-matter, case reference) whose segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."
    • Changedeurlex_get_document16 fields changed
      • changedInput schema / properties / content_mode / description
        Previous value: -"How much of the document body to return. \"paged\" (default) returns a bounded character window — see offset/limit; \"full\" returns the entire body in one call (large acts can be hundreds of KB); \"metadata_only\" returns metadata with no body and skips the content fetch. offset and limit apply only to \"paged\"."New value: +"How much of the body to return. \"paged\" (default) returns a bounded character window (see offset/limit); \"full\" returns the entire body in one call (large acts can be hundreds of KB); \"metadata_only\" skips the content fetch. offset and limit apply only to \"paged\"."
      • changedInput schema / properties / eli_uri / description
        Previous value: -"Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri."New value: +"Work-level ELI URI of the act to fetch (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri."
      • changedInput schema / properties / format / description
        Previous value: -"Content format: \"html\" for the act text as served by EUR-Lex (default); \"markdown\" for that HTML converted to clean Markdown server-side (recitals and numbered points as readable text, genuine data tables as GFM); \"xml\" for Formex4 XML structured format."New value: +"Content format: \"html\" for the act text as served by EUR-Lex (default), \"markdown\" for that HTML converted to clean Markdown server-side, or \"xml\" for Formex4 structured XML."
      • changedInput schema / properties / language / description
        Previous value: -"Language code for document content (ISO 639-1 uppercase, e.g. EN, FR, DE). Defaults to EN. Falls back to EN if the requested language is unavailable."New value: +"Language code for document content (ISO 639-1 uppercase, e.g. EN, FR, DE). Defaults to EN, and falls back to EN if the requested language is unavailable."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum characters of body content to return in this window (\"paged\" mode only). Default 25000, max 100000. For the entire body in one response, use content_mode \"full\" instead of a large limit."New value: +"Maximum characters to return in this window (\"paged\" mode only). Default 25000, max 100000. For the entire body in one response, use content_mode \"full\"."
      • changedInput schema / properties / offset / description
        Previous value: -"Character offset into the full document body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call."New value: +"Character offset into the body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call."
      • changedInput schema / properties / outline / description
        Previous value: -"Return a structural outline of the act — the detected chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset into the body of the requested format — instead of body text. Use it to see what sections exist, then read one by paging (content_mode \"paged\") with its offset. Ignores offset/limit and select. An act with no detectable structure (e.g. case law) returns an empty outline, never an error. Not applied in content_mode \"metadata_only\"."New value: +"Return a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with its offset. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode \"metadata_only\"."
      • changedInput schema / properties / resolve / description
        Previous value: -"Which version to serve for a base act that has newer consolidated versions. \"as_requested\" (default) returns the exact CELEX requested — for a base act, the as-enacted text. \"current_consolidated\" transparently serves the newest consolidated version instead when one exists, reporting the served CELEX in celex_number and the originally requested CELEX in requested_celex; a no-op when no newer consolidated version exists. Regardless of this setting, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act."New value: +"Which version to serve for a base act with newer consolidated versions. \"as_requested\" (default) returns the exact CELEX requested; \"current_consolidated\" serves the newest consolidated version instead (echoing the request in requested_celex), a no-op when none exists. Either way, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act."
      • changedInput schema / properties / select / description
        Previous value: -"Return only the text of specific sections by type and number, instead of a raw character window. Roman and Arabic chapter/annex numbers are treated as equivalent. Applies on top of the requested format (html, markdown, xml). A section that cannot be located, or an act with no detectable structure, is reported in selection.missed with no wrong text returned — use offset/limit or content_mode \"full\" to read it. Ignored when outline is true or in content_mode \"metadata_only\"."New value: +"Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode \"metadata_only\"."
      • changedInput schema / properties / work_uri / description
        Previous value: -"CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. Dereferenced to its CELEX, then fetched by the same flow. Provide exactly one of celex_number, eli_uri, or work_uri."New value: +"CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. Provide exactly one of celex_number, eli_uri, or work_uri."
      • changedOutput schema / properties / author_institution / description
        Previous value: -"Human-readable name of the primary (first) originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). For co-legislated acts adopted by more than one body, prefer author_institutions for the complete set. Absent when not recorded."New value: +"Human-readable name of the primary (first) originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). For co-legislated acts, prefer author_institutions for the complete set. Absent when not recorded."
      • changedOutput schema / properties / author_institutions / description
        Previous value: -"All originating EU institutions, for co-legislated acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"] for an ordinary-legislative-procedure act). Absent when none recorded."New value: +"All originating EU institutions, for co-legislated acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"]). Absent when none recorded."
      • changedOutput schema / properties / content / description
        Previous value: -"Body content of the act in the requested format and language. In \"paged\" mode this is a character window (see content_offset / content_chars_returned / has_more); in \"full\" mode the entire body; omitted in \"metadata_only\" mode, when the window is empty (offset past the end), or when content is unavailable."New value: +"Body content of the act in the requested format and language. In \"paged\" mode a character window (see content_offset / content_chars_returned / has_more); in \"full\" mode the entire body; omitted in \"metadata_only\" mode, when the window is empty, or when content is unavailable."
      • changedOutput schema / properties / has_more / description
        Previous value: -"True when body content exists beyond the returned window. Page forward with offset = content_offset + content_chars_returned, or request content_mode \"full\" for the entire act in one call. Always false in \"metadata_only\" mode."New value: +"True when body content exists beyond the returned window. Page forward with offset = content_offset + content_chars_returned, or request content_mode \"full\". Always false in \"metadata_only\" mode."
      • changedOutput schema / properties / is_superseded / description
        Previous value: -"True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself a consolidated version."New value: +"True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself one."
      • changedOutput schema / properties / structure_detected / description
        Previous value: -"Whether any act structure was parsed from the body. Present when outline or select was used; false means the act has no detectable chapter/article/annex structure — read it via the paging floor (offset/limit or content_mode \"full\")."New value: +"Whether any act structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure — read it via offset/limit or content_mode \"full\"."
    • Changedeurlex_get_relations5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum related works to return per relation type and per direction (1–100). Defaults to 100. Incoming edges (e.g. works that cite this act) are ordered by document date descending, so the cap keeps the newest — page with offset for older ones. For the symmetric cites relation, outgoing and incoming each get this budget independently. When truncated is true, at least one direction filled its cap and more may exist."New value: +"Maximum related works per relation type and direction (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones. When truncated is true, at least one direction filled its cap."
      • changedInput schema / properties / offset / description
        Previous value: -"Pagination offset applied per relation type and per direction — number of related works to skip. Defaults to 0. Page forward by adding limit each call; incoming edges are ordered newest-first, so higher offsets reach older works."New value: +"Pagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works."
      • changedInput schema / properties / relation_types / description
        Previous value: -"Subset of relation types to return. Omit to return all types: cites (citation graph), amends (what this work amends), amended_by (what amends this work), repeals (what this work explicitly repeals), repealed_by (what explicitly repealed this work), implicitly_repeals (what this work implicitly repeals), implicitly_repealed_by (what implicitly repealed this work), legal_basis (treaty/treaty article this act is based on), consolidated_version (consolidated versions of this act)."New value: +"Subset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), consolidated_version (consolidated texts of this act)."
      • changedOutput schema / properties / celex_number / description
        Previous value: -"CELEX number of the source work whose relations were traversed. Absent when the work was addressed directly by work_uri."New value: +"CELEX number of the source work whose relations were traversed. Absent when addressed directly by work_uri."
      • changedOutput schema / properties / total / description
        Previous value: -"Number of relations returned in this page (not a corpus-wide count). A direction that filled its per-direction cap sets truncated — page with offset for the rest."New value: +"Number of relations returned in this page (not a corpus-wide count). A direction that filled its cap sets truncated — page with offset for the rest."
    • Changedeurlex_lookup_celex1 field changed
      • changedInput schema / properties / identifier_type / description
        Previous value: -"Format of the identifier. Use \"auto\" to let the server detect the format automatically. Supply explicitly if auto-detection fails or if the identifier is ambiguous."New value: +"Format of the identifier. \"auto\" detects it automatically; supply \"celex\" or \"eli\" explicitly if detection fails."
    • Changedeurlex_query_sparql2 fields changed
      • changedInput schema / properties / sparql_query / description
        Previous value: -"A read-only SPARQL SELECT query to execute against CELLAR. Non-SELECT queries (updates such as DELETE/INSERT, or ASK/CONSTRUCT/DESCRIBE) are rejected before execution. Leading comments and PREFIX/BASE declarations are allowed before the SELECT keyword. The cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at 100 if absent or capped to 100 if above that threshold."New value: +"A read-only SPARQL SELECT query. Leading comments and PREFIX/BASE declarations are allowed; the cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at 100 if absent, or capped to 100. Key CDM predicates: cdm:resource_legal_id_celex (CELEX), cdm:work_date_document (date), cdm:work_has_resource-type (type), cdm:work_is_about_concept_eurovoc (EuroVoc subject), cdm:work_cites_work (citation). CELEX is an xsd:string literal — match it with FILTER(STR(?celex) = \"…\"). For text, use bif:contains with a single-quoted phrase."
      • changedInput schema / properties / timeout_hint / description
        Previous value: -"Optional client-side timeout for this request, in milliseconds (1000–55000). When omitted, the default timeout applies; the endpoint hard limit is 60 seconds."New value: +"Optional client-side timeout in milliseconds (1000–55000). Defaults apply when omitted; the endpoint hard limit is 60 seconds."
    • Changedeurlex_search_documents7 fields changed
      • changedInput schema / properties / author_institution / description
        Previous value: -"Author institution name (e.g. \"European Parliament\", \"Council\", \"European Commission\"). Matched against the English names of EU corporate bodies; only works created by a matching institution are returned."New value: +"Author institution name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched against the English names of EU corporate bodies."
      • changedInput schema / properties / date_from / description
        Previous value: -"Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no lower bound."New value: +"Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound."
      • changedInput schema / properties / date_to / description
        Previous value: -"End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no upper bound."New value: +"End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound."
      • changedInput schema / properties / document_type / description
        Previous value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types. A type filter excludes consolidated texts (CONS_TEXT), which carry their own resource-type — set include_consolidated to fold them back in."New value: +"Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Omit to search all types. A type filter excludes consolidated texts (CONS_TEXT) — set include_consolidated to fold them back in."
      • changedInput schema / properties / eurovoc_concept / description
        Previous value: -"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828). Obtain concept URIs from eurlex_browse_subjects first. Leave blank or omit for no subject filter."New value: +"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Omit for no subject filter."
      • changedInput schema / properties / include_consolidated / description
        Previous value: -"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that incorporate later amendments and carry their own resource-type, so a plain type filter omits them. No effect when document_type is omitted (all types already return). Either way, consolidated rows are tagged is_consolidated: true."New value: +"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that a plain type filter omits. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true."
      • changedOutput schema / properties / documents / items / properties / resource_type / description
        Previous value: -"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Works classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. Absent for some older works."New value: +"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Works with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older works."
  12. 1 tool update
    • Changedeurlex_get_relations8 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum related works to return per relation type and per direction (1–100). Defaults to 100. Incoming edges (e.g. works that cite this act) are ordered by document date descending, so the cap keeps the newest — page with offset for older ones. For the symmetric cites relation, outgoing and incoming each get this budget independently. When truncated is true, at least one direction filled its cap and more may exist.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Pagination offset applied per relation type and per direction — number of related works to skip. Defaults to 0. Page forward by adding limit each call; incoming edges are ordered newest-first, so higher offsets reach older works.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The per-direction cap applied to this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Pagination offset applied to this response (per relation type and direction).",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of relations returned in this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / total / description
        Previous value: -"Total number of direct CDM relations returned."New value: +"Number of relations returned in this page (not a corpus-wide count). A direction that filled its per-direction cap sets truncated — page with offset for the rest."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when at least one relation type/direction filled its per-direction cap and more related works may exist — page with offset.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "work_uri",
        -  "relations",
        -  "total"
        -]New value: +[
        +  "work_uri",
        +  "relations",
        +  "total",
        +  "offset"
        +]
  13. 1 tool update
    • Changedeurlex_get_cases5 fields changed
      • addedOutput schema / properties / cases / items / properties / case_reference
        Added value: +{
        +  "description": "Case reference parsed from the title (e.g. \"Case C-97/23 P.\"). Absent when the title carries no case-reference segment.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / cases / items / properties / display_title
        Added value: +{
        +  "description": "Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties (e.g. an Advocate General opinion). Parsed from title; absent when title is.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / cases / items / properties / parties
        Added value: +{
        +  "description": "Parties to the case, parsed from the title (e.g. \"WhatsApp Ireland Ltd v European Data Protection Board.\"). Absent when the title carries no parties segment (e.g. AG opinions, some older cases).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / cases / items / properties / subject_matter
        Added value: +{
        +  "description": "Subject-matter keyword summary parsed from the title — the legal topics and provisions at issue. Absent when the title carries no subject-matter segment.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / cases / items / properties / title / description
        Previous value: -"English expression title where available (e.g. \"Google Spain SL v AEPD\"). Absent for many older cases."New value: +"Raw English expression title as stored in CELLAR. For case law this is a \"#\"-delimited string (court+date, parties, subject-matter, case reference); the parsed segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."
  14. 4 tool updates
    • Changedeurlex_browse_subjects3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit that was applied to this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of concepts returned in this response.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the returned list was capped at the limit and more concepts may exist.",
        +  "type": "boolean"
        +}
    • Changedeurlex_get_cases3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit that was applied to this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of cases returned in this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the returned page was capped at the limit and more cases may exist.",
        +  "type": "boolean"
        +}
    • Changedeurlex_query_sparql1 field changed
      • changedInput schema / properties / timeout_hint / description
        Previous value: -"Optional client-side timeout for this request, in milliseconds (1000–55000). When omitted, the server-configured default (SPARQL_QUERY_TIMEOUT_MS, 55000) applies. Virtuoso hard limit is 60 seconds."New value: +"Optional client-side timeout for this request, in milliseconds (1000–55000). When omitted, the default timeout applies; the endpoint hard limit is 60 seconds."
    • Changedeurlex_search_documents7 fields changed
      • changedInput schema / properties / document_type / description
        Previous value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types."New value: +"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types. A type filter excludes consolidated texts (CONS_TEXT), which carry their own resource-type — set include_consolidated to fold them back in."
      • addedInput schema / properties / include_consolidated
        Added value: +{
        +  "default": false,
        +  "description": "When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that incorporate later amendments and carry their own resource-type, so a plain type filter omits them. No effect when document_type is omitted (all types already return). Either way, consolidated rows are tagged is_consolidated: true.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit that was applied to this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / documents / items / properties / is_consolidated
        Added value: +{
        +  "description": "True when this CELEX is a consolidated version — a point-in-time text (…-YYYYMMDD) that incorporates amendments — rather than a base or amending act.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / documents / items / required
        Previous value: -[
        -  "work_uri",
        -  "celex_number"
        -]New value: +[
        +  "work_uri",
        +  "celex_number",
        +  "is_consolidated"
        +]
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of documents returned in this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the returned page was capped at the limit and more documents may exist.",
        +  "type": "boolean"
        +}
  15. 1 tool update
    • Changedeurlex_get_document10 fields changed
      • changedInput schema / properties / celex_number / description
        Previous value: -"CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number or eli_uri."New value: +"CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri."
      • changedInput schema / properties / eli_uri / description
        Previous value: -"Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number or eli_uri."New value: +"Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri."
      • addedInput schema / properties / resolve
        Added value: +{
        +  "default": "as_requested",
        +  "description": "Which version to serve for a base act that has newer consolidated versions. \"as_requested\" (default) returns the exact CELEX requested — for a base act, the as-enacted text. \"current_consolidated\" transparently serves the newest consolidated version instead when one exists, reporting the served CELEX in celex_number and the originally requested CELEX in requested_celex; a no-op when no newer consolidated version exists. Regardless of this setting, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act.",
        +  "enum": [
        +    "as_requested",
        +    "current_consolidated"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / work_uri
        Added value: +{
        +  "description": "CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. Dereferenced to its CELEX, then fetched by the same flow. Provide exactly one of celex_number, eli_uri, or work_uri.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / author_institution / description
        Previous value: -"Human-readable name of the originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). Absent when not recorded."New value: +"Human-readable name of the primary (first) originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). For co-legislated acts adopted by more than one body, prefer author_institutions for the complete set. Absent when not recorded."
      • addedOutput schema / properties / author_institutions
        Added value: +{
        +  "description": "All originating EU institutions, for co-legislated acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"] for an ordinary-legislative-procedure act). Absent when none recorded.",
        +  "items": {
        +    "description": "Human-readable EU institution name.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / consolidated_as_of
        Added value: +{
        +  "description": "Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present only when is_superseded is true.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / current_consolidated_celex
        Added value: +{
        +  "description": "CELEX of the newest consolidated version of the requested base act (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve \"current_consolidated\". Present only when is_superseded is true.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / is_superseded
        Added value: +{
        +  "description": "True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself a consolidated version.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / requested_celex
        Added value: +{
        +  "description": "The originally requested CELEX, echoed when resolve \"current_consolidated\" served a different (consolidated) work. celex_number holds the CELEX actually served. Absent when the served work is the one requested.",
        +  "type": "string"
        +}
  16. 1 tool update
    • Changedeurlex_get_relations3 fields changed
      • changedInput schema / properties / relation_types / description
        Previous value: -"Subset of relation types to return. Omit to return all types: cites (citation graph), amends (what this work amends), amended_by (what amends this work), legal_basis (treaty/treaty article this act is based on), consolidated_version (consolidated versions of this act)."New value: +"Subset of relation types to return. Omit to return all types: cites (citation graph), amends (what this work amends), amended_by (what amends this work), repeals (what this work explicitly repeals), repealed_by (what explicitly repealed this work), implicitly_repeals (what this work implicitly repeals), implicitly_repealed_by (what implicitly repealed this work), legal_basis (treaty/treaty article this act is based on), consolidated_version (consolidated versions of this act)."
      • changedInput schema / properties / relation_types / items / enum
        Previous value: -[
        -  "cites",
        -  "amends",
        -  "amended_by",
        -  "legal_basis",
        -  "consolidated_version"
        -]New value: +[
        +  "cites",
        +  "amends",
        +  "amended_by",
        +  "repeals",
        +  "repealed_by",
        +  "implicitly_repeals",
        +  "implicitly_repealed_by",
        +  "legal_basis",
        +  "consolidated_version"
        +]
      • changedOutput schema / properties / relations / items / properties / relation_type / description
        Previous value: -"Type of relation: cites, amends, amended_by, legal_basis, consolidated_version."New value: +"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, consolidated_version."

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.