Skip to main content
Glama

Resolve EU Legal Citation

eurlex_lookup_celex
Read-onlyIdempotent

Resolve an EU legal citation — a CELEX number, ELI URI, ECLI, or an OJ citation naming its act type and year (e.g. "Regulation (EU) 2016/679", "Directive 95/46/EC") — to its canonical CELLAR work, confirming it exists before you fetch or traverse it. Returns the work URI, confirmed CELEX number, document type, date, and the ECLI of a case that carries one. A CELEX that CELLAR holds under several works resolves to the one the EUR-Lex content resolver serves. An ECLI shared by several records (a judgment and its abstract or extract, or a joined AG opinion) resolves to the primary record with the lowest CELEX.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
identifierYesThe EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), an ECLI (e.g. ECLI:EU:C:2014:317), or an OJ citation that names its act type and year, resolved to the CELEX it names under identifier_type "auto": Regulation (EU) 2016/679, Regulation (EC) No 1049/2001, Directive 95/46/EC, Decision No 1313/2013/EU, Council Framework Decision 2002/584/JHA, Council Joint Action 2008/124/CFSP, Common Position 2003/444/CFSP. "No" before the numbers means number/year, otherwise year/number; a two-digit year is 19YY. A citation without its act type (95/46/EC) or year (Regulation No 17) is not parsed.
identifier_typeNoFormat of the identifier. "auto" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), or an OJ citation; "celex", "eli", or "ecli" forces that lookup. An OJ citation is recognized only under "auto".auto

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dateNoDocument date in ISO 8601 format (YYYY-MM-DD).
ecliNoEuropean Case Law Identifier of the case (e.g. "ECLI:EU:C:2014:317"), as CELLAR stores it — the resolved work's own, or the one another work holding the same CELEX records. Present for case law that carries one; absent for legislation and judicial notices.
errorNoPresent when the call failed. Absent on success.
foundNoTrue when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, or OJ citation matches no work in the corpus, with a notice naming what was tried. Only an identifier_type "auto" value that, after trimming, is neither an ECLI, an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year raises ambiguous_identifier instead.
noticeNoPresent only when found is false: the CELEX, ELI, or ECLI looked up, the accepted forms, and the search to use instead.
work_uriNoCELLAR work URI (stable resource identifier).
celex_numberNoConfirmed CELEX number for the resolved work.
resource_typeNoHuman-readable document category resolved from the CDM resource type (e.g. "Regulation", "Directive", "Judgment"). An authority value with no known label falls back to its code (e.g. "BUDGET"). Absent for some works.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / identifier / description
      Previous value: -"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), or an ECLI (e.g. ECLI:EU:C:2014:317)."New value: +"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), an ECLI (e.g. ECLI:EU:C:2014:317), or an OJ citation that names its act type and year, resolved to the CELEX it names under identifier_type \"auto\": Regulation (EU) 2016/679, Regulation (EC) No 1049/2001, Directive 95/46/EC, Decision No 1313/2013/EU, Council Framework Decision 2002/584/JHA, Council Joint Action 2008/124/CFSP, Common Position 2003/444/CFSP. \"No\" before the numbers means number/year, otherwise year/number; a two-digit year is 19YY. A citation without its act type (95/46/EC) or year (Regulation No 17) is not parsed."
    • changedInput schema / properties / identifier_type / description
      Previous value: -"Format of the identifier. \"auto\" detects it automatically (an ECLI by its ECLI: prefix, in any letter case); supply \"celex\", \"eli\", or \"ecli\" explicitly if detection fails."New value: +"Format of the identifier. \"auto\" detects a CELEX, an ELI URI, an ECLI (by its ECLI: prefix, in any letter case), or an OJ citation; \"celex\", \"eli\", or \"ecli\" forces that lookup. An OJ citation is recognized only under \"auto\"."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ECLI (ECLI: prefix), an ELI URI, nor CELEX-shaped (uppercase), so no lookup branch applies. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ECLI (ECLI: prefix), an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year (e.g. \"Regulation No 17\" names no year), so no lookup branch applies. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / found / description
      Previous value: -"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, or ECLI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI URI, nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, ECLI, or OJ citation matches no work in the corpus, with a notice naming what was tried. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI URI, CELEX-shaped (uppercase), nor an OJ citation naming its act type and year raises ambiguous_identifier instead."
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Present only when found is false: the CELEX, ELI, or ECLI looked up, the accepted forms, and the search to use instead.",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / ecli / description
      Previous value: -"European Case Law Identifier of the resolved work (e.g. \"ECLI:EU:C:2014:317\"), as CELLAR stores it. Present for case law that carries one; absent for legislation and judicial notices."New value: +"European Case Law Identifier of the case (e.g. \"ECLI:EU:C:2014:317\"), as CELLAR stores it — the resolved work's own, or the one another work holding the same CELEX records. Present for case law that carries one; absent for legislation and judicial notices."
  3. Changed6 schema fields changed
    • changedInput schema / properties / identifier / description
      Previous value: -"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679) or a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix)."New value: +"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix), or an ECLI (e.g. ECLI:EU:C:2014:317)."
    • changedInput schema / properties / identifier_type / description
      Previous value: -"Format of the identifier. \"auto\" detects it automatically; supply \"celex\" or \"eli\" explicitly if detection fails."New value: +"Format of the identifier. \"auto\" detects it automatically (an ECLI by its ECLI: prefix, in any letter case); supply \"celex\", \"eli\", or \"ecli\" explicitly if detection fails."
    • changedInput schema / properties / identifier_type / enum
      Previous value: -[
      -  "celex",
      -  "eli",
      -  "auto"
      -]New value: +[
      +  "celex",
      +  "eli",
      +  "ecli",
      +  "auto"
      +]
    • addedOutput schema / properties / ecli
      Added value: +{
      +  "description": "European Case Law Identifier of the resolved work (e.g. \"ECLI:EU:C:2014:317\"), as CELLAR stores it. Present for case law that carries one; absent for legislation and judicial notices.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase), so no lookup branch applies. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ECLI (ECLI: prefix), an ELI URI, nor CELEX-shaped (uppercase), so no lookup branch applies. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / found / description
      Previous value: -"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX, ELI, or ECLI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ECLI, an ELI URI, nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."
  4. Changed1 schema field changed
    • changedOutput schema / properties / resource_type / description
      Previous value: -"Human-readable document category resolved from the CDM resource type (e.g. \"Regulation\", \"Directive\", \"Judgment\"). An authority value with no known label falls back to its code (e.g. \"CONS_TEXT\"). Absent for some works."New value: +"Human-readable document category resolved from the CDM resource type (e.g. \"Regulation\", \"Directive\", \"Judgment\"). An authority value with no known label falls back to its code (e.g. \"BUDGET\"). Absent for some works."
  5. Changed1 schema field changed
    • changedOutput schema / properties / resource_type / description
      Previous value: -"CDM resource type URI indicating the document category (e.g. .../resource-type/REG for Regulation). Absent for some works."New value: +"Human-readable document category resolved from the CDM resource type (e.g. \"Regulation\", \"Directive\", \"Judgment\"). An authority value with no known label falls back to its code (e.g. \"CONS_TEXT\"). Absent for some works."
  6. Changed2 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier format could not be determined. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase), so no lookup branch applies. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / found / description
      Previous value: -"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. A malformed or undetectable identifier raises ambiguous_identifier instead."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. Only an identifier_type \"auto\" value that, after trimming, is neither an ELI URI nor CELEX-shaped (uppercase) raises ambiguous_identifier instead."
  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": [
      +      "found"
      +    ]
      +  },
      +  {
      +    "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: `ambiguous_identifier`: identifier_type is \"auto\" and the identifier format could not be determined. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "ambiguous_identifier"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "found"
      -]
  8. Changed1 schema field changed
    • changedInput schema / properties / identifier_type / description
      Previous value: -"Format of the identifier. Use \"auto\" to let the server detect the format automatically. Supply explicitly if auto-detection fails or if the identifier is ambiguous."New value: +"Format of the identifier. \"auto\" detects it automatically; supply \"celex\" or \"eli\" explicitly if detection fails."
  9. Changed1 schema field changed
    • changedOutput schema / properties / found / description
      Previous value: -"Always true on success (the tool throws not_found when the identifier does not resolve). Present as a discriminator for downstream logic."New value: +"True when the identifier resolves to a CELLAR work; false when a well-formed CELEX/ELI matches no work in the corpus. A malformed or undetectable identifier raises ambiguous_identifier instead."
  10. Changed2 schema fields changed
    • changedInput schema / properties / identifier / description
      Previous value: -"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679), ELI URI, or Official Journal reference (e.g. OJ L 119)."New value: +"The EU legal citation to resolve: a CELEX number (e.g. 32016R0679) or a work-level ELI URI (e.g. http://data.europa.eu/eli/reg/2016/679, with or without the /oj suffix)."
    • changedInput schema / properties / identifier_type / enum
      Previous value: -[
      -  "celex",
      -  "eli",
      -  "oj",
      -  "auto"
      -]New value: +[
      +  "celex",
      +  "eli",
      +  "auto"
      +]
  11. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is known. The description adds valuable behavioral detail beyond that: explains ambiguity resolution (multiple works, shared ECLI) and the deterministic rule for selecting the primary record. It does not describe failure modes or error handling, but the disclosed resolution rules are useful and not redundant 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.

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and efficiently covers input types, return values, and resolution rules in a few sentences. Every sentence contributes meaning without redundancy.

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

Completeness5/5

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

Given the tool's complexity (multiple identifier formats, ambiguity resolution) and the presence of an output schema documenting return structure, the description fully covers input handling, resolution behavior, and return fields. It is complete for an agent to invoke correctly.

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

Parameters3/5

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

Schema description coverage is 100%, with exhaustive detail on the identifier parameter including parsing rules for OJ citations and identifier_type descriptions. The tool description itself adds no additional parameter semantics beyond what the schema already provides. Baseline 3 is appropriate since the schema carries the full burden.

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 clearly states the tool's function: resolving EU legal citations to canonical CELLAR works. It specifies the verb 'Resolve', names the resource ('CELLAR work'), and enumerates the output fields. It distinguishes itself from siblings by its focus on resolution rather than search or retrieval, though it does not explicitly name an alternative.

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 implies when to use it — 'confirming it exists before you fetch or traverse it' — which points to use before retrieval tools like eurlex_get_document. It does not explicitly exclude other tools or state when not to use it, but the context is clear enough for an agent to infer the appropriate usage.

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.