What changed, and when
Changes to the MCP server and its API contract, for developers.
Every change to the MCP server that a client can observe from outside: new fields, changed semantics, fixes. It exists so you can tell a regression from a deliberate change without re-running your test suite against us.
Current API version: 0.93.0
- AddedAPI 0.93.0
An organization can require two-factor sign-in, for its API tokens too
An owner or admin can now require two-factor sign-in of all members of an organization. When it is required and the token's user has not set it up, every MCP call and every `/api/v1` request with a token for that organization gets HTTP 403 with the code `two_factor_required`, before anything runs or is charged: an RFC 9457 problem on `/api/v1`, `error_code: "two_factor_required"` on the MCP server. Nothing is revoked: the token works again as soon as its user sets up two-factor sign-in in Settings, Two-factor authentication. A new token for such an organization can only be created with two-factor sign-in set up. If your client switches over refusal codes, add a branch for `two_factor_required`.
- AddedAPI 0.92.0
A REST API under `/api/v1` serves the same operations as the MCP tools
The Klaracase API now has a REST surface under `/api/v1` for an API token created in Settings, API tokens. It serves the same operations as the MCP tools, with the same arguments, prices and answers: `GET /api/v1/decisions/search` (`search_decisions`), `GET /api/v1/search` (`cross_type_search`), `GET /api/v1/decisions/{id}` (`get_decision`; `{id}` is a UUID, an Aktenzeichen or an ECLI), `GET /api/v1/decisions/{id}/citations` (`get_citation_graph`), `POST /api/v1/datapackages` (`assemble_datapackage`), `POST /api/v1/citation-checks` and `GET /api/v1/citation-checks/{run}` (`check_citations`), `POST /api/v1/citation-check-documents` and `GET /api/v1/citation-check-documents/{document}` for a PDF, DOCX, Markdown or text file a check can then name by `document_id`, and the free `GET /api/v1/corpus/coverage` and `GET /api/v1/corpus/facets/{field}`. A call charges the organization the token was created for, and a result paid for over MCP is free over REST in the same month, and the other way round. Each endpoint needs a token ability: `search` for the two searches, `read` for a decision, the coverage and the facets, `graph`, `datapackage`, and `citation-check` for the check and the upload. A token created before tokens named an organization gets HTTP 409 `token_org_missing`; create a new one. Every error is an RFC 9457 problem (`application/problem+json`) whose `code` is the MCP `error_code`, and every response carries the header `X-Klaracase-Api-Release`. A token may make 60 calls a minute, and 10 a minute to the datapackage, check and upload endpoints.
- ChangedAPI 0.91.0
An API token does only what it may do, for the organization it was made for
An API token now carries abilities, and each MCP tool needs one: `search` for `search_decisions`, `cross_type_search`, `list_facets` and `corpus_coverage`, `read` for `get_decision`, `graph` for `get_citation_graph`, `datapackage` for `assemble_datapackage` and `citation-check` for `check_citations`. A token without the ability gets `error_code: "token_ability_missing"` with `required_ability`, and nothing runs or is charged. Tokens you already have keep working: a token created on the settings page carries every ability. When you create a new token you choose its abilities and its life, at most 365 days; an expired token gets HTTP 401. A new token acts for the organization you have open when you create it and charges that organization, even if you belong to several; if you leave it, the token stops working with HTTP 403 and `error_code: "token_org_membership_lost"`.
- AddedAPI 0.90.0
A finished Citation Check downloads its citation graph as JSON or Markdown
The Citation Check in the web app now offers the citation graph of a finished check as a file, in JSON or in Markdown to paste into an AI session: every decision the document cites that we hold, with what it cites and what cites it (up to 25 each way), and the norms the check confirmed. Depth 2 adds the citations of those decisions, at most 50 decisions per cited decision; nothing goes deeper. The download costs 2 credits per cited decision we hold, at most 50 per file, and norms are free. Before anything is charged, the page shows the price and your balance. The second format and every repeat download of the same check at the same depth are free for the rest of the month. A check whose findings were deleted after 90 days cannot be exported. The file never holds the text of your document.
- FixedAPI 0.90.0
A check that failed runs again when you send the same document again
When a check in the Citation Check of the web app failed on our side, sending the same text or uploading the same document again in the same month returned the failed check, charged nothing and did not run, so the document could not be checked until the month ended. Such a resubmit now starts a new check and is charged like a first check; the failed check stays refunded. The same fix applies to an AI assistant that checks citations through our MCP tools. A finished or rejected check of the same text is still returned for free.
- ChangedAPI 0.89.0
The citation graph keeps its totals and drops its internal counters; agent links open without a login
`get_citation_graph` and `assemble_datapackage` no longer serve their internal merge counters or the per-edge coverage marker to customer tokens; the totals, the served edges, each edge's `resolution_status` and the `edge_accounting` edge counts stay. `check_citations` no longer serves the `provenance` block. `changelog_url` now points at a markdown changelog, and the tool guide every description names opens without the pre-launch login. `check_citations` sends longer documents and free re-checks to the Citation Check in the web app. The volume-governed tools list the `volume_cap` refusal in their descriptions.
- ChangedAPI 0.88.0
Search rows show a confidence band instead of raw scores
Every row of `search_decisions`, `cross_type_search` and the search in the web app now carries `confidence`: `high`, `medium` or `low`; null means "not measured", never "low", and the answer carries `top_confidence`, the band of the best row. Raw scores, index identifiers and retrieval details are no longer served to customer tokens. Corpus-wide counts (`total_available`, `corpus_matches`, facet counts) are floor bands `{value, is_floor}`. If your client sorted or filtered on a raw score, read the row order and `confidence` instead.
- ChangedAPI 0.87.0
`search_decisions` pages stop at 10
The `page` argument of `search_decisions` now runs from 1 to 10 instead of 50, and `limit` is capped at 20, so one charge covers at most 200 results of one query. A `page` above 10 gets the validation message `page must be between 1 and 10.` and is not charged; the input schema declares `minimum: 1` and `maximum: 10`. For more results, narrow the query with filters such as `court`, `branch`, `cited_norm` or a date range.
- FixedAPI 0.86.0
`get_citation_graph` reads four more ways a citing text states a decision's date
When several decisions share the cited file number, `get_citation_graph` binds the citation to the one whose date the citing text states; otherwise the edge stays `unresolved_ambiguous` with `unresolved_reason: "ambiguous_docket"`. The date is now also read from a citation that carries its own date, a court named in the genitive before the date, a file number in square brackets, and a list of decisions each with its date and file number. So more of these edges bind the right decision, while a citation whose text states two different dates stays `unresolved_ambiguous`. Bound edges keep their binding, `check_citations` does not change, and no field or value is added.
- FixedAPI 0.86.0
A citation of another decision of the citing court binds again
A citation of another decision of the same court under the same file number could stay unbound as a self reference, withheld by `get_citation_graph` under `self_reference`, when a stored version of either decision named no court. The court check now reads all stored versions of both decisions, so such a citation binds the other decision again and no longer counts under `self_reference` in `references_withheld_reasons`. Where the versions name conflicting courts or seats, the citation stays a self reference. `check_citations` does not change, and no field or value is added.
- FixedAPI 0.85.0
A court label that the file number or the text contradicts is no longer written
The court labels we add to stored citations now fail safe: where the register of the file number, the citing text or a host court (as in `bei dem OLG Hamm`) contradicts a label, we write only the kind of court or no label. This keeps a wrong label from withdrawing a correct edge of `get_citation_graph` as `text_court_contradiction`. The label itself is not served, no served value moves at this release, and no field or value is added.
- FixedAPI 0.84.0
A decision's own file number no longer binds another court's decision in `get_citation_graph`
A decision often prints its own file number in its header, and that number could bind another court's decision with the same number. The citing decision's own number now binds another decision only where the text states a date or a court that picks it; otherwise the row stays unbound as a self reference, withheld under `self_reference`. The start of a compound docket, such as `8 KLs` in `8 KLs - 30 Js 29/18 - 14/18`, counts as a file number only when it carries a serial number and a year. Stored edges whose text contradicts their bound decision are withdrawn after the release and stay listed as `in_corpus: false` with `withheld_reason` `text_court_contradiction` or `text_date_contradiction`.
- FixedAPI 0.84.0
An edge found wrong on reading is withdrawn under a reason `get_citation_graph` already serves
Some wrong edges of `get_citation_graph` show only when a person reads the text. We can now withdraw such an edge individually: it stays in the list as `in_corpus: false` with `withheld_reason: "text_court_contradiction"` or `withheld_reason: "text_date_contradiction"`, counted in `references_withheld_reasons`, and the weekly re-resolution no longer binds it. A row found to name the citing decision itself leaves `references` and its totals. No field and no value is added.
- FixedAPI 0.84.0
The correction of duplicate-matching keys keeps the keys that name the decision itself
The correction announced in 0.83.0 of the internal keys that join two copies of one decision now keeps a key that a docket, date or ECLI of the decision itself supports, even when only a second publication or a source's docket list gives it. It removes only keys that name no docket of the decision. The correction moves no served field, and no field or value is added.
- FixedAPI 0.84.0
Query expansion understands `keinen Fernseher`, stays out of Jobcenter questions, and no longer reads `geringwertige Sachen` as labour law
In `search_decisions` and `cross_type_search`, `keinen Fernseher` now adds the Rundfunkbeitrag terms like `kein Fernseher`, and `query_expansion.status` reads `applied`. A television question that names the Jobcenter, the Sozialamt or the Erstausstattung is a social-law question, so it now reads `abstained` with `reason: "entry_blocked"` and adds nothing. `geringwertige Sachen` (§ 248a StGB) no longer adds labour-law terms and reads `abstained` with `reason: "no_entry_matched"`, while `Bagatellkündigung` still adds them. No field and no value is added.
- FixedAPI 0.83.0
A Finanzgericht docket with tax-type letters, such as `1 K 5671/03 E,F`, stays one file number
Imports from NRWE, the portals of Lower Saxony, Bremen and Saxony, and the Land portals that run on juris cut such a list at the comma, so `F` became a file number of its own. `get_decision` now serves `1 K 5671/03 E,F` as one entry of `metadata.file_numbers`, and `joined_proceeding_note` no longer reads `F` as a second proceeding. Two dockets joined by a comma, such as `2 L 5/20, 2 L 6/20`, stay two file numbers. No field and no value is added.
- FixedAPI 0.83.0
A date that differs only in the year no longer binds a decision of another kind of court
In `get_citation_graph`, a stated date that differs from the bound decision's date only in the year now keeps a binding to another court only when the named court is of the same kind, such as one OLG named for a decision of another OLG. Where the named court is of another kind, such as an OVG named for a decision of the BVerwG, the edge stays `unresolved_pending` with `attributed_court_contradiction`, unless exactly one decision under the docket comes from the named kind of court; it then binds that one. `check_citations` does not change, and no field or value is added.
- FixedAPI 0.82.0
A law abbreviation with a suffix, such as `StGB-DDR` or `BGB-E`, is no longer read as the law it starts with
Citation resolution now reads the whole abbreviation, including a part after a hyphen or slash and a closing code such as `HA`, so `StGB-DDR` no longer links to the federal StGB. `check_citations` now answers `§ 212 StGB-DDR` with `not_found`, and a Land act such as `BauGB-AG NRW` with `not_found` and `evidence.reason: "state_law_out_of_scope"`. Stored citations of such abbreviations stop counting under the federal law in `norms_cited_by_decision_results`, the `cited_norm` filter and `list_facets`. `a.F.`, years and SGB books such as `SGB II` read as before, and no field or value is added.
- FixedAPI 0.82.0
The weekly re-resolution of `get_citation_graph` finds a decision stored only under a compound docket, as `check_citations` does
A docket cited as filed, such as `620 KLs 5/11`, now finds a decision stored only under a compound spelling, such as `620 KLs 5/11 - 5650 Js 31/08`, when `get_citation_graph` re-resolves its open edges each week; a candidate of another court found this way is refused as `court_contradiction`. A docket that only an older version of a decision names no longer links to that decision. A newly linked edge counts in `referenced_by_total` of its target and fills `target_artifact_id` in the `instanzenzug_graph` of `search_decisions`. Edges linked before this release keep their link, `get_decision` and `check_citations` do not change, and no field or value is added.
- FixedAPI 0.82.0
The decisions that a cut docket key hid are imported after this release
The import of the decisions that a cut docket key hid (announced in 0.81.0) links their citations through the docket lookup of this release, so it runs after this release. The rule of 0.81.0 that search shows the copies of one decision from two sources as one hit stays in place; it moved no search hit at that release. No field and no value is added.
The version is the API version in force after the change; entries without one moved no wire contract (an outage fix, a data repair). This log covers what a client of the MCP server can observe; it is not a complete list of every deployment.