Skip to main content
Glama

Search EU Documents

eurlex_search_documents
Read-only

Search EU legislation, treaties, and preparatory acts across the CELLAR corpus by document type, date range, EuroVoc subject, author institution, and in-force status. Keyword matches English titles and CELEX strings only — there is no full-text body search. Corrigenda are excluded by default so primary acts fill the page (set include_corrigenda to include them). Returns a page of CELEX numbers, work URIs, type labels, dates, and titles, newest first, each flagged with is_consolidated and is_corrigendum. At least one filter is required.

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20.
offsetNoPagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to window to reach older documents.
date_toNoEnd of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound.
keywordNoKeyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; an OJ C fragment of a year, a slash, and at least four characters of the number (2024/01469, C/2024/0146) matches every CELEX holding it; one with a shorter number (2017/111) or opening with letters not followed by a digit (R(01), ROU_2024) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected.
in_forceNoRestrict by in-force status: true returns only acts currently in force; false returns acts not in force — repealed, expired, or not yet in force (eurlex_get_document names which, where CELLAR records one). Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status.
date_fromNoStart of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound.
document_typeNoDocument category: REG=Regulations, DIR=Directives, DEC=Decisions, TREATY=Treaties, JUDG=Judgments, OPIN_AG=AG Opinions, PROP=Proposals, REC=Recommendations. Each category includes its explicit CELLAR authority variants (for example, delegated and implementing regulations). Omit to search all types. Consolidated texts are excluded unless include_consolidated is true.
eurovoc_conceptNoEuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Only EuroVoc concept URIs are accepted; https://eurovoc.europa.eu/… and an upper-case host are read as the http://eurovoc.europa.eu/… form CELLAR stores. Omit for no subject filter.
author_institutionNoAuthor name (e.g. "European Parliament", "Council", "European Commission", "Supremo Tribunal de Justiça"), matched as a phrase against English authority labels or national-court names — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included.
include_corrigendaNoInclude corrigenda — separate correction works, co-typed CORRIGENDUM alongside the base type of the act they correct, carrying a "…R(nn)" CELEX and usually no English title. Default false: they are excluded so primary acts fill the page. Every returned row is tagged is_corrigendum.
include_consolidatedNoWhen true and document_type is set, also match consolidated texts whose basic act belongs to that document category. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true.

Output Schema

