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 by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.8% over 55 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/eur-lex-mcp-server
GitHub Stars
8
Server Listing
@cyanheads/eur-lex-mcp-server

TDQS

A4.5/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a distinct role, and descriptions clearly separate case-law search from legislation search, and citation resolution from document retrieval. The main possible confusion is between eurlex_lookup_celex and eurlex_get_document, since both accept CELEX identifiers, though one resolves references and the other fetches content.

Naming Consistency4/5

All tool names share the eurlex_ prefix and follow a verb_noun pattern, which is predictable. Minor inconsistency exists because eurlex_get_cases is actually a search operation while eurlex_get_document is a direct fetch, making the 'get' verb slightly ambiguous across the set.

Tool Count5/5

Seven tools is well-scoped for a legal-information server. Each tool covers a meaningful access pattern—search, lookup, retrieval, relations, SPARQL, and subject browsing—without redundancy.

Completeness5/5

The tool surface covers the core EUR-Lex lifecycle: browse the EuroVoc taxonomy, search legislation and case law, resolve citations, fetch full documents, traverse relations, and run raw SPARQL as an escape hatch. No obvious dead ends or missing operations prevent an agent from completing a typical legal-research workflow.

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. Concepts with an exact label match come first, then those whose label or one of its words starts with the keyword, then other substring matches, each group ordered 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.
noticeNoGuidance for the next call: on an empty first page, the keyword and language that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.
offsetNoPagination offset used for this response.
conceptsNoMatching EuroVoc concepts, exact label matches first, then word-start matches, then other substring matches, each group ordered by preferred 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.6/5.0
Behavior5/5

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

Beyond the readOnlyHint/idempotentHint annotations, the description discloses meaningful behavior: it matches both preferred and alternative labels, explains how a synonym reaches the concept, and specifies the exact ranking order (exact matches first, then prefix-start matches, then substring matches). This gives an agent faithful expectations about result quality.

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?

Three sentences cover purpose, matching behavior, output content, and ordering without filler. It is slightly dense, and the return-field listing partially overlaps the output schema, but every sentence carries useful decision-relevant information and the core purpose is front-loaded.

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 read-only browse/lookup tool with annotations and an output schema, the description provides everything an agent needs: how to use the result, what matching behavior to expect, how results are ordered, and what each returned concept includes. No functionally important gap remains.

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?

The schema already documents all four parameters at 100% coverage, so the baseline is 3. The description adds extra semantic value by explaining how the keyword is matched (preferred/alternative labels, ordering) and that the requested language affects returned labels, going beyond mere 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 uses a specific verb ('Search') with a clear resource ('EuroVoc thesaurus') and states the concrete outcome: resolving a keyword into concept URIs. It also names the downstream use case (eurlex_search_documents' eurovoc_concept filter), which clearly distinguishes it from sibling tools like retrieval or search tools.

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 makes the intended usage context explicit: this is the tool to resolve a keyword into subject-filter URIs before calling eurlex_search_documents. It does not enumerate when not to use it, but the linkage to the sibling search tool provides clear situational guidance with no exclusions.

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. A case number reaches every judgment, order, and AG opinion filed under it. 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 CELEX number (whose sixth character names the court: C, T, or F), work URI, ECLI, date, and type, plus — parsed from the title where present — the formation, Advocate General, parties, referring court, subject matter, and case reference. The raw CELLAR title is returned only when those fields do not capture all of it.

ParametersJSON Schema
NameRequiredDescriptionDefault
courtNoCourt filter, by the court letter at position 6 of the CELEX: CJEU (C) = Court of Justice of the EU, GC (T) = General Court. It does not narrow by record type: every primary record the court filed matches, and its derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Omit to search every court.
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 matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX that opens with the sector and year (62013CJ), the year and type letters (2013CJ0131), or type letters followed by the number (CJ0131, J0131) matches every CELEX that holds it at that position; one opening with letters not followed by a digit (R(01)) tests every CELEX and can take tens of seconds; a bare year (2013) or a fragment opening mid-year or mid-number (013CJ0131, 0131) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected.
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_numberNoNumber of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form ("Case C-97/23 P."), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case ("C-131/12 and C-132/12") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice ("Opinion 2/13", "Ruling 1/78") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters is matched as a CELEX substring instead, case-insensitively: one opening with the sector and year (62014CJ0362), the year and both letters (2013CJ0131), or both letters and the number (CJ0131) is answered from the CELEX index; any other (12CJ0131, 0131) tests every CELEX and can take tens of seconds.
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, then by CELEX number ascending among records sharing a date, so pages are stable across calls.
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).
noticeNoGuidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.
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.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=true, so the description carries the full burden of behavioral disclosure. It does so extensively: default exclusion of derivatives, keyword matching semantics (phrase matching, CELEX substring patterns, performance warnings), case_number accepted forms and rejection of multi-case values, interaction of court filter with record types, and the return fields including the parsed title fields. It even notes when the raw CELLAR title is returned. No contradiction with annotations.

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 dense but appropriately so given the tool's complexity. It is front-loaded with purpose and then flows logically through default behavior, keyword, case_number, and derivative handling. However, it is a single long paragraph without visual breaks (e.g., bullet points), which could be slightly harder to scan. Still, every sentence earns its place; no fluff. A 4 reflects the slight lack of structuring while acknowledging the necessity of the detail.

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 all essential aspects for correct invocation: the full filter set, their interactions, edge cases (pre-1989 numbers, numbered opinions, multi-case rejection), performance warnings, and the exact return fields including how title parsing works. An output schema exists, so return-value details are partially covered, but the description adds the crucial behavioral context (e.g., when raw title is returned). Nothing an agent needs to decide when and how to call this tool 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?

