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

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

Output Schema

TableJSON 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.
offsetNoPagination offset used for this response.
has_moreNoTrue only when CELLAR returned an additional valid row beyond this page.
documentsNoMatching EU documents ordered by date descending, then by CELEX number ascending among documents sharing a date, so pages are stable across calls.
truncatedNoTrue when an additional CELLAR row proves more documents exist beyond this page.
query_echoNoEcho of filters applied to this search. Useful for diagnosing empty results.
next_offsetNoOffset for the next page. Present only when has_more is true.

Schema Changelog

Changes observed during successful MCP inspections.

  1. 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."
  2. 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."
  3. 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."
  4. 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."
  5. 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"
      +}
  6. 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."
  7. 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"
      +]
  8. 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."
  9. 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."
  10. 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"
      -]
  11. 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"
      +]
  12. 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"
      +  }
      +]
  13. 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."
  14. 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"
      +}
  15. 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."
  16. 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."
  17. 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."
  18. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations provide readOnlyHint and openWorldHint, but the description adds substantial behavioral context beyond them: newest-first ordering, per-row is_consolidated and is_corrigendum flags, default corrigenda exclusion, and nuanced CELEX matching behavior including potential slow searches. It also discloses data limitations, such as only a minority of works carrying the in-force property. No contradiction with the annotations.

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

Conciseness5/5

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

The main description is front-loaded: purpose, core limitation, default behavior, return shape, and required condition all appear in a short, ordered block. The long keyword parameter description is verbose only because the behavior is genuinely complex and consequential. Every sentence earns its place, and there is no filler.

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

Completeness5/5

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

The definition covers all 11 parameters, mandatory filter usage, default exclusions, return fields, ordering, and a reference to eurlex_get_document for in-force details. With an output schema present and read-only annotations, an agent has everything needed to select and invoke the tool correctly. The only minor omission, explicit naming of sibling tools for alternate lookup flows, does not make the tool incomplete.

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

Parameters5/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines4/5

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

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

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.