assemble_datapackage
ChatGPTUse this when the user wants several decisions (up to 10) they have already identified as one grounded package, for a memo, a comparison or a brief: each decision's text plus its outgoing citation edges in one structured JSON answer, suitable as grounded context. It is not meant for ONE decision (get_decision serves precise Randnummer and section slices), for the complete paged edges of one decision (get_citation_graph), or for finding decisions (the search tools). ARGUMENTS. ids (array of strings, required, 1 to 10): internal decision UUIDs (the id a search row, get_decision or get_citation_graph serves) or Aktenzeichen; order matters, because the response budget drops decisions from the END. include_citations (boolean, default true): serve each decision's outgoing citation edges. full_text (boolean, default false): serve whole judgments instead of ~700-character excerpts. max_chars (integer, default 60000, minimum 500, maximum 200000): the per-decision text cap when full_text is true. REFUSAL CODES. Every refusal carries a closed error_code: ids_unresolved (an id was not found or was ambiguous), max_chars_below_minimum, unauthenticated, no_billable_organization, insufficient_credits, volume_cap (the organization's daily row limit, or with full_text its daily full-text limit; nothing ran, nothing was charged, retry after retry_after_seconds), backend_unavailable. Needs the datapackage token ability (else token_ability_missing; nothing runs or is charged). PRICE. Costs 5 credits per call. The charge is idempotency-keyed on the resolved ids plus include_citations, full_text and max_chars, so repeating the same package inside the billing month reports cost: 0. The credits block reports what this call took. RESPONSE FIELDS. payload_truncated says whether the response was shed to fit the client's size cap. truncation.dropped_seed_ids names the decisions that were dropped, and a second call with those ids gets the rest. truncation_notice says the same in German. Per decision, truncated and truncated_reason say whether the served text is the whole judgment, and leitsatz_source says who wrote the headnote an excerpt cut from a Leitsatz. Every edge carries in_corpus and resolution_status, one of resolved, unresolved_ambiguous, unresolved_pending, unresolved_no_match, unresolved_out_of_coverage. An unresolved edge is never corpus-verified, and unresolved_out_of_coverage is a disclosed corpus boundary, never a citation that does not exist. An unresolved edge also carries unresolved_reason when the stored row names WHY it did not bind (for example foreign_court_docket, out_of_coverage, journal_fundstelle, ambiguous_docket), the same value get_citation_graph serves for that edge; the key is absent when nothing was stored, and a resolved edge never carries it. Field-by-field response semantics, disclosure rules and worked examples: see the "assemble_datapackage" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
check_citations
ChatGPTUse this when the user provides a German legal text (a Schriftsatz, Urteil, Beschluss, memo or draft) and asks whether its citations are real. The tool checks every court-decision and statute citation against the Klaracase corpus. It returns one verdict per citation, with offsets into the exact input text. It does not find decisions (search_decisions, cross_type_search), read one already identified (get_decision) or build a grounding package from ids (assemble_datapackage). A matched_decision.artifact_id is the id get_decision and get_citation_graph take. SYNCHRONOUS AND CORPUS-ONLY. One call, no polling. The external register stage is skipped here, so not_found is WEAKER evidence than in the Citation Check of the Klaracase web app, which also consults the register. The web app is where longer documents, and anything needing external confirmation, are checked. ARGUMENTS. text (required): the legal text, at least 50 characters and at most the per-tool cap named in the schema; every offset in the answer is a Unicode codepoint offset into this exact string. reference_date (optional, YYYY-MM-DD): the document date the pre-reform-numbering advisory falls back to. VERDICTS, a CLOSED seven-value set: verified_corpus, verified_external, not_found, out_of_coverage, ambiguous, unverifiable, discrepancy. Only discrepancy asserts that something IS wrong; the other six run from confirmation to absence of evidence, and not_found is never a claim that a citation is fabricated. The verdict is always one of these seven words. REFUSALS carry an error_code, one of text_too_long, not_german_legal_text, insufficient_credits, unauthenticated, no_billable_organization, backend_unavailable. Two refusals carry validation prose instead of a code: a text under 50 characters, and a reference_date that is not an ISO calendar day. not_german_legal_text is the legal-text gate: a deterministic counter reads five independent legal-signal categories, and the text passes on TWO OR MORE categories. A lone statute sentence is refused however long it is; the surrounding sentences or the cited decision supply the missing categories, padding does not. Needs the citation-check token ability (else token_ability_missing; nothing runs or is charged). PRICE: a length-based credit charge, taken before the check runs and deduped on identical text inside the billing period, so a repeat costs 0, unless the latest same-content run FAILED, which is charged again. The PRICE block below states the live formula. FIELDS THAT QUALIFY THE VERDICTS. partial and unverified_count say the run left citations unchecked; a re-check of that run in the Citation Check of the web app (the notes name its page) re-runs the external stage over exactly those citations and costs nothing, while calling this tool again re-checks the whole text and charges for it. check_scope and subdivision_check say how far down the citation this check actually looked, and check_scope.court whether the court the prose names was compared at all. verdict_counts and unique_citations count DISTINCT citations while findings and progress.citations_total count OCCURRENCES, and the extraction counters say what was dropped rather than checked. The German advisory strings (coverage_advisory, ambiguity_advisory, subdivision_advisory, ecli_advisory, evidence.advisory, evidence.section_absence_advisory) are finished sentences written for the user to read as they stand. SIZE. payload_truncated is always present and says whether THIS answer had to be degraded to fit your tool-result budget. It is a different statement from partial, which is about the external register stage. When it is true, truncation names what was shed and guidance names the remedy as a call. The shedding order keeps the answer: the German advisory sentences go first, then evidence is reduced to its reason, and only then are tail findings dropped — every row that lost something names the loss in payload_truncated_fields, and verdict_counts, `p…
corpus_coverage
ChatGPTUse this when a search came back empty or thin and the open question is whether the corpus holds that court or that period at all, or when the user asks what Klaracase covers. Reports per-branch (Gerichtsbarkeit) and per-court decision counts with the earliest and latest decision_date we hold, measured over the decision store, not the search index: it tells a non-existent legal concept apart from a coverage gap. Free, 0 credits. It does not answer a legal question (the search tools) or list the filter VOCABULARY, the values a filter accepts (list_facets). A count in a search answer is scoped to one query and is not a coverage figure, while every figure here is DERIVED from the corpus and cannot drift the way a written sentence can. Nothing is required. branch scopes the report to one Gerichtsbarkeit slug; a branch is a COURT JURISDICTION and never a legal subject area (Rechtsgebiet), so patent is the Bundespatentgericht while patent decisions of the ordinary courts count under ordentlich. top caps the per-court rows, busiest first. Response fields. coverage_ranges IS THE INGESTION BOUNDARY, per bucket, and the one field an out_of_coverage verdict rests on. holdings_earliest rides each range row and is the earliest decision we MEASURABLY hold for that bucket. court_founding_year is the year the court was constituted, used as a plausibility floor on dates. corpus_floors is one derived sentence over the whole scope. A courts row's earliest is the earliest plausible decision we HOLD for that court, and it is NOT where our ingestion starts: coverage_ranges, holdings_earliest and court_founding_year say that, and the numbers differ by decades. This tool is free: it costs 0 credits and the credits block reports 0 charged. A refusal carries error_code: "unauthenticated" or error_code: "no_billable_organization". A branch outside the slug set, or a top below 1 or above 100, is refused by validation in prose, with no code. Needs the search token ability (else token_ability_missing; nothing runs or is charged). Field-by-field response semantics, disclosure rules and worked examples: see the "corpus_coverage" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
cross_type_search
ChatGPTUse this when a German legal question needs the statute AND the case law in one answer: what the law says and how courts have applied it, or a § the user names plus the decisions on it. Two independent sections, sections.laws and sections.decisions. No commentary. The query takes German legal-concept phrasing, e.g. "Widerrufsrecht Fernabsatzvertrag Wertersatz Verbraucher", rather than bare keywords. It is not meant for decisions alone (search_decisions pages and serves 20 rows), a known Aktenzeichen (get_decision), or law outside Germany. A decision row's id feeds get_decision, get_citation_graph and assemble_datapackage. Arguments: query (required, 2-500 characters); jurisdiction (max 50) filters the LAWS section only; court (max 100), branch, document_type, cited_norm (max 120) and cited_statutes (up to 5 statutes from a fixed list) filter the decisions section; date_from/date_to (YYYY-MM-DD, date_to not earlier); mode (keyword|semantic|hybrid, default hybrid); limit (per section, default 5, capped at 10); bridge (default true). No filter axis narrows both sections: filters_applied_sections names, per axis, the sections it ran on; a section it does not name was searched UNFILTERED on that axis. The laws section can add doctrinal phrases. A language model writes them from a query in everyday language. For this step, that model processes your query text in the EU (see the privacy policy, Datenschutzerklärung). bridge: false switches every server-side addition off. Refusal error_code values: insufficient_credits, unauthenticated, no_billable_organization, search_timeout, index_unavailable, query_too_long, volume_cap (the organization's daily row limit; nothing ran, nothing was charged, retry after retry_after_seconds). Other bad arguments (a bad date range, an unknown enum, limit below 1) are refused in prose with no code. Needs the search token ability (else token_ability_missing; nothing runs or is charged). Costs 1 credit per distinct query (query, filters and mode) per billing period, not per call; limit is free and a repeat reports cost: 0. On credits.metered: false the figures are null, not zero. Response structure. The two sections are independent retrievals, so a law row has no rank relative to a decision row. Rows arrive in served order. confidence (high, medium, low) bands each row's relevance and top_confidence bands the best row of the response; null means "not measured on this request", never "low". Neither reorders anything. section_totals.<section> carries total_available (matching indexed passages on the LEXICAL ARM ONLY, per total_available_basis, served as a floor band {value, is_floor}, so it is NOT an upper bound on the rows served, a UNION of several retrieval arms), candidate_pool (scales with limit) and three-valued truncated (null = that section never ran). filters_applied names the filters the search ran with, absent when nothing was filtered. Raw scores, index ids and retrieval-leg disclosures are operator diagnostics and are not served to customer tokens. norms_cited_by_decision_results names the §§ the served decisions cite in common. That block counts the TOP 10 of the ranked decision candidate pool, under a floor of two and a cap of five. With a limit below 10, its basis does not shrink with the page, so a cited_by entry may name a decision id this call did not serve. Field-by-field response semantics, disclosure rules and worked examples: see the "cross_type_search" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
get_citation_graph
ChatGPTUse this when the user asks what a decision relies on, which later decisions cite it, whether a line of case law is settled or contested, or wants to follow precedent from ONE decision they can name. Serves references (decisions it cites, outgoing) and referenced_by (decisions citing it, incoming). Edges are extracted from decision texts, so a missing edge is not proof that the decision cites nothing. It does not find a decision (the search tools), serve the text of one decision (get_decision), or bundle several decisions with their citations in one payload (assemble_datapackage). Arguments. id (string, required): the internal decision UUID, or a German Aktenzeichen like "VIII ZR 271/17". direction (string, default both): outgoing, incoming or both. depth (integer, default 1): 1 for direct neighbours, 2 for neighbours of neighbours, capped at 50 distinct neighbour decisions. court and date (strings, optional): disambiguators for an Aktenzeichen id. page (integer, default 1, maximum 20): 1-based page over the source decision's neighbour lists, 25 distinct decisions per direction, depth 1 only. The cursor follows the rows actually SERVED, so a row dropped to fit the size budget (references_shed_by_budget) is served first by the next page and references_served_so_far is where that page starts. Refusals carry an error_code: not_found, ambiguous_aktenzeichen, invalid_direction, page_undefined_at_this_depth, unauthenticated, no_billable_organization, insufficient_credits, volume_cap (the organization's daily row limit is reached; nothing ran and nothing was charged, retry after retry_after_seconds), backend_unavailable. Needs the graph token ability (else token_ability_missing; nothing runs or is charged). Costs 2 credits per call, and the credits block reports what this call took. Response fields. Every edge carries a resolution_status, one of resolved, unresolved_ambiguous, unresolved_pending, unresolved_no_match, unresolved_out_of_coverage; an unresolved_ambiguous edge serves ambiguous_candidates instead of one bound target. An unresolved edge also carries unresolved_reason when the stored row names WHY it did not bind (for example foreign_court_docket, out_of_coverage, journal_fundstelle, ambiguous_docket); the key is absent when nothing was stored, and a resolved edge never carries it. Where the reason is a coverage word it agrees with resolution_status: out_of_coverage beside unresolved_out_of_coverage, in_range_unresolved beside every other unresolved status. loops_to_source marks a depth-2 edge that points back at the source. has_more_references and has_more_referenced_by say whether a further page exists. target_artifact_id is the identity of a bound edge and the id that get_decision and assemble_datapackage take, reference_canonicals and occurrences are its evidence, and canonical_key_conflict reports a clash of the spelling key an unbound edge falls back on. references_total, references_resolved_total, references_unresolved_total and referenced_by_total describe the decision rather than the list this answer served: two spellings of one citation are two stored rows and one served edge. references_withheld_reasons groups by reason every edge of this decision that carries a withheld reason: both the ones this tool removed from the lists and the ones it still serves with a withheld_reason on the row, counted in rows and per decision, so an edge marked in the list is always counted in the map beside it. TWO TRUNCATION SIGNALS, different questions: truncated (with truncation_notice) says the neighbour POOL was capped before serving and page reaches the rest; payload_truncated, always present, says THIS answer was degraded to fit the size budget, and when true a truncation object names the shed evidence fields and the edges dropped. Field-by-field response semantics, disclosure rules and worked examples: see the "get_citation_graph" section of https://klaracase.de/docs/mcp/tools-guide …
get_decision
ChatGPTUse this when the user names ONE decision, by Aktenzeichen ("VIII ZR 271/17"), ECLI or the id a search served, and wants its text, its headnote, a Randnummer window, or confirmation that it exists and says what they think it says. Serves the full text or one slice of it (a named section or a Randnummer window) plus metadata. It does not find decisions (search_decisions), cover statutes and decisions together (cross_type_search), or bundle several decisions with their citations in one call (assemble_datapackage). search_decisions also serves headnote provenance: get_decision serves no leitsatz_source and no reference or provenance block, so where a Leitsatz came from is answered by search_decisions. The id it serves is the handle for get_citation_graph and assemble_datapackage. ARGUMENTS. id accepts exactly three forms: the internal UUID, an Aktenzeichen in its normal spacing and casing ("VIII ZR 271/17"), or a full ECLI; nothing partial is normalized, and an Aktenzeichen shared by several courts is refused with a candidate list unless court and/or date narrow it. max_chars caps the returned text (minimum 500, default 40000). rn_from, rn_to and section select a slice instead of the whole text. JOINED PROCEEDINGS. metadata.file_numbers is the authoritative set of this decision's file numbers, and joined_proceeding_note fires whenever it holds more than one. The title the search tools serve is a static indexed string: it lists at most four file numbers, and on a decision with more than four it lists the first three plus u. a. (+N). The docket you searched for can therefore sit behind that u. a.; metadata.file_numbers here holds the full set, and the title does not. REFUSAL CODES. max_chars_below_minimum, not_found, not_found_under_filter, ambiguous_aktenzeichen, rn_range_not_found, section_not_found, sections_unavailable, official_headnote_not_located, document_leitsatz_not_located, unauthenticated, no_billable_organization, insufficient_credits, volume_cap (the organization's daily full-text limit; nothing ran, nothing was charged, retry after retry_after_seconds), backend_unavailable. Needs the read token ability (else token_ability_missing; nothing runs or is charged). PRICE. 1 credit per decision per calendar month. The charge is idempotency-keyed per artifact per billing month, so every further read of the same decision that month, other sections and ranges included, reports cost: 0. FIELDS DESCRIBING THE SERVED TEXT. full_text holds the served text and text_length the whole judgment's length; served_text_length beside them is the slice's own length. truncated says your max_chars cut the text. available_range_scope names the population available_range describes. rn_source says whether a Randnummer may be cited, rn_source_basis says where that verdict came from, and rn_source_note explains it in words. returned_range_note names a widened, cut or refuted span, including the case where the served bytes refute the stored anchors. Field-by-field response semantics, disclosure rules and worked examples: see the "get_decision" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
get_norm
ChatGPTFetch the full current text of ONE German federal or EU norm by its citation, e.g. "§ 535 BGB", "§ 626 Abs. 2 BGB" or "Art. 6 DSGVO". Returns heading, text, lifecycle (current, repealed, unconfirmed), the version served (last amendment date, source fetched and last seen), the neighbouring norms, and a ready search_decisions call for the decisions citing it. One norm per call. An Absatz in the reference is echoed with whether it exists; the text is always the whole norm. WHICH TOOL. cross_type_search FINDS a norm from a question; this tool reads one you can cite. check_citations verifies many citations in a text. REFUSAL CODES. invalid_reference, range_not_supported, historical_version_unavailable (a.F.), ambiguous (with candidates), not_found (detail_code statute_unknown, section_unknown, state_law_out_of_scope), statute_superseded (with successor), section_not_in_current_text. TOKEN ABILITY: read. PRICE: 1 credit per norm per calendar month; a repeat read this month reports cost 0. norm.lifecycle, law.upstream_status and version.last_amendment_date state whether the text is current and as of when. Field semantics: section "get_norm" in the tool guide at /docs/mcp/tools-guide. Field-by-field response semantics, disclosure rules and worked examples: see the "get_norm" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
list_facets
ChatGPTUse this when a search is to be filtered by court, branch, document type, jurisdiction, law type or cited norm: it lists the values the INDEX actually holds, so a filter value need not be guessed. A value is here because a decision was indexed under it, never because we verified the thing it names exists. It does not answer a legal question (the search tools) or say how much the corpus holds (corpus_coverage). Supported fields: court_name, court_branch (Gerichtsbarkeit), document_type, jurisdiction, law_type and cited_norms. cited_norms is never enumerated whole and REQUIRES a norm to scope to, e.g. {"field":"cited_norms","norm":"§ 249 BGB"}. The values populate a filter on search_decisions or cross_type_search. corpus_coverage reports how much the corpus HOLDS: the counts here are indexed passages, floored to coarse bands, and the live court total is corpus_coverage.courts_total. An unlisted value still filters, because this tool bounds ENUMERATION, never filtering. ARGUMENTS. field is required and takes one name from the list above. type (decision|law) scopes the counts to one artifact type. norm names the cited_norms family to list. prefix narrows the listing case-insensitively, and a trailing space is significant. RESPONSE FIELDS. values is always a JSON object, {} when empty. truncated says the list is short of the vocabulary. applies_to names the artifact type the field lives on. guidance gives the reason an empty list is empty; an unreachable index is reported there as an availability failure, never as an empty corpus. On a cited_norms family whose § IS in the current consolidated text, every value carries absatz_absent_in_current_text: a § that declares no Absatz leaves Abs. 1 unchecked and marks Abs. 2 or higher, the oracle that makes check_citations answer absatz_absent. On a family whose § is NOT in the current text, every value carries section_absent_in_current_text: true instead and NO Absatz flag, because that question does not arise; section_repealed_on rides beside it when the repeal date is known. When neither could be established, neither key is served. REFUSALS. Error codes: unrecognisable_norm_token, norm_family_unavailable, unauthenticated, no_billable_organization. A bad field, type or prefix, and a missing norm, are refused in prose without an error code. Needs the search token ability (else token_ability_missing; nothing runs or is charged). Free introspection: this call costs 0 credits. Field-by-field response semantics, disclosure rules and worked examples: see the "list_facets" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
search_decisions
ChatGPTUse this when the user asks what German courts have decided on a legal question, wants case law on a topic, or needs decisions with real Aktenzeichen to cite: civil, criminal, administrative, tax, social and labour law, from the BGH, BVerfG, BVerwG, BSG, BFH, BAG, OLGs and LGs. The query takes German legal concepts, e.g. "Widerrufsrecht Fernabsatzvertrag Wertersatz Verbraucher", not bare keywords. It is not for a question outside German law, a known Aktenzeichen (get_decision looks it up), or a question where the statute matters as much as the case law (cross_type_search answers both in one call). A row's id is the handle for get_decision, get_citation_graph and assemble_datapackage. list_facets lists the filter values the index holds. corpus_coverage says how far back each court reaches; a zero can mean the period is not covered. ARGUMENTS. query (required, 2-500 characters). court, branch (Gerichtsbarkeit slug), document_type, cited_norm (one canonical §-token), cited_statutes and date_from/date_to (YYYY-MM-DD) narrow the search. mode (keyword|semantic|hybrid) is auto-selected when unset. limit defaults to 20, its cap. page: 1 to 10, default 1. bridge: false switches the vocabulary expansion off for one call. Your query text is processed in the EU (see the privacy policy). REFUSALS. search_timeout (retryable) and index_unavailable (nothing was searched) are failures, not an empty corpus: neither shows case law is absent. insufficient_credits refuses a call the balance cannot pay, volume_cap a call past the organization's daily row limit (nothing ran, nothing was charged; retry after retry_after_seconds), and a query over 500 characters answers query_too_long. Any other bad argument (unknown branch, document_type or mode, a bad date range, page outside 1 to 10) is refused in prose with no error_code. Needs the search token ability (else token_ability_missing; nothing runs or is charged). Costs 1 credit per distinct query (query, filters and mode), not per call; page and limit are free. FIELDS ON THE WHOLE RESULT SET (rows are one page). total_available, with total_available_basis, counts matching passages on the lexical arm alone, served as a floor band {value, is_floor}. candidate_pool is the window this call ranked and pages through; pool_exhaustive and truncated say whether anything matching remains. payload_truncated says the answer was shortened to fit the size budget. filters_applied records what the search RAN with. rn_source decides whether a row's Randnummer may be cited. Rows arrive in served order. confidence (high, medium, low) bands each row's relevance and top_confidence bands the best row's; null means "not measured on this request", never "low". Neither reorders anything. Raw scores, index ids and retrieval-leg disclosures are operator diagnostics and are not served to customer tokens. Field-by-field response semantics, disclosure rules and worked examples: see the "search_decisions" section of https://klaracase.de/docs/mcp/tools-guide (markdown).
assemble_datapackage
Claudecheck_citations
Claudecorpus_coverage
Claudecross_type_search
Claudeget_citation_graph
Claudeget_decision
Claudeget_norm
Claudelist_facets
Claudesearch_decisions
Claude