eur-lex-mcp-server
Server Details
Search EU legislation, CJEU case law, and treaties; traverse CELLAR graph; browse EuroVoc concepts.
- Status
- Healthy
- Uptime
- 99.8% over 75 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/eur-lex-mcp-server
- GitHub Stars
- 11
- Server Listing
- @cyanheads/eur-lex-mcp-server
TDQS
Scored across 7 tools
Each tool occupies a distinct niche: subject-thesaurus resolution, case-law search, legislation search, document retrieval, relation traversal, citation resolution, and a raw SPARQL escape hatch. The only near-neighbors — eurlex_lookup_celex and eurlex_get_document, both accepting CELEX — are explicitly separated (resolve/confirm vs. fetch full metadata and body) and the descriptions spell out the intended workflow. No two tools appear to do the same thing.
All tools share the eurlex_ prefix followed by a snake_case verb_noun phrase (get_cases, get_document, get_relations, lookup_celex, browse_subjects, search_documents, query_sparql). The verbs (browse/get/lookup/query/search) are used consistently and each signals a distinct action rather than being interchangeable filler.
Seven tools for a broad legal-information domain is well within the sweet spot, and each has a clear job: discovery, retrieval, graph traversal, resolution, term lookup, and a raw-query fallback. Nothing feels redundant or like padding.
The surface covers the full lifecycle — find subjects, search legislation and case law, resolve citations, fetch metadata plus paged/selected full text, and traverse amendment/repeal/transposition/interpretation relations — with SPARQL as a general escape hatch. The main gap is the acknowledged absence of full-text body search (keyword matching limited to titles/CELEX), which forces agents to know or discover an identifier before fetching content, and there is no built-in export or citation-formatting operation.
Available Tools
7 toolseurlex_browse_subjectsBrowse EuroVoc SubjectsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of EuroVoc concepts to return, served up to 50 per call; a larger value (up to 10,000) is served at 50 and reported in limit_clamp. Defaults to 20. | |
| offset | No | Pagination offset — number of concepts to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000. | |
| keyword | Yes | Search term matched against EuroVoc preferred and alternative concept labels (e.g. "privacy", "agriculture", "product liability"). | |
| language | No | Language code for concept labels (e.g. "en", "fr", "de"). Case-insensitive — "EN" and "en" behave identically. Defaults to English. | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied to this response. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of concepts returned in this response. |
| total | No | Number of concepts returned in this response. |
| notice | No | 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; on a page ending at row 10,000, that no later page can be read and how to narrow the keyword. |
| offset | No | Pagination offset used for this response. |
| concepts | No | Matching EuroVoc concepts, exact label matches first, then word-start matches, then other substring matches, each group ordered by preferred label. |
| has_more | No | True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match. |
| truncated | No | True when an additional CELLAR row proves more concepts exist beyond this page. |
| limit_clamp | No | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | No | Offset for the next page. Present only when has_more is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description goes further by disclosing match semantics (preferred and alternative labels), result ranking (exact match, then prefix, then substring, each ordered by preferred label), and which fields are returned — none of which the annotations cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and downstream routing in the first sentence, then layers matching behavior and ordering; dense but every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still summarizes returned fields and, more importantly, explains result ordering — filling the gap the output schema cannot express. Nothing an agent needs to invoke or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value about the keyword parameter's matching behavior (synonym resolution, exact/prefix/substring ranking) and confirms language applies to returned labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the EuroVoc thesaurus, resolving a keyword into concept URIs') and explicitly ties the output to the eurovoc_concept filter of eurlex_search_documents, distinguishing it from the sibling lookup/search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the downstream use case and the condition that selects it: resolve a keyword to concept URIs for use in eurlex_search_documents' subject filter. An agent knows both why and when to call this before searching.
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 LawARead-onlyInspect
Search CJEU and General Court case law — judgments, orders, and Advocate General opinions and views — by case number, court, case type, keyword, and date range. A case number reaches every judgment, order, AG opinion, and AG view 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.
| Name | Required | Description | Default |
|---|---|---|---|
| court | No | 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. | |
| limit | No | Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20. | |
| offset | No | Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to window to reach older cases. | |
| date_to | No | End of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound. | |
| keyword | No | 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. | |
| case_type | No | Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view). Omit to search all. | |
| date_from | No | Start of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound. | |
| case_number | No | 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. | |
| include_derivative | No | Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, AG opinions, and AG views. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already requires the selected primary type family). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied to this page. |
| cases | No | Matching case law records ordered by date descending, then by CELEX number ascending among records sharing a date, so pages are stable across calls. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of cases returned in this page. |
| total | No | Number of cases returned in this page (not a corpus-wide count). |
| notice | No | 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; on a page ending at row 10,000, that no later page can be read and the closed date_from/date_to window that continues past it. |
| offset | No | Pagination offset used for this response. |
| has_more | No | True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match. |
| truncated | No | True when an additional CELLAR row proves more cases exist beyond this page. |
| query_echo | No | Echo of filters applied to this search. Useful for diagnosing empty results. |
| limit_clamp | No | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | No | Offset for the next page. Present only when has_more is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/open-world safety, yet the description still adds behavior the agent could not infer: derivative notices/abstracts/summaries/corrigenda are suppressed by default so distinct cases fill the page, and keyword matching is title+CELEX only, not full text. Some of this (10,000-row sort cap, slow prefix scans) is duplicated from the schema rather than new.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and default behavior are front-loaded in the first two sentences, and the remaining content is dense and largely earns its place. The final sentence describing return fields is wordy and partly redundant with the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema and nine parameters, the description covers the exclusions, the no-body-search limitation, and the shape of what comes back, so an agent knows exactly what a call yields and how to widen it. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3; the description still adds interpretive value, notably that the sixth CELEX character encodes court (C/T/F) and that a case number reaches every primary record filed under it. Keyword and case_number semantics are largely restated from the schema, limiting it to a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Search CJEU and General Court case law') with an explicit enumeration of the record families covered (judgments, orders, AG opinions, views) and the filter axes. It also carves out scope boundaries (derivative records excluded by default) that make it clearly distinct from the broader document-search sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use case_number versus keyword ('for every record filed under a case, use case_number') and warns 'there is no full-text body search', which steers the agent toward title/CELEX matching. It stops short of naming alternative sibling tools (eurlex_lookup_celex, eurlex_search_documents), so routing to a different tool is left to inference.
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 DocumentARead-onlyIdempotentInspect
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, ELI, Official Journal reference, typed dates of effect, transposition deadlines, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum characters to return in this window ("paged" mode only; select ignores it). Default 25000; a window holds at most 100000 characters, so a larger value is served at 100000 and reported in limit_clamp. Follow has_more and the returned offsets until false to reconstruct the complete body. | |
| format | No | Content format: "html" for the act text as served by EUR-Lex (default), "markdown" for that HTML converted to clean Markdown server-side, or "xml" for Formex4 structured XML. | html |
| offset | No | Character offset into the body where the returned window starts ("paged" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call. Offsets are format-specific: an offset is only valid against the same format it was measured in — keep format constant when paging. | |
| select | No | 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. An act's section runs to its next heading, and its last article, section, and chapter stop where the enacting terms end: the closing formula, signatures, and footnotes after them (and in xml the annexes) belong to no section, nor do the notes closing a consolidated text — read those by paging on from the section's end. 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_uri | No | Work-level ELI URI of the act to fetch (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri. | |
| outline | No | 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". | |
| resolve | No | 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. | as_requested |
| language | No | 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. | EN |
| work_uri | No | 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. An expression or manifestation URI (…/cellar/{id}.0006, ….0006.03) is served as the work it belongs to, with a notice. Provide exactly one of celex_number, eli_uri, or work_uri. | |
| celex_number | No | CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri. | |
| content_mode | No | 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". | paged |
| include_recitals | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Maximum body characters allowed in the window. |
| eli | No | European Legislation Identifier of the work served (e.g. "http://data.europa.eu/eli/reg/2016/679/oj"); a consolidated text carries its own point-in-time ELI (e.g. "http://data.europa.eu/eli/reg/2016/679/2016-05-04"), a corrigendum its own. Absent when CELLAR records none, as for case law, proposals, and national measures. |
| date | No | Document date in ISO 8601 format (YYYY-MM-DD). |
| ecli | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of body characters returned. |
| title | No | 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. |
| notice | No | How to retrieve the remaining document content; when select.annexes asked for "ANNEX" on an act whose annexes are numbered, which numbers select one; when work_uri names an expression or manifestation, the work served in its place; 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. |
| content | No | 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. |
| outline | No | Structural outline of the act. Present only when outline is true; an empty array means no structure was detected. |
| has_more | No | 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. |
| in_force | No | 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. |
| language | No | Language code of the returned content. |
| work_uri | No | CELLAR work URI. |
| formation | No | 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. |
| selection | No | 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. |
| truncated | No | True when the returned body window was capped. |
| legal_basis | No | Legal basis acts for this work — for a consolidated text, its base act's. Absent when none are recorded. |
| limit_clamp | No | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| repealed_by | No | 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. |
| celex_number | No | Confirmed CELEX number for the retrieved work. |
| content_mode | No | Content mode applied to this response: "metadata_only", "paged", or "full". |
| oj_reference | No | Official Journal reference the act was published under, e.g. "OJ L 119, 4.5.2016, p. 1–88", "OJ 13, 21.2.1962, p. 204–211" (before 1968, no series letter), "OJ L 42I, …" (an issue class other than R), or for act-by-act publication "OJ L, 2024/1689, 12.7.2024" and "OJ C, C/2024/2664, 29.4.2024". Pages are the English edition's, or before 1973 the original-language edition's; an act also reprinted in a later issue cites the earliest. For a consolidated text, its base act's. Absent when CELLAR records no publication. |
| is_superseded | No | 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. |
| resource_type | No | Human-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works. |
| base_act_celex | No | 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. |
| case_reference | No | Case law: the case reference from the title (e.g. "Case C-131/12."). |
| content_format | No | Format of the returned content: "html", "markdown", or "xml". |
| content_offset | No | 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. |
| content_status | No | 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. |
| subject_matter | No | Case law: the subject-matter keyword list from the title (e.g. "Personal data – Protection of individuals …"). |
| dates_of_effect | No | Every date of effect CELLAR records for the act, sorted by date, one entry per date and type (a date can carry two, e.g. entry into force and application), whether past or ahead and whatever in_force says. For a consolidated text, its base act's. Absent when none is recorded. |
| end_of_validity | No | 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. |
| referring_court | No | Case law: the national court that referred a preliminary ruling, from the title (e.g. "Audiencia Nacional"). Absent on direct actions and appeals. |
| requested_celex | No | 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. |
| entry_into_force | No | 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. Every recorded date, typed, is in dates_of_effect. |
| eurovoc_subjects | No | EuroVoc subject classifications — for a consolidated text, its base act's. Absent when none are recorded. |
| national_measure | No | National implementing measure publication citation and notification facts recorded on the served work. Missing facts are omitted; no source URL is inferred. |
| advocates_general | No | 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. |
| content_available | No | Whether 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". |
| content_omissions | No | Known source omissions; an available body can still omit substantive tables. |
| language_fallback | No | Human-readable note explaining the fallback that occurred (e.g. "Requested FR content unavailable; returned EN"). Present only when a fallback happened. |
| selected_sections | No | 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. |
| author_institution | No | 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. |
| consolidated_as_of | No | Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present whenever is_superseded is. |
| requested_language | No | Originally requested language code when English fallback changed the effective language reported in language. |
| structure_detected | No | 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". |
| author_institutions | No | 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. |
| content_chars_total | No | Total 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_returned | No | Number of body characters returned in this response (equals content length). Present when a body was fetched and available. |
| transposition_deadlines | No | A directive's deadlines for transposition into national law, sorted. For a consolidated text, its base act's. Absent when none is recorded. |
| current_consolidated_celex | No | 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. |
| alternative_representations | No | Verified alternative PDF stream locations; no claim that they contain every omitted table. |
| content_unavailability_reason | No | Why content_status is "unavailable": no representation exists, the upstream request failed, or a multipart Formex body could not be assembled completely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/openWorld; the description adds substantial behavior beyond that — a hard 100,000-character cap per body, paging continuation, language defaulting to EN with automatic fallback, resolve behavior for consolidated versions, and the fact that unlocatable sections are reported in selection.missed with no wrong text returned. These are exactly the non-obvious traits an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in a crisp first sentence, but the remainder is one very long run-on paragraph that pages through return-field lists, paging rules, and select semantics without breaks or ordering by importance. Much of the middle (title, date, ELI, EuroVoc subjects) restates what the output schema already provides.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, nested-object tool with an output schema, the description covers every decisional point: identifier choice, content_mode/paged vs full vs metadata_only, the 100k cap, format/language, resolve, outline and select. Nothing an agent needs to invoke it correctly is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining cross-parameter interactions the schema only documents piecemeal — that select ignores offset/limit and outline, that outline offsets are format-specific, and that format must stay constant while paging. The returns/metadata enumeration partly duplicates the schema, but the mode-interaction semantics are genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource — 'Fetch the metadata and full text of an EU act or case-law record' — and names the three identifier types it accepts, which cleanly separates it from the search/lookup/browse siblings. An agent can tell this is the identifier-driven full-document retriever without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational routing: 'use outline: true for a heading map', 'select to pull specific articles', paging on with offset/limit. However, it never names a sibling tool or states when to prefer eurlex_search_documents or eurlex_lookup_celex over this one, so the when-not/alternatives half of the guidance is absent.
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 GraphARead-onlyIdempotentInspect
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 the works adopted under it, the proposal it adopts (or, for a proposal, the act that adopted it), the CJEU rulings interpreting it (or, for a ruling, the acts it interprets), and works that cite it. Amendment, repeal, interpretation, and adoption rows carry the provisions CELLAR records each edge as targeting, and article narrows interpreted_by to the rulings on one article. Returns direct relations only, paginated per relation type and direction. Requires a CELEX number or CELLAR work URI.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum related works per relation type and direction, served up to 100 per call (default 100); a larger value (up to 10,000) is served at 100 and reported in limit_clamp. A response-budget cut can lower the common depth further to fit each complete surface within 64,000 UTF-8 bytes, never below 1; the notice reports requested/applied limits and withheld rows. Incoming edges are newest-first. Continue at next_offset for older works; narrow relation_types or lower limit for a smaller response. | |
| offset | No | Pagination offset applied per relation type and direction — related works to skip (default 0). Continue at the returned next_offset, which adds the applied depth after any response-budget cut; incoming edges are newest-first, so higher offsets reach older works. Must be below 10,000: CELLAR sorts at most 10,000 related works per type and direction, so pages stop at row 10,000. | |
| article | No | Narrow interpreted_by to the rulings with a recorded provision in this article of the act: an article number with at most one letter (17, 6a), optionally prefixed "Article", "Art." or "Art", in any case. The article matches at any depth (17 matches provisions recorded in Article 17(1)(c)), leading zeros are ignored, and a letter also matches its Latin ordinal (28c matches Article 28 quater). Rulings CELLAR records no provision for are left out. Paging, has_more, and next_offset then count matching rulings only; other relation types are unaffected. With an explicit relation_types, include interpreted_by. A blank value is the same as omitting it. | |
| work_uri | No | 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. | |
| celex_number | No | CELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri. | |
| member_states | No | Narrow national_transposition rows to the measures of these member states — the 27 member states plus the United Kingdom, by alpha-3 or two-letter code, in any case. Paging, has_more, and next_offset then count matching measures only; other relation types are unaffected. With an explicit relation_types, include national_transposition. An empty list is the same as omitting it. | |
| relation_types | No | Subset of relation types to return; omit for all fifteen, equivalent to listing them explicitly. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), basis_for (works naming this act among their legal bases — implementing and delegated acts, decisions, Parliament resolutions, drafts; the incoming side of legal_basis), interprets (for a ruling: the acts it interprets), interpreted_by (CJEU and General Court rulings interpreting this act; the incoming side of interprets), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures), adopts (the works this act adopts — usually its Commission proposal, also an international agreement its concluding decision adopts or a joint-committee decision; tell them apart by CELEX), adopted_by (the act that adopted this work; the incoming side of adopts). Whole rows, titles, and provisions are kept within a 64,000 UTF-8 byte budget per complete response surface by lowering the common per-type/direction depth, never below 1; a depth-1 page still over it has the provisions of its rows withheld whole, largest first (counted in provisions_withheld), and is then returned whole with disclosure. Name only the types you need to reduce the response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of relations returned in this page, summed across every relation type and direction — not the count for any single type or direction. |
| total | No | Number of relations returned in this page (not a corpus-wide count). |
| notice | No | Guidance for the next call: on an empty first page, how to widen the traversal; on a first page where member_states matched no national_transposition measures, the codes it named; with article, that interpreted_by leaves out rulings CELLAR records no provision for, or on a first page with none, the article it named; on a page with more rows, the offset to continue from; on a page ending at row 10,000, the relation types and directions that reached it, each with a ready-to-run eurlex_query_sparql query listing its older works; the rows whose provisions were withheld to fit the response budget, and the relation types whose provisions CELLAR did not return. |
| offset | No | Pagination offset applied to this response (per relation type and direction). |
| article | No | The article interpreted_by rows were narrowed to, normalized from the article input: the number without a prefix or leading zeros, any letter in lower case (17, 28c). Absent when no article filter was given. |
| has_more | No | True when an additional valid row or a response-budget cut proves at least one requested relation type/direction has more rows. False on a retained page that ends at row 10,000, the last one CELLAR sorts; its notice names the types and directions that reached it. |
| work_uri | No | CELLAR URI of the source work (the work_uri input, or resolved from the CELEX). |
| relations | No | Direct CDM relations for the requested work. |
| truncated | No | True when an additional valid row proves at least one relation type/direction has more related works — page with offset. |
| limit_clamp | No | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | No | Offset plus the applied per-type/direction depth after any response-budget cut. Present only when has_more is true; use this value to continue without skipping withheld rows. |
| celex_number | No | 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. |
| member_states | No | The member states national_transposition rows were narrowed to, as ISO 3166-1 alpha-3 codes, normalized from member_states and de-duplicated. Absent when no member_states filter was given. |
| empty_relation_types | No | 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. |
| requested_relation_types | No | The relation types this request traversed — the explicit relation_types list, or all types when it was omitted. Diff against the types present in relations[], or read empty_relation_types, to confirm which requested types returned edges. |
TDQS
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 covered. The description adds useful behavioral context: one-hop traversal only, pagination per relation type and direction, provision targets on certain edge types, and article-level narrowing of interpreted_by. It does not describe rate limits or response-budget clamping, which appear only in the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and relation graph scope immediately after the opening clause. It is dense and somewhat run-on because it enumerates many edge types, but that enumeration is relevant for a complex graph-traversal tool and most sentences earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has high complexity, seven parameters, full schema description coverage, and an output schema, so the description need not repeat every parameter detail. It covers the essential identity, required addressing input, one-hop limitation, relation categories, and article scoping. Minor omissions such as member_states narrowing and pagination limit details are adequately covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries the detailed parameter semantics. The description reinforces the CELEX/URI requirement and explains the article filter and relation edge meaning, but it adds little beyond the schema's own parameter documentation. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a precise verb and resource: 'Traverse the one-hop CDM relationship graph of an EU act.' It enumerates the relation categories (amendment, repeal, consolidation, transposition, legal basis, CJEU interpretation, citation), making the tool clearly distinct from sibling search, document, and SPARQL tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the required input ('Requires a CELEX number or CELLAR work URI') and the output scope ('Returns direct relations only, paginated per relation type and direction'). It does not explicitly compare when to use this tool instead of eurlex_get_document, eurlex_query_sparql, or eurlex_search_documents, so the alternative-selection guidance is implicit rather than explicit.
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 CitationARead-onlyIdempotentInspect
Resolve an EU legal citation — a CELEX number, ELI URI, ECLI, an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC"), or an Official Journal reference naming its issue, date, and first page (e.g. "OJ L 119, 4.5.2016, p. 1") — 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. An OJ reference whose first page starts several acts returns found false, its notice naming each CELEX.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | 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; one followed by its parenthesized OJ reference (Directive 95/46/EC (OJ L 281, 23.11.1995, p. 31)) resolves as the citation. An Official Journal reference resolves, also under "auto", to the act starting on the page it cites: OJ L 281, 23.11.1995, p. 31 (also "of 23.11.1995", a page range, a class letter as in OJ L 42I, OJ C, and before 1968 the series-less OJ 13, 21.2.1962, p. 204/62), the year-first OJ 1995 L 281, p. 31, and the act-by-act OJ L, 2024/1689, 12.7.2024 or OJ C, C/2024/2664, 29.4.2024; the cited date must be the publication date. A reference without its year or first page (OJ L 281, OJ L 119/1) is not parsed. A CELEX is also read in lowercase, after a CELEX: prefix, from a EUR-Lex page URL carrying uri=CELEX:… (e.g. https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679), or from a publications.europa.eu/resource/celex/ URI; an ELI over https, on the eur-lex.europa.eu host, without a scheme, with a trailing slash, or with a language segment after /oj or a date (…/oj/eng). A case number (C-131/12) names several records rather than one work and returns found false with a pointer to eurlex_get_cases. | |
| identifier_type | No | Format of the identifier. "auto" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), an OJ citation, or an Official Journal reference; "celex", "eli", or "ecli" forces that lookup. An OJ citation or reference is recognized only under "auto". | auto |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Document date in ISO 8601 format (YYYY-MM-DD). |
| ecli | No | 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. |
| error | No | Present when the call failed. Absent on success. |
| found | No | True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, OJ citation, or Official Journal reference matches no work in the corpus, when an OJ reference's first page starts several acts, or when the identifier is a case number, with a notice naming what was tried. Only an identifier_type "auto" value that, after trimming, is neither an ECLI, an ELI, a CELEX in any accepted form, an OJ citation naming its act type and year, nor an OJ reference naming its issue, year, and first page raises ambiguous_identifier instead. |
| notice | No | Present only when found is false: the CELEX, ELI, ECLI, or OJ reference looked up, the accepted forms, and the search to use instead; for an OJ reference whose first page starts several acts, the CELEX of each. |
| work_uri | No | CELLAR work URI (stable resource identifier). |
| celex_number | No | Confirmed CELEX number for the resolved work. |
| resource_type | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/open-world profile, and the description goes well beyond them: it spells out resolution precedence for ambiguous inputs (multiple works per CELEX resolves to the EUR-Lex-served one; shared ECLI resolves to the primary record with the lowest CELEX; ambiguous OJ first page returns found=false with each CELEX named in the notice) and enumerates the returned fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the opening clause and the ambiguity rules are grouped at the end. The first sentence is a long em-dash run listing every accepted citation form, which duplicates the schema and costs readability, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a citation-normalization tool this is complete: input formats, disambiguation rules, fallback behavior for case numbers, and a note on returned fields. With an output schema and safety annotations already present, nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the identifier parameter's schema description already enumerates the accepted formats and parsing rules in detail. The description's first sentence largely restates that enumeration, adding only light framing rather than new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
A specific verb (resolve) with a well-scoped resource (an EU legal citation of several named formats) and an explicit output target (canonical CELLAR work). It also distinguishes itself from a sibling by noting that a case number like C-131/12 returns found=false with a pointer to eurlex_get_cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the workflow position clearly — 'confirming it exists before you fetch or traverse it' — and names eurlex_get_cases for the case-number case. It does not say when to prefer eurlex_search_documents or eurlex_get_document for a citation that fails to resolve, so alternatives are only partly covered.
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 QueryARead-onlyInspect
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 the server row cap (100 by default). The cdm:, skos:, and xsd: prefixes are auto-injected.
| Name | Required | Description | Default |
|---|---|---|---|
| sparql_query | Yes | 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 the server row cap (100 unless the deployment configures a lower one) if absent, or capped to it; to read past the cap, add ORDER BY and repeat the query with OFFSET raised by the cap (a sorted query reaches row 10,000 at most). 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_hint | No | Optional client-side timeout in milliseconds (1000–55000). The server default (55000 unless the deployment configures another value) applies when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The server-enforced result ceiling that was applied. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of binding rows returned in this response. |
| total | No | Number of binding rows returned (at most the server's row cap, 100 by default). |
| notice | No | On a truncated result: how to page past the row cap with ORDER BY and OFFSET, and the 10,000-row limit on a sorted query. 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. |
| bindings | No | Raw SPARQL binding rows. To extract a value from a row: row["varName"]?.value. Use the variables array to iterate in query order. |
| truncated | No | True when the server's row cap (the deployment's configured cap, 100 by default; cap gives the value applied) limited the rows and more may exist upstream — page on with ORDER BY in the query and OFFSET raised by the cap per call (sorted queries reach row 10,000 at most), or narrow the query with FILTERs. |
| variables | No | Variable names from the SELECT head, in query order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: only SELECT is accepted, update forms and ASK/CONSTRUCT/DESCRIBE are rejected pre-execution, results are capped at the server row cap (100 default), and cdm:/skos:/xsd: prefixes are auto-injected. These are exactly the operational traits an agent needs before issuing a raw query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler: purpose and positioning first, execution constraints second, prefix behavior last. The most decision-relevant information (read-only, SELECT-only) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a raw-query escape hatch with a rich output schema already present, the description covers what an agent must know: acceptance/rejection rules, result capping, and prefix injection. Return-value explanation is correctly omitted since the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters in depth (LIMIT injection, prefix auto-injection, timeout range). The description's mention of the row cap and auto-injected prefixes restates what the schema provides rather than adding new parameter meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a raw, read-only SPARQL SELECT against the CELLAR Virtuoso endpoint') and explicitly positions itself against the siblings as 'an escape hatch for CDM ontology traversals the curated tools do not cover.' An agent can distinguish it from eurlex_search_documents or eurlex_get_relations without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use condition ('traversals the curated tools do not cover'), which routes the agent away from the curated siblings toward this tool for advanced cases. It stops short of naming which sibling handles what, so there is no explicit when-not/alternative mapping, but the context is unambiguous.
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 DocumentsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20. | |
| offset | No | Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to window to reach older documents. | |
| date_to | No | End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound. | |
| keyword | No | 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. | |
| in_force | No | 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. | |
| date_from | No | Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound. | |
| document_type | No | 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. | |
| eurovoc_concept | No | 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. | |
| author_institution | No | Author name (e.g. "European Parliament", "Council", "European Commission", "Supremo Tribunal de Justiça"), matched as a phrase against English authority labels or national-court names — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included. | |
| include_corrigenda | No | 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. | |
| include_consolidated | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied to this page. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of documents returned in this page. |
| total | No | Number of documents returned in this page (not a corpus-wide count). |
| notice | No | 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; on a page ending at row 10,000, that no later page can be read and the closed date_from/date_to window that continues past it. |
| offset | No | Pagination offset used for this response. |
| has_more | No | True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match. |
| documents | No | Matching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls. |
| truncated | No | True when an additional CELLAR row proves more documents exist beyond this page. |
| query_echo | No | Echo of filters applied to this search. Useful for diagnosing empty results. |
| limit_clamp | No | Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value. |
| next_offset | No | Offset for the next page. Present only when has_more is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite the annotations already marking the tool read-only and open-world, the description adds substantial operational context: no full-text body search, default exclusion of corrigenda, newest-first ordering, returned fields, is_consolidated and is_corrigendum flags, and the at-least-one-filter requirement. This gives an agent a clear behavioral picture beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core search purpose and then adds the most important constraints in a few dense sentences. It is slightly long because it repeats some schema-level caveats, but nearly every sentence carries relevant information for selecting and invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 11-parameter schema, the annotations, and the output schema, the description covers the key behavioral facts an agent needs: no body search, required filtering, default corrigenda exclusion, and the shape of returned results. Pagination and limit details are left to the rich schema, which is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description still adds the important constraint that at least one filter is required, which is not expressed in the schema. It also summarizes keyword and corrigenda behavior, though most parameter-level detail is already present in the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search EU legislation, treaties, and preparatory acts in CELLAR, filtered by type, dates, EuroVoc, author, and in-force status. It is clear on scope and content, but it does not explicitly distinguish itself from case-law-focused siblings such as eurlex_get_cases or from eurlex_lookup_celex beyond referencing eurlex_browse_subjects and eurlex_get_document for adjacent tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful usage constraints: keyword searches titles and CELEX strings only, corrigenda are excluded unless include_corrigenda is set, and at least one filter is required. It also points to eurlex_browse_subjects for EuroVoc URIs and eurlex_get_document for in-force detail, but it stops short of clearly saying when to choose this tool versus eurlex_get_cases or eurlex_lookup_celex.
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.
3 tool updates
- Changed
eurlex_get_document5 fields changed- added
Output schema / properties / dates_of_effectAdded value: +{ + "description": "Every date of effect CELLAR records for the act, sorted by date, one entry per date and type (a date can carry two, e.g. entry into force and application), whether past or ahead and whatever in_force says. For a consolidated text, its base act's. Absent when none is recorded.", + "items": { + "additionalProperties": false, + "description": "One date of effect.", + "properties": { + "date": { + "description": "Date (YYYY-MM-DD).", + "type": "string" + }, + "type": { + "description": "What takes effect on that date: \"entry_into_force\", \"application\", \"partial_application\", \"provisional_application\", \"takes_effect\", or \"takes_partial_effect\". Absent when CELLAR records no type, or one outside these.", + "enum": [ + "entry_into_force", + "application", + "partial_application", + "provisional_application", + "takes_effect", + "takes_partial_effect" + ], + "type": "string" + } + }, + "required": [ + "date" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / eliAdded value: +{ + "description": "European Legislation Identifier of the work served (e.g. \"http://data.europa.eu/eli/reg/2016/679/oj\"); a consolidated text carries its own point-in-time ELI (e.g. \"http://data.europa.eu/eli/reg/2016/679/2016-05-04\"), a corrigendum its own. Absent when CELLAR records none, as for case law, proposals, and national measures.", + "type": "string" +} - changed
Output schema / properties / entry_into_force / descriptionPrevious value: -"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."New value: +"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. Every recorded date, typed, is in dates_of_effect." - added
Output schema / properties / oj_referenceAdded value: +{ + "description": "Official Journal reference the act was published under, e.g. \"OJ L 119, 4.5.2016, p. 1–88\", \"OJ 13, 21.2.1962, p. 204–211\" (before 1968, no series letter), \"OJ L 42I, …\" (an issue class other than R), or for act-by-act publication \"OJ L, 2024/1689, 12.7.2024\" and \"OJ C, C/2024/2664, 29.4.2024\". Pages are the English edition's, or before 1973 the original-language edition's; an act also reprinted in a later issue cites the earliest. For a consolidated text, its base act's. Absent when CELLAR records no publication.", + "type": "string" +} - added
Output schema / properties / transposition_deadlinesAdded value: +{ + "description": "A directive's deadlines for transposition into national law, sorted. For a consolidated text, its base act's. Absent when none is recorded.", + "items": { + "description": "Deadline (YYYY-MM-DD).", + "type": "string" + }, + "type": "array" +}
- Changed
eurlex_get_relations10 fields changed- added
Input schema / properties / articleAdded value: +{ + "description": "Narrow interpreted_by to the rulings with a recorded provision in this article of the act: an article number with at most one letter (17, 6a), optionally prefixed \"Article\", \"Art.\" or \"Art\", in any case. The article matches at any depth (17 matches provisions recorded in Article 17(1)(c)), leading zeros are ignored, and a letter also matches its Latin ordinal (28c matches Article 28 quater). Rulings CELLAR records no provision for are left out. Paging, has_more, and next_offset then count matching rulings only; other relation types are unaffected. With an explicit relation_types, include interpreted_by. A blank value is the same as omitting it.", + "pattern": "^\\s*(?:(?:[Aa][Rr][Tt][Ii][Cc][Ll][Ee]|[Aa][Rr][Tt]\\.?)\\s*)?\\d{1,4}[A-Za-z]?\\s*$|^\\s*$", + "type": "string" +} - changed
Input schema / properties / relation_types / descriptionPrevious value: -"Subset of relation types to return; omit for all thirteen, equivalent to listing them explicitly. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), basis_for (works naming this act among their legal bases — implementing and delegated acts, decisions, Parliament resolutions, drafts; the incoming side of legal_basis), interprets (for a ruling: the acts it interprets), interpreted_by (CJEU and General Court rulings interpreting this act; the incoming side of interprets), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures). Whole rows and titles are kept within a 64,000 UTF-8 byte budget per complete response surface by lowering the common per-type/direction depth, never below 1; an oversize depth-1 page is returned whole with disclosure. Name only the types you need to reduce the response."New value: +"Subset of relation types to return; omit for all fifteen, equivalent to listing them explicitly. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), basis_for (works naming this act among their legal bases — implementing and delegated acts, decisions, Parliament resolutions, drafts; the incoming side of legal_basis), interprets (for a ruling: the acts it interprets), interpreted_by (CJEU and General Court rulings interpreting this act; the incoming side of interprets), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures), adopts (the works this act adopts — usually its Commission proposal, also an international agreement its concluding decision adopts or a joint-committee decision; tell them apart by CELEX), adopted_by (the act that adopted this work; the incoming side of adopts). Whole rows, titles, and provisions are kept within a 64,000 UTF-8 byte budget per complete response surface by lowering the common per-type/direction depth, never below 1; a depth-1 page still over it has the provisions of its rows withheld whole, largest first (counted in provisions_withheld), and is then returned whole with disclosure. Name only the types you need to reduce the response." - changed
Input schema / properties / relation_types / items / enumPrevious value: -[ - "cites", - "amends", - "amended_by", - "repeals", - "repealed_by", - "implicitly_repeals", - "implicitly_repealed_by", - "legal_basis", - "basis_for", - "interprets", - "interpreted_by", - "consolidated_version", - "national_transposition" -]New value: +[ + "cites", + "amends", + "amended_by", + "repeals", + "repealed_by", + "implicitly_repeals", + "implicitly_repealed_by", + "legal_basis", + "basis_for", + "interprets", + "interpreted_by", + "consolidated_version", + "national_transposition", + "adopts", + "adopted_by" +] - added
Output schema / properties / articleAdded value: +{ + "description": "The article interpreted_by rows were narrowed to, normalized from the article input: the number without a prefix or leading zeros, any letter in lower case (17, 28c). Absent when no article filter was given.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one relation type and direction. `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `member_states_not_applicable`: member_states was given with a relation_types list that does not include national_transposition, the only type it filters. `not_found`: The CELEX number, given directly or as a resource/celex/ work URI, is not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `sparql_error`: CELLAR rejected a query this traversal sent. The same call fails the same way again. `sparql_timeout`: A query this traversal sent ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one relation type and direction. `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `member_states_not_applicable`: member_states was given with a relation_types list that does not include national_transposition, the only type it filters. `article_not_applicable`: article was given with a relation_types list that does not include interpreted_by, the only type it filters. `not_found`: The CELEX number, given directly or as a resource/celex/ work URI, is not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `sparql_error`: CELLAR rejected a query this traversal sent. The same call fails the same way again. `sparql_timeout`: A query this traversal sent ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "offset_past_window", - "invalid_identifier_args", - "member_states_not_applicable", - "not_found", - "sparql_error", - "sparql_timeout" -]New value: +[ + "offset_past_window", + "invalid_identifier_args", + "member_states_not_applicable", + "article_not_applicable", + "not_found", + "sparql_error", + "sparql_timeout" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance for the next call: on an empty first page, how to widen the traversal; on a first page where member_states matched no national_transposition measures, the codes it named; on a page with more rows, the offset to continue from; on a page ending at row 10,000, the relation types and directions that reached it, each with a ready-to-run eurlex_query_sparql query listing its older works."New value: +"Guidance for the next call: on an empty first page, how to widen the traversal; on a first page where member_states matched no national_transposition measures, the codes it named; with article, that interpreted_by leaves out rulings CELLAR records no provision for, or on a first page with none, the article it named; on a page with more rows, the offset to continue from; on a page ending at row 10,000, the relation types and directions that reached it, each with a ready-to-run eurlex_query_sparql query listing its older works; the rows whose provisions were withheld to fit the response budget, and the relation types whose provisions CELLAR did not return." - added
Output schema / properties / relations / items / properties / provisionsAdded value: +{ + "description": "The provisions CELLAR records this edge as targeting, distinct and sorted. They belong to the edge's object: this act on an incoming row (the articles a ruling interprets, the provisions an amending act changes), the related work on an outgoing one. Read for amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, interprets, interpreted_by, adopts, and adopted_by; absent on other types and on an edge CELLAR records no provision for, which does not mean the edge reaches the whole act. Compact codes read A article, P paragraph, L point letter or subparagraph number, PT numbered point, T indent, and BIS/TER/QUATER… the Latin ordinal of a lettered article (A17P1LC is Article 17(1)(c), A28QUATER Article 28c). Authority codes precede numbers, each {CODE|URI} token written as its CODE: AR article, PA paragraph, PO or PTA point, AN annex, ALN unnumbered paragraph, TIRE indent, CHA chapter, TXT text (AR 43 PA 4 is Article 43(4)).", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / relations / items / properties / provisions_withheldAdded value: +{ + "description": "How many provisions this row has but does not carry: withheld whole, largest row first, to keep a one-row-per-direction page within 64,000 UTF-8 bytes per surface, and named in the notice. Name fewer relation_types to receive them. Absent when nothing was withheld.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / relations / items / properties / relation_type / descriptionPrevious value: -"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, basis_for, interprets, interpreted_by, consolidated_version, national_transposition."New value: +"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, basis_for, interprets, interpreted_by, consolidated_version, national_transposition, adopts, adopted_by."
- Changed
eurlex_lookup_celex5 fields changed- changed
Input schema / properties / identifier / descriptionPrevious 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. A CELEX is also read in lowercase, after a CELEX: prefix, from a EUR-Lex page URL carrying uri=CELEX:… (e.g. https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679), or from a publications.europa.eu/resource/celex/ URI; an ELI over https, on the eur-lex.europa.eu host, without a scheme, with a trailing slash, or with a language segment after /oj or a date (…/oj/eng). A case number (C-131/12) names several records rather than one work and returns found false with a pointer to eurlex_get_cases."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; one followed by its parenthesized OJ reference (Directive 95/46/EC (OJ L 281, 23.11.1995, p. 31)) resolves as the citation. An Official Journal reference resolves, also under \"auto\", to the act starting on the page it cites: OJ L 281, 23.11.1995, p. 31 (also \"of 23.11.1995\", a page range, a class letter as in OJ L 42I, OJ C, and before 1968 the series-less OJ 13, 21.2.1962, p. 204/62), the year-first OJ 1995 L 281, p. 31, and the act-by-act OJ L, 2024/1689, 12.7.2024 or OJ C, C/2024/2664, 29.4.2024; the cited date must be the publication date. A reference without its year or first page (OJ L 281, OJ L 119/1) is not parsed. A CELEX is also read in lowercase, after a CELEX: prefix, from a EUR-Lex page URL carrying uri=CELEX:… (e.g. https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679), or from a publications.europa.eu/resource/celex/ URI; an ELI over https, on the eur-lex.europa.eu host, without a scheme, with a trailing slash, or with a language segment after /oj or a date (…/oj/eng). A case number (C-131/12) names several records rather than one work and returns found false with a pointer to eurlex_get_cases." - changed
Input schema / properties / identifier_type / descriptionPrevious 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\"."New value: +"Format of the identifier. \"auto\" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), an OJ citation, or an Official Journal reference; \"celex\", \"eli\", or \"ecli\" forces that lookup. An OJ citation or reference is recognized only under \"auto\"." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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, a CELEX (bare, after a CELEX: prefix, or in a EUR-Lex URL), a prefixed case number, nor an OJ citation naming its act type and year (e.g. \"Regulation No 17\" names no year), so no lookup branch applies. `sparql_error`: CELLAR rejected the lookup query this call sent. The same call fails the same way again. `sparql_timeout`: The lookup query ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. 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, a CELEX (bare, after a CELEX: prefix, or in a EUR-Lex URL), a prefixed case number, an OJ citation naming its act type and year (e.g. \"Regulation No 17\" names no year), nor an Official Journal reference naming its issue, year, and first page (e.g. \"OJ L 281\" names neither), so no lookup branch applies. `sparql_error`: CELLAR rejected the lookup query this call sent. The same call fails the same way again. `sparql_timeout`: The lookup query ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / found / descriptionPrevious 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, or the identifier is a case number, with a notice naming what was tried. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI, a CELEX in any accepted form, nor an OJ citation naming its act type and year raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, OJ citation, or Official Journal reference matches no work in the corpus, when an OJ reference's first page starts several acts, or when the identifier is a case number, with a notice naming what was tried. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI, a CELEX in any accepted form, an OJ citation naming its act type and year, nor an OJ reference naming its issue, year, and first page raises ambiguous_identifier instead." - changed
Output schema / properties / notice / descriptionPrevious value: -"Present only when found is false: the CELEX, ELI, or ECLI looked up, the accepted forms, and the search to use instead."New value: +"Present only when found is false: the CELEX, ELI, ECLI, or OJ reference looked up, the accepted forms, and the search to use instead; for an OJ reference whose first page starts several acts, the CELEX of each."
4 tool updates
- Changed
eurlex_get_cases3 fields changed- changed
Input schema / properties / case_type / anyOfPrevious value: -[ - { - "const": "", - "type": "string" - }, - { - "description": "judgment, order (procedural decision), or ag_opinion (Advocate General opinion).", - "enum": [ - "judgment", - "order", - "ag_opinion" - ], - "type": "string" - } -]New value: +[ + { + "const": "", + "type": "string" + }, + { + "description": "judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view).", + "enum": [ + "judgment", + "order", + "ag_opinion" + ], + "type": "string" + } +] - changed
Input schema / properties / case_type / descriptionPrevious value: -"Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all."New value: +"Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view). Omit to search all." - changed
Input schema / properties / include_derivative / descriptionPrevious 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)."New value: +"Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, AG opinions, and AG views. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already requires the selected primary type family)."
- Changed
eurlex_get_document3 fields changed- added
Output schema / properties / alternative_representationsAdded value: +{ + "description": "Verified alternative PDF stream locations; no claim that they contain every omitted table.", + "items": { + "additionalProperties": false, + "description": "One explicitly advertised PDF stream.", + "properties": { + "format": { + "const": "pdf", + "description": "Alternative format advertised by CELLAR.", + "type": "string" + }, + "language": { + "description": "Language of this representation.", + "type": "string" + }, + "url": { + "description": "CELLAR-advertised stream URL for this work and language.", + "type": "string" + } + }, + "required": [ + "format", + "language", + "url" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / content_omissionsAdded value: +{ + "additionalProperties": false, + "description": "Known source omissions; an available body can still omit substantive tables.", + "properties": { + "tables": { + "description": "Number of missing-table markers in the full source body, independent of the returned window.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "tables" + ], + "type": "object" +} - added
Output schema / properties / national_measureAdded value: +{ + "additionalProperties": false, + "description": "National implementing measure publication citation and notification facts recorded on the served work. Missing facts are omitted; no source URL is inferred.", + "properties": { + "journal": { + "description": "National official journal name supplied by CELLAR.", + "type": "string" + }, + "notification_date": { + "description": "Date the national measure was notified; not proof of complete transposition.", + "type": "string" + }, + "number": { + "description": "Official journal issue number, verbatim.", + "type": "string" + }, + "pages": { + "description": "Official journal pages, retaining leading zeroes.", + "type": "string" + }, + "publication_date": { + "description": "Publication date in the national official journal; distinct from the document date.", + "type": "string" + } + }, + "type": "object" +}
- Changed
eurlex_get_relations5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum related works per relation type and direction, served up to 100 per call (default 100); a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones. The cap applies to each type and direction separately, so on a heavily linked act a lower limit, with relation_types narrowed, keeps the response small."New value: +"Maximum related works per relation type and direction, served up to 100 per call (default 100); a larger value (up to 10,000) is served at 100 and reported in limit_clamp. A response-budget cut can lower the common depth further to fit each complete surface within 64,000 UTF-8 bytes, never below 1; the notice reports requested/applied limits and withheld rows. Incoming edges are newest-first. Continue at next_offset for older works; narrow relation_types or lower limit for a smaller response." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works. Must be below 10,000: CELLAR sorts at most 10,000 related works per type and direction, so pages stop at row 10,000."New value: +"Pagination offset applied per relation type and direction — related works to skip (default 0). Continue at the returned next_offset, which adds the applied depth after any response-budget cut; incoming edges are newest-first, so higher offsets reach older works. Must be below 10,000: CELLAR sorts at most 10,000 related works per type and direction, so pages stop at row 10,000." - changed
Input schema / properties / relation_types / descriptionPrevious 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), basis_for (works naming this act among their legal bases — implementing and delegated acts, decisions, Parliament resolutions, drafts; the incoming side of legal_basis), interprets (for a ruling: the acts it interprets), interpreted_by (CJEU and General Court rulings interpreting this act; the incoming side of interprets), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures). Omitted on a heavily linked act (the GDPR, a framework regulation), the call returns hundreds of related works with whole titles — a response of well over 100 KB; name only the types you need."New value: +"Subset of relation types to return; omit for all thirteen, equivalent to listing them explicitly. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), basis_for (works naming this act among their legal bases — implementing and delegated acts, decisions, Parliament resolutions, drafts; the incoming side of legal_basis), interprets (for a ruling: the acts it interprets), interpreted_by (CJEU and General Court rulings interpreting this act; the incoming side of interprets), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures). Whole rows and titles are kept within a 64,000 UTF-8 byte budget per complete response surface by lowering the common per-type/direction depth, never below 1; an oversize depth-1 page is returned whole with disclosure. Name only the types you need to reduce the response." - changed
Output schema / properties / has_more / descriptionPrevious value: -"True only when at least one requested relation type/direction returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice names the types and directions that reached it."New value: +"True when an additional valid row or a response-budget cut proves at least one requested relation type/direction has more rows. False on a retained page that ends at row 10,000, the last one CELLAR sorts; its notice names the types and directions that reached it." - changed
Output schema / properties / next_offset / descriptionPrevious value: -"Offset for the next page. Present only when has_more is true."New value: +"Offset plus the applied per-type/direction depth after any response-budget cut. Present only when has_more is true; use this value to continue without skipping withheld rows."
- Changed
eurlex_search_documents1 field changed- changed
Input schema / properties / author_institution / descriptionPrevious 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."New value: +"Author name (e.g. \"European Parliament\", \"Council\", \"European Commission\", \"Supremo Tribunal de Justiça\"), matched as a phrase against English authority labels or national-court names — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included."
7 tool updates
- Changed
eurlex_browse_subjects8 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of EuroVoc concepts to return (1–50). Defaults to 20."New value: +"Maximum number of EuroVoc concepts to return, served up to 50 per call; a larger value (up to 10,000) is served at 50 and reported in limit_clamp. Defaults to 20." - changed
Input schema / properties / limit / maximumPrevious value: -50New value: +10000 - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset — number of concepts to skip. Defaults to 0."New value: +"Pagination offset — number of concepts to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one search. `sparql_error`: CELLAR rejected the thesaurus search this call sent. The same call fails the same way again. `sparql_timeout`: The thesaurus search ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - added
Output schema / properties / error / properties / data / properties / reason / examplesAdded value: +[ + "offset_past_window", + "sparql_error", + "sparql_timeout" +] - changed
Output schema / properties / has_more / descriptionPrevious value: -"True only when CELLAR returned an additional valid row beyond this page."New value: +"True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match." - added
Output schema / properties / limit_clampAdded value: +{ + "additionalProperties": false, + "description": "Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.", + "properties": { + "applied": { + "description": "The limit served: the per-call maximum.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "requested": { + "description": "The limit the call asked for.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"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; on a page ending at row 10,000, that no later page can be read and how to narrow the keyword."
- Changed
eurlex_get_cases8 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return (1–100). Defaults to 20."New value: +"Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +10000 - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset — number of results to skip. Defaults to 0."New value: +"Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to window to reach older cases." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one search. `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`: CELLAR rejected the search it was sent: a filter combination its query planner cannot compile. The same call fails the same way again. `sparql_timeout`: The search ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "invalid_case_number", - "invalid_keyword", - "sparql_error" -]New value: +[ + "offset_past_window", + "invalid_date_range", + "invalid_case_number", + "invalid_keyword", + "sparql_error", + "sparql_timeout" +] - changed
Output schema / properties / has_more / descriptionPrevious value: -"True only when CELLAR returned an additional valid row beyond this page."New value: +"True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match." - added
Output schema / properties / limit_clampAdded value: +{ + "additionalProperties": false, + "description": "Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.", + "properties": { + "applied": { + "description": "The limit served: the per-call maximum.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "requested": { + "description": "The limit the call asked for.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"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; on a page ending at row 10,000, that no later page can be read and the closed date_from/date_to window that continues past it."
- Changed
eurlex_get_document9 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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."New value: +"Maximum characters to return in this window (\"paged\" mode only; select ignores it). Default 25000; a window holds at most 100000 characters, so a larger value is served at 100000 and reported in limit_clamp. Follow has_more and the returned offsets until false to reconstruct the complete body." - removed
Input schema / properties / limit / maximumRemoved value: -100000 - changed
Input schema / properties / select / descriptionPrevious 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\"."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. An act's section runs to its next heading, and its last article, section, and chapter stop where the enacting terms end: the closing formula, signatures, and footnotes after them (and in xml the annexes) belong to no section, nor do the notes closing a consolidated text — read those by paging on from the section's end. 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\"." - changed
Input schema / properties / select / properties / annexes / descriptionPrevious value: -"Comma-separated annex numbers or letters, e.g. \"I,II\"."New value: +"Comma-separated annex numbers or letters, e.g. \"I,II\". \"ANNEX\" alone (any case, or the served language's annex word, e.g. \"Anhang\") selects an act's lone unnumbered annex; on an act whose annexes are numbered it misses, and the notice names their numbers." - changed
Input schema / properties / work_uri / descriptionPrevious 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."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. An expression or manifestation URI (…/cellar/{id}.0006, ….0006.03) is served as the work it belongs to, with a notice. Provide exactly one of celex_number, eli_uri, or work_uri." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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 (for an expression or manifestation URI, the work it belongs to) carries no CELEX number. `content_challenge`: The primary content response is an AWS WAF bot-challenge interstitial rather than legal text. `sparql_error`: CELLAR rejected a query this call sent to resolve the identifier or read its metadata. The same call fails the same way again. `sparql_timeout`: A query this call sent to CELLAR ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_identifier_args", - "not_found", - "content_challenge" -]New value: +[ + "invalid_identifier_args", + "not_found", + "content_challenge", + "sparql_error", + "sparql_timeout" +] - added
Output schema / properties / limit_clampAdded value: +{ + "additionalProperties": false, + "description": "Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.", + "properties": { + "applied": { + "description": "The limit served: the per-call maximum.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "requested": { + "description": "The limit the call asked for.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious 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."New value: +"How to retrieve the remaining document content; when select.annexes asked for \"ANNEX\" on an act whose annexes are numbered, which numbers select one; when work_uri names an expression or manifestation, the work served in its place; 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."
- Changed
eurlex_get_relations13 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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."New value: +"Maximum related works per relation type and direction, served up to 100 per call (default 100); a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones. The cap applies to each type and direction separately, so on a heavily linked act a lower limit, with relation_types narrowed, keeps the response small." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +10000 - added
Input schema / properties / member_statesAdded value: +{ + "description": "Narrow national_transposition rows to the measures of these member states — the 27 member states plus the United Kingdom, by alpha-3 or two-letter code, in any case. Paging, has_more, and next_offset then count matching measures only; other relation types are unaffected. With an explicit relation_types, include national_transposition. An empty list is the same as omitting it.", + "items": { + "description": "A member state as its ISO 3166-1 alpha-3 code (DEU, GRC, GBR for the United Kingdom) or two-letter code (DE; EL or GR for Greece; UK or GB), in any case.", + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works."New value: +"Pagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works. Must be below 10,000: CELLAR sorts at most 10,000 related works per type and direction, so pages stop at row 10,000." - changed
Input schema / properties / relation_types / descriptionPrevious 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)."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), basis_for (works naming this act among their legal bases — implementing and delegated acts, decisions, Parliament resolutions, drafts; the incoming side of legal_basis), interprets (for a ruling: the acts it interprets), interpreted_by (CJEU and General Court rulings interpreting this act; the incoming side of interprets), consolidated_version (consolidated texts of this act), national_transposition (member-state implementing measures). Omitted on a heavily linked act (the GDPR, a framework regulation), the call returns hundreds of related works with whole titles — a response of well over 100 KB; name only the types you need." - changed
Input schema / properties / relation_types / items / enumPrevious value: -[ - "cites", - "amends", - "amended_by", - "repeals", - "repealed_by", - "implicitly_repeals", - "implicitly_repealed_by", - "legal_basis", - "consolidated_version", - "national_transposition" -]New value: +[ + "cites", + "amends", + "amended_by", + "repeals", + "repealed_by", + "implicitly_repeals", + "implicitly_repealed_by", + "legal_basis", + "basis_for", + "interprets", + "interpreted_by", + "consolidated_version", + "national_transposition" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one relation type and direction. `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `member_states_not_applicable`: member_states was given with a relation_types list that does not include national_transposition, the only type it filters. `not_found`: The CELEX number, given directly or as a resource/celex/ work URI, is not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `sparql_error`: CELLAR rejected a query this traversal sent. The same call fails the same way again. `sparql_timeout`: A query this traversal sent ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_identifier_args", - "not_found" -]New value: +[ + "offset_past_window", + "invalid_identifier_args", + "member_states_not_applicable", + "not_found", + "sparql_error", + "sparql_timeout" +] - changed
Output schema / properties / has_more / descriptionPrevious value: -"True only when at least one requested relation type/direction returned an additional valid row beyond this page."New value: +"True only when at least one requested relation type/direction returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice names the types and directions that reached it." - added
Output schema / properties / limit_clampAdded value: +{ + "additionalProperties": false, + "description": "Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.", + "properties": { + "applied": { + "description": "The limit served: the per-call maximum.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "requested": { + "description": "The limit the call asked for.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "requested", + "applied" + ], + "type": "object" +} - added
Output schema / properties / member_statesAdded value: +{ + "description": "The member states national_transposition rows were narrowed to, as ISO 3166-1 alpha-3 codes, normalized from member_states and de-duplicated. Absent when no member_states filter was given.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"Guidance for the next call: on an empty first page, how to widen the traversal; on a first page where member_states matched no national_transposition measures, the codes it named; on a page with more rows, the offset to continue from; on a page ending at row 10,000, the relation types and directions that reached it, each with a ready-to-run eurlex_query_sparql query listing its older works." - changed
Output schema / properties / relations / items / properties / relation_type / descriptionPrevious value: -"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, consolidated_version, national_transposition."New value: +"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, basis_for, interprets, interpreted_by, consolidated_version, national_transposition."
- Changed
eurlex_lookup_celex4 fields changed- changed
Input schema / properties / identifier / descriptionPrevious 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."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. A CELEX is also read in lowercase, after a CELEX: prefix, from a EUR-Lex page URL carrying uri=CELEX:… (e.g. https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679), or from a publications.europa.eu/resource/celex/ URI; an ELI over https, on the eur-lex.europa.eu host, without a scheme, with a trailing slash, or with a language segment after /oj or a date (…/oj/eng). A case number (C-131/12) names several records rather than one work and returns found false with a pointer to eurlex_get_cases." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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, a CELEX (bare, after a CELEX: prefix, or in a EUR-Lex URL), a prefixed case number, nor an OJ citation naming its act type and year (e.g. \"Regulation No 17\" names no year), so no lookup branch applies. `sparql_error`: CELLAR rejected the lookup query this call sent. The same call fails the same way again. `sparql_timeout`: The lookup query ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "ambiguous_identifier" -]New value: +[ + "ambiguous_identifier", + "sparql_error", + "sparql_timeout" +] - changed
Output schema / properties / found / descriptionPrevious 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."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, or the identifier is a case number, with a notice naming what was tried. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI, a CELEX in any accepted form, nor an OJ citation naming its act type and year raises ambiguous_identifier instead."
- Changed
eurlex_query_sparql6 fields changed- changed
Input schema / properties / sparql_query / descriptionPrevious 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."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 the server row cap (100 unless the deployment configures a lower one) if absent, or capped to it; to read past the cap, add ORDER BY and repeat the query with OFFSET raised by the cap (a sorted query reaches row 10,000 at most). 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." - changed
Input schema / properties / timeout_hint / descriptionPrevious value: -"Optional client-side timeout in milliseconds (1000–55000). Defaults apply when omitted; the endpoint hard limit is 60 seconds."New value: +"Optional client-side timeout in milliseconds (1000–55000). The server default (55000 unless the deployment configures another value) applies when omitted." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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`: CELLAR rejected the query: a syntax or semantic error, a compile error, or a sorted query whose OFFSET + LIMIT passes row 10,000 (SR353, answered with its own recovery: lower OFFSET or narrow the query). The same query fails the same way again. `sparql_timeout`: The query ran past the client-side timeout (timeout_hint, default 55 s), or Virtuoso refused it as over its estimated-cost limit. Neither is retried: the call fails inside the configured bound. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"On a truncated result: how to page past the row cap with ORDER BY and OFFSET, and the 10,000-row limit on a sorted query. 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." - changed
Output schema / properties / total / descriptionPrevious value: -"Number of binding rows returned (capped at 100 by the server)."New value: +"Number of binding rows returned (at most the server's row cap, 100 by default)." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the server-enforced result ceiling capped the rows and more may exist upstream — narrow the query with FILTERs to see the rest."New value: +"True when the server's row cap (the deployment's configured cap, 100 by default; cap gives the value applied) limited the rows and more may exist upstream — page on with ORDER BY in the query and OFFSET raised by the cap per call (sorted queries reach row 10,000 at most), or narrow the query with FILTERs."
- Changed
eurlex_search_documents8 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return (1–100). Defaults to 20."New value: +"Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +10000 - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset — number of results to skip. Defaults to 0."New value: +"Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to window to reach older documents." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one search. `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`: CELLAR rejected the search it was sent: a filter combination its query planner cannot compile. The same call fails the same way again. `sparql_timeout`: The search ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_filters", - "invalid_date_range", - "invalid_author_institution", - "invalid_keyword", - "sparql_error" -]New value: +[ + "offset_past_window", + "no_filters", + "invalid_date_range", + "invalid_author_institution", + "invalid_keyword", + "sparql_error", + "sparql_timeout" +] - changed
Output schema / properties / has_more / descriptionPrevious value: -"True only when CELLAR returned an additional valid row beyond this page."New value: +"True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match." - added
Output schema / properties / limit_clampAdded value: +{ + "additionalProperties": false, + "description": "Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.", + "properties": { + "applied": { + "description": "The limit served: the per-call maximum.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "requested": { + "description": "The limit the call asked for.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "requested", + "applied" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"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; on a page ending at row 10,000, that no later page can be read and the closed date_from/date_to window that continues past it."
1 tool update
- Changed
eurlex_search_documents2 fields changed- changed
Input schema / properties / eurovoc_concept / descriptionPrevious 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." - changed
Output schema / properties / query_echo / properties / eurovoc_concept / descriptionPrevious value: -"EuroVoc concept URI filter applied."New value: +"EuroVoc concept URI filter applied, in the http://eurovoc.europa.eu/ form it was matched as."
4 tool updates
- Changed
eurlex_get_cases5 fields changed- added
Output schema / properties / cases / items / properties / advocate_generalAdded value: +{ + "description": "Advocate General who delivered the opinion, from an AG opinion title (e.g. \"Jääskinen\"). Absent on judgments and orders.", + "type": "string" +} - changed
Output schema / properties / cases / items / properties / display_title / descriptionPrevious 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." - added
Output schema / properties / cases / items / properties / formationAdded 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" +} - added
Output schema / properties / cases / items / properties / referring_courtAdded 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" +} - changed
Output schema / properties / cases / items / properties / title / descriptionPrevious 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."
- Changed
eurlex_get_document20 fields changed- changed
Input schema / properties / outline / descriptionPrevious 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\"." - changed
Input schema / properties / select / descriptionPrevious 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\"." - added
Input schema / properties / select / properties / headingsAdded 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" +} - added
Input schema / properties / select / properties / operative_partAdded 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" +} - changed
Output schema / properties / author_institution / descriptionPrevious 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." - changed
Output schema / properties / author_institutions / descriptionPrevious 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." - changed
Output schema / properties / author_institutions / items / descriptionPrevious value: -"Human-readable institution name."New value: +"Author label, as in author_institution." - added
Output schema / properties / case_referenceAdded value: +{ + "description": "Case law: the case reference from the title (e.g. \"Case C-131/12.\").", + "type": "string" +} - added
Output schema / properties / ecliAdded 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" +} - added
Output schema / properties / formationAdded 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" +} - changed
Output schema / properties / outline / items / properties / kind / descriptionPrevious 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." - changed
Output schema / properties / outline / items / properties / label / descriptionPrevious 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\"." - changed
Output schema / properties / outline / items / properties / number / descriptionPrevious 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." - added
Output schema / properties / referring_courtAdded 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" +} - changed
Output schema / properties / selected_sections / items / properties / label / descriptionPrevious 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." - changed
Output schema / properties / selection / properties / matched / descriptionPrevious 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." - changed
Output schema / properties / selection / properties / requested / descriptionPrevious 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." - changed
Output schema / properties / structure_detected / descriptionPrevious 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\"." - added
Output schema / properties / subject_matterAdded value: +{ + "description": "Case law: the subject-matter keyword list from the title (e.g. \"Personal data – Protection of individuals …\").", + "type": "string" +} - changed
Output schema / properties / title / descriptionPrevious 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."
- Changed
eurlex_get_relations2 fields changed- added
Output schema / properties / relations / items / properties / related_dateAdded 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" +} - added
Output schema / properties / relations / items / properties / related_titleAdded 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" +}
- Changed
eurlex_search_documents2 fields changed- changed
Input schema / properties / author_institution / descriptionPrevious 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." - changed
Input schema / properties / keyword / descriptionPrevious 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."
5 tool updates
- Changed
eurlex_browse_subjects2 fields changed- changed
Output schema / properties / concepts / descriptionPrevious 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." - changed
Output schema / properties / concepts / items / properties / matched_label / descriptionPrevious 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."
- Changed
eurlex_get_cases2 fields changed- changed
Input schema / properties / case_number / descriptionPrevious 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." - changed
Input schema / properties / keyword / descriptionPrevious 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."
- Changed
eurlex_lookup_celex5 fields changed- changed
Input schema / properties / identifier / descriptionPrevious 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." - changed
Input schema / properties / identifier_type / descriptionPrevious 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\"." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / found / descriptionPrevious 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." - added
Output schema / properties / noticeAdded 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" +}
- Changed
eurlex_query_sparql4 fields changed- changed
Input schema / properties / sparql_query / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "not_read_only", - "sparql_error", - "sparql_timeout" -]New value: +[ + "not_read_only", + "unsupported_query_form", + "sparql_error", + "sparql_timeout" +] - added
Output schema / properties / noticeAdded 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" +}
- Changed
eurlex_search_documents1 field changed- changed
Input schema / properties / keyword / descriptionPrevious 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."
1 tool update
- Changed
eurlex_get_document9 fields changed- added
Input schema / properties / include_recitalsAdded 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" +} - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / outline / descriptionPrevious 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\"." - changed
Input schema / properties / select / descriptionPrevious 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\"." - changed
Output schema / properties / outline / items / properties / label / descriptionPrevious 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." - changed
Output schema / properties / outline / items / properties / number / descriptionPrevious 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." - changed
Output schema / properties / selected_sections / items / properties / label / descriptionPrevious value: -"Section descriptor, e.g. \"Article 17\"."New value: +"Section label in English whatever the language and format, e.g. \"Article 17\"." - changed
Output schema / properties / selection / properties / matched / descriptionPrevious 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." - changed
Output schema / properties / selection / properties / requested / descriptionPrevious 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\"]."
3 tool updates
- Changed
eurlex_get_document16 fields changed- changed
Input schema / properties / resolve / descriptionPrevious 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." - changed
Input schema / properties / work_uri / descriptionPrevious 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." - changed
Output schema / properties / author_institution / descriptionPrevious 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." - changed
Output schema / properties / author_institutions / descriptionPrevious 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." - added
Output schema / properties / base_act_celexAdded 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" +} - changed
Output schema / properties / consolidated_as_of / descriptionPrevious 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." - changed
Output schema / properties / current_consolidated_celex / descriptionPrevious 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." - added
Output schema / properties / end_of_validityAdded 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" +} - added
Output schema / properties / entry_into_forceAdded 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" +} - changed
Output schema / properties / eurovoc_subjects / descriptionPrevious 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." - changed
Output schema / properties / in_force / descriptionPrevious 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." - changed
Output schema / properties / is_superseded / descriptionPrevious 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." - changed
Output schema / properties / legal_basis / descriptionPrevious 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." - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / repealed_byAdded 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" +} - changed
Output schema / properties / requested_celex / descriptionPrevious 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."
- Changed
eurlex_get_relations1 field changed- changed
Input schema / properties / work_uri / descriptionPrevious 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."
- Changed
eurlex_search_documents2 fields changed- changed
Input schema / properties / in_force / descriptionPrevious 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." - changed
Output schema / properties / documents / items / properties / is_consolidated / descriptionPrevious 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."
4 tool updates
- Changed
eurlex_browse_subjects3 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - removed
Output schema / properties / error / properties / data / properties / reason / examplesRemoved value: -[ - "no_concepts" -] - added
Output schema / properties / noticeAdded 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" +}
- Changed
eurlex_get_cases4 fields changed- changed
Input schema / properties / keyword / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "invalid_case_number", - "no_results", - "sparql_error" -]New value: +[ + "invalid_date_range", + "invalid_case_number", + "invalid_keyword", + "sparql_error" +] - added
Output schema / properties / noticeAdded 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" +}
- Changed
eurlex_get_relations4 fields changed- changed
Output schema / properties / empty_relation_types / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_identifier_args", - "not_found", - "no_relations" -]New value: +[ + "invalid_identifier_args", + "not_found" +] - added
Output schema / properties / noticeAdded 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" +}
- Changed
eurlex_search_documents4 fields changed- changed
Input schema / properties / keyword / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_filters", - "invalid_date_range", - "no_results", - "sparql_error" -]New value: +[ + "no_filters", + "invalid_date_range", + "invalid_author_institution", + "invalid_keyword", + "sparql_error" +] - added
Output schema / properties / noticeAdded 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" +}
4 tool updates
- Changed
eurlex_get_cases1 field changed- changed
Output schema / properties / cases / descriptionPrevious 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."
- Changed
eurlex_get_document4 fields changed- added
Output schema / properties / advocates_generalAdded 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" +} - changed
Output schema / properties / author_institution / descriptionPrevious 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." - changed
Output schema / properties / author_institutions / descriptionPrevious 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." - changed
Output schema / properties / author_institutions / items / descriptionPrevious value: -"Human-readable EU institution name."New value: +"Human-readable institution name."
- Changed
eurlex_lookup_celex1 field changed- changed
Output schema / properties / ecli / descriptionPrevious 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."
- Changed
eurlex_search_documents1 field changed- changed
Output schema / properties / documents / descriptionPrevious 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."
5 tool updates
- Changed
eurlex_get_cases7 fields changed- changed
Input schema / properties / case_number / descriptionPrevious 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." - changed
Input schema / properties / court / anyOfPrevious 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" + } +] - changed
Input schema / properties / court / descriptionPrevious 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." - added
Output schema / properties / cases / items / properties / ecliAdded 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" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "no_results", - "sparql_error" -]New value: +[ + "invalid_date_range", + "invalid_case_number", + "no_results", + "sparql_error" +] - changed
Output schema / properties / query_echo / properties / celex_fragment / descriptionPrevious 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."
- Changed
eurlex_get_document4 fields changed- changed
Input schema / properties / select / descriptionPrevious 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\"." - changed
Output schema / properties / content / descriptionPrevious 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." - changed
Output schema / properties / selected_sections / descriptionPrevious 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." - changed
Output schema / properties / selection / descriptionPrevious 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."
- Changed
eurlex_get_relations1 field changed- added
Output schema / properties / relations / items / properties / related_member_stateAdded 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" +}
- Changed
eurlex_lookup_celex6 fields changed- changed
Input schema / properties / identifier / descriptionPrevious 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)." - changed
Input schema / properties / identifier_type / descriptionPrevious 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." - changed
Input schema / properties / identifier_type / enumPrevious value: -[ - "celex", - "eli", - "auto" -]New value: +[ + "celex", + "eli", + "ecli", + "auto" +] - added
Output schema / properties / ecliAdded 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" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / found / descriptionPrevious 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."
- Changed
eurlex_query_sparql1 field changed- changed
Input schema / properties / sparql_query / descriptionPrevious 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."
3 tool updates
- Changed
eurlex_get_document6 fields changed- changed
Output schema / properties / content / descriptionPrevious 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." - changed
Output schema / properties / content_offset / descriptionPrevious 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." - changed
Output schema / properties / has_more / descriptionPrevious 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." - added
Output schema / properties / selected_sectionsAdded 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" +} - changed
Output schema / properties / selection / descriptionPrevious 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." - changed
Output schema / properties / selection / properties / matched / descriptionPrevious value: -"Section descriptors found and returned in content, in document order."New value: +"Section descriptors located in the body, in document order."
- Changed
eurlex_lookup_celex1 field changed- changed
Output schema / properties / resource_type / descriptionPrevious 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."
- Changed
eurlex_search_documents6 fields changed- changed
Input schema / properties / in_force / descriptionPrevious 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." - added
Input schema / properties / include_corrigendaAdded 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" +} - added
Output schema / properties / documents / items / properties / is_corrigendumAdded 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" +} - changed
Output schema / properties / documents / items / requiredPrevious value: -[ - "work_uri", - "celex_number", - "is_consolidated" -]New value: +[ + "work_uri", + "celex_number", + "is_consolidated", + "is_corrigendum" +] - added
Output schema / properties / query_echo / properties / include_corrigendaAdded 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" +} - changed
Output schema / properties / query_echo / requiredPrevious value: -[ - "include_consolidated" -]New value: +[ + "include_consolidated", + "include_corrigenda" +]
3 tool updates
- Changed
eurlex_get_document12 fields changed- changed
Output schema / properties / eurovoc_subjects / descriptionPrevious value: -"EuroVoc subject classifications."New value: +"EuroVoc subject classifications. Absent when none are recorded." - added
Output schema / properties / eurovoc_subjects / items / additionalPropertiesAdded value: +false - changed
Output schema / properties / eurovoc_subjects / items / descriptionPrevious value: -"EuroVoc concept URI."New value: +"An EuroVoc subject: its concept URI plus its preferred label when available." - added
Output schema / properties / eurovoc_subjects / items / propertiesAdded 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" + } +} - added
Output schema / properties / eurovoc_subjects / items / requiredAdded value: +[ + "concept_uri" +] - changed
Output schema / properties / eurovoc_subjects / items / typePrevious value: -"string"New value: +"object" - changed
Output schema / properties / legal_basis / descriptionPrevious value: -"Legal basis acts for this work."New value: +"Legal basis acts for this work. Absent when none are recorded." - added
Output schema / properties / legal_basis / items / additionalPropertiesAdded value: +false - changed
Output schema / properties / legal_basis / items / descriptionPrevious 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." - added
Output schema / properties / legal_basis / items / propertiesAdded 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" + } +} - added
Output schema / properties / legal_basis / items / requiredAdded value: +[ + "work_uri" +] - changed
Output schema / properties / legal_basis / items / typePrevious value: -"string"New value: +"object"
- Changed
eurlex_lookup_celex1 field changed- changed
Output schema / properties / resource_type / descriptionPrevious 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."
- Changed
eurlex_query_sparql1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."
6 tool updates
- Changed
eurlex_browse_subjects7 fields changed- changed
Input schema / properties / keyword / descriptionPrevious 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\")." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "concepts", - "total", - "offset" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "concepts", + "total", + "offset", + "has_more" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / concepts / items / properties / matched_labelAdded 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" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - added
Output schema / properties / has_moreAdded value: +{ + "description": "True only when CELLAR returned an additional valid row beyond this page.", + "type": "boolean" +} - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset for the next page. Present only when has_more is true.", + "type": "number" +} - changed
Output schema / properties / truncated / descriptionPrevious 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."
- Changed
eurlex_get_cases6 fields changed- changed
Output schema / anyOfPrevious 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" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_results", - "sparql_error" -]New value: +[ + "invalid_date_range", + "no_results", + "sparql_error" +] - added
Output schema / properties / has_moreAdded value: +{ + "description": "True only when CELLAR returned an additional valid row beyond this page.", + "type": "boolean" +} - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset for the next page. Present only when has_more is true.", + "type": "number" +} - changed
Output schema / properties / truncated / descriptionPrevious 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."
- Changed
eurlex_get_document2 fields changed- added
Input schema / properties / celex_number / anyOfAdded 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" + } +] - removed
Input schema / properties / celex_number / typeRemoved value: -"string"
- Changed
eurlex_get_relations17 fields changed- added
Input schema / properties / celex_number / anyOfAdded 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" + } +] - removed
Input schema / properties / celex_number / typeRemoved value: -"string" - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / relation_types / descriptionPrevious 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)." - changed
Input schema / properties / relation_types / items / enumPrevious 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" +] - changed
Input schema / properties / work_uri / descriptionPrevious 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." - changed
Output schema / anyOfPrevious 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" + ] + } +] - changed
Output schema / properties / cap / descriptionPrevious 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." - changed
Output schema / properties / celex_number / descriptionPrevious 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." - changed
Output schema / properties / empty_relation_types / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - added
Output schema / properties / has_moreAdded value: +{ + "description": "True only when at least one requested relation type/direction returned an additional valid row beyond this page.", + "type": "boolean" +} - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset for the next page. Present only when has_more is true.", + "type": "number" +} - changed
Output schema / properties / relations / items / properties / relation_type / descriptionPrevious 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." - changed
Output schema / properties / shown / descriptionPrevious 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." - changed
Output schema / properties / total / descriptionPrevious 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)." - changed
Output schema / properties / truncated / descriptionPrevious 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."
- Changed
eurlex_lookup_celex2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / found / descriptionPrevious 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."
- Changed
eurlex_search_documents6 fields changed- changed
Output schema / anyOfPrevious 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" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_filters", - "no_results", - "sparql_error" -]New value: +[ + "no_filters", + "invalid_date_range", + "no_results", + "sparql_error" +] - added
Output schema / properties / has_moreAdded value: +{ + "description": "True only when CELLAR returned an additional valid row beyond this page.", + "type": "boolean" +} - added
Output schema / properties / next_offsetAdded value: +{ + "description": "Offset for the next page. Present only when has_more is true.", + "type": "number" +} - changed
Output schema / properties / truncated / descriptionPrevious 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."
1 tool update
- Changed
eurlex_get_document12 fields changed- changed
Input schema / properties / content_mode / descriptionPrevious 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\"." - changed
Input schema / properties / language / descriptionPrevious 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." - changed
Input schema / properties / language / patternPrevious 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])$" - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Output schema / anyOfPrevious 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" + ] + } +] - changed
Output schema / properties / content / descriptionPrevious 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." - added
Output schema / properties / content_statusAdded 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" +} - added
Output schema / properties / content_unavailability_reasonAdded 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" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_identifier_args", - "not_found", - "language_unavailable", - "content_fetch_failed" -]New value: +[ + "invalid_identifier_args", + "not_found", + "content_challenge" +] - changed
Output schema / properties / has_more / descriptionPrevious 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." - added
Output schema / properties / requested_languageAdded value: +{ + "description": "Originally requested language code when English fallback changed the effective language reported in language.", + "type": "string" +}
1 tool update
- Changed
eurlex_search_documents3 fields changed- changed
Input schema / properties / document_type / descriptionPrevious 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." - changed
Input schema / properties / include_consolidated / descriptionPrevious 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." - changed
Output schema / properties / query_echo / properties / include_consolidated / descriptionPrevious 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."
Related MCP Connectors
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Every document the Publications Office of the European Union publishes — legislation, treaties…
Search Swiss federal legislation: laws, articles, amendments via the Fedlex SPARQL endpoint.
EU law for AI: EUR-Lex legislation and case law, citation graph, semantic search with asOf.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving EU official documents from the CELLAR repository by title, CELEX number, or custom SPARQL queries.417 npmMIT
- AlicenseAqualityAmaintenanceEnables searching and retrieving EU legal documents (regulations, directives, court decisions) via the EUR-Lex Cellar API, supporting full-text search, metadata, citations, and consolidated versions without requiring an API key.11291 npm7MIT
- AlicenseNot gradedqualityFmaintenanceProvides structured access to EU treaties, regulations, directives, and CJEU case law via 14 tools for searching, retrieving, and analyzing legislation and court decisions.Apache 2.0
- AlicenseAqualityBmaintenanceMCP server for EU law via the EUR-Lex / Cellar SPARQL endpoint — legislation (ELI/CELEX) and CJEU case-law (ECLI) with verifiable citations.3133 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.