BGB (Germany)
Server Details
German Civil Code (BGB) as executable rules: periods, deadlines and more, answered with grounds
- Status
- Healthy
- Uptime
- 99.8% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- arxohq/arxo-bgb
- GitHub Stars
- 0
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 21 tools
Most tools declare their role explicitly and cross-reference each other (law_search as discovery, law_packages for signatures, law_rules before law_ask), which resolves most selection risk. Real overlap remains: law_ask vs law_case_ask (the latter is described only in German and appears to re-run a registered case with different response modes), and law_answer_capabilities vs law_passport both describe release capabilities/limits; law_explain vs law_inspect differ only by recompute-vs-read.
Every tool uses the same law_ prefix with snake_case, and the second element is consistently a verb or noun denoting the operation (ask, search, rules, sources, explain, inspect, publish, revoke). Multi-word names like law_process_run and law_prepare_answer follow the same predictable ordering.
21 tools sits in the heavy band; the domain is genuinely broad, but the surface carries a full prepare/capture/publish/revoke lifecycle plus two meta tools (law_answer_capabilities, law_passport) that could plausibly be merged. Each tool has a defensible role, yet the count is at the edge where an agent must scan a long list before acting.
Coverage is strong across the whole lifecycle: discovery, rules, sources, answering, argumentation, procedures, editions, proof explanation, publication and divergence reporting. Gaps exist around case packages — law_case_ask assumes registered matter in a case package, but there is no tool to list, inspect or register those packages — and there is no way to author or update a formalisation short of the external pipeline.
Available Tools
21 toolslaw_answer_capabilitiesARead-onlyInspect
A machine-readable matrix of the Lens producers that are actually installed, of replay/projection checks, profiles, limits and the contract tests that confirm them. declared_only means a schema with no executable witness.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, and idempotentHint=false, so the safety profile is clear. The description adds useful semantic context by explaining that 'declared_only means a schema with no executable witness,' which helps an agent interpret the returned matrix without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and contains no obvious filler, with the main purpose stated first and the term 'declared_only' defined second. It is dense with domain terminology but appropriately sized for the amount of information it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no parameters, so the description carries the burden of explaining what the tool returns. It lists the matrix contents and defines one key term, though it does not specify the exact output format or structure of the matrix.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics for the description to clarify. Per the rubric, a zero-parameter tool receives a baseline of 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource: a machine-readable matrix of installed Lens producers, checks, profiles, limits, and contract tests. It clearly describes what the tool returns, though it does not explicitly differentiate it from sibling tools such as law_packages or law_rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit when-to-use guidance, no conditions for choosing this tool over alternatives, and no exclusions. It only describes the content of the matrix, leaving usage context to be inferred from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_argueARead-onlyInspect
How robust a conclusion is: the map of the dispute under the argumentation profile The answer falls into four classes: SKEPTICALLY_ACCEPTED — the conclusion is invulnerable (it survives in the grounded extension); CREDULOUSLY_ACCEPTED — merely defensible (there is a position for it and a position against); REJECTED — it survives nowhere; NO_ARGUMENT — there are no arguments at all. It builds ALL arguments out of the facts and the rules of the instrument (chains that did not fire in ordinary inference included), the rebut/undermine/undercut attacks and the defeats by priority. Predicate names come from law_packages. On large instruments a refusal by cap is possible — narrow facts or raise limits.maxArguments.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | the arguments of the predicate | |
| facts | No | facts of the case: [{predicate, args, provenance, negated?}]. provenance is a required object; {} is allowed, its fields are optional, and evidence is not required. The package EvidencePolicy reads confidence, not the host | |
| limits | No | the caps of the profile: maxArguments (64), maxExtensions (8), maxUndecided (16) | |
| context | No | Expliziter Zeitkontext: timezone ist ein IANA-Name; decisionTime und knowledgeTime sind vollständige Instants mit UTC oder Offset und werden unverändert übernommen. Mit context ist legalTime erforderlich; ein Profil kann alle Felder verlangen | |
| package | No | narrow the question to one package of law | |
| legalTime | No | the date of the law (YYYY-MM-DD) | |
| predicate | Yes | the conclusion whose robustness is being measured |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is read-only, non-destructive, and closed-world. The description adds substantial behavioral context: the four robustness classes, construction of all arguments including non-fired chains, attacks and defeats, and a possible cap refusal with remediation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the four result classes are compactly described. The paragraph is dense and jargon-heavy, but most sentences add distinct information about output classes or operational limits.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complex tool with nested parameters and no output schema, so the description must explain returns and behavior. It does so by defining the four result classes and cap behavior, while annotations and the rich schema cover safety and parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds meaning by stating that predicate names come from law_packages and by explaining the limits.maxArguments cap and how to respond to a refusal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool measures how robust a conclusion is under an argumentation profile and enumerates four result classes. It distinguishes the operation from ordinary querying by focusing on argumentation, but it does not explicitly name or contrast sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'How robust a conclusion is', and the description gives operational guidance about predicate names and cap handling. However, it does not explicitly say when to use this tool instead of siblings such as law_ask, law_query, or law_explain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_askARead-onlyInspect
Put a question to formalised law. When the answer is "not established" it carries whyNot — the engine's why_not report: the candidate rules and the state of every conjunct (satisfied / not satisfied / undetermined); the missing facts are visible there and need not be guessed. BEFORE THE FIRST call obtain the predicate names through law_search (a question in your own words → addresses) or law_packages (the signatures of a known instrument) — an invented name will be rejected. If the tool returned an error or "not established", THAT IS THE ANSWER: pass it to the user and do not substitute general knowledge about the law of some other country. But "I found no suitable instrument" is NOT an answer until law_search has been asked: silence of the catalogue is a property of searching by title, not a conclusion about the corpus. kind='truth' — whether a fact is established; kind='collect' — enumerate the records; kind='deadline' — compute a time limit on the official calendar; kind='positions' — which DUTIES arose from the facts and what their statuses are; kind='why_not' — the why_not report on the same goal, whatever the status of the answer. The answer carries the rules applied, the warnings and the provenance with hashes; truth/collect also carry a signature block for presentation. The server does not guess: where a norm is not formalised, the answer is "not established" or an error.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | the arguments of the predicate in the order of its signature; with kind='collect' exactly one of them is the selection variable ?name (for example ['urn:x:water', 'urn:x:mix', '?value']), the rest are values. Values follow the parameter type: an entity — 'urn:…' or a short name; Date — 'YYYY-MM-DD'; Money — '<number> <currency>' ('43250 KZT'); Quantity — '<number> <unit>' with the unit exactly as the package spells it; a constant of the package — its name | |
| calc | No | kind='calc': a tree {op,left,right}, op ∈ add|sub|mul|div|le|lt|ge|gt|eq|ne (the synonyms divide/multiply/plus/minus and the signs are accepted); the leaves are 5 | '3932 KZT' | '2 mrp' | {lookup: 'mrp', args: [2026]} — a statutory value from the corpus; aggregates are {aggregate: 'sum', element: '?v', over: [{predicate, args with '?variables'}]} over the facts given in facts | |
| days | No | deadline: the length of the period | |
| kind | No | the kind of question (truth by default) | |
| unit | No | ||
| after | No | deadline: the date of the event | |
| facts | No | facts of the case: [{predicate, args, provenance, negated?, package?, judgment?}]. provenance is required and must be an object; {} is allowed. Its fields are optional: {origin?, evidence?: StableId, span?: {page?, quote?, offset?}, extractor?: {name, version?, confidence?}, observedAt?, recordedAt?}. origin defaults to case_input. evidence and observedAt are not required; the extractor is lowered to was_generated_by and a document to was_derived_from. confidence is a decimal string; the package EvidencePolicy reads the threshold, not the host. package resolves an ambiguous short name; args use the same notation as the args of the question | |
| proof | No | return the evaluation field with the proof graph in the answer — a ready-made input for law_explain (kind truth|collect; by default a summary without the graph) | |
| cutoff | No | deadline: the hour operations close | |
| context | No | Expliziter Zeitkontext: timezone ist ein IANA-Name; decisionTime und knowledgeTime sind vollständige Instants mit UTC oder Offset und werden unverändert übernommen. Mit context ist legalTime erforderlich; ein Profil kann alle Felder verlangen | |
| focused | No | kind='truth': ask as focused_truth — the same answer as the full truth, but the proof and the warnings cover only the cone of the question; the answer carries evaluationKind and the slice hashes (focus); the cone in focus is reduced to coneHash and the predicate count, the full cone manifest comes in evaluation.focusManifest with proof=true. A slice is not an audit document: law_prepare_answer does not accept it for publication | |
| package | No | narrow the question to one package of law | |
| version | No | the exact package version pinned by the client (open('name@version')); if it differs from the profile composition the host refuses instead of answering with another version | |
| evidence | No | case documents, section 74, evidence_item nodes. One document is referenced from provenance.evidence of many facts. payload.confidence is data for the EvidencePolicy; the engine does not evaluate the number | |
| afterTime | No | deadline: the time of filing | |
| legalTime | No | the date of the law (YYYY-MM-DD) | |
| predicate | No | what is being asked, e.g. 'duty_amount' | |
| responseMode | No | full (default) — the complete answer. compact is accepted for compatibility: this server builds no short reply and returns the same complete answer in both modes; there is no fullAnswer reference and no stored snapshot of the answer. | |
| supportEdges | No | support edges, section 75, support_edge nodes: from is the document id, to is the fact literal, relation is supports or refutes. Admission is decided by the package EvidencePolicy, not by the host | |
| deadlinePolicy | No | the policy for counting time limits expressed in days: the StableId of a deadline policy declared in the world of the question (e.g. 'urn:kz:corpus:clir:administrative-code#AC_WORKING_DAY_TERMS'), or its short name when exactly one declaration carries it. An inline object {start_count: 'same_day'|'next_day', include_end: true|false, roll: 'no_roll'|'next_working_day'|'previous_working_day'[, month_end: 'last_day_of_month']} is accepted only by a 0.1 world; a 0.2 world refuses it, and the refusal names the declared policies. Without a policy a norm carrying a time limit answers MISSING_POLICY — the policy is set by the law of procedure and the server never assumes one. The snapshot of the official calendar for working days is supplied by the server itself whenever an instrument counts them. | |
| evidencePolicy | No | StableId of an evidence_policy node, section 78.2. Without it, previous calls keep their behaviour. The confidence threshold is a rule of that policy, not an argument of the call | |
| selectedInterpretations | No | named readings; for an exactly_one group choose exactly one StableId out of law_packages/law_rules |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description is free to add the behaviour that matters: "not established" answers carry a whyNot report with candidate rules and conjunct states, answers carry rules, warnings and provenance hashes, version pinning causes refusal rather than silent substitution, and the server never assumes a missing norm or deadline policy. These are non-obvious traits an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then prerequisites, then kind semantics, then return shape — a sensible order. It is long and somewhat repetitive (the "not established is the answer" point is made twice, once in capitals), but nearly every sentence carries operational content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 22-parameter, nested-schema tool with no output schema, the description still covers the prerequisites, the meaning of the answer modes, the content of the returned answer (rules, warnings, provenance hashes, signature block) and the failure semantics. Only the calc path is left entirely to the schema, which is a small residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 95%, so the baseline is 3, but the description adds genuine meaning by explaining the semantics of the kind values (truth vs collect vs deadline vs positions vs why_not) and the role of law_search/law_packages in filling predicate and args. It omits kind='calc' from that enumeration even though a dedicated calc parameter exists, leaving the most structurally complex branch unglossed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Put a question to formalised law") and enumerates the question kinds, so an agent knows this is the main evaluation entry point. It does not, however, contrast itself with close siblings such as law_case_ask, law_query or law_argue, so the agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the prerequisite (obtain predicate names via law_search or law_packages before the first call, because an invented name is rejected), what to do with errors and "not established" results (pass to the user, do not substitute general legal knowledge), and the trap that an empty catalogue search is not a negative answer. That is a when/when-not/alternative map rather than a hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_capture_answerCRead-onlyInspect
Run a registered producer and obtain producerControl/0.2 for a later verifiable preparation of a Lens. The producer is chosen only from the shipped registry.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | ||
| producer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, and idempotentHint=false. The description adds the registry constraint but conspicuously leaves the tension between 'Run a producer' and readOnlyHint unexplained, and says nothing about why idempotentHint is false or what a failed run looks like. It adds only marginal context over the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler and the key constraint placed last. It is not bloated, but the density of undefined jargon means the brevity comes at the cost of comprehension rather than from efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a nested request object, no output schema, and 0% parameter documentation, the description is far too thin. It never defines 'producer', 'producerControl/0.2', or 'Lens', nor does it explain what the request must contain or what the caller receives, leaving an agent unable to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% with two required parameters, one of which ('request') is a nested object that is entirely undocumented. The description adds a little meaning to 'producer' (must come from the shipped registry) but gives no insight into the structure or contents of 'request', so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names an action ('Run a registered producer') and an output ('producerControl/0.2'), but both are opaque domain jargon that a fresh agent cannot decode. It never states in plain terms what the tool actually does, and it does not differentiate itself from siblings like law_prepare_answer, law_publish_answer, or law_answer_capabilities beyond implying a 'later verifiable preparation' step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is a constraint ('The producer is chosen only from the shipped registry'), which says what inputs are legal, not when to pick this tool over the many siblings. No when-to-use, no when-not-to-use, and no named alternatives are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_case_askBRead-onlyInspect
Die Operation ask: eine registrierte Sache eines Fallpakets über ihren verankerten Abhängigkeiten ausführen und die Antwort zurückgeben: standardmäßig eine Projektion des Auswertungsdokuments ohne Beweisgraph, bei responseMode full oder proof: true das kanonische Dokument mit Beweis und Manifest. Die Frage ist JSON nach query.schema.json (query), eine evaluate-Zeichenkette (evaluate + queryId), eine gespeicherte queryId ohne query oder card + args. Eine Verweigerung der Vorbereitung ist ein Fehler mit LDC-*-Code, nie eine leere Antwort.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | die Kartenparameter: Name → Zeichenkettenausdruck der Sprache | |
| card | No | die id einer Karte eines installierten Katalogs | |
| case | No | the name of the case declaration from [[cases]]; optional when there is only one case | |
| proof | No | true — das vollständige Dokument mit Beweisgraph (dasselbe wie responseMode full); false — die Projektion. Dieselbe Form wie bei law_ask. | |
| query | No | the question as JSON per query.schema.json; queryId is a URN in the namespace of the package, or a short name given in queryId | |
| package | Yes | the path to the case package (the directory holding law.toml) from the root of the repository | |
| queryId | No | ohne query/evaluate — die Wahl einer gespeicherten queries/*.json nach Kurzname oder voller URN; mit evaluate — die id der ausgeführten Frage | |
| evaluate | No | the string `evaluate <expression>;`; requires queryId | |
| responseMode | No | compact — eine Projektion für einen Agenten: results, positions, conflicts, das Manifest, Issues oberhalb von info und alle Hashes bleiben erhalten, proofGraph ist durch Hash, Wurzeln und Knotenzahl ersetzt (Feld proof), die Zahl der entfernten info-Issues steht in issuesOmitted. full — das vollständige kanonische Auswertungsdokument, dasselbe, das `law ask` schreibt; proof: true verlangt dasselbe. Der resultHash der Projektion ist der des vollständigen Dokuments; für Beweis oder Veröffentlichung ist full nötig. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/no-destructive/closed-world, and the description adds genuinely new behavior: the default response is a projection without proof graph, responseMode full or proof:true yields the canonical document with proof and manifest, and a failed preparation returns an error with an LDC-* code rather than an empty answer. That error-contract sentence is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense but well-ordered block: purpose first, then output shape, then accepted input forms, then failure semantics. No filler sentences, though the German sentences are long and jargon-loaded, and the language mismatch with the English tool/parameter names adds friction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters, nested objects, and no output schema, the description carries the return-value burden and does so by distinguishing the compact projection (results, positions, conflicts, manifest, hashes, proofGraph collapsed) from the full canonical document. Missing only a plain-language statement of what the answer content represents for a first-time caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does add the mutually-exclusive invocation combinations (query alone, evaluate+queryId, stored queryId alone, card+args), which the per-parameter schema does not state, but its responseMode and proof explanations largely duplicate the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb ('ausführen') and resource ('eine registrierte Sache eines Fallpakets'), but 'Sache' and 'verankerte Abhängigkeiten' are internal jargon that does not tell an outside agent plainly that this answers a question against a case package. It never contrasts itself with the very similar sibling law_ask (which it only mentions in a parameter description), so discrimination relies on the agent reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to choose this tool over law_ask, law_query, or law_argue, and no exclusions or prerequisites. The input-form list (query / evaluate+queryId / stored queryId / card+args) hints at usage shapes but is parameter guidance, not tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_editionsARead-onlyInspect
The axis of editions (O-2): what changed in an instrument between two dates of the law — the state of the editions, the dating of the norms and the semantic diff between the D1 projections. The verdict NOT_DATED means "there was nothing to date it by", not "nothing changed". The outcome of a particular question on a date comes from law_ask with legalTime.
| Name | Required | Description | Default |
|---|---|---|---|
| dateA | Yes | the date of the law "before" (YYYY-MM-DD) | |
| dateB | Yes | the date of the law "after" (YYYY-MM-DD) | |
| package | Yes | the instrument of the corpus |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, non-destructive, non-open-world behavior, so the description's main addition is the NOT_DATED caveat and the mention of output categories like edition state and semantic diff. It still does not explain output structure, limitations, or why idempotentHint is false, leaving meaningful behavioral context undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the main purpose in the first sentence. Some internal shorthand ('O-2', 'D1 projections') is less useful than plain language, but the text is not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry more weight in explaining return values. It names the output categories and one important verdict caveat, but leaves undefined terms and the full shape of results or error cases unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description only conceptually frames the parameters as an instrument and two law dates. It adds no format or constraint details beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the core operation: showing what changed in an instrument between two law dates, including edition state, norm dating, and semantic diff. This distinguishes it from law_ask for point-in-time questions, though jargon such as 'axis of editions (O-2)' and 'D1 projections' is opaque without context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit routing rule for a key alternative: a particular question on a date should use law_ask with legalTime. However, it does not compare against other possibly relevant siblings such as law_inspect, law_query, or law_packages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_explainARead-onlyInspect
Unfold the proof of a law_ask answer into a chain "rule ← premises → conclusion". The compact input: question (the original law_ask arguments, truth/collect), resultHash and codeHash from the provenance of the answer. The server repeats the computation and compares the hashes; if anything changed it refuses explicitly. Alternatively pass the evaluation from law_ask(proof=true). answerResource=fullAnswer.uri explains a stored compact snapshot without recomputing and without the client loading pages; by default only the proofRef chain. nodeId selects one node and all of its premises (up to 24 KB, otherwise an explicit refusal). proofHash refers to the whole graph; scope marks the part selected.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | No | ||
| codeHash | No | ||
| question | No | the original law_ask arguments | |
| evaluation | No | the evaluation document from law_ask | |
| resultHash | No | ||
| answerResource | No | the fullAnswer.uri of a stored answer taken with proof=true |
Output Schema
| Name | Required | Description |
|---|---|---|
| steps | Yes | |
| proofHash | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: the server repeats the computation and explicitly refuses on hash mismatch, nodeId output is capped at 24 KB with an explicit refusal beyond that, answerResource mode avoids recomputation and client page loading, and the default is proofRef-chain only. The annotations only cover read-only/destructive/idempotent/openWorld, so this failure-mode and limit disclosure is genuinely additive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded with the purpose, but written as telegraphic fragments ('The compact input: question..., resultHash and codeHash from the provenance of the answer.') that blend parameter semantics with behavioral constraints in run-on sentences. Size is reasonable for a 6-parameter multi-mode tool, but scanability suffers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers mode selection, verification semantics, size limits, and node-scoped selection. Given the nested-object oneOf schema, this is close to complete; the only loose end is the unexplained proofHash/scope references that do not map to schema properties.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 50% schema description coverage, the description still accounts for all six parameters: question (original law_ask arguments), resultHash and codeHash (from the answer's provenance), evaluation (from law_ask proof=true), answerResource (fullAnswer.uri of a stored proof=true answer), and nodeId (selects one node plus its premises). It also conveys the mutual exclusivity of the oneOf modes, though it mentions proofHash and scope, which do not appear in the schema properties, adding slight ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (unfold/explain) and resource (the proof of a law_ask answer) and even names the output shape, the 'rule ← premises → conclusion' chain. It anchors itself to the law_ask sibling as the producer of its inputs, so an agent can place it in the workflow, though it never contrasts itself against an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional context for the three input modes: pass question/resultHash/codeHash to have the server recompute and verify, pass the evaluation from law_ask(proof=true), or use answerResource to explain a stored snapshot without recomputing. There are no explicit exclusions or sibling alternatives, but the mode-selection guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_inspectARead-onlyIdempotentInspect
Evaluation inspector over a SAVED evaluation document: summary — the origin card, resultHash and snapshot verification, listings of results, positions and issues; slice — the closure of proof nodes for a query, rule, position or node with addresses, both sides of BOTH, defeats, values, names resolved against the snapshot; diff — what changed between two documents on the context, result and justification levels; locate — the declaration by StableId. Nothing is evaluated or recomputed: the source is evaluation from law_ask(proof=true) or an answerResource. Missing data is a limit state (limits), never a negation.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| index | No | ||
| bundle | No | ||
| select | No | ||
| against | No | ||
| context | No | ||
| sources | No | ||
| snapshot | No | ||
| operation | Yes | ||
| evaluation | No | ||
| answerResource | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: it operates purely over a saved document with no evaluation or recomputation, and it defines the semantics of absent data as a limit state rather than a negation. It does not cover pagination or rate/latency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The resource and read-only framing are front-loaded, and little is pure filler, but the operation breakdown is delivered as one dense, dash-separated run-on that is hard to parse. Structure suffers even though information density is high.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be explained. But for a complex 11-parameter tool with nested objects and a oneOf constraint at 0% schema coverage, the description omits pagination, indexing, bundling and source-selection semantics, which an agent would need to invoke it correctly in non-trivial cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 11 parameters, so the description carries real weight: it maps each operation to its inputs (slice selectors for query/rule/position/node, diff via against, locate by StableId). However, several top-level parameters — page/cursor/budgetBytes, index, bundle, sources, context, snapshot — are never mentioned, leaving meaningful gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (inspect, read-only) and resource (a SAVED evaluation document) and enumerates the four operations — summary, slice, diff, locate — each with its own scope. It does not directly contrast with siblings like law_ask or law_explain, but it does name law_ask(proof=true) as the upstream source, which implicitly differentiates inspection from evaluation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use condition: the source must be an evaluation from law_ask(proof=true) or an answerResource, and it emphasizes that nothing is evaluated or recomputed here. It also supplies interpretation guidance ('missing data is a limit state, never a negation'), though it states no explicit when-not or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_packagesARead-onlyInspect
The catalogue of formalised law: instruments, predicates with signatures, the boundaries of coverage. This is where the NAMES of predicates come from — they must never be guessed. But do NOT start from the catalogue when looking for the right instrument: the overview is large, and the title of an instrument rarely matches the words of a question ("Newton's laws of motion" contains no word "physics"). A question in your own words goes to law_search first, which returns addresses; the catalogue is for the exact signature of what you found. With no arguments — the overview: one line per instrument (key, title, legal order, counters of rules, facts, signatures, norms, constants); a whole instrument — package="kz-gpk"; a search over the signatures, labels and constants of every instrument — query="substring". All three modes are PAGED: limit and offset, with the remainder named in the text (showing a–b of N; k more) and in structuredContent (total, truncated, next — a ready-made continuation call). The unit of a page is named by pageUnit: the overview and query page over INSTRUMENTS (20 and 20 by default), package=… pages over the SIGNATURES of one instrument (20 by default, 300 at most) — large codes carry thousands. package=… together with catalog=… pages a separate list of the instrument: "questions" — the CATALOGUE OF QUESTIONS: which enquiries are provided for (a question in words, a form, a predicate or norms) and what the instrument does NOT answer, with the type of reason; a card is a template of an enquiry, not an answer, and not every instrument has one; "norms" — the NORMS of the instrument, "constants" — the CONSTANTS (names of declarations). "task-guides" — TASK GUIDES: the order of applying a canon to a document — what to gather, which cards to ask and how to read the answers; a guide answers nothing. catalog="task-guides" is allowed without package too — every guide of the profile; guide=… — the detail of one guide; the walkthrough — MCP Prompts under the same name. The detail of an instrument prints a preview of these lists and names the count and the ready-made call for the mode.
| Name | Required | Description | Default |
|---|---|---|---|
| guide | No | together with catalog="task-guides": the detail of one guide — a name <package>/<id> (as in prompts/list) or an id together with package | |
| limit | No | how many per page: instruments (overview 20, query 20), signatures of an instrument (20, at most 300) or elements of a catalog list (questions 20, norms 20, constants 100, task guides 20) | |
| query | No | a substring filter over signatures, labels and constants (case-insensitive) | |
| offset | No | from which element of the page (0); the unit is the pageUnit of the answer | |
| catalog | No | together with package: page the catalogue of questions, the norms, the constants or the task guides of the instrument instead of its signatures; "task-guides" also without package: every task guide of the profile | |
| package | No | the full signatures of this instrument |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint=false and destructiveHint=false, so safety is covered; the description goes further by disclosing pagination behaviour (limit/offset, 'showing a–b of N; k more') and the structuredContent fields it returns (total, truncated, next as a ready-made continuation call), plus default and maximum page sizes. It does not explain why idempotentHint is false, but that is a minor omission against an otherwise rich behavioural account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and most sentences carry real information, but the prose is sprawling, dense with em-dashes and parentheticals, and restates some defaults already carried by the schema (20/300 limits). The mode enumeration is hard to skim, which costs it against a genuinely concise definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description compensates by describing the return shape (one line per instrument with key, title, legal order and counters; page metadata in structuredContent). For a six-parameter, multi-mode, read-only catalogue tool the description covers modes, defaults, caps and continuation calls adequately; only the precise field list of the structuredContent payload is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage the baseline is 3, but the description adds genuine cross-parameter semantics the schema cannot: how package, catalog, query and the paging pair combine ('package=… together with catalog=… pages a separate list'), which argument switches the page unit from instruments to signatures, and the fact that catalog='task-guides' is legal without package. That interaction logic is the value-add beyond the per-parameter text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely (the catalogue of formalised law: instruments, predicate signatures, coverage boundaries) and explicitly distinguishes itself from the sibling law_search, which it tells the agent to use for keyword questions. It is a catalogue/browse resource rather than a clean verb+resource pair, and only one of fifteen siblings is differentiated, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-NOT: 'do NOT start from the catalogue when looking for the right instrument', justified by the size of the overview and title/query word mismatch, and routes the agent to law_search first, with the catalogue reserved for resolving the exact signature of something already found. It also states which mode to use under which argument combination.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_passportBRead-onlyInspect
Passport of an exact release: purpose, interface, boundaries, checks and performance. The reports section holds the history of measurements, failures included. Entries are paged by JSON Pointer; next continues the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| index | No | Explicit passport-index path; otherwise LAW_MCP_PASSPORT_INDEX is used. | |
| limit | No | ||
| offset | No | ||
| version | Yes | ||
| sections | No | ||
| contentHash | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, non-destructive, closed-world operation, so the description does not need to restate safety. It adds useful behavior beyond annotations: the reports section includes failed measurements, entries are paged by JSON Pointer, and a next value continues the answer. It still leaves the exact pagination contract and response shape somewhat cryptic, but it provides meaningful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the passport contents before adding the reports and pagination notes. Every sentence is relevant, though terms like 'JSON Pointer' and 'next continues the answer' are compressed enough to be ambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With seven parameters, low schema description coverage, and no output schema, the description should do more to explain required release identity, section selection, index behavior, and return structure. It mentions paging and some sections but leaves the agent without enough detail to confidently construct calls or interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14%, so the description must compensate for undocumented parameters. It does not explain name, version, contentHash, limit, offset, or the full sections enum; it only alludes generally to an exact release, a reports section, and JSON Pointer paging. That is insufficient for a seven-parameter tool with low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource: the passport for an exact release, with sections for purpose, interface, boundaries, checks, performance, and reports. It is clear what kind of artifact is being fetched, but it never states an explicit verb such as retrieve or return and does not distinguish this tool from siblings like law_inspect or law_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance about when to use law_passport versus alternatives such as law_inspect, law_sources, law_report, or law_query. It implies that the tool is used to inspect an exact release passport, but does not state prerequisites, exclusions, or routing conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_prepare_answerBInspect
At the explicit request of the user, repeat between 1 and 12 earlier law_ask or law_process_run calls, compare their replayControl strictly, and prepare a non-public frozen document for 24 hours. The client never supplies the machine answer: the server obtains it only by executing afresh. A divergence in any input, in the law, in a resource, in the server code, in the engine library or in the result rejects the document as a whole.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | ||
| question | Yes | ||
| assistant | No | ||
| calculations | No | ||
| producerRuns | No | Runs of registered producers with control/0.2; mutually exclusive with calculations. | |
| documentVersion | No | Version of the immutable document; 0.1 is kept for transitional compatibility, 0.2 includes all native results and the common reader. |
Output Schema
| Name | Required | Description |
|---|---|---|
| expiresAt | Yes | |
| previewUrl | Yes | |
| contentHash | Yes | |
| resultCount | No | |
| documentHash | Yes | |
| preparationId | Yes | |
| calculationCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does add real behavior beyond annotations: a 24-hour non-public freeze, server-side re-execution ('The client never supplies the machine answer'), and all-or-nothing rejection on any divergence in input/law/resource/server code/engine library/result. However, this directly conflicts with the annotation title 'Prepare a public write-up', which claims public output where the description says non-public. That inconsistency undermines trust in the stated behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler and the user-request trigger front-loaded, so nothing is wasted. But the sentences are dense and grammatically awkward ('compare their replayControl strictly'), forcing re-reading of the central mechanism.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the verification/rejection model and the 24-hour non-public lifetime. Still missing for a nested, oneOf-constrained tool: what the produced document actually is, what documentVersion 0.1 vs 0.2 means, and the role of the assistant payload.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description must compensate. It does explain the key semantic that replayControl is strictly compared and that client-supplied answers are never trusted, and it matches the schema's 1–12 item bound. It says nothing about question, language, assistant or documentVersion, leaving a large share of the six parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource: 'prepare a non-public frozen document for 24 hours' from 1–12 earlier law_ask or law_process_run calls. It implicitly separates itself from law_publish_answer (non-public, frozen, 24h) but never names that sibling, and the jargon 'replayControl' and the reference to law_process_run (not in the sibling list) cloud the picture.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives one trigger condition clearly: 'At the explicit request of the user'. It does not say when NOT to use it, nor route the agent to alternatives such as law_publish_answer, law_capture_answer or law_ask for the non-verification path. Usage is implied rather than fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_processARead-onlyInspect
Which stages the procedure established by an instrument consists of, and whether it carries a structural defect. The stages, the transitions and the condition of every transition are reconstructed from the formalisation rather than retold: what leads from where to where, and under what condition. The check of the graph: unreachable stages, dead transitions, a transition that enters no stage at all. Without package — the list of instruments whose procedure is formalised. A stage with no exit is named but is NOT counted as a defect: whether it is terminal by design cannot be seen from the formalisation.
| Name | Required | Description | Default |
|---|---|---|---|
| package | No | the instrument; without it — the list of instruments that carry procedures |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description explains that results are reconstructed from a formalization and that checks include unreachable stages, dead transitions, and transitions entering no stage. It also usefully states that a stage with no exit is reported but not counted as a defect, which is important behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably sized and front-loads the core purpose, but the first sentence is grammatically awkward and the repeated reference to formalisation makes it slightly harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one optional parameter and no output schema, the description provides a solid account of what is returned: stages, transitions, transition conditions, and specific graph defects. It could be more explicit about result formatting, but the essential call behavior is covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single package parameter already has 100% schema description coverage, and the description adds only the same behavior: omitting package lists instruments whose procedure is formalized. It does not significantly extend the schema's semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool reports the stages of a procedure and checks for structural defects in the procedure graph. It is specific about the resource and analysis performed, though it does not explicitly distinguish itself from the sibling tool law_process_run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: pass a package to analyze that instrument's procedure, or omit it to list instruments with formalized procedures. However, it gives no explicit guidance on when to use this tool instead of related siblings such as law_process_run or law_inspect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_process_runBRead-onlyInspect
How a particular case will run, step by step: a log of {date, attempt?, facts?} is executed frame by frame, and the law of each frame is the law of ITS date. The answer says: which stages have been entered; which attempted transition produced NO legal effect; which duties are violated and which time limits are running; what is available next and WHAT EXACTLY is missing for the rest. The names of transitions come from law_process. Stages entered means "was it ever entered", not "where it is now": the core 0.1 does not compute points of the current state.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | the log of the case: [{date, attempt?, time?, decisionTime?, knowledgeTime?, facts: [{predicate, args, provenance}]}]; each fact requires a provenance object ({} is allowed), its fields are optional, and evidence is not required. On an attempted transition `time` is the instant of the event (ISO 8601 with an offset), and by it the bearer takes its place in the history; the decision and knowledge axes of a frame come from the entry, else from the case, else from midnight UTC of the date; every frame names the axes it used and where they came from | |
| package | Yes | the instrument | |
| instance | Yes | what is going through the procedure: the number of the lot, of the application, of the case | |
| legalTime | No | the base date (YYYY-MM-DD); the date of a frame is set by the step itself | |
| probeTime | No | the instant of a hypothetical attempt, used to work out the steps available on the last frame; without it the available steps are not computed — the tool does not invent time | |
| procedure | No | the procedure, where there is more than one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only safety, so the description appropriately adds substantive behavioral context: what the answer reports, how stages-entered differs from current state, and that without probeTime the tool does not compute available next steps. It also discloses a significant limitation—that this does not compute points of the current state. It does not explain error behavior, but the additional disclosure is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with its purpose and avoids obvious filler, but it is a dense, run-on paragraph with nested parentheticals and jargon that makes it harder to parse than necessary. Several clauses are useful, but the structure could be clearer and more scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, 100% schema coverage, no output schema, and a complex domain, the description does a substantial job explaining the returned information, the temporal rules, and the tool's limits. It lacks explicit guidance on error cases or when to prefer it over siblings, but it is close to complete for the core behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the parameters, including the complex steps structure and the probeTime semantics. The description adds little parameter detail beyond what is in the schema and instead focuses on output and conceptual behavior. This fits the baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific function—executing a dated log of case events frame by frame to determine procedural effects—which is more than a restatement of the name. It also distinguishes itself from law_process by noting that transition names come from that tool. However, the purpose is expressed in dense domain jargon ('frame', 'core 0.1') that weakens immediate clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is used when you have a case log to evaluate, but it gives no explicit when-to-use guidance, no when-not conditions, and no comparison against alternatives beyond noting that transition names come from law_process. An agent must infer the selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_publish_answerAIdempotentInspect
Publish a prepared document. Repeating it with the same preparationId idempotently returns the same URL and the same separate revocation secret.
| Name | Required | Description | Default |
|---|---|---|---|
| preparationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| revoked | Yes | |
| publicId | Yes | |
| publicUrl | Yes | |
| publishedAt | Yes | |
| revokeSecret | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag idempotentHint=true and readOnlyHint=false, but the description adds concrete behavioral detail beyond that: the repeat call returns the *same URL* and the *same separate revocation secret*, which is exactly what an agent needs to know to safely retry. It is slightly redundant with idempotentHint but the payload specifics are new information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core action is front-loaded before the idempotency note. Wording is slightly clunky ("with the same preparationId idempotently returns") but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained further, and annotations carry the safety profile. The remaining gap is the missing pointer to law_prepare_answer as the source of preparationId and to law_revoke_answer as the consumer of the revocation secret.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single preparationId parameter has no schema description. The description names preparationId and implies it is a handle produced by a prior preparation step, but does not say where to obtain it or what its format is, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Publish a prepared document") that an agent can distinguish from law_prepare_answer (which prepares) and law_revoke_answer (which revokes). It does not name those siblings explicitly, but the preparation/publish/revoke triad is inferable from the verb choice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the precondition that a document must already be prepared and identified by preparationId, which implies law_prepare_answer runs first. However, it never states when to use this versus alternatives, nor what happens if the preparationId is unknown or expired.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_queryARead-onlyInspect
Eine deterministische LawQL-Abfrage über das CLIR einer Formalisierung: eine Frage an das Modell des Aktes selbst, nicht an einen Fall. Relationen (14): anchors, edges, fields, imports, interpretations, labels, links, literals, nodes, norms, positions, rules, variables, windows. Feldlisten: law query --schema. Funktionen (9): anchor/1, labels/1..2, short/1, contains/2, overlaps/2, starts_with/2, ends_with/2, position/2, derivation/2. exists/not exists über eine gebundene Variable; nur Gleichheit und Mitgliedschaft, keine Arithmetik und keine Ordnungsvergleiche. Bereich: corpus nach package.name (zum Beispiel kz.corpus.labour_code, kein Dateiname) oder ein Glob; ohne corpus der gesamte Profilausschnitt; ein Bereich außerhalb des Profils ist leer (CORPUS_EMPTY). Beispiele: from r in rules where r.head_predicate == "urn:…#eligible" select r.id as producer, r.strength as strength, anchor(r.id) as anchors — wer erzeugt; from l in literals where l.predicate == "urn:…#eligible" select l.node as reader, l.context as context — wer liest; query eligible over "pkg" { for x: Person; where applicant(x); select eligible(x); } — Inferenz durch den Kern. Dies ist Orchestrierung über CLIR und Kern; neue juristische Semantik wird hier nicht implementiert. Statt Text eine Frage aus dem Katalog mit arguments: anchors-of, imports-of, links-of, producers, readers, type-step (Stand: law query --list) (die Parameter predicate/node/type sind URNs, pkg ein package.name oder ein Glob). Die strukturelle Antwort ist eine queryPage: resultHash des vollständigen queryResult, snapshot (Hash der Paketliste des Bereichs), rowCount, rows nach rowLimit (20, höchstens 5000) und rowOffset, next mit dem snapshot zur Fortsetzung; full: true liefert das vollständige queryResult, wenn der Bereich ein einzelnes Paket ist. Jede Zeile trägt ihre Provenienz (CLIR-Knoten); eine leere Antwort trägt den Explain-Trichter (emptyAt nennt die Klausel); Fehler tragen LDC-Qxxxx-Codes mit Hinweisen; ein zu breites Quellenprodukt wird vor der Ausführung abgelehnt (QUERY_TOO_BROAD), eine Fortsetzung auf einem anderen Schnappschuss als SNAPSHOT_CHANGED.
| Name | Required | Description | Default |
|---|---|---|---|
| case | No | the case for query-over; it replaces the case clause | |
| full | No | das vollständige queryResult statt einer Seite zurückgeben; nur wenn der Bereich ein einzelnes Paket ist | |
| limit | No | an explicit cap on eval() materialisations (it does NOT bound the rows — see rowLimit) | |
| query | No | inline LawQL | |
| corpus | No | der Bereich des Schnappschusses: ein package.name (zum Beispiel kz.corpus.labour_code) oder ein Glob über package.name; ohne corpus der gesamte Profilausschnitt | |
| engine | No | there is one engine — the core; the reference implementation is called by its own command | lawc |
| question | No | der Name einer Frage aus dem Katalog benannter Abfragen (producers, readers, anchors-of, imports-of, links-of, type-step) oder eines Lints; anstelle von query | |
| rowLimit | No | how many rows in structuredContent (20; the budget may lower it) | |
| snapshot | No | der Schnappschuss-Hash aus next.snapshot der vorherigen Seite: eine Fortsetzung auf einem anderen Schnappschuss wird abgelehnt (SNAPSHOT_CHANGED) | |
| arguments | No | die Parameter der Frage: ein Objekt „Name → Zeichenkette“ (predicate, node, type — URNs; pkg — ein package.name oder ein Glob) | |
| rowOffset | No | ab welcher Zeile (0); die Fortsetzung kommt aus next zusammen mit snapshot; nur strukturelle Abfragen |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotations, the description discloses pagination behavior (rowLimit default 20, max 5000, next/snapshot), full-result mode, provenance per row, empty-result explain funnels with emptyAt, error codes, and pre-execution rejection of overly broad queries (QUERY_TOO_BROAD) or stale continuations (SNAPSHOT_CHANGED). It also sets the scope boundary that an out-of-profile corpus yields CORPUS_EMPTY.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is highly relevant for an 11-parameter query language, but it is presented as a dense, semicolon-heavy block rather than a structured reference. The purpose is front-loaded and most clauses earn their place, yet readability and scanability suffer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by explaining the queryPage shape, row provenance, empty-result diagnostics, error codes, and snapshot-based continuation. Combined with the schema's full parameter descriptions and the listed relations/functions, an agent has enough information to form and continue queries correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description still adds useful semantics: corpus is a package.name or glob rather than a filename, without corpus means the whole profile slice, full only works for a single package, and limit caps materialisations rather than rows. It also clarifies that predicate/node/type are URNs and that snapshot continues a previous page.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: a deterministic LawQL query over CLIR, explicitly framed as a question to the act's model rather than to a case. It lists the queryable relations and functions and gives concrete examples, so the agent can distinguish this structured-query tool from case-oriented or natural-language siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how the tool is used (inline LawQL, catalog question names, arguments, corpus scope, continuations) and clarifies that this is orchestration over CLIR and the core rather than new legal semantics. It does not explicitly say when to choose this over siblings such as law_ask or law_search, so it lacks full when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_reportARead-onlyInspect
A REPORT of a divergence between the formalisation and the source: the answer contradicts the pinned text, a norm of the source is not expressed by a rule, a label diverges from the text, an address cannot be found. A report is a hypothesis for triage by a formaliser: it does NOT change the law, it never reaches the answers of the other tools, and "not derived" does not become "derived" because of it. An address is required and is checked against the catalogue: package, fragment (a StableId from law_sources) and/or predicate; callId is the X-Law-Call-Id of the answer you disagree with. The entry goes into the server log.
| Name | Required | Description | Default |
|---|---|---|---|
| callId | No | the X-Law-Call-Id of the answer you disagree with | |
| package | Yes | the instrument of the corpus | |
| category | Yes | the kind of divergence: norm not expressed / outcome against the text / label against the text / address not found / text against the official one / other | |
| expected | Yes | what the source says (with the article) | |
| fragment | No | the StableId of the source fragment | |
| observed | Yes | what the system answered | |
| predicate | No | the predicate the report is about |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false, idempotentHint=false), and the description adds real context by explaining the effect: it does not mutate the law, does not feed other tools' answers, and lands in the server log. However, 'the entry goes into the server log' sits in mild tension with readOnlyHint=true and the description never reconciles that the call does create a persisted record — an agent could read this as a purely side-effect-free operation. Useful added context, but the write-to-log vs. readOnly framing is left slightly ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core definition, then constraints, then the operational requirement (address + callId) and the log destination. It is dense but almost every clause carries information; the only soft spots are the somewhat rhetorical framing ('a report is a hypothesis for triage by a formaliser') and run-on enumeration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must say what comes back, and it doesn't — the agent learns only that an entry goes into the server log, not whether it receives a report id, echo, or rejection on a bad address. It does cover the required address, the categories, and the dispute workflow, so for a 7-parameter diagnostic tool the coverage is adequate but leaves the response contract and error behaviour unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is already met, and the description adds meaning on top: package/fragment/predicate form an address checked against the catalogue, fragment is a StableId drawn from law_sources, and callId is the X-Law-Call-Id of the disputed answer. That cross-references sibling tools and supplies validation semantics absent from the schema. It does not explain how category affects triage or whether expected/observed need article citation, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'A REPORT of a divergence between the formalisation and the source', then enumerates the divergence kinds (contradiction, missing norm, label mismatch, broken address). It also clarifies the artifact's standing relative to siblings ('never reaches the answers of the other tools'), so an agent can tell this apart from law_explain/law_argue, though it never routes to a named alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear trigger conditions (you disagree with an answer; you found a norm in the source not expressed as a rule; an address cannot be found) and a strong usage constraint ('it does NOT change the law', 'not derived does not become derived'). It also states the filing prerequisite: an address validated against the catalogue, plus callId from the disputed answer. No explicit 'do not use this for X, use sibling Y instead', so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_revoke_answerADestructiveIdempotentInspect
Revoke a published document using its separate secret. The public id alone grants no control; revocation closes the HTML page, the API and the download.
| Name | Required | Description | Default |
|---|---|---|---|
| publicId | Yes | ||
| revokeSecret | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| revoked | Yes | |
| publicId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine value beyond them by enumerating the blast radius — 'revocation closes the HTML page, the API and the download' — which tells the agent exactly what stops working.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the action-with-required-credential is front-loaded ahead of the consequence. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The scope of destruction and the credential requirement are covered; only errant cases (invalid/rotated secret, already-revoked state) are unaddressed, a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load. It explains the security model (the public id grants no control; the separate secret is what authorizes the action), which meaningfully clarifies revokeSecret, but it gives no format, length, or acquisition guidance for either parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Revoke a published document') with the key mechanism named (separate secret). It is clearly distinguishable in intent, though it never names its natural sibling (law_publish_answer) or any other tool, so the agent must infer routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when it applies (a document was published and you hold the revoke secret) via 'The public id alone grants no control,' but there is no explicit when-to-use, when-not-to-use, or alternative clause. Adequate but inferential.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_rulesARead-onlyInspect
The rules of formalised law put into words: exactly how a predicate is derived (premises, source articles). Call this BEFORE supplying facts to law_ask — the rules say which facts are needed instead of leaving them to be guessed. For large instruments package=… returns a table of contents; the full text comes from predicate=…. The listing by package is paged: limit (20 by default, 500 at most) and offset; the remainder is named in the text (showing a–b of N; k more) and in structuredContent (total, truncated, next — a ready-made continuation call).
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | the language the rules are put into | |
| limit | No | package: how many rules per page (20; the budget may lower it) | |
| offset | No | package: from which rule (0) | |
| package | No | every rule of the instrument | |
| contract | No | Return a machine input contract over the same import/dependency world as law_ask. No case evaluation. | |
| predicate | No | the rules that derive this predicate | |
| inputLimit | No | Machine contract: leaf declarations per page (50). | |
| inputOffset | No | Machine contract: offset of leaf declarations. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| limit | No | |
| rules | Yes | |
| total | No | |
| offset | No | |
| compact | No | |
| package | Yes | |
| ruleCount | No | |
| truncated | No | |
| factsTemplate | No | |
| inputContract | No | |
| verbalizationGaps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: paging behavior for package listings, the default/max limit and 'the budget may lower it', the human-readable remainder text, and the structuredContent fields (total, truncated, next) that form a ready-made continuation call. It does not address the non-idempotent hint, but otherwise this is rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and the call-ordering rule before paging details. Dense parenthetical clauses ('20 by default, 500 at most', the 'showing a–b of N' sample) make it slightly heavy, but each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with an output schema and full annotation coverage, the description supplies modes, ordering relative to law_ask, paging, and continuation guidance. Return values need not be re-explained because the output schema exists; the remaining omission is minor (no explicit note on the contract mode's interplay with the other flags).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents each parameter description. The description goes beyond it by explaining the mode interaction — package returns a table of contents for large instruments while predicate returns the full text — and by spelling out paging defaults and the continuation payload. This is more than the baseline repetition the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — it returns 'the rules of formalised law ... exactly how a predicate is derived (premises, source articles)'. It distinguishes its two modes (package= gives a table of contents for large instruments; predicate= gives the full derivation) and separates itself from the sibling law_ask.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this BEFORE supplying facts to law_ask', with the reason (the rules say which facts are needed rather than guessing). It names the alternative and the ordering condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_screenARead-onlyInspect
Build a necessary condition — a superset — for the preliminary selection of rows from an external source. This is NOT a legal answer and NOT SQL: the result is a typed tree and a manifest of the extensions up to TRUE. Every row that passes must then be computed in full by the engine, with a proof graph, on the same snapshot of the data. The binding is passed as a pinnable object; sourceSchemaContentHash is the actual hash of the source schema and is compared loudly with the pin. Case facts that carry provenance (origin, document, quote, extractor) are supplied to law_ask, not here. The confidence figure is read by the package EvidencePolicy, not by this tool and not by the engine.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | a StableId or a unique short name of the goal | |
| binding | Yes | a law.screen.binding/0.1 artefact | |
| package | Yes | the package key from law_packages | |
| legalTime | No | the date of the law YYYY-MM-DD; without it every window of every rule is taken into account | |
| sourceSchemaContentHash | Yes | the actual sha256 of the source schema |
Output Schema
| Name | Required | Description |
|---|---|---|
| manifest | Yes | |
| condition | Yes | |
| disclaimer | Yes | |
| schemaVersion | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, closed-world), and the description adds substantial context beyond them: the output is a typed tree plus an extensions manifest, screening must be followed by full engine computation with a proof graph on the same snapshot, the binding is a pinnable object, and sourceSchemaContentHash is compared against the pin. These are non-obvious contract details an agent could not derive from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by scope exclusions and contract details. Every sentence carries information, but the middle is thick with domain jargon and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, annotations, and full schema coverage already present, the description still covers the result shape (typed tree + manifest), the two-stage execution contract with snapshot consistency, pin comparison semantics, where provenance facts belong, and what consumes the confidence value. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds real semantics on top: the binding is 'passed as a pinnable object' and sourceSchemaContentHash is the actual hash 'compared loudly with the pin.' The legalTime fallback behavior is already in the schema, so it earns only modest additional credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Build a necessary condition — a superset — for the preliminary selection of rows from an external source.' It also fences itself off from siblings by declaring it is 'NOT a legal answer and NOT SQL' and routes provenance facts to law_ask. The jargon ('manifest of the extensions up to TRUE') is dense, so it is clear but not effortless.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not guidance (not a legal answer, not SQL) and names the alternative for adjacent work ('Case facts that carry provenance ... are supplied to law_ask, not here'). It also states the downstream obligation that passing rows must be recomputed by the engine. It never states the positive trigger condition ('use this when you need to pre-filter candidates'), leaving that to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_searchARead-onlyInspect
A semantic SEARCH over formalised law: a question or a notion in your own words → candidates with addresses — predicates with signatures, rules, article fragments. This is the layer of DISCOVERY, not of the answer: the result says WHAT to ask next (law_ask by signature, law_rules, law_sources) and establishes neither a fact nor a norm. The ranking is a deterministic lexical embedder, and similarity of text is not applicability of a norm. If you know the exact name, go straight to law_packages/law_ask; an empty result does NOT mean the norm does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| kinds | No | narrow the kinds of candidate | |
| limit | No | how many candidates (8, at most 25) | |
| query | Yes | a question or a notion in your own words | |
| package | No | search inside this instrument only |
Output Schema
| Name | Required | Description |
|---|---|---|
| model | No | |
| query | Yes | |
| fallback | Yes | |
| candidates | Yes | |
| indexUnits | No | |
| jurisdiction | Yes | |
| corpusFingerprint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, but the description goes well beyond them: it discloses the ranking mechanism (deterministic lexical embedder), warns that textual similarity is not normative applicability, clarifies the tool establishes neither fact nor norm, and pre-empts the empty-result false negative. This is exactly the extra behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition and follows with routing constraints, so almost every sentence earns its place. The ALL-CAPS emphasis, arrows, and em-dash fragments add stylistic noise that slightly obscures an otherwise tight structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value format need not be re-explained, and the description still characterizes results as addressed candidates. Combined with the discovery-layer framing and sibling routing, nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (kinds, limit, query, package) are already documented in the schema, establishing a baseline of 3. The description reinforces query semantics ('a question or a notion in your own words') and implies the candidate kinds, but adds no syntax, default, or constraint detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('semantic SEARCH over formalised law') and concretely describes the output shape ('candidates with addresses — predicates with signatures, rules, article fragments'). It explicitly differentiates from siblings law_ask, law_rules, and law_sources, so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use/when-not guidance: 'This is the layer of DISCOVERY, not of the answer', 'If you know the exact name, go straight to law_packages/law_ask', plus the critical caveat that an empty result does not mean the norm is absent. Alternatives are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
law_sourcesARead-onlyInspect
Sources: by default short excerpts (view=summary), 5 texts per page, with the address of the full text in fragments[].full. Either package or fragment is required (a StableId from law_search/law_rules). view=full returns exact parts of the text: textRange sets a range of Unicode characters, fragments[].next is the continuation with a contentHash. The hash refers to the WHOLE source, not to the excerpt or the part. textOffset/textLimit require fragment; a continuation requires contentHash. Lists are paged with offset/limit; the answer budget may shrink a page.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | summary | |
| limit | No | how many texts: summary 5, full 1 (the budget may lower it) | |
| offset | No | from which fragment (0) | |
| status | No | the status of the variant, as given on the source card | |
| package | No | the package key — every fragment of that instrument | |
| fragment | No | the StableId of a fragment | |
| language | No | the language of the variant, as given on the source card | |
| textLimit | No | the maximum number of Unicode characters in a part of the text (also ≤8000 bytes of UTF-8) | |
| textOffset | No | ||
| contentHash | No | the hash of the full text taken from the previous part |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe read profile (readOnlyHint=true, destructiveHint=false), so the bar is lower; the description adds real value on top: pagination via offset/limit, that the answer budget may shrink a page, and the non-obvious rule that the contentHash refers to the WHOLE source rather than the excerpt. That is substantial behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the default behavior and each clause carrying a distinct rule (view modes, required inputs, continuation/hash semantics, paging). Telegraphic style is efficient, though the run-on packing of rules slightly reduces scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, no-required-param tool with no output schema, the description does the heavy lifting on paging, view modes, continuation, and partial return shape (fragments[].full, fragments[].next). It leaves status/language behavior to the source card and never describes error or empty-result handling, but coverage is otherwise strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 80% schema coverage the baseline is 3, but the description adds cross-parameter semantics the schema cannot express: textOffset/textLimit require fragment, a continuation requires contentHash, and the hash scope warning. It also explains the textRange/fragments[].next continuation model, though it references a textRange that is not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes clear this retrieves official text sources, defaulting to short excerpts (view=summary) and offering full text (view=full), and it names law_search/law_rules as the origin of the StableId inputs. It does not, however, explicitly distinguish itself from sibling retrieval tools such as law_packages or law_editions, leaving the agent to infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It specifies a key prerequisite ('Either package or fragment is required') and traces the StableId back to law_search/law_rules, which is genuine usage context. But it never states when to prefer this tool over the many sibling lookup tools, so usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
- Changed
law_argue4 fields changed- added
Input schema / properties / contextAdded value: +{ + "additionalProperties": false, + "description": "Expliziter Zeitkontext: timezone ist ein IANA-Name; decisionTime und knowledgeTime sind vollständige Instants mit UTC oder Offset und werden unverändert übernommen. Mit context ist legalTime erforderlich; ein Profil kann alle Felder verlangen", + "properties": { + "decisionTime": { + "type": "string" + }, + "knowledgeTime": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "timezone", + "decisionTime", + "knowledgeTime" + ], + "type": "object" +} - changed
Input schema / properties / facts / descriptionPrevious value: -"facts of the case: [{predicate, args, negated?, provenance?}]. provenance is the same object as on law_ask: origin, document, quote, extractor. confidence is read by the package EvidencePolicy, not by the engine"New value: +"facts of the case: [{predicate, args, provenance, negated?}]. provenance is a required object; {} is allowed, its fields are optional, and evidence is not required. The package EvidencePolicy reads confidence, not the host" - added
Input schema / properties / facts / itemsAdded value: +{ + "properties": { + "args": { + "type": "array" + }, + "predicate": { + "type": "string" + }, + "provenance": { + "type": "object" + } + }, + "required": [ + "predicate", + "args", + "provenance" + ], + "type": "object" +} - changed
Input schema / properties / limits / descriptionPrevious value: -"the caps of the §274 profile: maxArguments (64), maxExtensions (8), maxUndecided (16)"New value: +"the caps of the profile: maxArguments (64), maxExtensions (8), maxUndecided (16)"
- Changed
law_ask9 fields changed- changed
Input schema / properties / args / descriptionPrevious value: -"the arguments of the predicate in the order of its signature; with kind='collect' exactly one of them is the selection variable ?name (for example ['urn:x:water', 'urn:x:mix', '?value']), the rest are values. Values follow the parameter type: an entity — 'urn:…' or a short name; Date — 'YYYY-MM-DD'; Money — '<number> <currency>' ('43250 KZT'); Quantity — '<number> <unit>' with the unit exactly as the package spells it ('25 calendar_year', '30 meter'; law_packages shows the units of the constants, units are never converted — §49); a constant of the package — its name"New value: +"the arguments of the predicate in the order of its signature; with kind='collect' exactly one of them is the selection variable ?name (for example ['urn:x:water', 'urn:x:mix', '?value']), the rest are values. Values follow the parameter type: an entity — 'urn:…' or a short name; Date — 'YYYY-MM-DD'; Money — '<number> <currency>' ('43250 KZT'); Quantity — '<number> <unit>' with the unit exactly as the package spells it; a constant of the package — its name" - changed
Input schema / properties / calc / descriptionPrevious value: -"kind='calc': a tree {op,left,right}, op ∈ add|sub|mul|div|le|lt|ge|gt|eq|ne (the synonyms divide/multiply/plus/minus and the signs are accepted); the leaves are 5 | '3932 KZT' | '2 mrp' | {lookup: 'mrp', args: [2026]} — a statutory value from the corpus; aggregates §59 are {aggregate: 'sum', element: '?v', over: [{predicate, args with '?variables'}]} over the facts given in facts"New value: +"kind='calc': a tree {op,left,right}, op ∈ add|sub|mul|div|le|lt|ge|gt|eq|ne (the synonyms divide/multiply/plus/minus and the signs are accepted); the leaves are 5 | '3932 KZT' | '2 mrp' | {lookup: 'mrp', args: [2026]} — a statutory value from the corpus; aggregates are {aggregate: 'sum', element: '?v', over: [{predicate, args with '?variables'}]} over the facts given in facts" - added
Input schema / properties / contextAdded value: +{ + "additionalProperties": false, + "description": "Expliziter Zeitkontext: timezone ist ein IANA-Name; decisionTime und knowledgeTime sind vollständige Instants mit UTC oder Offset und werden unverändert übernommen. Mit context ist legalTime erforderlich; ein Profil kann alle Felder verlangen", + "properties": { + "decisionTime": { + "type": "string" + }, + "knowledgeTime": { + "type": "string" + }, + "timezone": { + "type": "string" + } + }, + "required": [ + "timezone", + "decisionTime", + "knowledgeTime" + ], + "type": "object" +} - changed
Input schema / properties / deadlinePolicy / descriptionPrevious value: -"the §86 policy for counting time limits expressed in days: {start_count: 'same_day'|'next_day', include_end: true|false, roll: 'no_roll'|'next_working_day'|'previous_working_day'[, month_end: 'last_day_of_month' — for months and years only]}. Without it a norm carrying a time limit answers with a DEADLINE_POLICY_* warning — the policy is set by the law of procedure and the server never assumes one. The snapshot of the official calendar §85 for working days is supplied by the server itself whenever an instrument counts them."New value: +"the policy for counting time limits expressed in days: the StableId of a deadline policy declared in the world of the question (e.g. 'urn:kz:corpus:clir:administrative-code#AC_WORKING_DAY_TERMS'), or its short name when exactly one declaration carries it. An inline object {start_count: 'same_day'|'next_day', include_end: true|false, roll: 'no_roll'|'next_working_day'|'previous_working_day'[, month_end: 'last_day_of_month']} is accepted only by a 0.1 world; a 0.2 world refuses it, and the refusal names the declared policies. Without a policy a norm carrying a time limit answers MISSING_POLICY — the policy is set by the law of procedure and the server never assumes one. The snapshot of the official calendar for working days is supplied by the server itself whenever an instrument counts them." - changed
Input schema / properties / deadlinePolicy / typePrevious value: -"object"New value: +[ + "string", + "object" +] - changed
Input schema / properties / facts / descriptionPrevious value: -"facts of the case: [{predicate, args, negated?, package?, provenance?, judgment?}]. package resolves an ambiguous short name. provenance is {origin?, evidence?: StableId, span?: {page?, quote?, offset?}, extractor?: {name, version?, confidence?}, observedAt?, recordedAt?}. origin defaults to case_input (section 73; extraction adds no origin value): the extractor is lowered to a was_generated_by edge, the document to was_derived_from. confidence is a decimal string; the threshold is read by the package EvidencePolicy (field confidence), not by the engine. A fact with an extractor and no evidence is accepted as case_input and yields the warning FACT_WITHOUT_EVIDENCE. A call without provenance is unchanged. args use the same notation as the args of the question"New value: +"facts of the case: [{predicate, args, provenance, negated?, package?, judgment?}]. provenance is required and must be an object; {} is allowed. Its fields are optional: {origin?, evidence?: StableId, span?: {page?, quote?, offset?}, extractor?: {name, version?, confidence?}, observedAt?, recordedAt?}. origin defaults to case_input. evidence and observedAt are not required; the extractor is lowered to was_generated_by and a document to was_derived_from. confidence is a decimal string; the package EvidencePolicy reads the threshold, not the host. package resolves an ambiguous short name; args use the same notation as the args of the question" - added
Input schema / properties / facts / itemsAdded value: +{ + "properties": { + "args": { + "type": "array" + }, + "predicate": { + "type": "string" + }, + "provenance": { + "type": "object" + } + }, + "required": [ + "predicate", + "args", + "provenance" + ], + "type": "object" +} - changed
Input schema / properties / focused / descriptionPrevious value: -"kind='truth': ask as focused_truth (§181.3) — the same answer as the full truth, but the proof and the warnings cover only the cone of the question; the answer carries evaluationKind and the slice hashes (focus); the cone in focus is reduced to coneHash and the predicate count, the full cone manifest comes in evaluation.focusManifest with proof=true. A slice is not an audit document: law_prepare_answer does not accept it for publication"New value: +"kind='truth': ask as focused_truth — the same answer as the full truth, but the proof and the warnings cover only the cone of the question; the answer carries evaluationKind and the slice hashes (focus); the cone in focus is reduced to coneHash and the predicate count, the full cone manifest comes in evaluation.focusManifest with proof=true. A slice is not an audit document: law_prepare_answer does not accept it for publication" - changed
Input schema / properties / selectedInterpretations / descriptionPrevious value: -"named readings §152; for an exactly_one group choose exactly one StableId out of law_packages/law_rules"New value: +"named readings; for an exactly_one group choose exactly one StableId out of law_packages/law_rules"
- Changed
law_case_ask4 fields changed- changed
Input schema / properties / card / descriptionPrevious value: -"die id einer Karte eines installierten Katalogs DECISION-0190"New value: +"die id einer Karte eines installierten Katalogs" - changed
Input schema / properties / evaluate / descriptionPrevious value: -"the string `evaluate <expression>;` §267.2; requires queryId"New value: +"the string `evaluate <expression>;`; requires queryId" - added
Input schema / properties / proofAdded value: +{ + "description": "true — das vollständige Dokument mit Beweisgraph (dasselbe wie responseMode full); false — die Projektion. Dieselbe Form wie bei law_ask.", + "type": "boolean" +} - added
Input schema / properties / responseModeAdded value: +{ + "description": "compact — eine Projektion für einen Agenten: results, positions, conflicts, das Manifest, Issues oberhalb von info und alle Hashes bleiben erhalten, proofGraph ist durch Hash, Wurzeln und Knotenzahl ersetzt (Feld proof), die Zahl der entfernten info-Issues steht in issuesOmitted. full — das vollständige kanonische Auswertungsdokument, dasselbe, das `law ask` schreibt; proof: true verlangt dasselbe. Der resultHash der Projektion ist der des vollständigen Dokuments; für Beweis oder Veröffentlichung ist full nötig.", + "enum": [ + "full", + "compact" + ] +}
- Added
law_inspect - Changed
law_passport1 field changed- added
Input schema / properties / indexAdded value: +{ + "description": "Explicit passport-index path; otherwise LAW_MCP_PASSPORT_INDEX is used.", + "minLength": 1, + "type": "string" +}
- Changed
law_process_run2 fields changed- changed
Input schema / properties / steps / descriptionPrevious value: -"the log of the case: [{date, attempt?, time?, decisionTime?, knowledgeTime?, facts: [{predicate, args}]}]; on an attempted transition `time` is the instant of the event (ISO 8601 with an offset), and by it the bearer takes its place in the history §161.1 (DECISION-0156); the decision and knowledge axes of a frame come from the entry, else from the case, else from midnight UTC of the date; every frame names the axes it used and where they came from"New value: +"the log of the case: [{date, attempt?, time?, decisionTime?, knowledgeTime?, facts: [{predicate, args, provenance}]}]; each fact requires a provenance object ({} is allowed), its fields are optional, and evidence is not required. On an attempted transition `time` is the instant of the event (ISO 8601 with an offset), and by it the bearer takes its place in the history; the decision and knowledge axes of a frame come from the entry, else from the case, else from midnight UTC of the date; every frame names the axes it used and where they came from" - added
Input schema / properties / steps / itemsAdded value: +{ + "properties": { + "facts": { + "items": { + "properties": { + "args": { + "type": "array" + }, + "predicate": { + "type": "string" + }, + "provenance": { + "type": "object" + } + }, + "required": [ + "predicate", + "args", + "provenance" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
law_query1 field changed- changed
Input schema / properties / question / descriptionPrevious value: -"der Name einer Frage aus dem Katalog corpus/ql/questions (producers, readers, anchors-of, imports-of, links-of, type-step) oder eines Lints; anstelle von query"New value: +"der Name einer Frage aus dem Katalog benannter Abfragen (producers, readers, anchors-of, imports-of, links-of, type-step) oder eines Lints; anstelle von query"
- Changed
law_rules5 fields changed- added
Input schema / properties / contractAdded value: +{ + "description": "Return a machine input contract over the same import/dependency world as law_ask. No case evaluation.", + "type": "boolean" +} - added
Input schema / properties / inputLimitAdded value: +{ + "description": "Machine contract: leaf declarations per page (50).", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / inputOffsetAdded value: +{ + "description": "Machine contract: offset of leaf declarations.", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / lang / descriptionPrevious value: -"the language the rules are put into (DECISION-0032; the language of the profile by default; the rest are draft packs, with §218 label overlays)"New value: +"the language the rules are put into" - added
Output schema / properties / inputContractAdded value: +{ + "type": "object" +}
20 tool updates
- First observed
law_answer_capabilities - First observed
law_argue - First observed
law_ask - First observed
law_capture_answer - First observed
law_case_ask - First observed
law_editions - First observed
law_explain - First observed
law_packages - First observed
law_passport - First observed
law_prepare_answer - First observed
law_process - First observed
law_process_run - First observed
law_publish_answer - First observed
law_query - First observed
law_report - First observed
law_revoke_answer - First observed
law_rules - First observed
law_screen - First observed
law_search - First observed
law_sources
Related MCP Connectors
French Civil Code (LEGI) as executable rules: facts and a legal date in, answers with grounds out
French family-benefit models (CNAF corpus) as executable rules with sources; independent demo
German court decisions and statutes with citation checks. OAuth 2.1 or Bearer token.
Verified, citable German & EU law for any LLM. Daily updates from official sources, hosted in DE.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceCite-grade German legal-text infrastructure for LLM agents, providing access to federal, Länder, and EU laws with cryptographic provenance.2Apache 2.0
- AlicenseAqualityBmaintenanceEnables AI agents to retrieve the verbatim text of German federal and state statutes, search official case law from BGH, BAG and BVerfG, and compute procedurally exact deadlines under §§ 187–193 BGB with weekend and public-holiday adjustment. It also supplies structured statutory-element blueprints with burden-of-proof allocation and assembles citation-secured research dossiers for pleadings.6MIT
- AlicenseNot gradedqualityFmaintenanceEnables querying over 6,800 German federal statutes, case law, and legislative preparatory works with verbatim source text. Integrates EU law cross-references and provides citation validation and legal stance building.160 npm23Apache 2.0

kvasir-legalofficial
FlicenseNot gradedqualityCmaintenanceVerifiable German, Austrian, Swiss and EU law: resolve citations to the wording in force, verify the citations a model produced against the official source, and walk the citation graph.-
Glama MCP Gateway
Add one secure layer between your agents and this server.