NameRequiredDescriptionDefault
capNoThe limit that was applied to this page.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of documents returned in this page.
totalNoNumber of documents returned in this page (not a corpus-wide count).
noticeNoGuidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from; on a page ending at row 10,000, that no later page can be read and the closed date_from/date_to window that continues past it.
offsetNoPagination offset used for this response.
has_moreNoTrue only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match.
documentsNoMatching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls.
truncatedNoTrue when an additional CELLAR row proves more documents exist beyond this page.
query_echoNoEcho of filters applied to this search. Useful for diagnosing empty results.
limit_clampNoPresent only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.
next_offsetNoOffset for the next page. Present only when has_more is true.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / author_institution / description
      Previous value: -"Author name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched as a phrase against the English labels of each work's authors — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included."New value: +"Author name (e.g. \"European Parliament\", \"Council\", \"European Commission\", \"Supremo Tribunal de Justiça\"), matched as a phrase against English authority labels or national-court names — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included."
  2. Changed8 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum number of results to return (1–100). Defaults to 20."New value: +"Maximum number of results to return, served up to 100 per call; a larger value (up to 10,000) is served at 100 and reported in limit_clamp. Defaults to 20."
    • changedInput schema / properties / limit / maximum
      Previous value: -100New value: +10000
    • changedInput schema / properties / offset / description
      Previous value: -"Pagination offset — number of results to skip. Defaults to 0."New value: +"Pagination offset — number of results to skip. Defaults to 0. Must be below 10,000: CELLAR sorts at most 10,000 matches for one search, so pages stop at row 10,000; narrow with a date_from/date_to window to reach older documents."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_author_institution`: author_institution holds no letters or digits, so it can name no institution. `invalid_keyword`: keyword holds no letters or digits, so no title and no CELEX can match it. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one search. `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_author_institution`: author_institution holds no letters or digits, so it can name no institution. `invalid_keyword`: keyword holds no letters or digits, so no title and no CELEX can match it. `sparql_error`: CELLAR rejected the search it was sent: a filter combination its query planner cannot compile. The same call fails the same way again. `sparql_timeout`: The search ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "no_filters",
      -  "invalid_date_range",
      -  "invalid_author_institution",
      -  "invalid_keyword",
      -  "sparql_error"
      -]New value: +[
      +  "offset_past_window",
      +  "no_filters",
      +  "invalid_date_range",
      +  "invalid_author_institution",
      +  "invalid_keyword",
      +  "sparql_error",
      +  "sparql_timeout"
      +]
    • changedOutput schema / properties / has_more / description
      Previous value: -"True only when CELLAR returned an additional valid row beyond this page."New value: +"True only when CELLAR returned an additional valid row beyond this page. False on a page that ends at row 10,000, the last one CELLAR sorts; its notice says whether more may match."
    • addedOutput schema / properties / limit_clamp
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Present only when limit exceeded the per-call maximum: the value asked for and the value served. The response follows the applied value.",
      +  "properties": {
      +    "applied": {
      +      "description": "The limit served: the per-call maximum.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "requested": {
      +      "description": "The limit the call asked for.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "requested",
      +    "applied"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from."New value: +"Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from; on a page ending at row 10,000, that no later page can be read and the closed date_from/date_to window that continues past it."
  3. Changed2 schema fields changed
    • changedInput schema / properties / eurovoc_concept / description
      Previous value: -"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Omit for no subject filter."New value: +"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Only EuroVoc concept URIs are accepted; https://eurovoc.europa.eu/… and an upper-case host are read as the http://eurovoc.europa.eu/… form CELLAR stores. Omit for no subject filter."
    • changedOutput schema / properties / query_echo / properties / eurovoc_concept / description
      Previous value: -"EuroVoc concept URI filter applied."New value: +"EuroVoc concept URI filter applied, in the http://eurovoc.europa.eu/ form it was matched as."
  4. Changed2 schema fields changed
    • changedInput schema / properties / author_institution / description
      Previous value: -"Author institution name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched against the English names of EU corporate bodies."New value: +"Author name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched as a phrase against the English labels of each work's authors — the labels eurlex_get_document reports in author_institution(s), member states and MEPs included."
    • changedInput schema / properties / keyword / description
      Previous value: -"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; one opening with letters not followed by a digit (R(01), ROU_2024) or with a year and a slash (2024/01469) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; an OJ C fragment of a year, a slash, and at least four characters of the number (2024/01469, C/2024/0146) matches every CELEX holding it; one with a shorter number (2017/111) or opening with letters not followed by a digit (R(01), ROU_2024) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
  5. Changed1 schema field changed
    • changedInput schema / properties / keyword / description
      Previous value: -"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set; a partial CELEX (e.g. 2016R0679) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set. A partial CELEX that opens with the sector and year (02016R0679), the year and type letters (2016R0679), or type letters followed by the number (R0679, J0131) matches every CELEX that holds it at that position, consolidated versions included; one opening with letters not followed by a digit (R(01), ROU_2024) or with a year and a slash (2024/01469) tests every CELEX and can take tens of seconds; a bare year (2016) or a fragment opening mid-year or mid-number (016R0679, 0679, 0679R) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
  6. Changed2 schema fields changed
    • changedInput schema / properties / in_force / description
      Previous value: -"Restrict by in-force status: true returns only acts currently in force, false only acts no longer in force. Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status."New value: +"Restrict by in-force status: true returns only acts currently in force; false returns acts not in force — repealed, expired, or not yet in force (eurlex_get_document names which, where CELLAR records one). Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status."
    • changedOutput schema / properties / documents / items / properties / is_consolidated / description
      Previous value: -"True when this CELEX is a consolidated version — a point-in-time text (…-YYYYMMDD) that incorporates amendments — rather than a base or amending act."New value: +"True when this CELEX is a consolidated version (sector 0, e.g. 02016R0679-20160504) — a point-in-time text that incorporates amendments — rather than a base or amending act."
  7. Changed4 schema fields changed
    • changedInput schema / properties / keyword / description
      Previous value: -"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), or against CELEX substrings."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 32016R0679) matches that document, its numbered siblings (…(01) to …(20)), and for case law its _INF, _RES, _SUM, and _EXT records, plus its corrigenda (…R(01) to …R(20), and any work recorded as correcting it) when include_corrigenda is set; a partial CELEX (e.g. 2016R0679) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `no_results`: The first page (offset 0) returned zero bindings — no matching documents in CELLAR. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_author_institution`: author_institution holds no letters or digits, so it can name no institution. `invalid_keyword`: keyword holds no letters or digits, so no title and no CELEX can match it. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "no_filters",
      -  "invalid_date_range",
      -  "no_results",
      -  "sparql_error"
      -]New value: +[
      +  "no_filters",
      +  "invalid_date_range",
      +  "invalid_author_institution",
      +  "invalid_keyword",
      +  "sparql_error"
      +]
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.",
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • changedOutput schema / properties / documents / description
      Previous value: -"Matching EU documents ordered by date descending."New value: +"Matching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls."
  9. Changed6 schema fields changed
    • changedInput schema / properties / in_force / description
      Previous value: -"If true, restrict to acts currently in force. Omit to return all regardless of in-force status."New value: +"Restrict by in-force status: true returns only acts currently in force, false only acts no longer in force. Either way the act must carry the in-force property, which a minority of works do. Omit to return all regardless of in-force status."
    • addedInput schema / properties / include_corrigenda
      Added value: +{
      +  "default": false,
      +  "description": "Include corrigenda — separate correction works, co-typed CORRIGENDUM alongside the base type of the act they correct, carrying a \"…R(nn)\" CELEX and usually no English title. Default false: they are excluded so primary acts fill the page. Every returned row is tagged is_corrigendum.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / documents / items / properties / is_corrigendum
      Added value: +{
      +  "description": "True when this work carries the CORRIGENDUM resource-type — a correction to another act rather than a primary act. Only ever true when include_corrigenda is set, since corrigenda are excluded by default.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / documents / items / required
      Previous value: -[
      -  "work_uri",
      -  "celex_number",
      -  "is_consolidated"
      -]New value: +[
      +  "work_uri",
      +  "celex_number",
      +  "is_consolidated",
      +  "is_corrigendum"
      +]
    • addedOutput schema / properties / query_echo / properties / include_corrigenda
      Added value: +{
      +  "description": "Effective include_corrigenda value after the false default is applied — whether corrigenda were admitted alongside primary acts. Always present, since the default shapes which records can appear.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / query_echo / required
      Previous value: -[
      -  "include_consolidated"
      -]New value: +[
      +  "include_consolidated",
      +  "include_corrigenda"
      +]
  10. Changed6 schema fields changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "documents",
      -      "total",
      -      "offset",
      -      "query_echo"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "documents",
      +      "total",
      +      "offset",
      +      "has_more",
      +      "query_echo"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `no_results`: The query returned zero bindings — no matching documents in CELLAR. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `no_results`: The first page (offset 0) returned zero bindings — no matching documents in CELLAR. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "no_filters",
      -  "no_results",
      -  "sparql_error"
      -]New value: +[
      +  "no_filters",
      +  "invalid_date_range",
      +  "no_results",
      +  "sparql_error"
      +]
    • addedOutput schema / properties / has_more
      Added value: +{
      +  "description": "True only when CELLAR returned an additional valid row beyond this page.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / next_offset
      Added value: +{
      +  "description": "Offset for the next page. Present only when has_more is true.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when the returned page was capped at the limit and more documents may exist."New value: +"True when an additional CELLAR row proves more documents exist beyond this page."
  11. Changed3 schema fields changed
    • changedInput schema / properties / document_type / description
      Previous value: -"Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Omit to search all types. A type filter excludes consolidated texts (CONS_TEXT) — set include_consolidated to fold them back in."New value: +"Document category: REG=Regulations, DIR=Directives, DEC=Decisions, TREATY=Treaties, JUDG=Judgments, OPIN_AG=AG Opinions, PROP=Proposals, REC=Recommendations. Each category includes its explicit CELLAR authority variants (for example, delegated and implementing regulations). Omit to search all types. Consolidated texts are excluded unless include_consolidated is true."
    • changedInput schema / properties / include_consolidated / description
      Previous value: -"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that a plain type filter omits. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true."New value: +"When true and document_type is set, also match consolidated texts whose basic act belongs to that document category. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true."
    • changedOutput schema / properties / query_echo / properties / include_consolidated / description
      Previous value: -"Effective include_consolidated value after the false default is applied — whether consolidated texts (CONS_TEXT) of the document_type were folded in. Always present, since the default shapes which records can appear; has effect only when document_type is set."New value: +"Effective include_consolidated value after the false default is applied — whether consolidated texts whose basic act belongs to the document_type category were included. Always present, since the default shapes which records can appear; has effect only when document_type is set."
  12. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "documents",
      +      "total",
      +      "offset",
      +      "query_echo"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `no_filters`: No effective narrowing filter was supplied — an unfiltered search would scan the entire corpus. `no_results`: The query returned zero bindings — no matching documents in CELLAR. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_filters",
      +            "no_results",
      +            "sparql_error"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "documents",
      -  "total",
      -  "offset",
      -  "query_echo"
      -]
  13. Changed2 schema fields changed
    • addedOutput schema / properties / query_echo / properties / include_consolidated
      Added value: +{
      +  "description": "Effective include_consolidated value after the false default is applied — whether consolidated texts (CONS_TEXT) of the document_type were folded in. Always present, since the default shapes which records can appear; has effect only when document_type is set.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / query_echo / required
      Added value: +[
      +  "include_consolidated"
      +]
  14. Changed1 schema field changed
    • changedInput schema / properties / eurovoc_concept / anyOf
      Previous value: -[
      -  {
      -    "const": "",
      -    "type": "string"
      -  },
      -  {
      -    "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).",
      -    "pattern": "^http.*",
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).",
      +    "type": "string"
      +  }
      +]
  15. Changed7 schema fields changed
    • changedInput schema / properties / author_institution / description
      Previous value: -"Author institution name (e.g. \"European Parliament\", \"Council\", \"European Commission\"). Matched against the English names of EU corporate bodies; only works created by a matching institution are returned."New value: +"Author institution name (e.g. \"European Parliament\", \"Council\", \"European Commission\"), matched against the English names of EU corporate bodies."
    • changedInput schema / properties / date_from / description
      Previous value: -"Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no lower bound."New value: +"Start of date range (YYYY-MM-DD), matched against document date. Omit for no lower bound."
    • changedInput schema / properties / date_to / description
      Previous value: -"End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no upper bound."New value: +"End of date range (YYYY-MM-DD), matched against document date. Omit for no upper bound."
    • changedInput schema / properties / document_type / description
      Previous value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types. A type filter excludes consolidated texts (CONS_TEXT), which carry their own resource-type — set include_consolidated to fold them back in."New value: +"Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Omit to search all types. A type filter excludes consolidated texts (CONS_TEXT) — set include_consolidated to fold them back in."
    • changedInput schema / properties / eurovoc_concept / description
      Previous value: -"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828). Obtain concept URIs from eurlex_browse_subjects first. Leave blank or omit for no subject filter."New value: +"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828), obtained from eurlex_browse_subjects. Omit for no subject filter."
    • changedInput schema / properties / include_consolidated / description
      Previous value: -"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that incorporate later amendments and carry their own resource-type, so a plain type filter omits them. No effect when document_type is omitted (all types already return). Either way, consolidated rows are tagged is_consolidated: true."New value: +"When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that a plain type filter omits. No effect when document_type is omitted. Consolidated rows are always tagged is_consolidated: true."
    • changedOutput schema / properties / documents / items / properties / resource_type / description
      Previous value: -"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Works classified under several resource-types (e.g. corrigenda) list all labels, comma-separated. Absent for some older works."New value: +"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Works with several resource-types (e.g. corrigenda) list all, comma-separated. Absent for some older works."
  16. Changed7 schema fields changed
    • changedInput schema / properties / document_type / description
      Previous value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types."New value: +"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation. Leave blank or omit to search all document types. A type filter excludes consolidated texts (CONS_TEXT), which carry their own resource-type — set include_consolidated to fold them back in."
    • addedInput schema / properties / include_consolidated
      Added value: +{
      +  "default": false,
      +  "description": "When true and document_type is set, also match consolidated texts (CONS_TEXT) of that type — point-in-time versions that incorporate later amendments and carry their own resource-type, so a plain type filter omits them. No effect when document_type is omitted (all types already return). Either way, consolidated rows are tagged is_consolidated: true.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The limit that was applied to this page.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / documents / items / properties / is_consolidated
      Added value: +{
      +  "description": "True when this CELEX is a consolidated version — a point-in-time text (…-YYYYMMDD) that incorporates amendments — rather than a base or amending act.",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / documents / items / required
      Previous value: -[
      -  "work_uri",
      -  "celex_number"
      -]New value: +[
      +  "work_uri",
      +  "celex_number",
      +  "is_consolidated"
      +]
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Number of documents returned in this page.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when the returned page was capped at the limit and more documents may exist.",
      +  "type": "boolean"
      +}
  17. Changed1 schema field changed
    • changedInput schema / properties / keyword / description
      Previous value: -"Keyword to match against document titles. Single dominant word recommended; multi-word phrase uses substring match."New value: +"Keyword matched against English document titles via the full-text index (multi-word input is treated as a phrase), or against CELEX substrings."
  18. Changed17 schema fields changed
    • addedInput schema / properties / date_from / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "Start date in ISO 8601 format (YYYY-MM-DD).",
      +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / date_from / description
      Previous value: -"Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date."New value: +"Start of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no lower bound."
    • removedInput schema / properties / date_from / pattern
      Removed value: -"^\\d{4}-\\d{2}-\\d{2}$"
    • removedInput schema / properties / date_from / type
      Removed value: -"string"
    • addedInput schema / properties / date_to / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "End date in ISO 8601 format (YYYY-MM-DD).",
      +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / date_to / description
      Previous value: -"End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date."New value: +"End of date range in ISO 8601 format (YYYY-MM-DD). Matches document date. Leave blank or omit for no upper bound."
    • removedInput schema / properties / date_to / pattern
      Removed value: -"^\\d{4}-\\d{2}-\\d{2}$"
    • removedInput schema / properties / date_to / type
      Removed value: -"string"
    • addedInput schema / properties / document_type / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "Document type: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation.",
      +    "enum": [
      +      "REG",
      +      "DIR",
      +      "DEC",
      +      "TREATY",
      +      "JUDG",
      +      "OPIN_AG",
      +      "PROP",
      +      "REC"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / document_type / description
      Previous value: -"Document type filter: REG=Regulation, DIR=Directive, DEC=Decision, TREATY=Treaty, JUDG=Judgment, OPIN_AG=AG Opinion, PROP=Proposal, REC=Recommendation."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."
    • removedInput schema / properties / document_type / enum
      Removed value: -[
      -  "REG",
      -  "DIR",
      -  "DEC",
      -  "TREATY",
      -  "JUDG",
      -  "OPIN_AG",
      -  "PROP",
      -  "REC"
      -]
    • removedInput schema / properties / document_type / type
      Removed value: -"string"
    • addedInput schema / properties / eurovoc_concept / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "EuroVoc concept URI (e.g. http://eurovoc.europa.eu/2828).",
      +    "pattern": "^http.*",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / eurovoc_concept / description
      Previous value: -"EuroVoc concept URI to filter by subject (e.g. http://eurovoc.europa.eu/2828). Obtain concept URIs from eurlex_browse_subjects first."New 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."
    • removedInput schema / properties / eurovoc_concept / pattern
      Removed value: -"^http.*"
    • removedInput schema / properties / eurovoc_concept / type
      Removed value: -"string"
    • changedOutput schema / properties / documents / items / properties / resource_type / description
      Previous value: -"Human-readable document type label (e.g. \"Regulation\", \"Directive\"). Absent for some older works."New 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."
  19. Changed1 schema field changed
    • changedInput schema / properties / author_institution / description
      Previous value: -"Author institution name filter (e.g. \"European Parliament\", \"Council\"). Substring match."New 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."
  20. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Despite the annotations already marking the tool read-only and open-world, the description adds substantial operational context: no full-text body search, default exclusion of corrigenda, newest-first ordering, returned fields, is_consolidated and is_corrigendum flags, and the at-least-one-filter requirement. This gives an agent a clear behavioral picture beyond the structured annotations.

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

Conciseness4/5

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

The description is front-loaded with the core search purpose and then adds the most important constraints in a few dense sentences. It is slightly long because it repeats some schema-level caveats, but nearly every sentence carries relevant information for selecting and invoking the tool.

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

Completeness5/5

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

Given the 11-parameter schema, the annotations, and the output schema, the description covers the key behavioral facts an agent needs: no body search, required filtering, default corrigenda exclusion, and the shape of returned results. Pagination and limit details are left to the rich schema, which is appropriate.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, and the description still adds the important constraint that at least one filter is required, which is not expressed in the schema. It also summarizes keyword and corrigenda behavior, though most parameter-level detail is already present in the schema descriptions.

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

Purpose4/5

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

The description states a specific verb and resource: search EU legislation, treaties, and preparatory acts in CELLAR, filtered by type, dates, EuroVoc, author, and in-force status. It is clear on scope and content, but it does not explicitly distinguish itself from case-law-focused siblings such as eurlex_get_cases or from eurlex_lookup_celex beyond referencing eurlex_browse_subjects and eurlex_get_document for adjacent tasks.

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

Usage Guidelines4/5

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

It gives useful usage constraints: keyword searches titles and CELEX strings only, corrigenda are excluded unless include_corrigenda is set, and at least one filter is required. It also points to eurlex_browse_subjects for EuroVoc URIs and eurlex_get_document for in-force detail, but it stops short of clearly saying when to choose this tool versus eurlex_get_cases or eurlex_lookup_celex.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.