Although schema coverage is 100%, the description adds substantial meaning beyond the schema. For keyword, it explains phrase matching, CELEX matching patterns, and the trade-offs of partial CELEX inputs. For case_number, it details accepted formats, rejects multi-case values, and clarifies the CELEX substring fallback. For include_derivative, it explains the default behavior and its interaction with case_type. This goes well beyond the schema's basic descriptions and significantly helps an agent choose correct parameter values.

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 precise statement of what the tool does — search CJEU/GC case law — and enumerates the specific filters (case number, court, case type, keyword, date range). It clearly distinguishes the record set (judgments, orders, AG opinions) and immediately notes the exclusion of derivative records, which differentiates it from sibling search tools. This is a specific verb+resource with explicit scope.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance: when to use case_number vs keyword, when to set include_derivative, that case_type overrides include_derivative, and that numbered opinions/rulings must be looked up by CELEX rather than case number. It also warns against multi-case input and explains performance implications for certain CELEX patterns. While it does not name sibling tool names, it gives actionable alternative approaches, which is sufficient.

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 or case-law record by CELEX number, ELI URI, or work URI. Returns structured metadata (title, date, type, author institution, Advocates General, legal basis, EuroVoc subjects, in-force status and, for an act not in force, its repealing acts, end of validity, or pending entry into force; for case law, the ECLI and the formation, referring court, subject matter, and case reference parsed from the title) plus the body as HTML, Markdown, or Formex4 XML, defaulting to English with automatic fallback. Every body returned in one call is capped at 100,000 characters — paged and full windows page onward with offset/limit; use outline: true for a heading map and select to pull specific articles, chapters, recitals, or annexes of an act, or the headed sections and operative part of a judgment or order, reading a selected section on its own from the offset and chars in selected_sections.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum characters to return in this window ("paged" mode only; select ignores it). 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; a number may carry an English kind word or one in the language served, e.g. "Article 5", "Artikel 5", "5. cikk"). For case law, select headed sections by position or the operative part. Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. A section that cannot be located — including a number that appears only in text an amending act inserts into another act — is reported in selection.missed with no wrong text returned. offset and limit do not apply: the joined sections are capped at 100000 characters with no continuation, and each section stays readable on its own from its offset and chars in selected_sections. 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 the preamble's recitals as a heading list, each with its character offset — instead of body text. The recitals appear as one entry spanning the run (e.g. "Recitals 1–173") at the first recital's offset unless include_recitals is true. Headings of text an amending act inserts into another act are not listed. For case law, the outline lists each top-level section heading ("Legal context", "Costs") and, for a judgment or order, the operative part (the ruling). 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. "as_requested" (default) returns the exact CELEX requested; "current_consolidated" serves the newest consolidated version in effect of the requested act — or, for a consolidated CELEX, of its base act — echoing the request in requested_celex, and is a no-op when none exists (with a notice when the act's only consolidated versions are dated in the future). Either way, is_superseded / current_consolidated_celex / consolidated_as_of describe the text served.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. A work carrying several CELEX numbers (a national implementing measure, one per directive it was notified against) is served under its lowest, with a notice giving the count; each names the same document, so pass celex_number to serve a specific one. 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
include_recitalsNoList every recital as its own outline entry, with its own offset, instead of one entry for the run. Applies only when outline is true; select reaches a single recital either way.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoMaximum body characters allowed in the window.
dateNoDocument date in ISO 8601 format (YYYY-MM-DD).
ecliNoEuropean Case Law Identifier of a case-law record (e.g. "ECLI:EU:C:2014:317"), as eurlex_lookup_celex reports it: the work's own, or the lowest another work holding the same CELEX records. Absent for legislation.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of body characters returned.
titleNoDocument title in the language the body is served in (see language), or in English when CELLAR records no title in that language. Case law is titled in English whatever the language, parsed from its English CELLAR title: the parties (e.g. "Google Spain SL and Google Inc. v Agencia Española de Protección de Datos (AEPD) and Mario Costeja González."), or the court/AG descriptor when the case names none, with the rest in formation, referring_court, subject_matter, and case_reference, when the parser places the title whole; otherwise the raw "#"-delimited English title, or the served language's raw title when there is no English one. Absent for some older works and judgments.
noticeNoHow to retrieve the remaining document content; when a work_uri carries several CELEX numbers, how many it carries and which one was served; and, when no consolidated version is in effect yet, that the consolidated text served does not apply yet, or that resolve "current_consolidated" served the base act.
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; under select it is the matched sections joined in document order, each source character once — a section inside another selected section (an article in a selected chapter) is carried inside the enclosing one. Every one 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 contiguous window. Continue in "paged" mode with offset = content_offset + content_chars_returned until false. Always false in "metadata_only" mode, and always false for outline and select responses, where that recipe cannot resume across disjoint slices — a cut selection is disclosed through the truncated enrichment instead.
in_forceNoWhether the act is currently in force — for a consolidated text, whether its base act is. When false, repealed_by, entry_into_force, and end_of_validity give the reason where CELLAR records one: an explicit repeal, an entry into force still ahead, or an end of validity — past for an expired act, possibly still ahead for one not yet in force. Some acts not in force carry none of them.
languageNoLanguage code of the returned content.
work_uriNoCELLAR work URI.
formationNoCase law: the formation that decided, from the title's leading segment, verbatim (e.g. "Grand Chamber"), or "President", "Vice-President", or "President of the Second Chamber" for an order issued by that office. Absent when the title names none.
selectionNoOutcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, a nested section's text once inside its enclosing section, capped at 100000 characters. When the cap cuts the join, a trailing matched section may be partly or wholly absent from content — read selected_sections for each one's own address.
truncatedNoTrue when the returned body window was capped.
legal_basisNoLegal basis acts for this work — for a consolidated text, its base act's. Absent when none are recorded.
repealed_byNoCELEX numbers of the acts that explicitly repeal this one, the relation eurlex_get_relations names repealed_by (implicit repeals are listed there as implicitly_repealed_by). Present only when in_force is false; for a consolidated text, its base act's.
celex_numberNoConfirmed CELEX number for the retrieved work.
content_modeNoContent mode applied to this response: "metadata_only", "paged", or "full".
is_supersededNoWhether a newer consolidated version (an unofficial reading aid merging later amendments) than the text served is in effect, so this text may lack those amendments. False when the text served is the newest consolidated version in effect, or a consolidated version dated after it that does not apply yet. Not a repeal/replacement signal — the base act remains the law and may still be in force (see in_force). Present whenever the act has a consolidated version in effect; absent otherwise.
resource_typeNoHuman-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works.
base_act_celexNoCELEX of the base act a consolidated text consolidates (e.g. 32024R1689), linked through CELLAR rather than derived from the consolidated CELEX. Its authors, in-force status, legal basis, and EuroVoc subjects are reported here in place of the consolidation's own. Absent for a base act, and for a consolidated text whose base act is unlinked or carries no CELEX.
case_referenceNoCase law: the case reference from the title (e.g. "Case C-131/12.").
content_formatNoFormat of the returned content: "html", "markdown", or "xml".
content_offsetNoCharacter offset where the returned contiguous window begins. Present in "paged" and "full" modes. Absent for outline and select responses, whose content is not a contiguous span — read selected_sections for each matched section's own offset.
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.
subject_matterNoCase law: the subject-matter keyword list from the title (e.g. "Personal data – Protection of individuals …").
end_of_validityNoDate (YYYY-MM-DD) the act's validity ends or ended: past for an expired act, and possibly in the future for one not yet in force (read it with entry_into_force), so on its own it does not mean the act expired. Present only when in_force is false and CELLAR records an actual date rather than its open-ended 9999-12-31; for a consolidated text, its base act's.
referring_courtNoCase law: the national court that referred a preliminary ruling, from the title (e.g. "Audiencia Nacional"). Absent on direct actions and appeals.
requested_celexNoThe originally requested CELEX, echoed when resolve "current_consolidated" served a different consolidated version. celex_number holds the CELEX actually served. Absent when the served work is the one requested.
entry_into_forceNoEarliest entry-into-force date (YYYY-MM-DD) of an act not yet in force. Present only when in_force is false and that date is after today (UTC); for a consolidated text, its base act's.
eurovoc_subjectsNoEuroVoc subject classifications — for a consolidated text, its base act's. Absent when none are recorded.
advocates_generalNoAdvocates General who delivered this case-law record, by surname as CELLAR records it (e.g. ["Jääskinen"]), sorted. A few Opinions of the Court list several. Absent for legislation and for case law with none 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.
selected_sectionsNoSource address of each distinct section the selection located, in document order. Present only when select was used. A section nested inside another selected section keeps its own entry, though its text appears in content only once, inside the enclosing section. A selection is a set of slices, not a contiguous window, so these addresses — not content_offset — are how a caller navigates one; every section stays individually reachable even when the cap cut its text.
author_institutionNoPrimary (first) author, by the English label of its CELLAR authority code: an EU institution or body (e.g. "European Parliament", "Court of Justice", "European Union"), a member state on a national implementing measure (e.g. "Netherlands"), an MEP by surname on a parliamentary question (e.g. "VAN MIERT"), "Provisional data" for a consolidated text with no linked base act, or for a national-court decision the deciding court (e.g. "Supremo Tribunal de Justiça"). A code with no English label shows the last segment of its code. Each label is accepted by the author_institution filter of eurlex_search_documents. For co-legislated acts, prefer author_institutions for the complete set. For a consolidated text, the base act's (see base_act_celex). Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General.
consolidated_as_ofNoConsolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present whenever is_superseded is.
requested_languageNoOriginally requested language code when English fallback changed the effective language reported in language.
structure_detectedNoWhether any structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure, or for case law no section heading or operative part — read it via offset/limit or content_mode "full".
author_institutionsNoAll authors, labelled as in author_institution and listed once each, for acts adopted by more than one body (e.g. ["European Parliament", "Council of the European Union"]) or signed by several states. Advocates General appear in advocates_general instead. For a consolidated text, the base act's. 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 act's newest consolidated version in effect (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve "current_consolidated". A consolidation dated in the future is never this version. Present whenever is_superseded is.
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.5/5.0
Behavior5/5

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

The annotations provide only readOnlyHint, openWorldHint, and idempotentHint. The description goes far beyond by disclosing pagination behavior (100,000-character cap, offset/limit paging), format switching (HTML, Markdown, XML), language fallback to English, the select mechanism with missed section reporting, outline offset format-sensitivity, and resolve behavior for consolidated versions. It also explains edge cases like amending-act inserted text and future consolidated versions. This is comprehensive behavioral disclosure that substantially exceeds 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.

Conciseness4/5

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

The description is front-loaded with the core purpose and then systematically covers metadata fields, body formats, pagination, select, outline, and resolve. Every sentence contains essential information, but the sheer length (a dense, single paragraph) makes it less concise than ideal. It could be broken into bullet points, but given the tool's complexity, the density is arguably appropriate. It earns a 4 rather than a 5 due to verbosity.

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 every aspect an agent needs: input identifier alternatives, output metadata composition (including case-law-specific fields like ECLI and referring court), body format options, pagination and continuation, selective section retrieval, outline generation with offsets and recital handling, version resolution, language fallback, and edge cases. With 12 parameters, a nested select object, and an output schema, the description leaves nothing ambiguous about how to use the tool correctly.

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?

While the schema already documents all 12 parameters (100% coverage), the description adds meaningful semantics beyond the schema. For instance, it explains the exact paging arithmetic (offset = content_offset + content_chars_returned), clarifies that offsets are format-specific, details select's interaction with outline (ignored when outline is true), notes that offset/limit do not apply in select mode, and explains the resolve no-op conditions. These are operational details not present in the schema, enhancing an agent's correct invocation.

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 clear verb and resource: 'Fetch the metadata and full text of an EU act or case-law record by CELEX number, ELI URI, or work URI.' This unambiguously identifies what the tool does and its input identifiers. It also distinguishes itself from sibling tools like eurlex_search_documents (search) and eurlex_browse_subjects (subject browsing) by being the direct document retrieval tool.

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

Usage Guidelines3/5

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

The description states the key usage constraint 'Provide exactly one of celex_number, eli_uri, or work_uri' and notes that work_uri is the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents, implicitly connecting them. However, it does not explicitly advise when to prefer this tool over alternatives (e.g., 'use eurlex_search_documents when you need to discover documents; use this when you have a specific identifier'). The guidance is mostly about internal parameter usage, not comparison with siblings.

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 the national_transposition act match, which stands 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).
noticeNoGuidance for the next call: on an empty first page, how to widen the traversal; on a page with more rows, the offset to continue from.
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 page — a first page with no edges, or an exhausted later 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.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is known. The description adds meaningful behavior beyond annotations: 'direct relations only,' pagination per relation type and direction, explicit vs implicit repeal handling, and the CELEX/URI requirement. There is no contradiction with 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 compact and front-loaded: the first sentence states the core purpose and enumerates the relation types, while the second clarifies scope, pagination, and required inputs. Every sentence earns its place with no filler or repetition.

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?

Given the rich input schema, detailed enum descriptions, high schema coverage, output schema, and annotations, the description is complete for an agent to invoke the tool correctly. It explains the relationship graph concept, identifies required inputs, and clarifies direct-only behavior, leaving no critical gap.

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 coverage is 100%, with detailed parameter descriptions for limit, offset, work_uri, celex_number, and relation_types, including enum values and the exactly-one constraint. The description adds a readable high-level overview of the graph contents but does not provide essential parameter semantics beyond what the schema already covers.

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 action ('Traverse') and a specific resource ('one-hop CDM relationship graph of an EU act'), and then enumerates exactly what relation types are returned: amendments, repeals, consolidations, transpositions, legal basis, and citations. It clearly distinguishes this tool from a simple document fetch or search by emphasizing direct graph 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 description gives clear context for use: it requires a CELEX number or CELLAR work URI, returns only direct one-hop relations, and paginates per relation type and direction. It does not explicitly name alternative sibling tools or say when not to use this tool, but the usage conditions are specific enough for an agent to infer when this is the right choice.

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, ELI URI, ECLI, or an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC") — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, date, and the ECLI of a case that carries one. A CELEX that CELLAR holds under several works resolves to the one the EUR-Lex content resolver serves. An ECLI shared by several records (a judgment and its abstract or extract, or a joined AG opinion) resolves to the primary record with the lowest CELEX.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesThe EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), an ECLI (e.g. ECLI:EU:C:2014:317), or an OJ citation that names its act type and year, resolved to the CELEX it names under identifier_type "auto": Regulation (EU) 2016/679, Regulation (EC) No 1049/2001, Directive 95/46/EC, Decision No 1313/2013/EU, Council Framework Decision 2002/584/JHA, Council Joint Action 2008/124/CFSP, Common Position 2003/444/CFSP. "No" before the numbers means number/year, otherwise year/number; a two-digit year is 19YY. A citation without its act type (95/46/EC) or year (Regulation No 17) is not parsed.
identifier_typeNoFormat of the identifier. "auto" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), or an OJ citation; "celex", "eli", or "ecli" forces that lookup. An OJ citation is recognized only under "auto".auto

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoDocument date in ISO 8601 format (YYYY-MM-DD).
ecliNoEuropean Case Law Identifier of the case (e.g. "ECLI:EU:C:2014:317"), as CELLAR stores it — the resolved work's own, or the one another work holding the same CELEX records. Present for case law that carries one; absent for legislation and judicial notices.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, or OJ citation matches no work in the corpus, with a notice naming what was tried. Only an identifier_type "auto" value that, after trimming, is neither an ECLI, an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year raises ambiguous_identifier instead.
noticeNoPresent only when found is false: the CELEX, ELI, or ECLI looked up, the accepted forms, and the search to use 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. "BUDGET"). Absent for some works.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is known. The description adds valuable behavioral detail beyond that: explains ambiguity resolution (multiple works, shared ECLI) and the deterministic rule for selecting the primary record. It does not describe failure modes or error handling, but the disclosed resolution rules are useful and not redundant with 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 compact, front-loaded with the core purpose, and efficiently covers input types, return values, and resolution rules in a few sentences. Every sentence contributes meaning without redundancy.

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?

