Skip to main content
Glama

Payments Law — EU payments legislation

Compare PSR or PSD3 article versions

compare_versions
Read-onlyIdempotent

Use this to compare an article between the Commission proposal and the Council compromise text of PSR or PSD3, within the same instrument. Serves the word-level comparison the build published: a pair is servable if and only if a diff artefact exists for it — the PSR and PSD3 proposal↔compromise pairs and nothing else. Every other pair is refused, including any with a text published in the Official Journal; for every consolidated instrument's pinned as-adopted text the refusal carries the URL where that text is published. This service never recomputes a comparison. Pairs match in either direction, and a reversed request is the same artefact with the ops inverted. changes reads that artefact structurally, for a caller that needs what kind of change this was without parsing the word-level ops.

Input Schema

NameRequiredDescriptionDefault
limitNo
cursorNo
to_locatorNoThe article on the to side.
from_locatorNoThe article on the from side. Alignment is identity on the article number, so naming either side names both.
instrument_idYesRegistry id of the instrument, e.g. "psr".
to_version_idYesVersion id the other side.
from_version_idYesVersion id one side of the pair.

Output Schema

NameRequiredDescriptionDefault
dataYes
errorYes
coverageYes
warningsYes
paginationYes
provenanceYes
derivationsYes
corpus_releaseYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / data / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "article": {
      -        "type": "string"
      -      },
      -      "changes": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "additionalProperties": {},
      -              "properties": {
      -                "type": {
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "type"
      -              ],
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "What KIND of change this comparison evidences, read off the same artefact as pairs[]. Types: paragraph_added, paragraph_deleted, paragraph_amended (with words_changed, counting both sides of a substitution), figure_changed (with from/to quoting the served text), heading_changed, the article_* counterparts of the first three for an article's text outside any numbered paragraph, and none_detected where nothing was found — never an empty list. An entry carries `paragraph` and, where the served text settles it, `point` and `subpoint`, in the §7 locator model's own field names; an article_* entry carries none of them. Those components are a CITATION, not a promise of retrieval: a sub-point is often not a block get_provision serves, so open an entry at the enclosing point, and then the paragraph, which does serve the text the entry quotes. A roman sub-point is always qualified by its letter point (PSR Art 97(2)(a)(ii), never (ii) alone), and a list the text does not settle is left unlocated. ARTICLE-SCOPED, not page-scoped: the whole inventory travels with every page of pairs[], so a client paging through must not concatenate it. Repeated identical entries are repeated occurrences in one paragraph, not duplicates. Null means this release predates the inventory, which is not the same as none_detected."
      -      },
      -      "cite": {
      -        "type": "string"
      -      },
      -      "classification_note": {
      -        "type": "string"
      -      },
      -      "comparison_url": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "direction": {
      -        "type": "string"
      -      },
      -      "editorial_review_state": {
      -        "type": "string"
      -      },
      -      "from": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "version_id": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "version_id"
      -        ],
      -        "type": "object"
      -      },
      -      "instrument_id": {
      -        "type": "string"
      -      },
      -      "pairs": {
      -        "items": {
      -          "additionalProperties": {},
      -          "properties": {
      -            "ops": {
      -              "items": {
      -                "items": false,
      -                "maxItems": 2,
      -                "minItems": 2,
      -                "prefixItems": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "string"
      -                  }
      -                ],
      -                "type": "array"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "ops"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "status": {
      -        "type": "string"
      -      },
      -      "to": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "version_id": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "version_id"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "instrument_id",
      -      "article",
      -      "cite",
      -      "from",
      -      "to",
      -      "status",
      -      "direction",
      -      "editorial_review_state",
      -      "classification_note",
      -      "comparison_url",
      -      "changes",
      -      "pairs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "article": {
      +        "type": "string"
      +      },
      +      "changes": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "paragraph": {
      +                  "description": "The §7 locator model's own field; an article_* entry carries none.",
      +                  "type": "string"
      +                },
      +                "point": {
      +                  "description": "Set where the served text settles it. A citation, not a promise of retrieval: open the entry at the enclosing point, then the paragraph, which serves the text the entry quotes.",
      +                  "type": "string"
      +                },
      +                "subpoint": {
      +                  "description": "A roman sub-point, always qualified by its letter point (PSR Art 97(2)(a)(ii), never (ii) alone); a list the text does not settle is left unlocated.",
      +                  "type": "string"
      +                },
      +                "type": {
      +                  "description": "paragraph_added, paragraph_deleted, paragraph_amended (with words_changed, counting both sides of a substitution), figure_changed (with from/to quoting the served text), heading_changed, the article_* counterparts of the first three for text outside any numbered paragraph, and none_detected where nothing was found, never an empty list.",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "type"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "What kind of change this comparison evidences, read off the same artefact as pairs[]. Article-scoped, not page-scoped: the whole inventory travels with every page of pairs[], so a client paging through must not concatenate it. Repeated identical entries are repeated occurrences in one paragraph. Null means this release predates the inventory, which is not the same as none_detected."
      +      },
      +      "cite": {
      +        "type": "string"
      +      },
      +      "classification_note": {
      +        "type": "string"
      +      },
      +      "comparison_url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "direction": {
      +        "type": "string"
      +      },
      +      "editorial_review_state": {
      +        "type": "string"
      +      },
      +      "from": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "version_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "version_id"
      +        ],
      +        "type": "object"
      +      },
      +      "instrument_id": {
      +        "type": "string"
      +      },
      +      "pairs": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "ops": {
      +              "items": {
      +                "items": false,
      +                "maxItems": 2,
      +                "minItems": 2,
      +                "prefixItems": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "string"
      +                  }
      +                ],
      +                "type": "array"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "ops"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "status": {
      +        "type": "string"
      +      },
      +      "to": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "version_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "version_id"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "instrument_id",
      +      "article",
      +      "cite",
      +      "from",
      +      "to",
      +      "status",
      +      "direction",
      +      "editorial_review_state",
      +      "classification_note",
      +      "comparison_url",
      +      "changes",
      +      "pairs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / instrument_id / pattern
      Previous value: -"^[a-z0-9]+(?:-[a-z0-9]+)*$"New value: +"^[A-Za-z0-9]+(?:[ ._-][A-Za-z0-9]+)*$"
  3. Changed1 schema field changed
    • changedOutput schema / properties / data / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "article": {
      -        "type": "string"
      -      },
      -      "changes": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "additionalProperties": {},
      -              "properties": {
      -                "type": {
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "type"
      -              ],
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "What KIND of change this comparison evidences, read off the same artefact as pairs[]. Types: paragraph_added, paragraph_deleted, paragraph_amended (with words_changed, counting both sides of a substitution), figure_changed (with from/to quoting the served text), heading_changed, the article_* counterparts of the first three for an article's text outside any numbered paragraph, and none_detected where nothing was found — never an empty list. An entry carries `paragraph` and, where the served text settles it, `point` and `subpoint`, in the §7 locator model's own field names; an article_* entry carries none of them. Those components are a CITATION, not a promise of retrieval: a sub-point is often not a block get_provision serves, so open an entry at the enclosing point, and then the paragraph, which does serve the text the entry quotes. A roman sub-point is always qualified by its letter point (PSR Art 97(2)(a)(ii), never (ii) alone), and a list the text does not settle is left unlocated. ARTICLE-SCOPED, not page-scoped: the whole inventory travels with every page of pairs[], so a client paging through must not concatenate it. Repeated identical entries are repeated occurrences in one paragraph, not duplicates. Null means this release predates the inventory, which is not the same as none_detected."
      -      },
      -      "cite": {
      -        "type": "string"
      -      },
      -      "classification_note": {
      -        "type": "string"
      -      },
      -      "direction": {
      -        "type": "string"
      -      },
      -      "editorial_review_state": {
      -        "type": "string"
      -      },
      -      "from": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "version_id": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "version_id"
      -        ],
      -        "type": "object"
      -      },
      -      "instrument_id": {
      -        "type": "string"
      -      },
      -      "pairs": {
      -        "items": {
      -          "additionalProperties": {},
      -          "properties": {
      -            "ops": {
      -              "items": {
      -                "items": false,
      -                "maxItems": 2,
      -                "minItems": 2,
      -                "prefixItems": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "string"
      -                  }
      -                ],
      -                "type": "array"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "ops"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "status": {
      -        "type": "string"
      -      },
      -      "to": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "version_id": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "version_id"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "instrument_id",
      -      "article",
      -      "cite",
      -      "from",
      -      "to",
      -      "status",
      -      "direction",
      -      "editorial_review_state",
      -      "classification_note",
      -      "changes",
      -      "pairs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "article": {
      +        "type": "string"
      +      },
      +      "changes": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "type": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "type"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "What KIND of change this comparison evidences, read off the same artefact as pairs[]. Types: paragraph_added, paragraph_deleted, paragraph_amended (with words_changed, counting both sides of a substitution), figure_changed (with from/to quoting the served text), heading_changed, the article_* counterparts of the first three for an article's text outside any numbered paragraph, and none_detected where nothing was found — never an empty list. An entry carries `paragraph` and, where the served text settles it, `point` and `subpoint`, in the §7 locator model's own field names; an article_* entry carries none of them. Those components are a CITATION, not a promise of retrieval: a sub-point is often not a block get_provision serves, so open an entry at the enclosing point, and then the paragraph, which does serve the text the entry quotes. A roman sub-point is always qualified by its letter point (PSR Art 97(2)(a)(ii), never (ii) alone), and a list the text does not settle is left unlocated. ARTICLE-SCOPED, not page-scoped: the whole inventory travels with every page of pairs[], so a client paging through must not concatenate it. Repeated identical entries are repeated occurrences in one paragraph, not duplicates. Null means this release predates the inventory, which is not the same as none_detected."
      +      },
      +      "cite": {
      +        "type": "string"
      +      },
      +      "classification_note": {
      +        "type": "string"
      +      },
      +      "comparison_url": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "direction": {
      +        "type": "string"
      +      },
      +      "editorial_review_state": {
      +        "type": "string"
      +      },
      +      "from": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "version_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "version_id"
      +        ],
      +        "type": "object"
      +      },
      +      "instrument_id": {
      +        "type": "string"
      +      },
      +      "pairs": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "ops": {
      +              "items": {
      +                "items": false,
      +                "maxItems": 2,
      +                "minItems": 2,
      +                "prefixItems": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "string"
      +                  }
      +                ],
      +                "type": "array"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "ops"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "status": {
      +        "type": "string"
      +      },
      +      "to": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "version_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "version_id"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "instrument_id",
      +      "article",
      +      "cite",
      +      "from",
      +      "to",
      +      "status",
      +      "direction",
      +      "editorial_review_state",
      +      "classification_note",
      +      "comparison_url",
      +      "changes",
      +      "pairs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed10 schema fields changed
    • addedInput schema / properties / cursor / anyOf
      Added value: +[
      +  {
      +    "maxLength": 512,
      +    "pattern": "^[A-Za-z0-9_-]+$",
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedInput schema / properties / cursor / type
      Removed value: -[
      -  "string",
      -  "null"
      -]
    • changedInput schema / properties / from_locator / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "annex": {
      -        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "article": {
      -        "description": "Article number as printed: \"97\", \"45a\", \"69-a\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "kind": {
      -        "description": "Which kind of provision the locator names.",
      -        "enum": [
      -          "article",
      -          "annex",
      -          "recital"
      -        ],
      -        "type": "string"
      -      },
      -      "paragraph": {
      -        "description": "Numbered paragraph within the article, e.g. \"2\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "point": {
      -        "description": "Lettered point within the paragraph, e.g. \"b\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "recital": {
      -        "description": "Recital number, e.g. \"95\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "subpoint": {
      -        "description": "Sub-point within the point.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "annex": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered."
      +      },
      +      "article": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Article number as printed: \"97\", \"45a\", \"69-a\"."
      +      },
      +      "kind": {
      +        "description": "Which kind of provision the locator names.",
      +        "enum": [
      +          "article",
      +          "annex",
      +          "recital"
      +        ],
      +        "type": "string"
      +      },
      +      "paragraph": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Numbered paragraph within the article, e.g. \"2\"."
      +      },
      +      "point": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Lettered point within the paragraph, e.g. \"b\"."
      +      },
      +      "recital": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Recital number, e.g. \"95\"."
      +      },
      +      "subpoint": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Sub-point within the point."
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / from_version_id / maxLength
      Added value: +64
    • addedInput schema / properties / from_version_id / pattern
      Added value: +"^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$"
    • addedInput schema / properties / instrument_id / maxLength
      Added value: +64
    • addedInput schema / properties / instrument_id / pattern
      Added value: +"^[a-z0-9]+(?:-[a-z0-9]+)*$"
    • changedInput schema / properties / to_locator / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "annex": {
      -        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "article": {
      -        "description": "Article number as printed: \"97\", \"45a\", \"69-a\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "kind": {
      -        "description": "Which kind of provision the locator names.",
      -        "enum": [
      -          "article",
      -          "annex",
      -          "recital"
      -        ],
      -        "type": "string"
      -      },
      -      "paragraph": {
      -        "description": "Numbered paragraph within the article, e.g. \"2\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "point": {
      -        "description": "Lettered point within the paragraph, e.g. \"b\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "recital": {
      -        "description": "Recital number, e.g. \"95\".",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "subpoint": {
      -        "description": "Sub-point within the point.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "annex": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered."
      +      },
      +      "article": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Article number as printed: \"97\", \"45a\", \"69-a\"."
      +      },
      +      "kind": {
      +        "description": "Which kind of provision the locator names.",
      +        "enum": [
      +          "article",
      +          "annex",
      +          "recital"
      +        ],
      +        "type": "string"
      +      },
      +      "paragraph": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Numbered paragraph within the article, e.g. \"2\"."
      +      },
      +      "point": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Lettered point within the paragraph, e.g. \"b\"."
      +      },
      +      "recital": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Recital number, e.g. \"95\"."
      +      },
      +      "subpoint": {
      +        "anyOf": [
      +          {
      +            "maxLength": 32,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Sub-point within the point."
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / to_version_id / maxLength
      Added value: +64
    • addedInput schema / properties / to_version_id / pattern
      Added value: +"^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$"
  5. Changed6 schema fields changed
    • removedInput schema / properties / cursor / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / cursor / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedInput schema / properties / from_locator / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "annex": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered."
      -      },
      -      "article": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Article number as printed: \"97\", \"45a\", \"69-a\"."
      -      },
      -      "kind": {
      -        "description": "Which kind of provision the locator names.",
      -        "enum": [
      -          "article",
      -          "annex",
      -          "recital"
      -        ],
      -        "type": "string"
      -      },
      -      "paragraph": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Numbered paragraph within the article, e.g. \"2\"."
      -      },
      -      "point": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Lettered point within the paragraph, e.g. \"b\"."
      -      },
      -      "recital": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Recital number, e.g. \"95\"."
      -      },
      -      "subpoint": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Sub-point within the point."
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "annex": {
      +        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "article": {
      +        "description": "Article number as printed: \"97\", \"45a\", \"69-a\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "kind": {
      +        "description": "Which kind of provision the locator names.",
      +        "enum": [
      +          "article",
      +          "annex",
      +          "recital"
      +        ],
      +        "type": "string"
      +      },
      +      "paragraph": {
      +        "description": "Numbered paragraph within the article, e.g. \"2\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "point": {
      +        "description": "Lettered point within the paragraph, e.g. \"b\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "recital": {
      +        "description": "Recital number, e.g. \"95\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "subpoint": {
      +        "description": "Sub-point within the point.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / to_locator / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "annex": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered."
      -      },
      -      "article": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Article number as printed: \"97\", \"45a\", \"69-a\"."
      -      },
      -      "kind": {
      -        "description": "Which kind of provision the locator names.",
      -        "enum": [
      -          "article",
      -          "annex",
      -          "recital"
      -        ],
      -        "type": "string"
      -      },
      -      "paragraph": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Numbered paragraph within the article, e.g. \"2\"."
      -      },
      -      "point": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Lettered point within the paragraph, e.g. \"b\"."
      -      },
      -      "recital": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Recital number, e.g. \"95\"."
      -      },
      -      "subpoint": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Sub-point within the point."
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "annex": {
      +        "description": "Annex number, roman or arabic (\"I\", \"1\"); omit for an instrument whose single annex is unnumbered.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "article": {
      +        "description": "Article number as printed: \"97\", \"45a\", \"69-a\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "kind": {
      +        "description": "Which kind of provision the locator names.",
      +        "enum": [
      +          "article",
      +          "annex",
      +          "recital"
      +        ],
      +        "type": "string"
      +      },
      +      "paragraph": {
      +        "description": "Numbered paragraph within the article, e.g. \"2\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "point": {
      +        "description": "Lettered point within the paragraph, e.g. \"b\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "recital": {
      +        "description": "Recital number, e.g. \"95\".",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "subpoint": {
      +        "description": "Sub-point within the point.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / data / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "article": {
      -        "type": "string"
      -      },
      -      "changes": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "additionalProperties": {},
      -              "properties": {
      -                "type": {
      -                  "type": "string"
      -                }
      -              },
      -              "required": [
      -                "type"
      -              ],
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "What KIND of change this comparison evidences, read off the same artefact as pairs[]. Types: paragraph_added, paragraph_deleted, paragraph_amended (with words_changed, counting both sides of a substitution), figure_changed (with from/to quoting the served text), heading_changed, the article_* counterparts of the first three for an article's text outside any numbered paragraph, and none_detected where nothing was found — never an empty list. An entry carries `paragraph` and, where the served text settles it, `point` and `subpoint`, in the §7 locator model's own field names; an article_* entry carries none of them. Those components are a CITATION, not a promise of retrieval: a sub-point is often not a block get_provision serves, so open an entry at the enclosing point, and then the paragraph, which does serve the text the entry quotes. A roman sub-point is always qualified by its letter point (PSR Art 97(2)(a)(ii), never (ii) alone), and a list the text does not settle is left unlocated. ARTICLE-SCOPED, not page-scoped: the whole inventory travels with every page of pairs[], so a client paging through must not concatenate it. Repeated identical entries are repeated occurrences in one paragraph, not duplicates. Null means this release predates the inventory, which is not the same as none_detected."
      -      },
      -      "cite": {
      -        "type": "string"
      -      },
      -      "classification_note": {
      -        "type": "string"
      -      },
      -      "direction": {
      -        "type": "string"
      -      },
      -      "editorial_review_state": {
      -        "type": "string"
      -      },
      -      "from": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "version_id": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "version_id"
      -        ],
      -        "type": "object"
      -      },
      -      "instrument_id": {
      -        "type": "string"
      -      },
      -      "pairs": {
      -        "items": {
      -          "additionalProperties": {},
      -          "properties": {
      -            "ops": {
      -              "items": {
      -                "prefixItems": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "string"
      -                  }
      -                ],
      -                "type": "array"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "ops"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "status": {
      -        "type": "string"
      -      },
      -      "to": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "version_id": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "version_id"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "instrument_id",
      -      "article",
      -      "cite",
      -      "from",
      -      "to",
      -      "status",
      -      "direction",
      -      "editorial_review_state",
      -      "classification_note",
      -      "changes",
      -      "pairs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "article": {
      +        "type": "string"
      +      },
      +      "changes": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "type": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "type"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "What KIND of change this comparison evidences, read off the same artefact as pairs[]. Types: paragraph_added, paragraph_deleted, paragraph_amended (with words_changed, counting both sides of a substitution), figure_changed (with from/to quoting the served text), heading_changed, the article_* counterparts of the first three for an article's text outside any numbered paragraph, and none_detected where nothing was found — never an empty list. An entry carries `paragraph` and, where the served text settles it, `point` and `subpoint`, in the §7 locator model's own field names; an article_* entry carries none of them. Those components are a CITATION, not a promise of retrieval: a sub-point is often not a block get_provision serves, so open an entry at the enclosing point, and then the paragraph, which does serve the text the entry quotes. A roman sub-point is always qualified by its letter point (PSR Art 97(2)(a)(ii), never (ii) alone), and a list the text does not settle is left unlocated. ARTICLE-SCOPED, not page-scoped: the whole inventory travels with every page of pairs[], so a client paging through must not concatenate it. Repeated identical entries are repeated occurrences in one paragraph, not duplicates. Null means this release predates the inventory, which is not the same as none_detected."
      +      },
      +      "cite": {
      +        "type": "string"
      +      },
      +      "classification_note": {
      +        "type": "string"
      +      },
      +      "direction": {
      +        "type": "string"
      +      },
      +      "editorial_review_state": {
      +        "type": "string"
      +      },
      +      "from": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "version_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "version_id"
      +        ],
      +        "type": "object"
      +      },
      +      "instrument_id": {
      +        "type": "string"
      +      },
      +      "pairs": {
      +        "items": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "ops": {
      +              "items": {
      +                "items": false,
      +                "maxItems": 2,
      +                "minItems": 2,
      +                "prefixItems": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "string"
      +                  }
      +                ],
      +                "type": "array"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "ops"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "status": {
      +        "type": "string"
      +      },
      +      "to": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "version_id": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "version_id"
      +        ],
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "instrument_id",
      +      "article",
      +      "cite",
      +      "from",
      +      "to",
      +      "status",
      +      "direction",
      +      "editorial_review_state",
      +      "classification_note",
      +      "changes",
      +      "pairs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / pagination / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "complete": {
      -        "type": "boolean"
      -      },
      -      "next_cursor": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "total": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "complete",
      -      "next_cursor"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "complete": {
      +        "type": "boolean"
      +      },
      +      "next_cursor": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "total": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "complete",
      +      "next_cursor"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  6. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description adds genuinely non-obvious traits: it never recomputes a diff, refusals carry the publication URL for consolidated as-adopted texts, and a reversed request maps to the same artefact with inverted ops. This is exactly the kind of servability and failure-mode context annotations cannot express.

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 servability rule is front-loaded in the second sentence and every later sentence adds distinct information (refusal URL, reversal symmetry, sibling pointer). Some phrasing is opaque build jargon ('the comparison the build published') and the pair-exclusivity point is restated twice, costing a little tightness.

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

Completeness4/5

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

Return values needn't be covered given the output schema, and safety is covered by annotations, so the description focuses correctly on servability, refusal behavior, and direction. The one gap for a paginated tool is that limit/cursor behavior is never addressed, which an agent paging a large article diff would need.

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 coverage is 71% and the nested locator fields are well documented in-schema, so the baseline is 3. The description adds directional semantics for from/to version ids (pairs match either direction and are the same artefact), but it says nothing about limit/cursor, the two parameters that carry no schema descriptions at all.

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?

Names a specific verb (compare) and resource (an article between the Commission proposal and the Council compromise of PSR or PSD3), plus the scope constraint 'within the same instrument'. It also contrasts itself with the structural alternative ('changes reads that artefact structurally'), so an agent can tell it apart from show_changes/list_version_changes without opening the schemas.

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?

Explicitly states the exact condition under which a pair is servable ('iff a diff artefact exists — PSR and PSD3 proposal↔compromise pairs and nothing else') and that every other pair, including Official Journal texts, is refused. It also routes the caller needing change kinds to the structural sibling rather than this word-level op, which is a real when-to-use/when-not-to-use distinction.

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.

Resources