Skip to main content
Glama

Search CJEU/GC Case Law

eurlex_get_cases
Read-only

Search CJEU and General Court case law — judgments, orders, and Advocate General opinions and views — by case number, court, case type, keyword, and date range. A case number reaches every judgment, order, AG opinion, and AG view filed under it. By default only these primary records are returned; derivative judicial information notices, case abstracts, summaries, and corrigenda are excluded so distinct cases fill the page (set include_derivative to include them). Keyword matches English case titles (which carry party names) and CELEX strings; there is no full-text body search. Returns each case with its CELEX number (whose sixth character names the court: C, T, or F), work URI, ECLI, date, and type, plus — parsed from the title where present — the formation, Advocate General, parties, referring court, subject matter, and case reference. The raw CELLAR title is returned only when those fields do not capture all of it.

Input Schema

NameRequiredDescriptionDefault
courtNoCourt filter, by the court letter at position 6 of the CELEX: CJEU (C) = Court of Justice of the EU, GC (T) = General Court. It does not narrow by record type: every primary record the court filed matches, and its derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Omit to search every court.
limitNoMaximum number of results to return, 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 cases.
date_toNoEnd of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no upper bound.
keywordNoKeyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX that opens with the sector and year (62013CJ), the year and type letters (2013CJ0131), or type letters followed by the number (CJ0131, J0131) matches every CELEX that holds it at that position; one opening with letters not followed by a digit (R(01)) tests every CELEX and can take tens of seconds; a bare year (2013) or a fragment opening mid-year or mid-number (013CJ0131, 0131) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected.
case_typeNoCase type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view). Omit to search all.
date_fromNoStart of date range in ISO 8601 format (YYYY-MM-DD). Leave blank or omit for no lower bound.
case_numberNoNumber of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form ("Case C-97/23 P."), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case ("C-131/12 and C-132/12") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice ("Opinion 2/13", "Ruling 1/78") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters is matched as a CELEX substring instead, case-insensitively: one opening with the sector and year (62014CJ0362), the year and both letters (2013CJ0131), or both letters and the number (CJ0131) is answered from the CELEX index; any other (12CJ0131, 0131) tests every CELEX and can take tens of seconds.
include_derivativeNoInclude derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, AG opinions, and AG views. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already requires the selected primary type family).

Output Schema

