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 — by case number, court, case type, keyword, and date range. A case number reaches every judgment, order, and AG opinion 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

TableJSON 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 (1–100). Defaults to 20.
offsetNoPagination offset — number of results to skip. Defaults to 0.
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). 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, and AG opinions. Default false: these are excluded so distinct primary cases fill the page. Ignored when case_type is set (that path already returns a single primary type).

Output Schema

TableJSON 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.
offsetNoPagination offset used for this response.
has_moreNoTrue only when CELLAR returned an additional valid row beyond this page.
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.
next_offsetNoOffset for the next page. Present only when has_more is true.

Schema Changelog

Changes observed during successful MCP inspections.

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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=true, so the description carries the full burden of behavioral disclosure. It does so extensively: default exclusion of derivatives, keyword matching semantics (phrase matching, CELEX substring patterns, performance warnings), case_number accepted forms and rejection of multi-case values, interaction of court filter with record types, and the return fields including the parsed title fields. It even notes when the raw CELLAR title is returned. No contradiction with 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 dense but appropriately so given the tool's complexity. It is front-loaded with purpose and then flows logically through default behavior, keyword, case_number, and derivative handling. However, it is a single long paragraph without visual breaks (e.g., bullet points), which could be slightly harder to scan. Still, every sentence earns its place; no fluff. A 4 reflects the slight lack of structuring while acknowledging the necessity of the detail.

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 description covers all essential aspects for correct invocation: the full filter set, their interactions, edge cases (pre-1989 numbers, numbered opinions, multi-case rejection), performance warnings, and the exact return fields including how title parsing works. An output schema exists, so return-value details are partially covered, but the description adds the crucial behavioral context (e.g., when raw title is returned). Nothing an agent needs to decide when and how to call this tool is missing.

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?

Although schema coverage is 100%, the description adds substantial meaning beyond the schema. For keyword, it explains phrase matching, CELEX matching patterns, and the trade-offs of partial CELEX inputs. For case_number, it details accepted formats, rejects multi-case values, and clarifies the CELEX substring fallback. For include_derivative, it explains the default behavior and its interaction with case_type. This goes well beyond the schema's basic descriptions and significantly helps an agent choose correct parameter values.

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?

The description opens with a precise statement of what the tool does — search CJEU/GC case law — and enumerates the specific filters (case number, court, case type, keyword, date range). It clearly distinguishes the record set (judgments, orders, AG opinions) and immediately notes the exclusion of derivative records, which differentiates it from sibling search tools. This is a specific verb+resource with explicit scope.

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

Usage Guidelines5/5

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

The description provides explicit usage guidance: when to use case_number vs keyword, when to set include_derivative, that case_type overrides include_derivative, and that numbered opinions/rulings must be looked up by CELEX rather than case number. It also warns against multi-case input and explains performance implications for certain CELEX patterns. While it does not name sibling tool names, it gives actionable alternative approaches, which is sufficient.

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.