eur-lex-mcp-server
Server Details
Search EU legislation, CJEU case law, and treaties; traverse CELLAR graph; browse EuroVoc concepts.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/eur-lex-mcp-server
- GitHub Stars
- 7
- Server Listing
- @cyanheads/eur-lex-mcp-server
TDQS
Scored across 7 tools
Each tool targets a distinct resource or operation: thesaurus browsing, case law search, document retrieval, relation traversal, citation resolution, raw SPARQL, and document search. There is no meaningful overlap, and complementary tools like lookup_celex and get_document clearly build on each other.
All tool names follow the uniform eurlex_<verb>_<noun> pattern, with consistent snake_case throughout. The verbs (browse, get, lookup, search, query) are reasonably distinct and align with their noun objects, making the API predictable.
Seven tools is well within the ideal range and each one earns its place in covering EU legal research workflows. The count feels neither padded nor sparse for the server's stated purpose.
The set covers the core lifecycle of finding and exploring EU legal documents: search legislation, browse subject vocabulary, resolve citations, fetch full text, and traverse relations. A minor gap is that case law search returns metadata but no obvious direct full-text retrieval for judgments, though query_sparql offers an escape hatch.
Available Tools
7 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, ordered alphabetically by preferred label.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of EuroVoc concepts to return (1–50). Defaults to 20. | |
| offset | No | Pagination offset — number of concepts to skip. Defaults to 0. | |
| 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. |
| offset | No | Pagination offset used for this response. |
| concepts | No | Matching EuroVoc concepts ordered alphabetically by label. |
| has_more | No | True only when CELLAR returned an additional valid row beyond this page. |
| truncated | No | True when an additional CELLAR row proves more concepts exist beyond this page. |
| 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?
The description reveals useful behavior beyond the annotations: it matches both preferred and alternative labels, returns the matched alternative label when applicable, and orders results by preferred label. Annotations already convey read-only, idempotent, and open-world traits, and the description does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three compact sentences, each earning its place: the first defines purpose and integration, the second explains matching behavior, and the third defines the returned fields and ordering. It is front-loaded with the most actionable information and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, downstream usage, matching behavior, and output fields, while the output schema handles detailed return structure. Annotations cover safety and open-world semantics. Nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage with clear descriptions, defaults, bounds, and examples for keyword, language, limit, and offset. The description reinforces the matching semantics of keyword and mentions the requested language, but it adds no new parameter-level detail beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches the EuroVoc thesaurus and resolves keywords into concept URIs, pairing a specific verb with a defined resource. It also distinguishes its output from the sibling eurlex_search_documents by noting these URIs feed that tool's eurovoc_concept filter, so an agent can tell which role it plays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use the tool: when a keyword needs to be mapped to EuroVoc concept URIs for use as a subject filter in eurlex_search_documents. It provides clear context but does not explicitly name alternatives or state when not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eurlex_get_casesSearch CJEU/GC Case LawARead-onlyInspect
Search CJEU and General Court case law — judgments, orders, and Advocate General opinions — by case number, court, case type, keyword, and date range. By default only these primary records are returned; derivative judicial information notices, case abstracts, summaries, and corrigenda are excluded so distinct cases fill the page (set include_derivative to include them). Keyword matches English case titles (which carry party names) and CELEX strings; there is no full-text body search. Returns each case with its court, date, and type, plus — parsed from the title where present — the parties, subject matter, and case reference.
| Name | Required | Description | Default |
|---|---|---|---|
| court | No | Court filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both. | |
| limit | No | Maximum number of results to return (1–100). Defaults to 20. | |
| offset | No | Pagination offset — number of results to skip. Defaults to 0. | |
| 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 to match against case titles and CELEX strings. | |
| case_type | No | Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). 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 | Case number in standard format: C-{num}/{year} for CJEU or T-{num}/{year} for General Court (e.g. C-131/12). | |
| include_derivative | No | 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). |
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. |
| 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). |
| offset | No | Pagination offset used for this response. |
| has_more | No | True only when CELLAR returned an additional valid row beyond this page. |
| 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. |
| 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 only carry readOnlyHint=true and openWorldHint=true. The description adds substantial behavioral context beyond them: the default exclusion of derivative records 'so distinct cases fill the page', the keyword scope limitation, and the caveat that parties/subject matter/case reference are 'parsed from the title where present.' It also clarifies that case_type being set returns a single primary type. All consistent with the read-only annotations — no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences front-load the purpose, then cover default filtering, keyword semantics, and return composition in order. For a 9-parameter tool with non-obvious default behavior (excluding derivative records), the length is justified — each sentence earns its place, though it is not as tight as it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (9 params, output schema present, annotations present), the description is thorough: purpose, default exclusion behavior, keyword limitations, and output composition are all covered. Pagination and date formats are already documented in the schema, and the return structure in the output schema, so nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema. It specifies what a keyword actually matches ('English case titles... and CELEX strings') and exactly what the result set carries ('court, date, and type, plus... the parties, subject matter, and case reference'). This supplements rather than repeats the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Search CJEU and General Court case law — judgments, orders, and Advocate General opinions' — and enumerates the query dimensions (case number, court, case type, keyword, date range). It also differentiates itself from siblings by disclosing the scope boundary: 'there is no full-text body search.' The agent can clearly tell this apart from eurlex_search_documents without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context on when to use this tool: keyword matching is limited to 'English case titles... and CELEX strings' plus the explicit exclusion 'there is no full-text body search' — a de facto routing signal toward a sibling for full-text needs. However, it never names an alternative tool explicitly or gives a when-not-to-use statement, so the guidance is implicit rather than directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eurlex_get_documentGet EU DocumentARead-onlyIdempotentInspect
Fetch the metadata and full text of an EU act by CELEX number, ELI URI, or work URI. Returns structured metadata (title, date, type, author institution, legal basis, EuroVoc subjects, in-force status) plus the act body as HTML, Markdown, or Formex4 XML, defaulting to English with automatic fallback. Ordinary offset-based paged windows and full-mode windows are capped at 100,000 characters; page with offset/limit to reconstruct larger acts, or use outline: true for a heading map and select to pull specific articles, chapters, recitals, or annexes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 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. | |
| 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). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode "metadata_only". | |
| eli_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 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". | |
| resolve | No | 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. | 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. 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 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Maximum body characters allowed in the window. |
| date | No | Document date in ISO 8601 format (YYYY-MM-DD). |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of body characters returned. |
| title | No | Document title in the requested language (absent for some older works and judgments). |
| notice | No | How to retrieve the remaining document content. |
| 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 and 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 window. Continue in "paged" mode with offset = content_offset + content_chars_returned until false. Always false in "metadata_only" mode. |
| in_force | No | Whether the act is currently in force. |
| language | No | Language code of the returned content. |
| work_uri | No | CELLAR work URI. |
| selection | No | Outcome of a structural selection. Present only when select was used; content holds the matched sections joined in document order. |
| truncated | No | True when the returned body window was capped. |
| legal_basis | No | Legal basis acts for this work. Absent when none are recorded. |
| celex_number | No | Confirmed CELEX number for the retrieved work. |
| content_mode | No | Content mode applied to this response: "metadata_only", "paged", or "full". |
| is_superseded | No | 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. |
| resource_type | No | Human-readable document type label (e.g. "Regulation", "Directive"). Absent for some older works. |
| content_format | No | Format of the returned content: "html", "markdown", or "xml". |
| content_offset | No | Character offset where the returned content window begins. Present when a body was fetched and available. |
| 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. |
| requested_celex | No | 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. |
| eurovoc_subjects | No | EuroVoc subject classifications. Absent when none are 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". |
| 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. |
| author_institution | No | 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. |
| consolidated_as_of | No | Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present only when is_superseded is true. |
| requested_language | No | Originally requested language code when English fallback changed the effective language reported in language. |
| structure_detected | No | 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". |
| author_institutions | No | 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. |
| 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. |
| current_consolidated_celex | No | 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. |
| 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?
With readOnlyHint and idempotentHint already supplied, the description still adds substantial behavioral detail: automatic fallback to English, 100,000-character cap on windows, continuation metadata, and the outline/select navigation model. Nothing contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three dense sentences: what the tool fetches, paging and size limits, and structural navigation. Each sentence earns its place, and the core verb is front-loaded in the first phrase.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with nested objects and a full output schema, the description gives the agent a complete sense of the primary flows: fetch, page, outline, select. Metadata-only mode and the resolve behavior are left to the schema, which is appropriate given the schema spill coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds workflow-level meaning: page with offset/limit to reconstruct larger acts and use outline/select to pull targeted sections. It reinforces how parameters behave as a cohesive system, even if the schema already covers each parameter individually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: fetch the metadata and full text of an EU act by CELEX number, ELI URI, or work URI. It enumerates returned metadata fields and the body, which clearly distinguishes it from sibling tools like eurlex_search_documents or eurlex_get_relations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended context is evident: use this tool when you already know an act identifier and need the document content. It does not explicitly name sibling tools as alternatives or state when *not* to use them, so it lacks exclusion guidance despite clear contextual framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eurlex_get_relationsGet CELLAR Relationship 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 works that cite it. 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 (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones. | |
| offset | No | 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. | |
| 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 relation-specific act matching, and act-matched relation types stand down when the work carries several CELEX numbers — address such a work by celex_number to name the act you mean. Provide exactly one of celex_number or work_uri. | |
| celex_number | No | CELEX number of the work to traverse (e.g. 32016R0679). Provide exactly one of celex_number or work_uri. | |
| relation_types | No | 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). |
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). |
| offset | No | Pagination offset applied to this response (per relation type and direction). |
| has_more | No | True only when at least one requested relation type/direction returned an additional valid row beyond this page. |
| 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. |
| next_offset | No | Offset for the next page. Present only when has_more is true. |
| 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. |
| 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 first page throws no_relations; an exhausted non-zero 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 supply readOnlyHint, openWorldHint, and idempotentHint; the description adds genuinely useful limits not inferable from the schema: it returns only direct (one-hop) relations, is paginated per relation type and direction, and requires one of two identifier forms. This exceeds the baseline for a read-only annotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences. The first states the operation and enumerates the relation categories; the second states scope and pagination. No filler or repetition of schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, relation types, the one-hop/direct restriction, pagination behavior, and identifier requirement. Sibling tools are distinct in purpose. With a rich schema and no required params, this is nearly complete; a minor gap is lack of mention that the two identifiers are mutually exclusive, though the schema states it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a non-obvious clarification that exactly one of celex_number or work_uri must be provided, which the schema itself does not encode as a required/exclusive constraint. This is meaningful extra guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Traverse') and a precise resource (CELLAR relationship graph of an EU act), then enumerates the relationship categories (amendments, repeals, consolidations, transpositions, legal basis, citations). This clearly distinguishes the tool from siblings like eurlex_get_document or eurlex_get_cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool returns and the input requirement (CELEX number or CELLAR work URI), and its
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eurlex_lookup_celexResolve EU Legal CitationARead-onlyIdempotentInspect
Resolve an EU legal citation — a CELEX number or ELI URI — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, and date.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | 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). | |
| identifier_type | No | Format of the identifier. "auto" detects it automatically; supply "celex" or "eli" explicitly if detection fails. | auto |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Document date in ISO 8601 format (YYYY-MM-DD). |
| 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 matches no work in the corpus. Only an identifier_type "auto" value that, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase) raises ambiguous_identifier instead. |
| work_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. "CONS_TEXT"). Absent for some works. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, openWorld, and idempotent hints, so the description adds value by disclosing the canonicalization behavior and the exact return payload (work URI, confirmed CELEX number, document type, and date). It conveys that the tool validates existence, which is a behavioral guarantee beyond the annotation hints. Missing error-handling for unregistered CELEX/ELI values is a minor gap but not severe given the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The main action ('Resolve an EU legal citation') is front-loaded, followed by concise scoping and return details. Every clause adds value and avoids the repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is an output schema, the description appropriately summarizes the resolved output. The instruction 'before you fetch or traverse it' indicates the tool's context of use, and the identifier types are explicit. It is complete for a straightforward lookup tool, and while it may not mention edge cases (e.g., invalid input), those are reasonably covered by annotations—and the rest by an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully covered by the schema with descriptions and examples (identifier, identifier_type, and the enum). The description itself does not add new semantic meaning for the parameters beyond what is already in the schema, and it restates only the fact that CELEX and ELI are supported. The baseline score of 3 is appropriate when schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Resolve an EU legal citation — a CELEX number or ELI URI — to its canonical CELLAR work'. This immediately distinguishes it from siblings like search_documents and get_document, and the phrase 'confirming it exists before you fetch or traverse it' clarifies that this is a resolution/normalization step rather than a retrieval tool. No ambiguity remains about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'before you fetch or traverse it' tells the agent that this tool is a prerequisite for other operations that take citations. It implies a workflow step without explicitly naming the alternative tools (e.g., search_documents when the citation is unknown). It gives a clear context but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eurlex_query_sparqlRaw CELLAR SPARQL 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 100. 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 100 if absent, or capped to 100. Key CDM predicates: cdm:resource_legal_id_celex (CELEX), cdm:work_date_document (date), cdm:work_has_resource-type (type), cdm:work_is_about_concept_eurovoc (EuroVoc subject), cdm:work_cites_work (citation). CELEX is an xsd:string literal — match it with FILTER(STR(?celex) = "…"). For text, use bif:contains with a single-quoted phrase. | |
| timeout_hint | No | Optional client-side timeout in milliseconds (1000–55000). Defaults apply when omitted; the endpoint hard limit is 60 seconds. |
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 (capped at 100 by the server). |
| 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-enforced result ceiling capped the rows and more may exist upstream — narrow the query with FILTERs to see the rest. |
| 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?
Beyond the readOnlyHint=true annotation, the description discloses concrete behavioral constraints: only SELECT is accepted, update/ASK/CONSTRUCT/DESCRIBE forms are rejected before execution, results are capped at 100, and cdm:, skos:, and xsd: prefixes are auto-injected. This gives an agent a clear execution model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main description is two tight sentences with the core constraint front-loaded. The parameter descriptions are detailed but directly useful, with no filler or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a raw query tool, the description covers accepted query forms, rejected forms, result limits, auto-injected prefixes, and the most relevant CDM predicates. An output schema exists, so return-value details are not the description's responsibility. Nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial value: it documents key CDM predicates (celex, dates, types, EuroVoc, citations), explains how to match CELEX literals with STR(), and recommends bif:contains for text queries. This goes well beyond the schema's bare parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: running a raw SPARQL SELECT against the CELLAR Virtuoso endpoint. It also marks the tool as an escape hatch for CDM ontology traversals, which separates it from the curated sibling tools even without naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly positions this tool as the fallback for cases the curated tools do not cover, which is strong when-to-use guidance. It does not explicitly name which sibling to prefer for simpler lookups, but the curated-vs-raw distinction is sufficient context for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eurlex_search_documentsSearch EU 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. Returns a page of CELEX numbers, work URIs, type labels, dates, and titles, newest first, each flagged with is_consolidated. At least one filter is required.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (1–100). Defaults to 20. | |
| offset | No | Pagination offset — number of results to skip. Defaults to 0. | |
| 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), or against CELEX substrings. | |
| in_force | No | If true, restrict to acts currently in force. 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. Omit for no subject filter. | |
| author_institution | No | Author institution name (e.g. "European Parliament", "Council", "European Commission"), matched against the English names of EU corporate bodies. | |
| 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). |
| offset | No | Pagination offset used for this response. |
| has_more | No | True only when CELLAR returned an additional valid row beyond this page. |
| documents | No | Matching EU documents ordered by date descending. |
| 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. |
| 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 annotations declaring readOnlyHint=true and openWorldHint=true, the description adds substantial behavioral detail: it specifies the response pagination (returns a page, newest first), the fields returned (CELEX numbers, work URIs, type labels, dates, titles, is_consolidated flag), and critical constraints (no full-text search, consolidated texts excluded unless include_consolidated is true, keyword treated as phrase). These details go well beyond the annotations and significantly aid correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: it opens with the core purpose, notes the key limitation, summarizes returns, and ends with a requirement. It avoids redundancy with the schema by not repeating all parameter descriptions. A minor point is that some details (e.g., consolidated exclusion) are also present in the schema, making the description slightly duplicative within the overall tool definition, but it remains appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, an output schema, and thorough schema descriptions, the description covers all critical operational aspects: it lists return fields, ordering, pagination, the mandatory filter requirement, and the no-full-text limitation. It lacks explicit note on rate limits or auth, but given openWorldHint and the presence of an output schema, no further information is essential for an agent to decide how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The top-level description repeats some parameter behaviors (e.g., keyword phrase handling, consolidated exclusion) but adds little new per-parameter meaning beyond what the schema already documents. The main added value is the cross-reference to eurlex_browse_subjects for eurovoc_concept and the overall return format, which does not directly enhance parameter understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and resource ('EU legislation, treaties, and preparatory acts across the CELLAR corpus') and enumerates the filter dimensions (document type, date range, EuroVoc subject, author institution, in-force status). It also clearly distinguishes from siblings by explicitly stating 'there is no full-text body search' and describing return content, making it unambiguous what this tool does and does not cover.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it specifies the scope (titles and CELEX strings only) and the mandatory condition ('At least one filter is required'). It also gives a practical alternative hint for obtaining EuroVoc concepts ('obtained from eurlex_browse_subjects'). However, it does not explicitly name sibling tools for alternative search scenarios (e.g., if full-text body search were available), so it lacks explicit exclusions beyond the no-full-text note.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
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."
7 tool updates
- Changed
eurlex_browse_subjects6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "concepts", + "total", + "offset" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_concepts`: No EuroVoc concepts matched the keyword in the requested language. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_concepts" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "concepts", - "total", - "offset" -]
- Changed
eurlex_get_cases6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cases", + "total", + "offset", + "query_echo" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_results`: The query returned zero bindings — no matching cases in CELLAR sector 6. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_results", + "sparql_error" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "cases", - "total", - "offset", - "query_echo" -]
- Changed
eurlex_get_document10 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "celex_number", + "content_mode", + "content_available", + "has_more", + "language", + "content_format" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / capAdded value: +{ + "description": "Maximum body characters allowed in the window.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: None of celex_number, eli_uri, or work_uri was provided, or more than one was. `not_found`: The CELEX, ELI, or work URI resolves to no fetchable work — the work is absent from the corpus, or the CELLAR work carries no CELEX number. `language_unavailable`: Requested language has no content in EUR-Lex after fallback to English also failed. `content_fetch_failed`: EUR-Lex content API returned non-200 after language fallback attempts. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_identifier_args", + "not_found", + "language_unavailable", + "content_fetch_failed" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "How to retrieve the remaining document content.", + "type": "string" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of body characters returned.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the returned body window was capped.", + "type": "boolean" +} - removed
Output schema / requiredRemoved value: -[ - "celex_number", - "content_mode", - "content_available", - "has_more", - "language", - "content_format" -]
- Changed
eurlex_get_relations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "work_uri", + "relations", + "total", + "offset", + "requested_relation_types", + "empty_relation_types" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_identifier_args`: Neither celex_number nor work_uri was provided, or both were. `not_found`: CELEX number not found in CELLAR — resolve the identifier with eurlex_lookup_celex first. `no_relations`: Work exists but has no CDM relations of the requested types. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_identifier_args", + "not_found", + "no_relations" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "work_uri", - "relations", - "total", - "offset", - "requested_relation_types", - "empty_relation_types" -]
- Changed
eurlex_lookup_celex6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "found" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier format could not be determined. Other values are possible when a failure originates below the handler.", + "examples": [ + "ambiguous_identifier" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "found" -]
- Changed
eurlex_query_sparql6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "bindings", + "variables", + "total" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `not_read_only`: The query is not a read-only SELECT — an update or non-SELECT query form was supplied. `sparql_error`: Virtuoso returned a syntax or semantic error — the query is malformed. `sparql_timeout`: Query exceeded the 60-second Virtuoso hard limit. Other values are possible when a failure originates below the handler.", + "examples": [ + "not_read_only", + "sparql_error", + "sparql_timeout" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "bindings", - "variables", - "total" -]
- Changed
eurlex_search_documents6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "documents", + "total", + "offset", + "query_echo" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `no_results`: The query returned zero bindings — no matching documents in CELLAR. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_filters", + "no_results", + "sparql_error" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "documents", - "total", - "offset", - "query_echo" -]
2 tool updates
- Changed
eurlex_get_cases3 fields changed- changed
Input schema / properties / include_derivative / descriptionPrevious value: -"Include derivative sector-6 records — judicial information notices, case abstracts, and case summaries — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)."New value: +"Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)." - added
Output schema / properties / query_echo / properties / include_derivativeAdded value: +{ + "description": "Effective include_derivative value after the false default is applied — whether derivative sector-6 records (notices, abstracts, summaries, corrigenda) were admitted alongside primary cases. Always present, since the default shapes which records can appear.", + "type": "boolean" +} - added
Output schema / properties / query_echo / requiredAdded value: +[ + "include_derivative" +]
- Changed
eurlex_search_documents2 fields changed- added
Output schema / properties / query_echo / properties / include_consolidatedAdded value: +{ + "description": "Effective include_consolidated value after the false default is applied — whether consolidated texts (CONS_TEXT) of the document_type were folded in. Always present, since the default shapes which records can appear; has effect only when document_type is set.", + "type": "boolean" +} - added
Output schema / properties / query_echo / requiredAdded value: +[ + "include_consolidated" +]
2 tool updates
- Changed
eurlex_query_sparql4 fields changed- changed
Output schema / properties / bindings / items / descriptionPrevious value: -"A single SPARQL result row. Each key is a SELECT variable name; each value is a SPARQL term object with \"type\" (e.g. \"uri\", \"literal\") and \"value\" (the string value) fields."New value: +"A single SPARQL result row. Each key is a SELECT variable name; each value is a SPARQL term object with \"type\" (\"uri\", \"literal\", or \"bnode\") and \"value\" (the string value), plus \"datatype\" (an IRI) on a typed literal or \"xml:lang\" (a language tag) on a language-tagged literal — the two are mutually exclusive. A variable left unbound by an OPTIONAL has no key in the row at all." - added
Output schema / properties / capAdded value: +{ + "description": "The server-enforced result ceiling that was applied.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of binding rows returned in this response.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the server-enforced result ceiling capped the rows and more may exist upstream — narrow the query with FILTERs to see the rest.", + "type": "boolean" +}
- Changed
eurlex_search_documents1 field changed- changed
Input schema / properties / eurovoc_concept / anyOfPrevious value: -[ - { - "const": "", - "type": "string" - }, - { - "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).", - "pattern": "^http.*", - "type": "string" - } -]New value: +[ + { + "const": "", + "type": "string" + }, + { + "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).", + "type": "string" + } +]
1 tool update
- Changed
eurlex_browse_subjects4 fields changed- added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Pagination offset — number of concepts to skip. Defaults to 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / concepts / descriptionPrevious value: -"Matching EuroVoc concepts ordered by relevance of the label match."New value: +"Matching EuroVoc concepts ordered alphabetically by label." - added
Output schema / properties / offsetAdded value: +{ + "description": "Pagination offset used for this response.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "concepts", - "total" -]New value: +[ + "concepts", + "total", + "offset" +]
2 tool updates
- Changed
eurlex_browse_subjects2 fields changed- changed
Input schema / properties / language / descriptionPrevious value: -"Language code for concept labels (e.g. \"en\", \"fr\", \"de\"). Defaults to English."New value: +"Language code for concept labels (e.g. \"en\", \"fr\", \"de\"). Case-insensitive — \"EN\" and \"en\" behave identically. Defaults to English." - changed
Input schema / properties / language / patternPrevious value: -"^[a-z]{2,3}$"New value: +"^[A-Za-z]{2,3}$"
- Changed
eurlex_get_document4 fields changed- changed
Input schema / properties / offset / descriptionPrevious value: -"Character offset into the body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call."New value: +"Character offset into the body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call. Offsets are format-specific: an offset is only valid against the same format it was measured in — keep format constant when paging." - 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. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode \"metadata_only\"."New value: +"Return a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with its offset, keeping the same format: outline offsets are measured in the requested format's body and land in the wrong place under any other format. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode \"metadata_only\"." - 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 section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode \"metadata_only\"."New value: +"Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). Sections are located in the body of the requested format, so pair select with the same format used for any outline. A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode \"metadata_only\"." - changed
Output schema / properties / is_superseded / descriptionPrevious value: -"True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself one."New value: +"True when a newer consolidated version of the requested base act exists (an unofficial reading aid merging later amendments), so the returned text may not include those amendments. Not a repeal/replacement signal — the base act remains the law and may still be in force (see in_force). Absent when the act has no consolidated version, or is itself one."
2 tool updates
- Changed
eurlex_get_cases1 field changed- added
Input schema / properties / include_derivativeAdded value: +{ + "default": false, + "description": "Include derivative sector-6 records — judicial information notices, case abstracts, and case summaries — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type).", + "type": "boolean" +}
- Changed
eurlex_get_relations3 fields changed- added
Output schema / properties / empty_relation_typesAdded value: +{ + "description": "Requested relation types that returned zero relations in THIS page. Page-scoped: a type can appear here because all its edges sit beyond the current offset/limit window, not only because the act genuinely has none of that relation — so absent-from-here does not prove absent-in-CELLAR. When every requested type is empty the tool throws no_relations instead.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / requested_relation_typesAdded value: +{ + "description": "The relation types this request traversed — the explicit relation_types list, or all types when it was omitted. Diff against the types present in relations[], or read empty_relation_types, to confirm which requested types returned edges.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "work_uri", - "relations", - "total", - "offset" -]New value: +[ + "work_uri", + "relations", + "total", + "offset", + "requested_relation_types", + "empty_relation_types" +]
6 tool updates
- Changed
eurlex_get_cases6 fields changed- changed
Input schema / properties / case_type / descriptionPrevious value: -"Case type filter: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Leave blank or omit to search all case types."New value: +"Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all." - changed
Input schema / properties / court / descriptionPrevious value: -"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Leave blank or omit to search both courts."New value: +"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both." - 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 (e.g. an Advocate General opinion). Parsed from title; absent when title is."New value: +"Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties. Parsed from title; absent when title is." - changed
Output schema / properties / cases / items / properties / parties / descriptionPrevious value: -"Parties to the case, parsed from the title (e.g. \"WhatsApp Ireland Ltd v European Data Protection Board.\"). Absent when the title carries no parties segment (e.g. AG opinions, some older cases)."New value: +"Parties to the case, parsed from the title (e.g. \"WhatsApp Ireland Ltd v European Data Protection Board.\"). Absent when the title carries no parties segment (e.g. AG opinions)." - changed
Output schema / properties / cases / items / properties / resource_type / descriptionPrevious value: -"Human-readable case type label (e.g. \"Judgment\", \"Order\", \"AG Opinion\"). Cases classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. Absent for some older cases."New value: +"Human-readable case type label (e.g. \"Judgment\", \"Order\", \"AG Opinion\"). Cases with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older cases." - changed
Output schema / properties / cases / items / properties / title / descriptionPrevious value: -"Raw English expression title as stored in CELLAR. For case law this is a \"#\"-delimited string (court+date, parties, subject-matter, case reference); the parsed segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."New value: +"Raw English expression title as stored in CELLAR — a \"#\"-delimited string (court+date, parties, subject-matter, case reference) whose segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."
- Changed
eurlex_get_document16 fields changed- changed
Input schema / properties / content_mode / descriptionPrevious value: -"How much of the document body to return. \"paged\" (default) returns a bounded character window — see offset/limit; \"full\" returns the entire body in one call (large acts can be hundreds of KB); \"metadata_only\" returns metadata with no body and skips the content fetch. offset and limit apply only to \"paged\"."New value: +"How much of the body to return. \"paged\" (default) returns a bounded character window (see offset/limit); \"full\" returns the entire body in one call (large acts can be hundreds of KB); \"metadata_only\" skips the content fetch. offset and limit apply only to \"paged\"." - changed
Input schema / properties / eli_uri / descriptionPrevious value: -"Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri."New value: +"Work-level ELI URI of the act to fetch (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri." - changed
Input schema / properties / format / descriptionPrevious value: -"Content format: \"html\" for the act text as served by EUR-Lex (default); \"markdown\" for that HTML converted to clean Markdown server-side (recitals and numbered points as readable text, genuine data tables as GFM); \"xml\" for Formex4 XML structured format."New value: +"Content format: \"html\" for the act text as served by EUR-Lex (default), \"markdown\" for that HTML converted to clean Markdown server-side, or \"xml\" for Formex4 structured XML." - changed
Input schema / properties / language / descriptionPrevious value: -"Language code for document content (ISO 639-1 uppercase, e.g. EN, FR, DE). Defaults to EN. Falls back to EN if the requested language is unavailable."New value: +"Language code for document content (ISO 639-1 uppercase, e.g. EN, FR, DE). Defaults to EN, and falls back to EN if the requested language is unavailable." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum characters of body content to return in this window (\"paged\" mode only). Default 25000, max 100000. For the entire body in one response, use content_mode \"full\" instead of a large limit."New value: +"Maximum characters to return in this window (\"paged\" mode only). Default 25000, max 100000. For the entire body in one response, use content_mode \"full\"." - changed
Input schema / properties / offset / descriptionPrevious value: -"Character offset into the full document body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call."New value: +"Character offset into the body where the returned window starts (\"paged\" mode only). Page forward by setting offset = content_offset + content_chars_returned from the previous call." - changed
Input schema / properties / outline / descriptionPrevious value: -"Return a structural outline of the act — the detected chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset into the body of the requested format — instead of body text. Use it to see what sections exist, then read one by paging (content_mode \"paged\") with its offset. Ignores offset/limit and select. An act with no detectable structure (e.g. case law) returns an empty outline, never an error. Not applied in content_mode \"metadata_only\"."New value: +"Return a structural outline of the act — chapters, sections, articles, annexes, and recitals as a heading list, each with its character offset — instead of body text. Read a section by paging with its offset. Ignores offset/limit and select; no detectable structure returns an empty outline. Not applied in content_mode \"metadata_only\"." - changed
Input schema / properties / resolve / descriptionPrevious value: -"Which version to serve for a base act that has newer consolidated versions. \"as_requested\" (default) returns the exact CELEX requested — for a base act, the as-enacted text. \"current_consolidated\" transparently serves the newest consolidated version instead when one exists, reporting the served CELEX in celex_number and the originally requested CELEX in requested_celex; a no-op when no newer consolidated version exists. Regardless of this setting, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act."New value: +"Which version to serve for a base act with newer consolidated versions. \"as_requested\" (default) returns the exact CELEX requested; \"current_consolidated\" serves the newest consolidated version instead (echoing the request in requested_celex), a no-op when none exists. Either way, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act." - 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 chapter/annex numbers are treated as equivalent. Applies on top of the requested format (html, markdown, xml). A section that cannot be located, or an act with no detectable structure, is reported in selection.missed with no wrong text returned — use offset/limit or content_mode \"full\" to read it. Ignored when outline is true or in content_mode \"metadata_only\"."New value: +"Return only the text of specific sections by type and number, instead of a raw character window (Roman and Arabic numbers are equivalent). A section that cannot be located is reported in selection.missed with no wrong text returned. Ignored when outline is true or in content_mode \"metadata_only\"." - 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. Dereferenced to its CELEX, then fetched by the same flow. Provide exactly one of celex_number, eli_uri, or work_uri."New value: +"CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. Provide exactly one of celex_number, eli_uri, or work_uri." - 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 adopted by more than one body, prefer author_institutions for the complete set. Absent when not recorded."New value: +"Human-readable name of the primary (first) originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). For co-legislated acts, prefer author_institutions for the complete set. Absent when not recorded." - 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\"] for an ordinary-legislative-procedure act). Absent when none recorded."New value: +"All originating EU institutions, for co-legislated acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"]). Absent when none recorded." - changed
Output schema / properties / content / descriptionPrevious value: -"Body content of the act in the requested format and language. In \"paged\" mode this is a character window (see content_offset / content_chars_returned / has_more); in \"full\" mode the entire body; omitted in \"metadata_only\" mode, when the window is empty (offset past the end), or when content is unavailable."New value: +"Body content of the act in the requested format and language. In \"paged\" mode a character window (see content_offset / content_chars_returned / has_more); in \"full\" mode the entire body; omitted in \"metadata_only\" mode, when the window is empty, or when content is unavailable." - 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\" for the entire act in one call. Always false in \"metadata_only\" mode."New value: +"True when body content exists beyond the returned window. Page forward with offset = content_offset + content_chars_returned, or request content_mode \"full\". Always false in \"metadata_only\" mode." - changed
Output schema / properties / is_superseded / descriptionPrevious value: -"True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself a consolidated version."New value: +"True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself one." - 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 the act has no detectable chapter/article/annex structure — read it via the paging floor (offset/limit or content_mode \"full\")."New value: +"Whether any act structure was parsed from the body. Present when outline or select was used; false means no detectable chapter/article/annex structure — read it via offset/limit or content_mode \"full\"."
- Changed
eurlex_get_relations5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum related works to return per relation type and per direction (1–100). Defaults to 100. Incoming edges (e.g. works that cite this act) are ordered by document date descending, so the cap keeps the newest — page with offset for older ones. For the symmetric cites relation, outgoing and incoming each get this budget independently. When truncated is true, at least one direction filled its cap and more may exist."New value: +"Maximum related works per relation type and direction (1–100, default 100). Incoming edges are ordered newest-first, so the cap keeps the newest — page with offset for older ones. When truncated is true, at least one direction filled its cap." - changed
Input schema / properties / offset / descriptionPrevious value: -"Pagination offset applied per relation type and per direction — number of related works to skip. Defaults to 0. Page forward by adding limit each call; incoming edges are ordered newest-first, so higher offsets reach older works."New value: +"Pagination offset applied per relation type and direction — related works to skip (default 0). Page forward by adding limit; incoming edges are newest-first, so higher offsets reach older works." - changed
Input schema / properties / relation_types / descriptionPrevious value: -"Subset of relation types to return. Omit to return all types: cites (citation graph), amends (what this work amends), amended_by (what amends this work), repeals (what this work explicitly repeals), repealed_by (what explicitly repealed this work), implicitly_repeals (what this work implicitly repeals), implicitly_repealed_by (what implicitly repealed this work), legal_basis (treaty/treaty article this act is based on), consolidated_version (consolidated versions of this act)."New value: +"Subset of relation types to return; omit for all. Types: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis (treaty/article this act rests on), consolidated_version (consolidated texts of this act)." - changed
Output schema / properties / celex_number / descriptionPrevious value: -"CELEX number of the source work whose relations were traversed. Absent when the work was addressed directly by work_uri."New value: +"CELEX number of the source work whose relations were traversed. Absent when addressed directly by work_uri." - changed
Output schema / properties / total / descriptionPrevious value: -"Number of relations returned in this page (not a corpus-wide count). A direction that filled its per-direction cap sets truncated — page with offset for the rest."New value: +"Number of relations returned in this page (not a corpus-wide count). A direction that filled its cap sets truncated — page with offset for the rest."
- Changed
eurlex_lookup_celex1 field changed- changed
Input schema / properties / identifier_type / descriptionPrevious value: -"Format of the identifier. Use \"auto\" to let the server detect the format automatically. Supply explicitly if auto-detection fails or if the identifier is ambiguous."New value: +"Format of the identifier. \"auto\" detects it automatically; supply \"celex\" or \"eli\" explicitly if detection fails."
- Changed
eurlex_query_sparql2 fields changed- changed
Input schema / properties / sparql_query / descriptionPrevious value: -"A read-only SPARQL SELECT query to execute against CELLAR. Non-SELECT queries (updates such as DELETE/INSERT, or ASK/CONSTRUCT/DESCRIBE) are rejected before execution. Leading comments and PREFIX/BASE declarations are allowed before the SELECT keyword. The cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at 100 if absent or capped to 100 if above that threshold."New value: +"A read-only SPARQL SELECT query. Leading comments and PREFIX/BASE declarations are allowed; the cdm:, skos:, and xsd: prefixes are auto-injected. LIMIT is injected at 100 if absent, or capped to 100. Key CDM predicates: cdm:resource_legal_id_celex (CELEX), cdm:work_date_document (date), cdm:work_has_resource-type (type), cdm:work_is_about_concept_eurovoc (EuroVoc subject), cdm:work_cites_work (citation). CELEX is an xsd:string literal — match it with FILTER(STR(?celex) = \"…\"). For text, use bif:contains with a single-quoted phrase." - changed
Input schema / properties / timeout_hint / descriptionPrevious value: -"Optional client-side timeout for this request, in milliseconds (1000–55000). When omitted, the default timeout applies; the endpoint hard limit is 60 seconds."New value: +"Optional client-side timeout in milliseconds (1000–55000). Defaults apply when omitted; the endpoint hard limit is 60 seconds."
- Changed
eurlex_search_documents7 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; only works created by a matching institution are returned."New value: +"Author institution name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched against the English names of EU corporate bodies." - changed
Input schema / properties / date_from / descriptionPrevious value: -"Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no lower bound."New value: +"Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound." - changed
Input schema / properties / date_to / descriptionPrevious value: -"End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no upper bound."New value: +"End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound." - changed
Input schema / properties / document_type / descriptionPrevious value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types. A type filter excludes consolidated texts (CONS_TEXT), which carry their own resource-type — set include_consolidated to fold them back in."New value: +"Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Omit to search all types. A type filter excludes consolidated texts (CONS_TEXT) — set include_consolidated to fold them back in." - changed
Input schema / properties / eurovoc_concept / descriptionPrevious value: -"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828). Obtain concept URIs from eurlex_browse_subjects first. Leave blank or omit for no subject filter."New value: +"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Omit for no subject filter." - 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 incorporate later amendments and carry their own resource-type, so a plain type filter omits them. No effect when document_type is omitted (all types already return). Either way, consolidated rows are tagged is_consolidated: true."New value: +"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that a plain type filter omits. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true." - changed
Output schema / properties / documents / items / properties / resource_type / descriptionPrevious value: -"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Works classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. Absent for some older works."New value: +"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Works with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older works."
1 tool update
- Changed
eurlex_get_relations8 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "description": "Maximum related works to return per relation type and per direction (1–100). Defaults to 100. Incoming edges (e.g. works that cite this act) are ordered by document date descending, so the cap keeps the newest — page with offset for older ones. For the symmetric cites relation, outgoing and incoming each get this budget independently. When truncated is true, at least one direction filled its cap and more may exist.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Pagination offset applied per relation type and per direction — number of related works to skip. Defaults to 0. Page forward by adding limit each call; incoming edges are ordered newest-first, so higher offsets reach older works.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / capAdded value: +{ + "description": "The per-direction cap applied to this page.", + "type": "number" +} - added
Output schema / properties / offsetAdded value: +{ + "description": "Pagination offset applied to this response (per relation type and direction).", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of relations returned in this page.", + "type": "number" +} - changed
Output schema / properties / total / descriptionPrevious value: -"Total number of direct CDM relations returned."New value: +"Number of relations returned in this page (not a corpus-wide count). A direction that filled its per-direction cap sets truncated — page with offset for the rest." - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when at least one relation type/direction filled its per-direction cap and more related works may exist — page with offset.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "work_uri", - "relations", - "total" -]New value: +[ + "work_uri", + "relations", + "total", + "offset" +]
1 tool update
- Changed
eurlex_get_cases5 fields changed- added
Output schema / properties / cases / items / properties / case_referenceAdded value: +{ + "description": "Case reference parsed from the title (e.g. \"Case C-97/23 P.\"). Absent when the title carries no case-reference segment.", + "type": "string" +} - added
Output schema / properties / cases / items / properties / display_titleAdded value: +{ + "description": "Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties (e.g. an Advocate General opinion). Parsed from title; absent when title is.", + "type": "string" +} - added
Output schema / properties / cases / items / properties / partiesAdded value: +{ + "description": "Parties to the case, parsed from the title (e.g. \"WhatsApp Ireland Ltd v European Data Protection Board.\"). Absent when the title carries no parties segment (e.g. AG opinions, some older cases).", + "type": "string" +} - added
Output schema / properties / cases / items / properties / subject_matterAdded value: +{ + "description": "Subject-matter keyword summary parsed from the title — the legal topics and provisions at issue. Absent when the title carries no subject-matter segment.", + "type": "string" +} - changed
Output schema / properties / cases / items / properties / title / descriptionPrevious value: -"English expression title where available (e.g. \"Google Spain SL v AEPD\"). Absent for many older cases."New value: +"Raw English expression title as stored in CELLAR. For case law this is a \"#\"-delimited string (court+date, parties, subject-matter, case reference); the parsed segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."
4 tool updates
- Changed
eurlex_browse_subjects3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The limit that was applied to this response.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of concepts returned in this response.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the returned list was capped at the limit and more concepts may exist.", + "type": "boolean" +}
- Changed
eurlex_get_cases3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The limit that was applied to this page.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of cases returned in this page.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the returned page was capped at the limit and more cases may exist.", + "type": "boolean" +}
- Changed
eurlex_query_sparql1 field changed- changed
Input schema / properties / timeout_hint / descriptionPrevious value: -"Optional client-side timeout for this request, in milliseconds (1000–55000). When omitted, the server-configured default (SPARQL_QUERY_TIMEOUT_MS, 55000) applies. Virtuoso hard limit is 60 seconds."New value: +"Optional client-side timeout for this request, in milliseconds (1000–55000). When omitted, the default timeout applies; the endpoint hard limit is 60 seconds."
- Changed
eurlex_search_documents7 fields changed- changed
Input schema / properties / document_type / descriptionPrevious value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types."New value: +"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types. A type filter excludes consolidated texts (CONS_TEXT), which carry their own resource-type — set include_consolidated to fold them back in." - added
Input schema / properties / include_consolidatedAdded value: +{ + "default": false, + "description": "When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that incorporate later amendments and carry their own resource-type, so a plain type filter omits them. No effect when document_type is omitted (all types already return). Either way, consolidated rows are tagged is_consolidated: true.", + "type": "boolean" +} - added
Output schema / properties / capAdded value: +{ + "description": "The limit that was applied to this page.", + "type": "number" +} - added
Output schema / properties / documents / items / properties / is_consolidatedAdded value: +{ + "description": "True when this CELEX is a consolidated version — a point-in-time text (…-YYYYMMDD) that incorporates amendments — rather than a base or amending act.", + "type": "boolean" +} - changed
Output schema / properties / documents / items / requiredPrevious value: -[ - "work_uri", - "celex_number" -]New value: +[ + "work_uri", + "celex_number", + "is_consolidated" +] - added
Output schema / properties / shownAdded value: +{ + "description": "Number of documents returned in this page.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when the returned page was capped at the limit and more documents may exist.", + "type": "boolean" +}
1 tool update
- Changed
eurlex_get_document10 fields changed- changed
Input schema / properties / celex_number / descriptionPrevious value: -"CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number or eli_uri."New value: +"CELEX number of the act to fetch (e.g. 32016R0679 for GDPR). Provide exactly one of celex_number, eli_uri, or work_uri." - changed
Input schema / properties / eli_uri / descriptionPrevious value: -"Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number or eli_uri."New value: +"Work-level ELI URI of the act to fetch, resolved to its CELLAR work (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix). Provide exactly one of celex_number, eli_uri, or work_uri." - added
Input schema / properties / resolveAdded value: +{ + "default": "as_requested", + "description": "Which version to serve for a base act that has newer consolidated versions. \"as_requested\" (default) returns the exact CELEX requested — for a base act, the as-enacted text. \"current_consolidated\" transparently serves the newest consolidated version instead when one exists, reporting the served CELEX in celex_number and the originally requested CELEX in requested_celex; a no-op when no newer consolidated version exists. Regardless of this setting, is_superseded / current_consolidated_celex / consolidated_as_of flag a stale base act.", + "enum": [ + "as_requested", + "current_consolidated" + ], + "type": "string" +} - added
Input schema / properties / work_uriAdded value: +{ + "description": "CELLAR work resource URI to fetch (e.g. http://publications.europa.eu/resource/cellar/3e485e15-11bd-11e6-ba9a-01aa75ed71a1) — the form returned by eurlex_lookup_celex, eurlex_get_relations, and eurlex_search_documents. Dereferenced to its CELEX, then fetched by the same flow. Provide exactly one of celex_number, eli_uri, or work_uri.", + "type": "string" +} - changed
Output schema / properties / author_institution / descriptionPrevious value: -"Human-readable name of the originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). Absent when not recorded."New value: +"Human-readable name of the primary (first) originating EU institution (e.g. \"European Parliament\", \"Council of the EU\"). For co-legislated acts adopted by more than one body, prefer author_institutions for the complete set. Absent when not recorded." - added
Output schema / properties / author_institutionsAdded value: +{ + "description": "All originating EU institutions, for co-legislated acts adopted by more than one body (e.g. [\"European Parliament\", \"Council of the EU\"] for an ordinary-legislative-procedure act). Absent when none recorded.", + "items": { + "description": "Human-readable EU institution name.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / consolidated_as_ofAdded value: +{ + "description": "Consolidation date of current_consolidated_celex in ISO 8601 (YYYY-MM-DD). Present only when is_superseded is true.", + "type": "string" +} - added
Output schema / properties / current_consolidated_celexAdded value: +{ + "description": "CELEX of the newest consolidated version of the requested base act (e.g. 02014R0833-20260424) — fetch it with eurlex_get_document, or pass resolve \"current_consolidated\". Present only when is_superseded is true.", + "type": "string" +} - added
Output schema / properties / is_supersededAdded value: +{ + "description": "True when the requested work is a base act with a newer consolidated version available — the returned text may be outdated. Absent when the act has no consolidated version, or is itself a consolidated version.", + "type": "boolean" +} - added
Output schema / properties / requested_celexAdded value: +{ + "description": "The originally requested CELEX, echoed when resolve \"current_consolidated\" served a different (consolidated) work. celex_number holds the CELEX actually served. Absent when the served work is the one requested.", + "type": "string" +}
1 tool update
- Changed
eurlex_get_relations3 fields changed- changed
Input schema / properties / relation_types / descriptionPrevious value: -"Subset of relation types to return. Omit to return all types: cites (citation graph), amends (what this work amends), amended_by (what amends this work), legal_basis (treaty/treaty article this act is based on), consolidated_version (consolidated versions of this act)."New value: +"Subset of relation types to return. Omit to return all types: cites (citation graph), amends (what this work amends), amended_by (what amends this work), repeals (what this work explicitly repeals), repealed_by (what explicitly repealed this work), implicitly_repeals (what this work implicitly repeals), implicitly_repealed_by (what implicitly repealed this work), legal_basis (treaty/treaty article this act is based on), consolidated_version (consolidated versions of this act)." - changed
Input schema / properties / relation_types / items / enumPrevious value: -[ - "cites", - "amends", - "amended_by", - "legal_basis", - "consolidated_version" -]New value: +[ + "cites", + "amends", + "amended_by", + "repeals", + "repealed_by", + "implicitly_repeals", + "implicitly_repealed_by", + "legal_basis", + "consolidated_version" +] - changed
Output schema / properties / relations / items / properties / relation_type / descriptionPrevious value: -"Type of relation: cites, amends, amended_by, legal_basis, consolidated_version."New value: +"Type of relation: cites, amends, amended_by, repeals, repealed_by, implicitly_repeals, implicitly_repealed_by, legal_basis, consolidated_version."
Related MCP Connectors
Temporal search and comparison for official Luxembourg and reviewed EU law, with provenance.
Search Swiss federal legislation: laws, articles, amendments via the Fedlex SPARQL endpoint.
Search French and European case law and French legal texts (codes, statutes, treaties).
Search Belgian & EU legislation: verbatim article text, per-article links, legal Q&A.
Related MCP Servers
- 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.1174 npm6MIT
- 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
- AlicenseAqualityAmaintenanceMCP server for EU law via the EUR-Lex / Cellar SPARQL endpoint — legislation (ELI/CELEX) and CJEU case-law (ECLI) with verifiable citations.332 npm1MIT
- AlicenseAqualityBmaintenanceProvides deterministic, read-only retrieval of authoritative EU legal materials, including legislation, case law, and EDPB/EDPS documents, with exact text, structural identifiers, and provenance.16MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.