Given the tool's complexity (multiple identifier formats, ambiguity resolution) and the presence of an output schema documenting return structure, the description fully covers input handling, resolution behavior, and return fields. It is complete for an agent to invoke correctly.

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%, with exhaustive detail on the identifier parameter including parsing rules for OJ citations and identifier_type descriptions. The tool description itself adds no additional parameter semantics beyond what the schema already provides. Baseline 3 is appropriate since the schema carries the full burden.

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's function: resolving EU legal citations to canonical CELLAR works. It specifies the verb 'Resolve', names the resource ('CELLAR work'), and enumerates the output fields. It distinguishes itself from siblings by its focus on resolution rather than search or retrieval, though it does not explicitly name an alternative.

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 implies when to use it — 'confirming it exists before you fetch or traverse it' — which points to use before retrieval tools like eurlex_get_document. It does not explicitly exclude other tools or state when not to use it, but the context is clear enough for an agent to infer the appropriate usage.

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 as a typed triple, ?work cdm:resource_legal_id_celex "32016R0679"^^xsd:string (an untyped literal matches nothing, in a triple or in FILTER(?celex = "…"), and a FILTER(STR(…)) comparison scans every 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).
noticeNoOn a zero-row result whose query has an untyped string literal as a triple object: how to type or language-tag it, since CELLAR stores identifiers as typed literals that an untyped one never matches.
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?

The description goes well beyond the readOnlyHint=true annotation by disclosing exactly what happens at execution: non-SELECT forms are rejected before execution, results are capped, and prefixes are auto-injected. This gives the agent concrete expectations about tool behavior and limitations without contradicting any annotation.

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 three dense sentences, all informative, with the core behavior front-loaded. The parameter description is long but every sentence earns its place by explaining real query-writing pitfalls. No filler or redundancy.

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 SPARQL tool with high complexity, the description plus schema fully covers what an agent needs: accepted query forms, prefix injection, result limits, important CDM predicates, literal typing pitfalls, and timeout behavior. The presence of an output schema means the description does not need to explain return values. Sibling differentiation is handled through the 'curated tools' framing.

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%, and the sparql_query parameter description adds substantial semantic value: it documents key CDM predicates, explains the CELEX typed-literal requirement with an example, warns about FILTER performance, and recommends bif:contains for text. This is far more useful than the raw schema would be on its own.

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 is specific: it names the verb (run), the resource (raw SPARQL SELECT against the CELLAR Virtuoso endpoint), and the purpose (escape hatch for CDM ontology traversals that curated tools do not cover). It clearly distinguishes itself from the sibling eurlex_* tools by describing itself as raw and not curated.

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 states when to use the tool: when curated tools do not cover CDM ontology traversals. It also sets hard usage constraints: only SELECT is accepted, update forms and ASK/CONSTRUCT/DESCRIBE are rejected, and results are capped at 100. It does not explicitly name alternative sibling tools, but the contrast with 'curated tools' is clear enough.

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. Corrigenda are excluded by default so primary acts fill the page (set include_corrigenda to include them). Returns a page of CELEX numbers, work URIs, type labels, dates, and titles, newest first, each flagged with is_consolidated and is_corrigendum. 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), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; an OJ C fragment of a year, a slash, and at least four characters of the number (2024/01469, C/2024/0146) matches every CELEX holding it; one with a shorter number (2017/111) or opening with letters not followed by a digit (R(01), ROU_2024) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected.
in_forceNoRestrict by in-force status: true returns only acts currently in force; false returns acts not in force — repealed, expired, or not yet in force (eurlex_get_document names which, where CELLAR records one). Either way the act must carry the in-force property, which a minority of works do. 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. Only EuroVoc concept URIs are accepted; https://eurovoc.europa.eu/… and an upper-case host are read as the http://eurovoc.europa.eu/… form CELLAR stores. Omit for no subject filter.
author_institutionNoAuthor name (e.g. "European Parliament", "Council", "European Commission"), matched as a phrase against the English labels of each work's authors — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included.
include_corrigendaNoInclude corrigenda — separate correction works, co-typed CORRIGENDUM alongside the base type of the act they correct, carrying a "…R(nn)" CELEX and usually no English title. Default false: they are excluded so primary acts fill the page. Every returned row is tagged is_corrigendum.
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).
noticeNoGuidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.
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, then by CELEX number ascending among documents sharing a date, so pages are stable across calls.
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.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint, but the description adds substantial behavioral context beyond them: newest-first ordering, per-row is_consolidated and is_corrigendum flags, default corrigenda exclusion, and nuanced CELEX matching behavior including potential slow searches. It also discloses data limitations, such as only a minority of works carrying the in-force property. No contradiction with 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 main description is front-loaded: purpose, core limitation, default behavior, return shape, and required condition all appear in a short, ordered block. The long keyword parameter description is verbose only because the behavior is genuinely complex and consequential. Every sentence earns its place, and there is 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 definition covers all 11 parameters, mandatory filter usage, default exclusions, return fields, ordering, and a reference to eurlex_get_document for in-force details. With an output schema present and read-only annotations, an agent has everything needed to select and invoke the tool correctly. The only minor omission, explicit naming of sibling tools for alternate lookup flows, does not make the tool incomplete.

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%, which sets a baseline of 3, but the description adds far more meaning than the schema alone. The keyword parameter gets deep semantics: phrase matching, whole-CELEX expansion to siblings and case-law records, partial CELEX matching rules, and performance warnings. Other parameters also gain context, including document_type variant coverage, include_consolidated behavior contingent on document_type, author phrase matching, and EuroVoc URL normalization.

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?