NameRequiredDescriptionDefault
capNoThe limit that was applied to this page.
casesNoMatching case law records ordered by date descending, then by CELEX number ascending among records sharing a date, so pages are stable across calls.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of cases returned in this page.
totalNoNumber of cases returned in this page (not a corpus-wide count).
noticeNoGuidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from; 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.
truncatedNoTrue when an additional CELLAR row proves more cases exist beyond this page.
query_echoNoEcho of filters applied to this search. Useful for diagnosing empty results.
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. Changed3 schema fields changed
    • changedInput schema / properties / case_type / anyOf
      Previous value: -[
      -  {
      -    "const": "",
      -    "type": "string"
      -  },
      -  {
      -    "description": "judgment, order (procedural decision), or ag_opinion (Advocate General opinion).",
      -    "enum": [
      -      "judgment",
      -      "order",
      -      "ag_opinion"
      -    ],
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view).",
      +    "enum": [
      +      "judgment",
      +      "order",
      +      "ag_opinion"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / case_type / description
      Previous value: -"Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Omit to search all."New value: +"Case type: judgment, order (procedural decision), or ag_opinion (Advocate General opinion or view). Omit to search all."
    • changedInput schema / properties / include_derivative / description
      Previous value: -"Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)."New value: +"Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, AG opinions, and AG views. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already requires the selected primary type family)."
  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 cases."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `invalid_keyword`: keyword holds no letters or digits, so no case title and no CELEX can match it. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `offset_past_window`: offset is 10,000 or more, past the last row CELLAR sorts for one search. `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `invalid_keyword`: keyword holds no letters or digits, so no case title and no CELEX can match it. `sparql_error`: CELLAR rejected the search it was sent: a filter combination its query planner cannot compile. The same call fails the same way again. `sparql_timeout`: The search ran past the client timeout, or CELLAR refused it as too costly to run. It is not retried. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_date_range",
      -  "invalid_case_number",
      -  "invalid_keyword",
      -  "sparql_error"
      -]New value: +[
      +  "offset_past_window",
      +  "invalid_date_range",
      +  "invalid_case_number",
      +  "invalid_keyword",
      +  "sparql_error",
      +  "sparql_timeout"
      +]
    • 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. Changed5 schema fields changed
    • addedOutput schema / properties / cases / items / properties / advocate_general
      Added value: +{
      +  "description": "Advocate General who delivered the opinion, from an AG opinion title (e.g. \"Jääskinen\"). Absent on judgments and orders.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / cases / items / properties / display_title / description
      Previous value: -"Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties. Parsed from title; absent when title is."New value: +"Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties. Parsed from the English title; absent when the record has none or its title carries no \"#\" segments."
    • addedOutput schema / properties / cases / items / properties / formation
      Added value: +{
      +  "description": "Formation that decided, from the title's leading segment, verbatim (e.g. \"Grand Chamber\", \"Full Court\", \"Fourth Chamber, Extended Composition\"), or \"President\", \"Vice-President\", or \"President of the Second Chamber\" for an order issued by that office. Absent when the title names none, as older \"Judgment of the Court of …\" titles do.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / cases / items / properties / referring_court
      Added value: +{
      +  "description": "National court that referred a preliminary ruling, from the title's referral segment (e.g. \"Audiencia Nacional\", or \"Tariefcommissie - Netherlands\" in older titles). Absent on direct actions and appeals.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / cases / items / properties / title / description
      Previous value: -"Raw English expression title as stored in CELLAR — a \"#\"-delimited string (court+date, parties, subject-matter, case reference) whose segments are surfaced in display_title, parties, subject_matter, and case_reference. Absent for many older cases."New value: +"Raw English expression title as stored in CELLAR, a \"#\"-delimited string (court, formation and date; parties; referral; subject matter; case reference). Present only when the parsed fields do not capture all of it: a segment the parser could not place, a judgment or order published by extracts (\"(Extracts)\"), a leading date that differs from date, or a title with no \"#\". Absent when the parse is complete, and for records with no English title."
  4. Changed2 schema fields changed
    • changedInput schema / properties / case_number / description
      Previous value: -"Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form (\"Case C-97/23 P.\"), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case (\"C-131/12 and C-132/12\") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice (\"Opinion 2/13\", \"Ruling 1/78\") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters (e.g. 2023CJ0097) is matched as a CELEX substring instead."New value: +"Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form (\"Case C-97/23 P.\"), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case (\"C-131/12 and C-132/12\") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice (\"Opinion 2/13\", \"Ruling 1/78\") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters is matched as a CELEX substring instead, case-insensitively: one opening with the sector and year (62014CJ0362), the year and both letters (2013CJ0131), or both letters and the number (CJ0131) is answered from the CELEX index; any other (12CJ0131, 0131) tests every CELEX and can take tens of seconds."
    • changedInput schema / properties / keyword / description
      Previous value: -"Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX (e.g. 2013CJ0131) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."New value: +"Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX that opens with the sector and year (62013CJ), the year and type letters (2013CJ0131), or type letters followed by the number (CJ0131, J0131) matches every CELEX that holds it at that position; one opening with letters not followed by a digit (R(01)) tests every CELEX and can take tens of seconds; a bare year (2013) or a fragment opening mid-year or mid-number (013CJ0131, 0131) matches titles only. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
  5. Changed4 schema fields changed
    • changedInput schema / properties / keyword / description
      Previous value: -"Keyword to match against case titles and CELEX strings."New value: +"Keyword matched against English case titles via the full-text index (multi-word input is treated as a phrase), and against CELEX numbers. A keyword that is a whole CELEX (e.g. 62023CO0097) matches that record, its numbered siblings (…(01) to …(20)), its _INF, _RES, _SUM, and _EXT records, and its corrigenda, with notices, abstracts, summaries, and corrigenda still joining only under include_derivative; for every record filed under a case, use case_number. A partial CELEX (e.g. 2013CJ0131) matches every CELEX containing it. A keyword with no digit, or with a character no CELEX holds (a space, a period), matches titles only. A keyword with no letter or digit is rejected."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `no_results`: The first page (offset 0) returned zero bindings — no matching cases in CELLAR sector 6. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `invalid_keyword`: keyword holds no letters or digits, so no case title and no CELEX can match it. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_date_range",
      -  "invalid_case_number",
      -  "no_results",
      -  "sparql_error"
      -]New value: +[
      +  "invalid_date_range",
      +  "invalid_case_number",
      +  "invalid_keyword",
      +  "sparql_error"
      +]
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Guidance for the next call: on an empty first page, the filters that matched nothing and how to broaden them; on a page with more rows, the offset to continue from.",
      +  "type": "string"
      +}
  6. Changed1 schema field changed
    • changedOutput schema / properties / cases / description
      Previous value: -"Matching case law records ordered by date descending."New value: +"Matching case law records ordered by date descending, then by CELEX number ascending among records sharing a date, so pages are stable across calls."
  7. Changed7 schema fields changed
    • changedInput schema / properties / case_number / description
      Previous value: -"Case number in standard format: C-{num}/{year} for CJEU or T-{num}/{year} for General Court (e.g. C-131/12)."New value: +"Number of a single case: C-{num}/{year} (Court of Justice), T-{num}/{year} (General Court), or F-{num}/{year} (Civil Service Tribunal), e.g. C-131/12. Also accepts the case_reference form (\"Case C-97/23 P.\"), any procedural suffix after the year (P, R, PPU, …), and a pre-1989 Court of Justice number with no prefix (26/62). A value naming more than one case (\"C-131/12 and C-132/12\") is rejected; search each separately. Matches the judgments, orders, AG opinions, and other primary records filed under that number; derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Numbered Opinions and Rulings of the Court of Justice (\"Opinion 2/13\", \"Ruling 1/78\") are not reached by a case number; look one up by its CELEX (e.g. 62013CV0002). A value made only of CELEX characters (e.g. 2023CJ0097) is matched as a CELEX substring instead."
    • changedInput schema / properties / court / anyOf
      Previous value: -[
      -  {
      -    "const": "",
      -    "type": "string"
      -  },
      -  {
      -    "description": "CJEU = Court of Justice of the EU, GC = General Court.",
      -    "enum": [
      -      "CJEU",
      -      "GC"
      -    ],
      -    "type": "string"
      -  }
      -]New value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "CJEU (C) = Court of Justice of the EU, GC (T) = General Court.",
      +    "enum": [
      +      "CJEU",
      +      "GC"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / court / description
      Previous value: -"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Omit to search both."New value: +"Court filter, by the court letter at position 6 of the CELEX: CJEU (C) = Court of Justice of the EU, GC (T) = General Court. It does not narrow by record type: every primary record the court filed matches, and its derivative records (notices, abstracts, summaries, corrigenda) join only under include_derivative. Omit to search every court."
    • addedOutput schema / properties / cases / items / properties / ecli
      Added value: +{
      +  "description": "European Case Law Identifier, the citation form of the record (e.g. \"ECLI:EU:C:2014:317\"); eurlex_lookup_celex resolves one back to its CELEX. Absent for judicial notices and the few records that carry none.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `no_results`: The first page (offset 0) returned zero bindings — no matching cases in CELLAR sector 6. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `invalid_case_number`: case_number is not a recognizable case number and holds characters no CELEX contains, names more than one case (e.g. \"C-131/12 and C-132/12\"), or is a prefix-less number dated outside 1953–1988. `no_results`: The first page (offset 0) returned zero bindings — no matching cases in CELLAR sector 6. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_date_range",
      -  "no_results",
      -  "sparql_error"
      -]New value: +[
      +  "invalid_date_range",
      +  "invalid_case_number",
      +  "no_results",
      +  "sparql_error"
      +]
    • changedOutput schema / properties / query_echo / properties / celex_fragment / description
      Previous value: -"CELEX substring derived from case_number."New value: +"CELEX pattern matched for case_number: year, court letter, and zero-padded case number, with * standing for any document letter that court files under a case number (e.g. \"2023C*0097\" reaches 62023CJ0097, 62023CO0097, and 62023CC0097). Absent when case_number was matched as a raw CELEX substring."
  8. Changed6 schema fields changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "cases",
      -      "total",
      -      "offset",
      -      "query_echo"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "cases",
      +      "total",
      +      "offset",
      +      "has_more",
      +      "query_echo"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `no_results`: The query returned zero bindings — no matching cases in CELLAR sector 6. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_date_range`: date_from or date_to is not a real calendar date, or date_from falls after date_to. `no_results`: The first page (offset 0) returned zero bindings — no matching cases in CELLAR sector 6. A later page that comes back empty returns an empty success instead. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "no_results",
      -  "sparql_error"
      -]New value: +[
      +  "invalid_date_range",
      +  "no_results",
      +  "sparql_error"
      +]
    • addedOutput schema / properties / has_more
      Added value: +{
      +  "description": "True only when CELLAR returned an additional valid row beyond this page.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / next_offset
      Added value: +{
      +  "description": "Offset for the next page. Present only when has_more is true.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when the returned page was capped at the limit and more cases may exist."New value: +"True when an additional CELLAR row proves more cases exist beyond this page."
  9. 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": [
      +      "cases",
      +      "total",
      +      "offset",
      +      "query_echo"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `no_results`: The query returned zero bindings — no matching cases in CELLAR sector 6. `sparql_error`: Virtuoso returned HTTP 200 with an error body — query malformed or timed out. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_results",
      +            "sparql_error"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "cases",
      -  "total",
      -  "offset",
      -  "query_echo"
      -]
  10. Changed3 schema fields changed
    • changedInput schema / properties / include_derivative / description
      Previous value: -"Include derivative sector-6 records — judicial information notices, case abstracts, and case summaries — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)."New value: +"Include derivative sector-6 records — judicial information notices, case abstracts, case summaries, and corrigenda — alongside primary judgments, orders, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type)."
    • addedOutput schema / properties / query_echo / properties / include_derivative
      Added value: +{
      +  "description": "Effective include_derivative value after the false default is applied — whether derivative sector-6 records (notices, abstracts, summaries, corrigenda) were admitted alongside primary cases. Always present, since the default shapes which records can appear.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / query_echo / required
      Added value: +[
      +  "include_derivative"
      +]
  11. Changed1 schema field changed
    • addedInput schema / properties / include_derivative
      Added 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"
      +}
  12. Changed6 schema fields changed
    • changedInput schema / properties / case_type / description
      Previous 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."
    • changedInput schema / properties / court / description
      Previous 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."
    • changedOutput schema / properties / cases / items / properties / display_title / description
      Previous value: -"Clean human-readable title for display — the parties for a contested case (e.g. \"Google Spain SL v AEPD\"), or the court/AG descriptor when a case has no named parties (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."
    • changedOutput schema / properties / cases / items / properties / parties / description
      Previous 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)."
    • changedOutput schema / properties / cases / items / properties / resource_type / description
      Previous 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."
    • changedOutput schema / properties / cases / items / properties / title / description
      Previous 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."
  13. Changed5 schema fields changed
    • addedOutput schema / properties / cases / items / properties / case_reference
      Added 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"
      +}
    • addedOutput schema / properties / cases / items / properties / display_title
      Added 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"
      +}
    • addedOutput schema / properties / cases / items / properties / parties
      Added 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"
      +}
    • addedOutput schema / properties / cases / items / properties / subject_matter
      Added 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"
      +}
    • changedOutput schema / properties / cases / items / properties / title / description
      Previous 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."
  14. Changed3 schema fields changed
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The limit that was applied to this page.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Number of cases 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 cases may exist.",
      +  "type": "boolean"
      +}
  15. Changed17 schema fields changed
    • addedInput schema / properties / case_type / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "judgment, order (procedural decision), or ag_opinion (Advocate General opinion).",
      +    "enum": [
      +      "judgment",
      +      "order",
      +      "ag_opinion"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / case_type / description
      Previous value: -"Case type filter: judgment, order (procedural decision), or ag_opinion (Advocate General opinion)."New value: +"Case type filter: judgment, order (procedural decision), or ag_opinion (Advocate General opinion). Leave blank or omit to search all case types."
    • removedInput schema / properties / case_type / enum
      Removed value: -[
      -  "judgment",
      -  "order",
      -  "ag_opinion"
      -]
    • removedInput schema / properties / case_type / type
      Removed value: -"string"
    • addedInput schema / properties / court / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "CJEU = Court of Justice of the EU, GC = General Court.",
      +    "enum": [
      +      "CJEU",
      +      "GC"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / court / description
      Previous value: -"Court filter: CJEU = Court of Justice of the EU, GC = General Court."New value: +"Court filter: CJEU = Court of Justice of the EU, GC = General Court. Leave blank or omit to search both courts."
    • removedInput schema / properties / court / enum
      Removed value: -[
      -  "CJEU",
      -  "GC"
      -]
    • removedInput schema / properties / court / type
      Removed value: -"string"
    • 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)."New value: +"Start of date range in ISO 8601 format (YYYY-MM-DD). 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)."New value: +"End of date range in ISO 8601 format (YYYY-MM-DD). 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"
    • changedOutput schema / properties / cases / items / properties / resource_type / description
      Previous value: -"Human-readable case type label (e.g. \"Judgment\", \"Order\", \"AG Opinion\"). Absent for some older cases."New 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."
  16. First observed

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only/open-world safety, yet the description still adds behavior the agent could not infer: derivative notices/abstracts/summaries/corrigenda are suppressed by default so distinct cases fill the page, and keyword matching is title+CELEX only, not full text. Some of this (10,000-row sort cap, slow prefix scans) is duplicated from the schema rather than new.

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

Conciseness4/5

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

Purpose and default behavior are front-loaded in the first two sentences, and the remaining content is dense and largely earns its place. The final sentence describing return fields is wordy and partly redundant with the output schema.

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

Completeness5/5

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

Despite an output schema and nine parameters, the description covers the exclusions, the no-body-search limitation, and the shape of what comes back, so an agent knows exactly what a call yields and how to widen it. Nothing essential to calling it correctly is missing.

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

Parameters4/5

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

With 100% schema coverage the baseline is 3; the description still adds interpretive value, notably that the sixth CELEX character encodes court (C/T/F) and that a case number reaches every primary record filed under it. Keyword and case_number semantics are largely restated from the schema, limiting it to a 4.

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

Purpose5/5

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

Specific verb+resource ('Search CJEU and General Court case law') with an explicit enumeration of the record families covered (judgments, orders, AG opinions, views) and the filter axes. It also carves out scope boundaries (derivative records excluded by default) that make it clearly distinct from the broader document-search sibling.

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

Usage Guidelines4/5

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

States when to use case_number versus keyword ('for every record filed under a case, use case_number') and warns 'there is no full-text body search', which steers the agent toward title/CELEX matching. It stops short of naming alternative sibling tools (eurlex_lookup_celex, eurlex_search_documents), so routing to a different tool is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.