States a specific verb and resource: search EU legislation, treaties, and preparatory acts across the CELLAR corpus, and enumerates the filters available. It also immediately clarifies the key limitation that keyword matches only English titles and CELEX strings, not full-text bodies, which disambiguates it from other search-like tools. The return payload is specified, making the tool's purpose unmistakable.

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 gives explicit operational guidance: at least one filter is required, there is no full-text body search, corrigenda are excluded by default, and consolidated texts require an explicit flag. This tells an agent when the tool is not appropriate and what conditions apply. It does not explicitly name sibling tools like eurlex_lookup_celex or eurlex_get_cases as alternatives, so it falls just short of a 5.

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. 1 tool update
    • Changedeurlex_search_documents2 fields changed
      • changedInput schema / properties / eurovoc_concept / description
        Previous 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."New value: +"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Only EuroVoc concept URIs are accepted; https://eurovoc.europa.eu/… and an upper-case host are read as the http://eurovoc.europa.eu/… form CELLAR stores. Omit for no subject filter."
      • changedOutput schema / properties / query_echo / properties / eurovoc_concept / description
        Previous value: -"EuroVoc concept URI filter applied."New value: +"EuroVoc concept URI filter applied, in the http://eurovoc.europa.eu/ form it was matched as."
  2. 4 tool updates
    • Changedeurlex_get_cases5 fields changed
      • addedOutput schema / properties / cases / items / properties / advocate_general
        Added value: +{
        +  "description": "Advocate General who delivered the opinion, from an AG opinion title (e.g. \"Jääskinen\"). Absent on judgments and orders.",
        +  "type": "string"
        +}
      • 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. 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 the English title; absent when the record has none or its title carries no \"#\" segments."
      • addedOutput schema / properties / cases / items / properties / formation
        Added value: +{
        +  "description": "Formation that decided, from the title's leading segment, verbatim (e.g. \"Grand Chamber\", \"Full Court\", \"Fourth Chamber, Extended Composition\"), or \"President\", \"Vice-President\", or \"President of the Second Chamber\" for an order issued by that office. Absent when the title names none, as older \"Judgment of the Court of …\" titles do.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / cases / items / properties / referring_court
        Added value: +{
        +  "description": "National court that referred a preliminary ruling, from the title's referral segment (e.g. \"Audiencia Nacional\", or \"Tariefcommissie - Netherlands\" in older titles). Absent on direct actions and appeals.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / cases / items / properties / title / description
        Previous 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."New value: +"Raw English expression title as stored in CELLAR, a \"#\"-delimited string (court, formation and date; parties; referral; subject matter; case reference). Present only when the parsed fields do not capture all of it: a segment the parser could not place, a judgment or order published by extracts (\"(Extracts)\"), a leading date that differs from date, or a title with no \"#\". Absent when the parse is complete, and for records with no English title."
    • Changedeurlex_get_document20 fields changed
      • changedInput schema / properties / outline / description
        Previous value: -"Return a structural outline of the act — chapters, sections, articles, annexes, and the preamble's recitals as a heading list, each with its character offset — instead of body text. The recitals appear as one entry spanning the run (e.g. \"Recitals 1–173\") at the first recital's offset unless include_recitals is true. Headings of text an amending act inserts into another act are not listed. 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\"."New value: +"Return a structural outline of the act — chapters, sections, articles, annexes, and the preamble's recitals as a heading list, each with its character offset — instead of body text. The recitals appear as one entry spanning the run (e.g. \"Recitals 1–173\") at the first recital's offset unless include_recitals is true. Headings of text an amending act inserts into another act are not listed. For case law, the outline lists each top-level section heading (\"Legal context\", \"Costs\") and, for a judgment or order, the operative part (the ruling). 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 number may carry an English kind word or one in the language served, e.g. \"Article 5\", \"Artikel 5\", \"5. cikk\"). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. A section that cannot be located — including a number that appears only in text an amending act inserts into another act — is reported in selection.missed with no wrong text returned. offset and limit do not apply: the joined sections are capped at 100000 characters with no continuation, and each section stays readable on its own from its offset and chars in selected_sections. 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 number may carry an English kind word or one in the language served, e.g. \"Article 5\", \"Artikel 5\", \"5. cikk\"). For case law, select headed sections by position or the operative part. Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. A section that cannot be located — including a number that appears only in text an amending act inserts into another act — is reported in selection.missed with no wrong text returned. offset and limit do not apply: the joined sections are capped at 100000 characters with no continuation, and each section stays readable on its own from its offset and chars in selected_sections. Ignored when outline is true or in content_mode \"metadata_only\"."
      • addedInput schema / properties / select / properties / headings
        Added value: +{
        +  "description": "Case law: comma-separated positions of section headings, as numbered in the outline, e.g. \"2\" or \"1,4\". A section runs to the next heading or the operative part.",
        +  "type": "string"
        +}
      • addedInput schema / properties / select / properties / operative_part
        Added value: +{
        +  "description": "Case law: true to return a judgment's or order's operative part (the ruling) to the end of the body: from its opening words (\"On those grounds, …\") in a modern body, from the \"Operative part\" section in a legacy one.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / author_institution / description
        Previous value: -"Human-readable name of the primary (first) originating institution — an EU institution (e.g. \"European Parliament\", \"Court of Justice\"), or for a national-court decision the deciding court (e.g. \"Supremo Tribunal de Justiça\"). For co-legislated acts, prefer author_institutions for the complete set. For a consolidated text, the base act's (see base_act_celex). Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General."New value: +"Primary (first) author, by the English label of its CELLAR authority code: an EU institution or body (e.g. \"European Parliament\", \"Court of Justice\", \"European Union\"), a member state on a national implementing measure (e.g. \"Netherlands\"), an MEP by surname on a parliamentary question (e.g. \"VAN MIERT\"), \"Provisional data\" for a consolidated text with no linked base act, or for a national-court decision the deciding court (e.g. \"Supremo Tribunal de Justiça\"). A code with no English label shows the last segment of its code. Each label is accepted by the author_institution filter of eurlex_search_documents. For co-legislated acts, prefer author_institutions for the complete set. For a consolidated text, the base act's (see base_act_celex). Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General."
      • changedOutput schema / properties / author_institutions / description
        Previous value: -"All originating institutions, for acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"]). Institutions only: an Advocate General appears in advocates_general. For a consolidated text, the base act's. Absent when none recorded."New value: +"All authors, labelled as in author_institution and listed once each, for acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the European Union\"]) or signed by several states. Advocates General appear in advocates_general instead. For a consolidated text, the base act's. Absent when none recorded."
      • changedOutput schema / properties / author_institutions / items / description
        Previous value: -"Human-readable institution name."New value: +"Author label, as in author_institution."
      • addedOutput schema / properties / case_reference
        Added value: +{
        +  "description": "Case law: the case reference from the title (e.g. \"Case C-131/12.\").",
        +  "type": "string"
        +}
      • addedOutput schema / properties / ecli
        Added value: +{
        +  "description": "European Case Law Identifier of a case-law record (e.g. \"ECLI:EU:C:2014:317\"), as eurlex_lookup_celex reports it: the work's own, or the lowest another work holding the same CELEX records. Absent for legislation.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / formation
        Added value: +{
        +  "description": "Case law: the formation that decided, from the title's leading segment, verbatim (e.g. \"Grand Chamber\"), or \"President\", \"Vice-President\", or \"President of the Second Chamber\" for an order issued by that office. Absent when the title names none.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / outline / items / properties / kind / description
        Previous value: -"Structural unit kind: \"chapter\", \"section\", \"article\", \"annex\", or \"recital\"."New value: +"Structural unit kind: \"chapter\", \"section\", \"article\", \"annex\", or \"recital\" in an act; \"heading\" or \"operative_part\" in case law."
      • changedOutput schema / properties / outline / items / properties / label / description
        Previous value: -"Human label in English whatever the language and format, e.g. \"Article 17\", \"CHAPTER IV\", \"Recitals 1–173\" — the form selection.matched reports; only an xml article with no number to read keeps its own heading text."New value: +"Human label in English whatever the language and format, e.g. \"Article 17\", \"CHAPTER IV\", \"Recitals 1–173\" — the form selection.matched reports; only an xml article with no number to read keeps its own heading text. A case-law heading keeps its text as served (e.g. \"Legal context\", \"Sur les dépens\"); the operative part is \"Operative part\"."
      • changedOutput schema / properties / outline / items / properties / number / description
        Previous value: -"Numbering token, the same in every language (e.g. \"17\", \"6A\", \"IV\" — Roman numerals in Latin letters, French \"premier\" as \"1\"); empty for a lone unnumbered annex. A recital entry covering a run reads as a range, first–last (e.g. \"1–173\"), unless include_recitals is true."New value: +"Numbering token, the same in every language (e.g. \"17\", \"6A\", \"IV\" — Roman numerals in Latin letters, French \"premier\" as \"1\"); empty for a lone unnumbered annex. A recital entry covering a run reads as a range, first–last (e.g. \"1–173\"), unless include_recitals is true. A case-law heading is numbered by its 1-based position, the number select.headings takes; empty for the operative part."
      • addedOutput schema / properties / referring_court
        Added value: +{
        +  "description": "Case law: the national court that referred a preliminary ruling, from the title (e.g. \"Audiencia Nacional\"). Absent on direct actions and appeals.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / selected_sections / items / properties / label / description
        Previous value: -"Section label in English whatever the language and format, e.g. \"Article 17\"."New value: +"Section label as in the outline, e.g. \"Article 17\", or a case-law heading's served text."
      • changedOutput schema / properties / selection / properties / matched / description
        Previous value: -"Labels of the sections located in the body, in document order — in English whatever the language and format, as in the outline."New value: +"Labels of the sections located in the body, in document order, as in the outline — in English whatever the language and format, except a case-law heading, which keeps its text as served."
      • changedOutput schema / properties / selection / properties / requested / description
        Previous value: -"Section descriptors requested, in English whatever the language, e.g. [\"Article 17\", \"CHAPTER IV\"]."New value: +"Section descriptors requested, in English whatever the language, e.g. [\"Article 17\", \"CHAPTER IV\"], or [\"Heading 2\", \"Operative part\"] for case law."
      • 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 no detectable chapter/article/annex structure — read it via offset/limit or content_mode \"full\"."New value: +"Whether any structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure, or for case law no section heading or operative part — read it via offset/limit or content_mode \"full\"."
      • addedOutput schema / properties / subject_matter
        Added value: +{
        +  "description": "Case law: the subject-matter keyword list from the title (e.g. \"Personal data – Protection of individuals …\").",
        +  "type": "string"
        +}
      • changedOutput schema / properties / title / description
        Previous value: -"Document title in the requested language (absent for some older works and judgments)."New value: +"Document title in the language the body is served in (see language), or in English when CELLAR records no title in that language. Case law is titled in English whatever the language, parsed from its English CELLAR title: the parties (e.g. \"Google Spain SL and Google Inc. v Agencia Española de Protección de Datos (AEPD) and Mario Costeja González.\"), or the court/AG descriptor when the case names none, with the rest in formation, referring_court, subject_matter, and case_reference, when the parser places the title whole; otherwise the raw \"#\"-delimited English title, or the served language's raw title when there is no English one. Absent for some older works and judgments."
    • Changedeurlex_get_relations2 fields changed
      • addedOutput schema / properties / relations / items / properties / related_date
        Added value: +{
        +  "description": "Document date of the related work (YYYY-MM-DD), the date rows are ordered by within each relation type and direction. Absent when CELLAR records none; such rows sort last.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / relations / items / properties / related_title
        Added value: +{
        +  "description": "The related work's English title, whole. Absent when the work has no English title — most national_transposition measures are titled only in their member state's language — with no other language substituted.",
        +  "type": "string"
        +}
    • Changedeurlex_search_documents2 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."New value: +"Author name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched as a phrase against the English labels of each work's authors — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included."
      • changedInput schema / properties / keyword / description
        Previous value: -"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; one opening with letters not followed by a digit (R(01), ROU_2024) or with a year and a slash (2024/01469) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; an OJ C fragment of a year, a slash, and at least four characters of the number (2024/01469, C/2024/0146) matches every CELEX holding it; one with a shorter number (2017/111) or opening with letters not followed by a digit (R(01), ROU_2024) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
  3. 5 tool updates
    • Changedeurlex_browse_subjects2 fields changed
      • changedOutput schema / properties / concepts / description
        Previous value: -"Matching EuroVoc concepts ordered alphabetically by label."New value: +"Matching EuroVoc concepts, exact label matches first, then word-start matches, then other substring matches, each group ordered by preferred label."
      • changedOutput schema / properties / concepts / items / properties / matched_label / description
        Previous value: -"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."New value: +"Alternative (non-preferred) EuroVoc label that matched the keyword, when one did — the closest match (exact, then word start, then substring), alphabetical among equals. Absent when the keyword matched the preferred label alone."
    • Changedeurlex_get_cases2 fields changed
      • changedInput schema / properties / case_number / description
        Previous value: -"Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form (\"Case C-97/23 P.\"), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case (\"C-131/12 and C-132/12\") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice (\"Opinion 2/13\", \"Ruling 1/78\") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters (e.g. 2023CJ0097) is matched as a CELEX substring instead."New value: +"Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form (\"Case C-97/23 P.\"), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case (\"C-131/12 and C-132/12\") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice (\"Opinion 2/13\", \"Ruling 1/78\") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters is matched as a CELEX substring instead, case-insensitively: one opening with the sector and year (62014CJ0362), the year and both letters (2013CJ0131), or both letters and the number (CJ0131) is answered from the CELEX index; any other (12CJ0131, 0131) tests every CELEX and can take tens of seconds."
      • changedInput schema / properties / keyword / description
        Previous value: -"Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX (e.g. 2013CJ0131) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."New value: +"Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX that opens with the sector and year (62013CJ), the year and type letters (2013CJ0131), or type letters followed by the number (CJ0131, J0131) matches every CELEX that holds it at that position; one opening with letters not followed by a digit (R(01)) tests every CELEX and can take tens of seconds; a bare year (2013) or a fragment opening mid-year or mid-number (013CJ0131, 0131) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
    • Changedeurlex_lookup_celex5 fields changed
      • changedInput schema / properties / identifier / description
        Previous value: -"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), or an ECLI (e.g. ECLI:EU:C:2014:317)."New value: +"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), an ECLI (e.g. ECLI:EU:C:2014:317), or an OJ citation that names its act type and year, resolved to the CELEX it names under identifier_type \"auto\": Regulation (EU) 2016/679, Regulation (EC) No 1049/2001, Directive 95/46/EC, Decision No 1313/2013/EU, Council Framework Decision 2002/584/JHA, Council Joint Action 2008/124/CFSP, Common Position 2003/444/CFSP. \"No\" before the numbers means number/year, otherwise year/number; a two-digit year is 19YY. A citation without its act type (95/46/EC) or year (Regulation No 17) is not parsed."
      • changedInput schema / properties / identifier_type / description
        Previous value: -"Format of the identifier. \"auto\" detects it automatically (an ECLI by its ECLI: prefix, in any letter case); supply \"celex\", \"eli\", or \"ecli\" explicitly if detection fails."New value: +"Format of the identifier. \"auto\" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), or an OJ citation; \"celex\", \"eli\", or \"ecli\" forces that lookup. An OJ citation is recognized only under \"auto\"."
      • 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, after trimming, is neither an ECLI (ECLI: prefix), an ELI URI, nor CELEX-shaped (uppercase), so no lookup branch applies. 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 ECLI (ECLI: prefix), an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year (e.g. \"Regulation No 17\" names no year), 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, or ECLI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI URI, nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, or OJ citation matches no work in the corpus, with a notice naming what was tried. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year raises ambiguous_identifier instead."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present only when found is false: the CELEX, ELI, or ECLI looked up, the accepted forms, and the search to use instead.",
        +  "type": "string"
        +}
    • Changedeurlex_query_sparql4 fields changed
      • changedInput schema / properties / sparql_query / description
        Previous 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 as a typed triple, ?work cdm:resource_legal_id_celex \"32016R0679\"^^xsd:string (an untyped literal matches nothing, and a FILTER(STR(…)) comparison scans every CELEX). For text, use bif:contains with a single-quoted phrase."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 as a typed triple, ?work cdm:resource_legal_id_celex \"32016R0679\"^^xsd:string (an untyped literal matches nothing, in a triple or in FILTER(?celex = \"…\"), and a FILTER(STR(…)) comparison scans every CELEX). For text, use bif:contains with a single-quoted phrase."
      • 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`: 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."New value: +"Machine-readable failure mode. Declared by this tool: `not_read_only`: The query is a SPARQL Update operation (INSERT, DELETE, WITH, LOAD, CLEAR, CREATE, DROP, COPY, MOVE, or ADD). `unsupported_query_form`: The query is not a SELECT: an ASK, CONSTRUCT, or DESCRIBE form, an unrecognized keyword, or no query keyword after the prologue. `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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_read_only",
        -  "sparql_error",
        -  "sparql_timeout"
        -]New value: +[
        +  "not_read_only",
        +  "unsupported_query_form",
        +  "sparql_error",
        +  "sparql_timeout"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "On a zero-row result whose query has an untyped string literal as a triple object: how to type or language-tag it, since CELLAR stores identifiers as typed literals that an untyped one never matches.",
        +  "type": "string"
        +}
    • Changedeurlex_search_documents1 field changed
      • changedInput schema / properties / keyword / description
        Previous value: -"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set; a partial CELEX (e.g. 2016R0679) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; one opening with letters not followed by a digit (R(01), ROU_2024) or with a year and a slash (2024/01469) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
  4. 1 tool update
    • Changedeurlex_get_document9 fields changed
      • addedInput schema / properties / include_recitals
        Added value: +{
        +  "default": false,
        +  "description": "List every recital as its own outline entry, with its own offset, instead of one entry for the run. Applies only when outline is true; select reaches a single recital either way.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / limit / description
        Previous 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."New value: +"Maximum characters to return in this window (\"paged\" mode only; select ignores it). Default 25000, max 100000. Follow has_more and the returned offsets until false to reconstruct the complete body."
      • 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, 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\"."New value: +"Return a structural outline of the act — chapters, sections, articles, annexes, and the preamble's recitals as a heading list, each with its character offset — instead of body text. The recitals appear as one entry spanning the run (e.g. \"Recitals 1–173\") at the first recital's offset unless include_recitals is true. Headings of text an amending act inserts into another act are not listed. 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). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. 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; a number may carry an English kind word or one in the language served, e.g. \"Article 5\", \"Artikel 5\", \"5. cikk\"). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. A section that cannot be located — including a number that appears only in text an amending act inserts into another act — is reported in selection.missed with no wrong text returned. offset and limit do not apply: the joined sections are capped at 100000 characters with no continuation, and each section stays readable on its own from its offset and chars in selected_sections. Ignored when outline is true or in content_mode \"metadata_only\"."
      • changedOutput schema / properties / outline / items / properties / label / description
        Previous value: -"Human label, e.g. \"Article 17\", \"CHAPTER IV\"."New value: +"Human label in English whatever the language and format, e.g. \"Article 17\", \"CHAPTER IV\", \"Recitals 1–173\" — the form selection.matched reports; only an xml article with no number to read keeps its own heading text."
      • changedOutput schema / properties / outline / items / properties / number / description
        Previous value: -"Numbering token as rendered (e.g. \"17\", \"IV\"); empty for a lone unnumbered annex."New value: +"Numbering token, the same in every language (e.g. \"17\", \"6A\", \"IV\" — Roman numerals in Latin letters, French \"premier\" as \"1\"); empty for a lone unnumbered annex. A recital entry covering a run reads as a range, first–last (e.g. \"1–173\"), unless include_recitals is true."
      • changedOutput schema / properties / selected_sections / items / properties / label / description
        Previous value: -"Section descriptor, e.g. \"Article 17\"."New value: +"Section label in English whatever the language and format, e.g. \"Article 17\"."
      • changedOutput schema / properties / selection / properties / matched / description
        Previous value: -"Section descriptors located in the body, in document order."New value: +"Labels of the sections located in the body, in document order — in English whatever the language and format, as in the outline."
      • changedOutput schema / properties / selection / properties / requested / description
        Previous value: -"Section descriptors requested, e.g. [\"Article 17\", \"CHAPTER IV\"]."New value: +"Section descriptors requested, in English whatever the language, e.g. [\"Article 17\", \"CHAPTER IV\"]."
  5. 3 tool updates
    • Changedeurlex_get_document16 fields changed
      • changedInput schema / properties / resolve / description
        Previous 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."New value: +"Which version to serve. \"as_requested\" (default) returns the exact CELEX requested; \"current_consolidated\" serves the newest consolidated version in effect of the requested act — or, for a consolidated CELEX, of its base act — echoing the request in requested_celex, and is a no-op when none exists (with a notice when the act's only consolidated versions are dated in the future). Either way, is_superseded / current_consolidated_celex / consolidated_as_of describe the text served."
      • 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. 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. A work carrying several CELEX numbers (a national implementing measure, one per directive it was notified against) is served under its lowest, with a notice giving the count; each names the same document, so pass celex_number to serve a specific one. 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 institution — an EU institution (e.g. \"European Parliament\", \"Court of Justice\"), or for a national-court decision the deciding court (e.g. \"Supremo Tribunal de Justiça\"). For co-legislated acts, prefer author_institutions for the complete set. Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General."New value: +"Human-readable name of the primary (first) originating institution — an EU institution (e.g. \"European Parliament\", \"Court of Justice\"), or for a national-court decision the deciding court (e.g. \"Supremo Tribunal de Justiça\"). For co-legislated acts, prefer author_institutions for the complete set. For a consolidated text, the base act's (see base_act_celex). Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General."
      • changedOutput schema / properties / author_institutions / description
        Previous value: -"All originating institutions, for acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"]). Institutions only: an Advocate General appears in advocates_general. Absent when none recorded."New value: +"All originating institutions, for acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"]). Institutions only: an Advocate General appears in advocates_general. For a consolidated text, the base act's. Absent when none recorded."
      • addedOutput schema / properties / base_act_celex
        Added value: +{
        +  "description": "CELEX of the base act a consolidated text consolidates (e.g. 32024R1689), linked through CELLAR rather than derived from the consolidated CELEX. Its authors, in-force status, legal basis, and EuroVoc subjects are reported here in place of the consolidation's own. Absent for a base act, and for a consolidated text whose base act is unlinked or carries no CELEX.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / consolidated_as_of / description
        Previous value: -"Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present only when is_superseded is true."New value: +"Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present whenever is_superseded is."
      • changedOutput schema / properties / current_consolidated_celex / description
        Previous value: -"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."New value: +"CELEX of the act's newest consolidated version in effect (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve \"current_consolidated\". A consolidation dated in the future is never this version. Present whenever is_superseded is."
      • addedOutput schema / properties / end_of_validity
        Added value: +{
        +  "description": "Date (YYYY-MM-DD) the act's validity ends or ended: past for an expired act, and possibly in the future for one not yet in force (read it with entry_into_force), so on its own it does not mean the act expired. Present only when in_force is false and CELLAR records an actual date rather than its open-ended 9999-12-31; for a consolidated text, its base act's.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / entry_into_force
        Added value: +{
        +  "description": "Earliest entry-into-force date (YYYY-MM-DD) of an act not yet in force. Present only when in_force is false and that date is after today (UTC); for a consolidated text, its base act's.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / eurovoc_subjects / description
        Previous value: -"EuroVoc subject classifications. Absent when none are recorded."New value: +"EuroVoc subject classifications — for a consolidated text, its base act's. Absent when none are recorded."
      • changedOutput schema / properties / in_force / description
        Previous value: -"Whether the act is currently in force."New value: +"Whether the act is currently in force — for a consolidated text, whether its base act is. When false, repealed_by, entry_into_force, and end_of_validity give the reason where CELLAR records one: an explicit repeal, an entry into force still ahead, or an end of validity — past for an expired act, possibly still ahead for one not yet in force. Some acts not in force carry none of them."
      • changedOutput schema / properties / is_superseded / description
        Previous 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."New value: +"Whether a newer consolidated version (an unofficial reading aid merging later amendments) than the text served is in effect, so this text may lack those amendments. False when the text served is the newest consolidated version in effect, or a consolidated version dated after it that does not apply yet. Not a repeal/replacement signal — the base act remains the law and may still be in force (see in_force). Present whenever the act has a consolidated version in effect; absent otherwise."
      • changedOutput schema / properties / legal_basis / description
        Previous value: -"Legal basis acts for this work. Absent when none are recorded."New value: +"Legal basis acts for this work — for a consolidated text, its base act's. Absent when none are recorded."
      • changedOutput schema / properties / notice / description
        Previous value: -"How to retrieve the remaining document content."New value: +"How to retrieve the remaining document content; when a work_uri carries several CELEX numbers, how many it carries and which one was served; and, when no consolidated version is in effect yet, that the consolidated text served does not apply yet, or that resolve \"current_consolidated\" served the base act."
      • addedOutput schema / properties / repealed_by
        Added value: +{
        +  "description": "CELEX numbers of the acts that explicitly repeal this one, the relation eurlex_get_relations names repealed_by (implicit repeals are listed there as implicitly_repealed_by). Present only when in_force is false; for a consolidated text, its base act's.",
        +  "items": {
        +    "description": "CELEX number of a repealing act.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / requested_celex / description
        Previous value: -"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."New value: +"The originally requested CELEX, echoed when resolve \"current_consolidated\" served a different consolidated version. celex_number holds the CELEX actually served. Absent when the served work is the one requested."
    • Changedeurlex_get_relations1 field changed
      • 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 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."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 the national_transposition act match, which stands 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."
    • Changedeurlex_search_documents2 fields changed
      • changedInput schema / properties / in_force / description
        Previous value: -"Restrict by in-force status: true returns only acts currently in force, false only acts no longer in force. Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status."New value: +"Restrict by in-force status: true returns only acts currently in force; false returns acts not in force — repealed, expired, or not yet in force (eurlex_get_document names which, where CELLAR records one). Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status."
      • changedOutput schema / properties / documents / items / properties / is_consolidated / description
        Previous value: -"True when this CELEX is a consolidated version — a point-in-time text (…-YYYYMMDD) that incorporates amendments — rather than a base or amending act."New value: +"True when this CELEX is a consolidated version (sector 0, e.g. 02016R0679-20160504) — a point-in-time text that incorporates amendments — rather than a base or amending act."
  6. 4 tool updates
    • Changedeurlex_browse_subjects3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."New value: +"Machine-readable failure mode."
      • removedOutput schema / properties / error / properties / data / properties / reason / examples
        Removed value: -[
        -  "no_concepts"
        -]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance for the next call: on an empty first page, the keyword and language that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.",
        +  "type": "string"
        +}
    • Changedeurlex_get_cases4 fields changed
      • changedInput schema / properties / keyword / description
        Previous value: -"Keyword to match against case titles and CELEX strings."New value: +"Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX (e.g. 2013CJ0131) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `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."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. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `invalid_keyword`: keyword holds no letters or digits, so no case title and no CELEX can match it. `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: -[
        -  "invalid_date_range",
        -  "invalid_case_number",
        -  "no_results",
        -  "sparql_error"
        -]New value: +[
        +  "invalid_date_range",
        +  "invalid_case_number",
        +  "invalid_keyword",
        +  "sparql_error"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.",
        +  "type": "string"
        +}
    • Changedeurlex_get_relations4 fields changed
      • 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. An empty first page throws no_relations; an exhausted non-zero page returns all requested types here."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 page — a first page with no edges, or an exhausted later 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`: 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."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. 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",
        -  "no_relations"
        -]New value: +[
        +  "invalid_identifier_args",
        +  "not_found"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance for the next call: on an empty first page, how to widen the traversal; on a page with more rows, the offset to continue from.",
        +  "type": "string"
        +}
    • Changedeurlex_search_documents4 fields changed
      • changedInput schema / properties / keyword / description
        Previous value: -"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), or against CELEX substrings."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set; a partial CELEX (e.g. 2016R0679) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
      • 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. `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."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. `invalid_author_institution`: author_institution holds no letters or digits, so it can name no institution. `invalid_keyword`: keyword holds no letters or digits, so no title and no CELEX can match it. `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",
        -  "invalid_date_range",
        -  "no_results",
        -  "sparql_error"
        -]New value: +[
        +  "no_filters",
        +  "invalid_date_range",
        +  "invalid_author_institution",
        +  "invalid_keyword",
        +  "sparql_error"
        +]
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.",
        +  "type": "string"
        +}
  7. 4 tool updates
    • Changedeurlex_get_cases1 field changed
      • changedOutput schema / properties / cases / description
        Previous value: -"Matching case law records ordered by date descending."New value: +"Matching case law records ordered by date descending, then by CELEX number ascending among records sharing a date, so pages are stable across calls."
    • Changedeurlex_get_document4 fields changed
      • addedOutput schema / properties / advocates_general
        Added value: +{
        +  "description": "Advocates General who delivered this case-law record, by surname as CELLAR records it (e.g. [\"Jääskinen\"]), sorted. A few Opinions of the Court list several. Absent for legislation and for case law with none recorded.",
        +  "items": {
        +    "description": "Advocate General surname, as CELLAR records it.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • 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, prefer author_institutions for the complete set. Absent when not recorded."New value: +"Human-readable name of the primary (first) originating institution — an EU institution (e.g. \"European Parliament\", \"Court of Justice\"), or for a national-court decision the deciding court (e.g. \"Supremo Tribunal de Justiça\"). For co-legislated acts, prefer author_institutions for the complete set. Absent when not recorded, and for an AG opinion whose only recorded author is the Advocate General."
      • 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\"]). Absent when none recorded."New value: +"All originating institutions, for acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"]). Institutions only: an Advocate General appears in advocates_general. Absent when none recorded."
      • changedOutput schema / properties / author_institutions / items / description
        Previous value: -"Human-readable EU institution name."New value: +"Human-readable institution name."
    • Changedeurlex_lookup_celex1 field changed
      • changedOutput schema / properties / ecli / description
        Previous value: -"European Case Law Identifier of the resolved work (e.g. \"ECLI:EU:C:2014:317\"), as CELLAR stores it. Present for case law that carries one; absent for legislation and judicial notices."New value: +"European Case Law Identifier of the case (e.g. \"ECLI:EU:C:2014:317\"), as CELLAR stores it — the resolved work's own, or the one another work holding the same CELEX records. Present for case law that carries one; absent for legislation and judicial notices."
    • Changedeurlex_search_documents1 field changed
      • changedOutput schema / properties / documents / description
        Previous value: -"Matching EU documents ordered by date descending."New value: +"Matching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls."
  8. 5 tool updates
    • Changedeurlex_get_cases7 fields changed
      • changedInput schema / properties / case_number / description
        Previous value: -"Case number in standard format: C-{num}/{year} for CJEU or T-{num}/{year} for General Court (e.g. C-131/12)."New value: +"Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form (\"Case C-97/23 P.\"), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case (\"C-131/12 and C-132/12\") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice (\"Opinion 2/13\", \"Ruling 1/78\") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters (e.g. 2023CJ0097) is matched as a CELEX substring instead."
      • changedInput schema / properties / court / anyOf
        Previous value: -[
        -  {
        -    "const": "",
        -    "type": "string"
        -  },
        -  {
        -    "description": "CJEU = Court of Justice of the EU, GC = General Court.",
        -    "enum": [
        -      "CJEU",
        -      "GC"
        -    ],
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "const": "",
        +    "type": "string"
        +  },
        +  {
        +    "description": "CJEU (C) = Court of Justice of the EU, GC (T) = General Court.",
        +    "enum": [
        +      "CJEU",
        +      "GC"
        +    ],
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / court / description
        Previous value: -"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both."New value: +"Court filter, by the court letter at position 6 of the CELEX: CJEU (C) = Court of Justice of the EU, GC (T) = General Court. It does not narrow by record type: every primary record the court filed matches, and its derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Omit to search every court."
      • addedOutput schema / properties / cases / items / properties / ecli
        Added value: +{
        +  "description": "European Case Law Identifier, the citation form of the record (e.g. \"ECLI:EU:C:2014:317\"); eurlex_lookup_celex resolves one back to its CELEX. Absent for judicial notices and the few records that carry none.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."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. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `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: -[
        -  "invalid_date_range",
        -  "no_results",
        -  "sparql_error"
        -]New value: +[
        +  "invalid_date_range",
        +  "invalid_case_number",
        +  "no_results",
        +  "sparql_error"
        +]
      • changedOutput schema / properties / query_echo / properties / celex_fragment / description
        Previous value: -"CELEX substring derived from case_number."New value: +"CELEX pattern matched for case_number: year, court letter, and zero-padded case number, with * standing for any document letter that court files under a case number (e.g. \"2023C*0097\" reaches 62023CJ0097, 62023CO0097, and 62023CC0097). Absent when case_number was matched as a raw CELEX substring."
    • Changedeurlex_get_document4 fields changed
      • 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). 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\"."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 inside another selected section (an article in a selected chapter) is returned once, within the enclosing one. 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 / content / description
        Previous 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; under select it is the matched sections joined in document order. Every one is capped at 100000 characters. 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; under select it is the matched sections joined in document order, each source character once — a section inside another selected section (an article in a selected chapter) is carried inside the enclosing one. Every one is capped at 100000 characters. Omitted in \"metadata_only\" mode, when the window is empty, or when content is unavailable."
      • changedOutput schema / properties / selected_sections / description
        Previous value: -"Source address of each section the selection sliced, in document order. Present only when select was used. A selection is a set of disjoint slices, not a contiguous window, so these addresses — not content_offset — are how a caller navigates one; every section stays individually reachable even when the cap cut its text."New value: +"Source address of each distinct section the selection located, in document order. Present only when select was used. A section nested inside another selected section keeps its own entry, though its text appears in content only once, inside the enclosing section. A selection is a set of slices, not a contiguous window, so these addresses — not content_offset — are how a caller navigates one; every section stays individually reachable even when the cap cut its text."
      • changedOutput schema / properties / selection / description
        Previous value: -"Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, capped at 100000 characters. When the cap cuts the join, a trailing matched section may be partly or wholly absent from content — read selected_sections for each one's own address."New value: +"Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, a nested section's text once inside its enclosing section, capped at 100000 characters. When the cap cuts the join, a trailing matched section may be partly or wholly absent from content — read selected_sections for each one's own address."
    • Changedeurlex_get_relations1 field changed
      • addedOutput schema / properties / relations / items / properties / related_member_state
        Added value: +{
        +  "description": "ISO 3166-1 alpha-3 code of the member state whose national measure this is (e.g. \"CZE\"), read from the three letters after the directive number in related_celex_number. Present on national_transposition rows only. The codes are the 27 member states plus \"GBR\" (the United Kingdom).",
        +  "type": "string"
        +}
    • Changedeurlex_lookup_celex6 fields changed
      • changedInput schema / properties / identifier / description
        Previous value: -"The 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)."New value: +"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), or an ECLI (e.g. ECLI:EU:C:2014:317)."
      • changedInput schema / properties / identifier_type / description
        Previous value: -"Format of the identifier. \"auto\" detects it automatically; supply \"celex\" or \"eli\" explicitly if detection fails."New value: +"Format of the identifier. \"auto\" detects it automatically (an ECLI by its ECLI: prefix, in any letter case); supply \"celex\", \"eli\", or \"ecli\" explicitly if detection fails."
      • changedInput schema / properties / identifier_type / enum
        Previous value: -[
        -  "celex",
        -  "eli",
        -  "auto"
        -]New value: +[
        +  "celex",
        +  "eli",
        +  "ecli",
        +  "auto"
        +]
      • addedOutput schema / properties / ecli
        Added value: +{
        +  "description": "European Case Law Identifier of the resolved work (e.g. \"ECLI:EU:C:2014:317\"), as CELLAR stores it. Present for case law that carries one; absent for legislation and judicial notices.",
        +  "type": "string"
        +}
      • 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, 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."New value: +"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ECLI (ECLI: prefix), 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. Only an identifier_type \"auto\" value that, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, or ECLI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI URI, nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."
    • Changedeurlex_query_sparql1 field changed
      • changedInput schema / properties / sparql_query / description
        Previous 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."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 as a typed triple, ?work cdm:resource_legal_id_celex \"32016R0679\"^^xsd:string (an untyped literal matches nothing, and a FILTER(STR(…)) comparison scans every CELEX). For text, use bif:contains with a single-quoted phrase."
  9. 3 tool updates
    • Changedeurlex_get_document6 fields changed
      • changedOutput schema / properties / content / description
        Previous 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."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; under select it is the matched sections joined in document order. Every one is capped at 100000 characters. Omitted in \"metadata_only\" mode, when the window is empty, or when content is unavailable."
      • changedOutput schema / properties / content_offset / description
        Previous value: -"Character offset where the returned content window begins. Present when a body was fetched and available."New value: +"Character offset where the returned contiguous window begins. Present in \"paged\" and \"full\" modes. Absent for outline and select responses, whose content is not a contiguous span — read selected_sections for each matched section's own offset."
      • changedOutput schema / properties / has_more / description
        Previous 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."New value: +"True when body content exists beyond the returned contiguous window. Continue in \"paged\" mode with offset = content_offset + content_chars_returned until false. Always false in \"metadata_only\" mode, and always false for outline and select responses, where that recipe cannot resume across disjoint slices — a cut selection is disclosed through the truncated enrichment instead."
      • addedOutput schema / properties / selected_sections
        Added value: +{
        +  "description": "Source address of each section the selection sliced, in document order. Present only when select was used. A selection is a set of disjoint slices, not a contiguous window, so these addresses — not content_offset — are how a caller navigates one; every section stays individually reachable even when the cap cut its text.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One selected section, addressable on its own through the paging floor.",
        +    "properties": {
        +      "chars": {
        +        "description": "Characters the section spans in the source body — pass as limit alongside offset to read exactly this section. A section longer than the maximum window is read by paging forward from offset instead.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "label": {
        +        "description": "Section descriptor, e.g. \"Article 17\".",
        +        "type": "string"
        +      },
        +      "offset": {
        +        "description": "Character offset of the section in the full body of the requested format — pass as offset in a paged call to read it.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "label",
        +      "offset",
        +      "chars"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / selection / description
        Previous value: -"Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order."New value: +"Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order, capped at 100000 characters. When the cap cuts the join, a trailing matched section may be partly or wholly absent from content — read selected_sections for each one's own address."
      • changedOutput schema / properties / selection / properties / matched / description
        Previous value: -"Section descriptors found and returned in content, in document order."New value: +"Section descriptors located in the body, in document order."
    • Changedeurlex_lookup_celex1 field changed
      • changedOutput schema / properties / resource_type / description
        Previous 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."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. \"BUDGET\"). Absent for some works."
    • Changedeurlex_search_documents6 fields changed
      • changedInput schema / properties / in_force / description
        Previous value: -"If true, restrict to acts currently in force. Omit to return all regardless of in-force status."New value: +"Restrict by in-force status: true returns only acts currently in force, false only acts no longer in force. Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status."
      • addedInput schema / properties / include_corrigenda
        Added value: +{
        +  "default": false,
        +  "description": "Include corrigenda — separate correction works, co-typed CORRIGENDUM alongside the base type of the act they correct, carrying a \"…R(nn)\" CELEX and usually no English title. Default false: they are excluded so primary acts fill the page. Every returned row is tagged is_corrigendum.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / documents / items / properties / is_corrigendum
        Added value: +{
        +  "description": "True when this work carries the CORRIGENDUM resource-type — a correction to another act rather than a primary act. Only ever true when include_corrigenda is set, since corrigenda are excluded by default.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / documents / items / required
        Previous value: -[
        -  "work_uri",
        -  "celex_number",
        -  "is_consolidated"
        -]New value: +[
        +  "work_uri",
        +  "celex_number",
        +  "is_consolidated",
        +  "is_corrigendum"
        +]
      • addedOutput schema / properties / query_echo / properties / include_corrigenda
        Added value: +{
        +  "description": "Effective include_corrigenda value after the false default is applied — whether corrigenda were admitted alongside primary acts. Always present, since the default shapes which records can appear.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / query_echo / required
        Previous value: -[
        -  "include_consolidated"
        -]New value: +[
        +  "include_consolidated",
        +  "include_corrigenda"
        +]
  10. 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."
  11. 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."
  12. 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"
        +}
  13. 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."
  14. 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"
        -]
  15. 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"
        +]

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.