Ansvar: EU Compliance & Legal Intelligence
Server Details
Cited EU & global law, regulations & security frameworks via Ansvar Gateway. OAuth, free + paid.
- Status
- Healthy
- Uptime
- 99.7% over 66 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Ansvar-Systems/ansvar-gateway
- GitHub Stars
- 0
TDQS
Scored across 35 tools
Most families are cleanly separated: legal retrieval (search/get_provision/diff), change tracking (get_changes/discover_eu_legislation), citation checking, CVE enrichment (search_cve/get_cve_details/batch_search/search_by_product), and workflow lifecycle verbs are each distinct. The main friction points are the citation-verification trio (validate_citation vs verify_citations vs validate_claim) and the capabilities pair (describe_capabilities vs get_my_capabilities), which rely on very long descriptions rather than names to separate. Descriptions do explicitly draw boundaries, so overlap is manageable.
Nearly all tools use snake_case with a leading verb (get_provision, list_coverage, start_workflow, validate_claim, search_cve), and the search_ and get_ prefixes are applied predictably. The exceptions are a few bare names like diff and search, plus batch_search sitting oddly beside the search_ family. Minor deviations only; overall readable and predictable.
35 tools is heavy for a single server and pushes past the comfortable 3-15 band, but the surface genuinely spans three large domains (EU legislation retrieval, CVE/vulnerability intelligence, and structured compliance workflows). It is defensible breadth rather than padding, though the count makes discovery harder and a split into sub-servers would help.
Coverage is unusually full: legal search, exact provision lookup, version diffing, change feeds, coverage/status introspection, three citation/claim verification tools, the full workflow lifecycle (scope/start/step/progress/submit/resume/cancel/report), and a complete CVE enrichment chain ending in ICS advisory detail. No obvious dead ends in any of the domains served.
Available Tools
35 toolsbatch_searchBatch SearchARead-onlyInspect
Get details for multiple CVEs in one query (max 100). Efficient for bulk vulnerability assessment.
| Name | Required | Description | Default |
|---|---|---|---|
| cve_ids | Yes | List of CVE IDs to look up | |
| include_kev | No | Include KEV status | |
| include_epss | No | Include EPSS scores |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds the behavioral constraint of max 100 and 'one query', but does not disclose return format, error handling, or partial failure 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 description is two sentences with no wasted words. It front-loads the action and includes a concise usage tip. Every word 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?
For a simple, read-only batch tool, the description covers the basic purpose and limit, and annotations cover safety. However, without an output schema, it does not specify what 'details' includes (e.g., which fields beyond KEV/EPSS) or behavior for invalid CVE IDs, leaving some gaps.
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%, with all three parameters documented (cve_ids, include_kev, include_epss). The description adds no additional parameter meaning beyond framing the batch nature, so it meets the baseline of 3.
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 verb ('Get details'), resource ('multiple CVEs'), and scope ('in one query (max 100)'). It distinguishes itself from sibling tools like get_cve_details by emphasizing batch capability, making the purpose immediately clear.
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 phrase 'Efficient for bulk vulnerability assessment' provides clear context for when to use this tool. However, it does not explicitly mention alternatives or when-not-to-use scenarios, such as pointing to get_cve_details for single CVE lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_workflowCancel WorkflowADestructiveInspect
Cancel an active workflow by id. Cancelled workflows cannot be resumed and are excluded from resume_workflow's active listing; their record stays visible in list_workflows. Idempotent — cancelling an already-cancelled workflow returns the same result.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavior: irreversibility ('cannot be resumed') and idempotency ('cancelling an already-cancelled workflow returns the same result'), which an agent needs for retry logic. It stops short of saying what happens to in-flight steps or whether cancellation is synchronous.
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 tight sentences, front-loaded with the action, followed by consequences and then the idempotency guarantee. Every sentence carries new information; nothing is repeated from the title or schema.
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 no explanation, and the description covers the key post-conditions: irreversibility, visibility in list_workflows, and exclusion from resume listings. A note on the effect on an in-flight workflow run would close the remaining 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 100% and the workflow_id property already documents its origin ('as returned by start_workflow') and recovery path via list_workflows. The description adds only 'by id', so baseline 3 is correct with the schema doing 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?
States a specific verb and resource ('Cancel an active workflow by id'), with the scope qualifier 'active'. The agent can immediately distinguish this from resume_workflow and list_workflows without opening any 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?
Explicitly routes the agent by naming siblings: cancelled runs are excluded from resume_workflow's active listing and remain visible in list_workflows. It does not state an explicit when-not case (e.g., cancelling a run that already completed), but the context provided is well above implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_kev_statusCheck Kev StatusARead-onlyInspect
Check if a CVE is in the CISA Known Exploited Vulnerabilities (KEV) catalog. Returns KEV details including required remediation actions and due dates.
| Name | Required | Description | Default |
|---|---|---|---|
| cve_id | Yes | CVE identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds behavioral context by specifying the return value includes KEV details, remediation actions, and due dates, which goes 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?
The description is two sentences: the first states the main purpose, the second lists the key return fields. Every word earns its place, with no redundancy or unnecessary detail.
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 simple one-parameter read-only tool with no output schema, the description is complete. It explains what the tool does and what it returns, making it sufficient for an agent to select and 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 100%, with the required cve_id parameter described as 'CVE identifier'. The description reinforces the parameter's purpose but adds no additional semantic detail beyond what 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?
The description clearly states the tool checks if a CVE is in the CISA KEV catalog, using a specific verb and resource. It distinguishes itself from siblings like get_cve_details and search_cve by focusing on KEV-specific status.
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 provides clear context for when to use the tool (whenever KEV status is needed) but does not explicitly mention alternatives or exclusions. The narrow scope makes the usage obvious, so it earns a 4 rather than a 3.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dfdCreate DfdAInspect
Validate a DFD artifact and render it as styled Mermaid. Returns {mermaid, validation_errors, structural_warnings}. Use after the DFD specialist (/threat-modeler-dfd) has finished extraction so the graph integrity (valid node types, declared trust_zones, reachable edge endpoints, recognised regulatory tokens) is checked before the artifact is submitted via submit_response on scoping.component_identification. artifact = {nodes, edges, trust_zones, assets}, each a list. node: {id, type, trust_zone, name?} where type is one of process|data_store|external_entity|actor and trust_zone references a trust_zones[].id. edge: {src_node, dst_node, id?, protocol?, authentication?, encrypted?, crosses_boundary?} where src_node/dst_node reference node ids (from/to accepted as aliases). trust_zone: {id, name?}. asset: {owner_node, id?, regulatory_relevance?} where owner_node references a node id and regulatory_relevance tokens are one of GDPR|PCI_DSS|DORA|NIS2|EU_AI_Act|HIPAA|ePrivacy|EBA|EIOPA. Bad input returns validation_errors with mermaid=null; it never raises.
| Name | Required | Description | Default |
|---|---|---|---|
| artifact | Yes | The DFD to validate and render: {nodes, edges, trust_zones, assets}, each a list. node = {id, type, trust_zone, name?} where type is process, data_store, external_entity, or actor and trust_zone references a trust_zones[].id. edge = {src_node, dst_node, id?, protocol?, authentication?, encrypted?, crosses_boundary?} where src_node and dst_node reference node ids (from/to are accepted aliases). trust_zone = {id, name?}. asset = {owner_node, id?, regulatory_relevance?} where regulatory_relevance tokens are GDPR, PCI_DSS, DORA, NIS2, EU_AI_Act, HIPAA, ePrivacy, EBA, or EIOPA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds useful behavioral details beyond annotations: returns {mermaid, validation_errors, structural_warnings}, 'Bad input returns validation_errors with mermaid=null; it never raises', and lists validation checks. It does not disclose side effects despite readOnlyHint=false, but no direct contradiction arises.
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 long but dense, covering purpose, workflow, input structure, and error handling in a structured way. It front-loads the core action and uses the rest for necessary detail, so it is efficient despite length.
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 complex tool with nested objects, the description covers workflow context, input schema details, return values, and error behavior. It leaves no significant gaps for an agent to select and invoke the tool 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% and the description mirrors the schema's artifact structure almost exactly. It adds no new parameter semantics beyond what the schema already provides, so the baseline 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 opens with 'Validate a DFD artifact and render it as styled Mermaid,' which is a specific verb+resource. It clearly distinguishes itself from siblings by referencing the DFD specialist workflow and submit_response, positioning it as the validation/rendering 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?
Explicitly states when to use: 'after the DFD specialist has finished extraction' and 'before the artifact is submitted via submit_response'. This gives clear workflow context. However, it does not name alternative tools or explicitly state when not to use it, so it falls 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.
describe_capabilitiesDescribe CapabilitiesARead-onlyInspect
Discover what Ansvar can do for your agent. Default (detail='summary') is a compact orientation view: one-line about, your tier summary, counts, a per-category index (id, name, available_to_caller, min_tier, entry_hint, tools/workflows counts, caveats for gated families), meta tool names, next_steps, the paid add-ons directory, and a sources count with a drill-down pointer. detail='full' returns the complete catalog (large — over 100k chars): category prose, the intent-keyed common_use_cases map, anti_patterns, guidance, the tour, and the full sources directory. section='sources' | 'addons' | 'tour' | 'law_map' | returns that one section alone; an unknown section is an error listing the valid ids. section='sources' returns 4 entries by default: compact entries carry a one-sentence address for corpora with get_provision; detail='full' replaces address with lookup, including served shapes, shares, examples, declared form, prefixes and addressing guidance. Filter by query, declared domain or jurisdiction; continue with next_cursor as cursor. query and jurisdiction also filter section='law_map' by product type or EU act key and market. domain, cursor and limit require section='sources'. detail is validated before section: an invalid detail is an error even when section= is passed. Every view is tier-aware: available_to_caller flags and caveat text reflect the caller, and gated families are shown with caveats, never silently omitted. The workflow lists are reconciled at read time against a TTL-cached snapshot of the live workflow registry (background-refreshed, 15 min): workflow_types_index carries the snapshot status (live / stale / unavailable) and fetched_at, plus registry types the curated catalog does not list yet; catalog_drift lists catalog ids the registry no longer serves (dropped from the payload). service_notices names subsystems in a known degraded state and the exact tools affected; a category's tool_status marks a catalog tool that currently dispatches on zero scopes fleet-wide and is withheld from tools/list and the category roster until a feed serves (e.g. get_changes during the baseline-only interim), with the same reason_code the tool's own refusal returns. Companion to get_my_capabilities (live tier / quota only). Backed by this repo's data/capabilities-catalog.yml (mirrored for documentation as infrastructure/gateway/capabilities-catalog.yml in arch-docs). Search in the corpus's primary language (en), then fetch the hits in the user's language with the language argument of get_provision (a code, or a short list of codes for versions side by side).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Sources per page, clamped to [1, 50]; requires section='sources'. | |
| query | No | Case-insensitive source tokens for section='sources'; product id, title tokens or EU act key for section='law_map'. | |
| cursor | No | Opaque next_cursor from a page with the same filters; requires section='sources'. | |
| detail | No | 'summary' (the default) returns the compact orientation view; 'full' returns the complete catalog, which runs over 100k characters. Any other value is an error, checked before section. | summary |
| domain | No | Exact declared domain ('telecom' is accepted for 'telecommunications-media'); requires section='sources'. Unknown values return an empty page. | |
| section | No | Return one section alone: 'sources', 'addons', 'tour', 'use_cases', 'law_map', or a category id from the summary view's index. Empty returns every section. An unknown value is an error listing the valid ids. | |
| content_kind | No | Kind of legal text: 'statute', 'court-decisions', 'preparatory-works' or 'disciplinary-decisions'; requires section='sources'. An unknown value is an error listing the valid values. | |
| jurisdiction | No | Market code for section='law_map', or jurisdiction code with canonical aliasing for section='sources'; matches a source's primary jurisdiction or one it serves (serves_jurisdiction_via marks a multi-jurisdiction match). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/destructiveHint, yet the description adds substantial non-obvious behavior: tier-aware gating with caveats rather than silent omission, a TTL-cached (15 min) workflow-registry snapshot with live/stale/unavailable status, catalog_drift entries, service_notices for degraded subsystems, and tool_status for zero-scope tools. This is exactly the kind of behavior an agent could not infer from structured fields.
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 well, but the body is a very dense near-3000-character run-on covering output shapes, caching, drift, notices and tips that would benefit from structure. Much of the content is warranted by the tool's complexity, but the readability cost is real.
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 enumeration is partly redundant, yet the description still rounds out operational context (error semantics for unknown section, tier-awareness, degraded-state signaling). For a complex multi-mode catalog tool with 8 optional params, the coverage is effectively complete.
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 prose largely restates the schema's dependency rules (domain/cursor/limit require section='sources'; detail validated before section) and the law_map filtering behavior already documented per-parameter, adding little genuinely new parameter meaning.
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 opens with a specific verb+resource ('Discover what Ansvar can do for your agent') and explicitly separates itself from the nearest sibling: 'Companion to get_my_capabilities (live tier / quota only)'. An agent can distinguish this catalog-discovery tool from live tier/quota tools without opening either 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?
It gives concrete selection rules: default detail='summary' for a compact orientation view, detail='full' for the complete catalog, section=<id> for one section alone. It also routes the agent elsewhere for live data (get_my_capabilities) and for corpus retrieval (search in en, fetch hits via get_provision's language arg). No explicit when-NOT-to-use beyond the sibling callout, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffDiffRead-onlyInspect
Compare two versions of a legal provision to see what changed. Use this when someone asks 'what changed in the latest DORA amendment', 'how did this article change between versions', or 'show me the differences in GDPR Article 17 after the update'. Returns a structured diff with added, removed, and modified text. The text content is one JSON document. Its evidence_summary field carries the 'Sources used' markdown table (the audit receipt per returned row) or a labelled zero-result note. Result rows carry url/title/subtitle display fields alongside their citation when available. meta.render_contract carries the versioned evidence-curation contract.
| Name | Required | Description | Default |
|---|---|---|---|
| law | Yes | Instrument the provision belongs to, as a framework id ('GDPR', 'DORA') or the corpus's own law identifier. | |
| article | Yes | Article or section number within the instrument, such as '17' or '5(1)(a)'. | |
| to_date | No | End of the comparison window as an ISO date. Empty means the version currently in force. | |
| from_date | No | Start of the comparison window as an ISO date, e.g. '2024-01-01'. Empty means the corpus picks the earliest version it holds. | |
| jurisdiction | Yes | ISO-2 code of the jurisdiction that owns the provision, such as EU or SE. |
discover_eu_legislationDiscover Eu LegislationARead-onlyInspect
Find EU legal acts by CELEX/ELI identifier, official title, reviewed alias, or LEXICAL match on title and EuroVoc labels (not semantic); filter by EuroVoc topic id or label, Ansvar sector, document type and availability. Returns bounded candidates with per-edition currency state and hold reasons, a framework crosswalk to eu-regulations where the same act is keyed there, and exact search/lookup hints.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | CELEX or ELI identifier, official title fragment, or a short concept phrase. Optional when at least one of topics/sectors/document_types/availability is given (filter-only discovery); a call with neither query nor filters refuses with reason=empty_request. Matching is LEXICAL, not semantic: exact CELEX/ELI, exact official title, reviewed alias, then every query token within ONE title or within ONE EuroVoc label (pref or alt) of the work — never across labels. A short candidate list is a lexical result, not a coverage claim. | |
| cursor | No | ||
| expand | No | with a single-work query (celex_exact/eli_exact hit) return the FULL editions or related list for that work instead of the bounded default | |
| topics | No | EuroVoc concept ids — the last path segment of the concept URI: numeric legacy ids or the hashed `c_<hex>` ids EuroVoc uses for newer concepts (release 4.24 carries both) — OR English EuroVoc labels. A label resolves by exact NFKC case-insensitive match on a pref label, else on an alt label; an unresolved label refuses unknown_filter_value naming up to 20 candidate {id, label} pairs whose label contains every token of the input; a label matching more than one concept refuses ambiguous_topic listing them. applied_filters.topics echoes the RESOLVED ids (the cursor binds those) and disclosures records each label→id resolution. Exact, OR within the list, AND with the other axes | |
| sectors | No | Ansvar sector/domain ids; OR within the list, AND with the other axes | |
| availability | No | ||
| document_types | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses bounded results, per-edition currency state, hold reasons, crosswalk behavior, and exact search/lookup hints. The explicit warning that lexical matches are not coverage claims is especially valuable for setting agent expectations.
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 dense but well-structured, leading with the core purpose and then adding high-value caveats and return characteristics. No sentences are wasted, and the most decision-relevant information appears first.
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 no output schema, the description covers returns at a useful level: bounded candidates, currency state, hold reasons, crosswalk, and hints. It also documents refusal and ambiguity cases in the parameter descriptions. A minor gap is the lack of explicit cursor/pagination semantics, though the cursor parameter exists in the schema.
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 schema descriptions for query, topics, sectors, and expand already provide detailed semantics, and the main description adds the lexical matching model and bounded-result behavior. Undocumented parameters like availability, document_types, cursor, and limit are less explained, but their enums and constraints offer partial self-documentation.
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 opens with a specific verb and resource: "Find EU legal acts" by CELEX/ELI identifier, official title, reviewed alias, or lexical match. It clearly distinguishes this from generic siblings like search and search_by_product by naming EU-specific identifiers, EuroVoc labels, and Ansvar sectors.
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 and query parameter explicitly explain when the tool can be called: query-only, filter-only, or both, and that omitting both refuses with empty_request. It also warns that matching is lexical, not semantic, and that a short candidate list is not a coverage claim. However, it does not explicitly name sibling alternatives or state when to prefer another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_reportGenerate ReportARead-onlyInspect
Produce the final compliance report from a completed workflow. Use this when someone says 'generate the gap analysis report', 'I need the DPIA report as a document', or 'create the threat model output'. Refuses until every quality gate passes, returning the failing check and a hint. Returns a structured report with findings, citations, and recommendations. Pass format html, pdf, docx, or all to additionally receive branded rendered artifacts as short-lived download URLs in a sibling render key; render failures attach render_error and never drop the report JSON. Rendering is served by the document plane and starts at the premium tier; on free and solo an included run also returns html or pdf carrying an Ansvar watermark, and outside an included run free and solo receive the report as JSON. A format the caller's tier does not serve is refused explicitly rather than quietly downgraded.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Artifacts to produce alongside the report JSON: 'json' (the default, JSON only), 'html', 'pdf', 'docx', or 'all'. Rendered artifacts come back as short-lived download URLs. The advertised enum is narrowed to what your tier serves, and a format your tier does not serve is refused rather than downgraded. | json |
| workflow_id | Yes | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. | |
| include_report | No | false returns only the delivery receipt (with its display_markdown), any rendered artifact links and the relay block; use it when your client limits tool output size. Default true returns the full report. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint=true, destructiveHint=false), and the description adds substantial behavior beyond that: the quality-gate refusal with failing check and hint, the render key with short-lived download URLs, the render_error fallback that never drops the report JSON, tier-based serving, and watermark rules for lower tiers. This is unusually rich disclosure for a read-only tool.
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 triggers and then behavior. The tier/watermark sentence is dense but every clause carries operational information; no filler, though the definition runs long.
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 present, return values need not be reiterated, and the description still covers failure modes, tier gating, and artifact delivery. Nothing an agent needs to invoke and interpret the tool correctly appears to be 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, but the description adds material meaning the schema does not: that the advertised format enum is narrowed by tier and that unserved formats are refused rather than downgraded. It does not re-explain workflow_id or include_report, so it sits just above baseline.
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 ('Produce the final compliance report') and scopes it to 'a completed workflow', clearly separating it from workflow-control siblings like start_workflow or resume_workflow. An agent can identify the operation without opening the 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?
Provides explicit natural-language triggers ('generate the gap analysis report', 'I need the DPIA report as a document', 'create the threat model output') and a clear exclusion: it refuses until every quality gate passes. The when-to-invoke condition is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changesGet ChangesRead-onlyInspect
Find observed rows from legislative change feeds in a jurisdiction or framework, or from an explicit source. Use this for questions such as 'what laws changed in Sweden this month' only when the requested scope is listed as amendment-capable. If since is omitted, the gateway defaults to the last 90 days. Coverage is per corpus. The EU Regulations source is baseline-only during the current interim: it is excluded from amendment-capable dispatch, and a framework it owns is advertised only if another reachable feed supports that framework. A successful empty response is not evidence that no amendments occurred. On a capability miss, the response names supported source, framework, and jurisdiction scopes — or, when no corpus advertises change feeds at all, says so explicitly with supported_scopes empty on every axis. Every dispatched response reports whether baseline rows were actually withheld and whether the producer supplied typed event metadata. Legacy rows without typed event metadata remain visible with event_kind unknown. A scope value that names nothing we serve is refused, not ignored: the call errors and names the value, never returning changes for only the part that resolved. Use diff for a known provision. Boundary: this tool reports amendments observed in SERVED corpus text; for newly published official acts and regulator announcements (what is new, not what changed in a text we serve), use search_regulatory_updates. The text content is one JSON document. Its evidence_summary field carries the 'Sources used' markdown table (the audit receipt per returned row) or a labelled zero-result note. Result rows carry url/title/subtitle display fields alongside their citation when available. meta.render_contract carries the versioned evidence-curation contract.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum change entries per source (default 20; values above 50 are clamped; total entries can reach limit × resolved sources). | |
| since | No | Earliest change date to report, as an ISO date, e.g. '2026-01-01'. Empty defaults to the last 90 days. | |
| sources | No | Exact corpus source ids to read change feeds from, such as swedish-law. | |
| frameworks | No | Registered framework scope ids such as GDPR or NIS2, restricted to frameworks a reachable change feed supports. | |
| regulation | No | Narrow the feed to one instrument by name, such as 'GDPR'. Optional; leave empty for every instrument in scope. | |
| jurisdictions | No | ISO-2 jurisdiction scope codes such as SE or EU. Only scopes a corpus advertises as amendment-capable are dispatched; a capability miss names the supported scopes. | |
| regulation_id | No | Narrow the feed to one instrument by the corpus's own identifier (e.g. a CELEX number). Optional alternative to regulation. |
get_current_stepGet Current StepARead-onlyInspect
Check which step a compliance workflow is currently on and what input is needed next. Use this when someone asks 'where are we in the gap analysis', 'what's the next step', or 'what do I need to provide now'. Returns the current step description and expected input format. questions_for_user is advisory — answerable from context or uploaded documents; requires_user_input=true is the server-enforced human-input gate, and the step then lists user_provided_fields that must be filled before calling submit_response.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotation, the description discloses key nuances: questions_for_user is advisory while requires_user_input is server-enforced, and it explains user_provided_fields gating submit_response. This adds significant operational context not available from annotations alone.
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, each earning its place: the main purpose, usage examples, and important field semantics. It is dense with useful information and contains no redundant phrases.
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 present, the description doesn't need to enumerate return fields, but it explains their behavior (advisory vs. enforced, user_provided_fields). This covers the core functionality and edge-case semantics, making it complete for an agent to use 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?
The input schema already fully documents workflow_id, including its origin from start_workflow and recovery via list_workflows (100% coverage). The description does not add further parameter semantics, so the baseline score 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 tool checks which step a compliance workflow is currently on and what input is needed next. It names the specific resource (compliance workflow step) and a concrete verb (check), and the example queries distinguish it from related tools like get_progress.
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 provides explicit usage triggers: 'Use this when someone asks...' with concrete example phrasings. It does not explicitly mention when not to use it or alternatives, but the context is clear and actionable for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cve_detailsGet Cve DetailsARead-onlyInspect
Get complete details for a specific CVE including CVSS scores, references, CPE mappings, KEV status, EPSS score, exploit references, and any CISA ICS/OT advisories (ICSA/ICSMA/ICSV) referencing it with their affected industrial products — use this to enrich an OT/ICS or robot-cell TARA with live advisory context.
| Name | Required | Description | Default |
|---|---|---|---|
| cve_id | Yes | CVE identifier (e.g., CVE-2024-1234) | |
| include_cpe | No | Include CPE mappings | |
| include_exploits | No | Include exploit references | |
| include_references | No | Include external links |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds meaningful behavioral context by specifying that the tool returns 'live advisory context' and includes CISA ICS/OT advisories with affected industrial products, indicating a comprehensive multi-source lookup. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the core purpose ('Get complete details') and efficiently lists the key outputs before giving a use case. Every word earns its place; no fluff or repetition.
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 the lack of an output schema, the description does an excellent job of conveying what the tool returns by enumerating seven distinct data categories, including the unique CISA ICS/OT advisory details. It also provides a practical use case, making the tool's broader context clear. The information is sufficient for an agent to decide when and how to use this tool.
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% for all 4 parameters, with clear descriptions for each. The tool description lists the data types returned (CVSS, references, CPE, etc.) which partially maps to the include_* parameters, but does not add new parameter-level meaning beyond what the schema already provides. Baseline 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 tool's function: 'Get complete details for a specific CVE' and enumerates the specific data categories (CVSS scores, references, CPE mappings, KEV status, EPSS score, exploit references, CISA ICS/OT advisories). This specific verb+resource+scope distinguishes it from sibling tools that focus on individual aspects (e.g., get_epss_score, check_kev_status).
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 provides a clear context for use: 'use this to enrich an OT/ICS or robot-cell TARA with live advisory context.' It implies when to choose this tool over more specialized ones, but does not explicitly mention alternatives or exclusions. This matches 'clear context, no exclusions'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_freshnessGet Data FreshnessARead-onlyInspect
Check the freshness and sync status of all data sources. Returns last sync time, data age in hours, record counts, and health status (current/stale/critical) for each source: NVD, CISA KEV, EPSS, ExploitDB. Use this to verify data is up-to-date before making security assessments.
| 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 and destructiveHint=false. The description adds valuable behavioral detail about the return payload (timestamps, age, counts, health status categories) and the exact data sources covered. It doesn't describe edge cases like partial failures, but for a read-only status tool this is adequate.
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: the first is a dense summary of functionality and outputs, the second is a clear usage recommendation. No filler or repetition of the name/title, and the most important information is front-loaded.
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?
Despite lacking an output schema, the description fully enumerates the return fields and data sources, making the tool's behavior predictable. Given the zero-parameter input and simple read-only nature, the description covers all necessary context without requiring more detail.
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 the baseline is 4. The description correctly makes no parameter claims, and since the schema is empty, there is no additional documentation needed. The description adds value by explaining what data the tool actually 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?
The description clearly states the verb 'Check' and the resource 'freshness and sync status of all data sources', and it lists specific return fields (last sync time, data age, record counts, health status) and the covered sources (NVD, CISA KEV, EPSS, ExploitDB). This distinguishes it from sibling tools that target individual sources or specific details.
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 provides explicit usage context: 'Use this to verify data is up-to-date before making security assessments.' While it doesn't name alternative tools or when NOT to use it, the context is clear and sufficient for an agent to decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_epss_scoreGet Epss ScoreARead-onlyInspect
Get the EPSS (Exploit Prediction Scoring System) score for a CVE. Returns the probability of exploitation in the next 30 days and percentile ranking.
| Name | Required | Description | Default |
|---|---|---|---|
| cve_id | Yes | CVE identifier |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool's safety profile is known. The description adds value by specifying the return values (probability and percentile), but does not cover potential caveats like data freshness or error handling.
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 long, front-loads the primary purpose, and contains no redundant information. Every word contributes to understanding the tool's function.
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 simple one-parameter read tool with no output schema, the description adequately explains the return format (probability and percentile). A mention of potential error behavior when the CVE is not found would make it fully complete, but it is otherwise sufficient.
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 input schema fully documents cve_id with a pattern and description (100% coverage). The description aligns with the schema ('for a CVE') but adds no extra meaning beyond what 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?
The description clearly states the tool retrieves the EPSS score for a CVE, with specific output context (probability within 30 days and percentile ranking). This distinctively separates it from sibling tools like get_cve_details or get_exploits.
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 explicit guidance is given on when to use this tool versus alternatives. The description implies usage for EPSS scores, but does not mention when not to use it or name alternative tools, leaving the agent to infer context from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_exploitsGet ExploitsARead-onlyInspect
Get public exploit code references for a CVE from Metasploit, ExploitDB, GitHub PoCs, and other sources.
| Name | Required | Description | Default |
|---|---|---|---|
| cve_id | Yes | CVE identifier | |
| verified_only | No | Only return verified exploits |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds useful context by specifying that it returns 'references' (not exploit code itself) and lists aggregation sources. However, it does not describe result format or pagination, which would be additional behavioral detail.
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 a single sentence of 14 words that front-loads the action and resource. Every word earns its place, with no redundancy or filler.
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?
The tool is simple with two parameters and good annotations. The description provides key context (sources, reference-only nature) and is sufficiently complete for a read-only lookup tool, though it could optionally mention the output shape (e.g., list of URLs).
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 schema already explains cve_id format and verified_only default/filtering. The description adds no extra parameter-specific semantics, so baseline 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 uses a specific verb ('Get') and resource ('public exploit code references') scoped to a CVE, and enumerates concrete sources (Metasploit, ExploitDB, GitHub PoCs). This clearly distinguishes it from siblings like get_cve_details and search_cve.
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 clearly indicates when to use the tool: when you need exploit code references for a given CVE. It does not explicitly name alternative tools or exclusions, but the context is unambiguous given the sibling tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ics_advisoryGet Ics AdvisoryARead-onlyInspect
Get full details of a CISA ICS/OT advisory including affected products (vendor + product + version range), referenced CVEs with CVSS, summary and the CSAF source URL. Public-domain CISA CSAF data.
| Name | Required | Description | Default |
|---|---|---|---|
| advisory_id | Yes | Advisory ID (e.g. ICSA-24-001-01, ICSMA-26-176-02) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context beyond annotations: it specifies the data source ('Public-domain CISA CSAF data') and the exact contents of the response, setting expectations for what the call returns. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly written sentence that front-loads the core action and then enumerates the return contents. Every word adds value; there is no fluff or repetition of schema properties.
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 simple read-only lookup tool with one well-documented parameter, the description fully covers what the tool does and what the response will contain. The absence of an output schema is compensated for by the explicit list of returned components. No critical information 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?
The schema already fully documents the single parameter with an example format, so description-level parameter guidance is not necessary. The description implicitly connects advisory_id to the advisory being fetched, but adds no extra semantic detail beyond the schema. Baseline of 3 applies due to 100% 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 states a specific verb and resource: 'Get full details of a CISA ICS/OT advisory' and enumerates the exact contents (affected products, CVEs with CVSS, summary, CSAF source URL). This clearly distinguishes it from sibling tools like search_ics_advisories (search vs. full detail) and get_cve_details (CVE-specific vs. advisory-scoped).
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 tool is used when you have an advisory ID and need the complete advisory record, but it does not explicitly state when to use this over alternatives or mention that search_ics_advisories should be used to find IDs. The usage context is understandable but left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_capabilitiesGet My CapabilitiesARead-onlyInspect
Tier, capabilities, limits, and live usage for the calling identity. Use this to decide what tools and fan-out paths are available before calling them, or to check remaining quota before issuing more requests — lower-tier agents can avoid wasted retries and decide whether to upgrade mid-conversation rather than discover limits by hitting walls. Visible to all tiers; takes no arguments. Returns a JSON document with: tier (free/solo/premium/team/company), capabilities (workflows, audit_ledger, include_premium_fanout — bool flags from ADR-026 §2 and ADR-032 §1), limits (max_concurrent_jobs, daily_quota — map tool→limit from ADR-028 §4, listing only tools your tier, scopes, and actor policy admit), with daily_quota_note when tool rows share a budget, and, at Free and Solo while included workflow runs are live, workflow_run_search_allowance (per_run, tools, note): searches that pass an active included run's workflow_id draw from that per-run allowance instead of the daily budget. At the free tier, the provision-body lookups (get_provision, validate_citation) share one 200 calls/day budget; daily_quota_note names every tool on it. usage_today (active_concurrent_calls, remaining_quota — map tool→remaining, both read live from the configured cap store; team/company budgets pool per organisation, so seats of one org see a shared remaining number), documents (Team and Company only: count, cap and remaining for your organisation's registered-document library, read live from the document service; count and remaining are null with an unavailable_reason when that read fails, never zero), tool_surface (tool_count and a 16-character fingerprint of the caller-scoped tools/list, computed_at in UTC, and a refresh_hint for detecting a stale client-side tool cache), workflow_discovery (present only when you can start a run — the three calls that take you from here to a running workflow: list_workflow_types for the live type ids, describe_capabilities for the catalog, start_workflow to begin; the type ids come from that call, never from this one), upgrade_url (empty for company tier, otherwise the marketing page that explains the next tier up), and service_notices — subsystems currently in a known degraded state, each naming the exact affected tools/add-ons and the reason those tools return, so an advertised capability that is temporarily down is never a surprise (empty list when everything is healthy). Counters reset at UTC midnight. With Redis configured, daily quota and concurrency are shared across workers and replicas; adding workers does not multiply the allowance. Development without Redis uses in-memory counters local to each process.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, non-destructive, not open-world), and the description adds substantial behaviour beyond them: counters reset at UTC midnight, Redis-backed quota/concurrency shared across workers and replicas so adding workers does not multiply allowance, in-memory counters in Redis-less development, per-org pooled budgets, and null-with-unavailable_reason rather than zero on failed document reads. These are non-obvious operational traits an agent cannot infer 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, but the body is a single dense run-on paragraph that enumerates nearly every return field (tier, capabilities, limits, workflow_run_search_allowance, usage_today, documents, tool_surface, workflow_discovery, upgrade_url, service_notices) plus ADR citations, much of which duplicates the output schema that already exists. Many clauses do not need to be in the description to call this zero-argument read tool.
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 no-argument, read-only tool with an output schema, nothing needed to invoke it correctly is missing: audience (visible to all tiers), argument behaviour, quota/reset semantics and degraded-subsystem signalling are all covered. Completeness is in fact beyond what the task requires.
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 takes zero arguments, so the baseline is 4, and the description reinforces this with 'takes no arguments' and 'visible to all tiers'. There is no parameter surface left to explain.
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?
Opens with a concrete noun phrase naming exactly what is returned: tier, capabilities, limits and live usage for the calling identity. It also disambiguates against siblings by naming describe_capabilities, list_workflow_types and start_workflow in the workflow-discovery section, so an agent can position this tool against neighbours without opening a 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?
Explicitly states when to reach for it: before calling tools or fan-out paths, and before issuing more requests to check remaining quota, with a motivating scenario (lower-tier agents avoiding wasted retries or upgrading mid-conversation). No explicit when-not-to-use or direct statement that describe_capabilities is the alternative for the catalog view, which keeps it 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.
get_progressGet ProgressARead-onlyInspect
See how far along a compliance workflow is and which steps remain. Use this when someone asks 'how much of the gap analysis is done', 'what percentage is complete', or 'how many steps are left'. Returns completed and remaining steps with a progress percentage and quality score.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe, read-only nature is known. The description adds value by specifying that the tool 'Returns completed and remaining steps with a progress percentage and quality score,' giving insight into the output structure and behavior beyond 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 concise and well-structured: purpose statement, usage examples, and output summary in three short sentences. There is no fluff or redundancy, and the most important information is front-loaded.
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 simple read-only tool with one parameter and an output schema, the description adequately covers purpose, when to use, and what to expect in return. It is complete enough for an agent to select and invoke the tool 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?
The schema description for workflow_id is complete (100% coverage), so the baseline is 3. The tool description does not add parameter-specific details, but the schema already provides sufficient meaning for the single 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?
The description clearly states the tool's function: 'See how far along a compliance workflow is and which steps remain.' It specifies the resource (compliance workflow) and the action (get progress), and distinguishes it from related tools like get_current_step by mentioning remaining steps and a progress percentage.
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 provides explicit usage scenarios: 'Use this when someone asks how much of the gap analysis is done, what percentage is complete, or how many steps are left.' This gives clear context for when to use the tool, though it does not explicitly name alternatives or when-not-to-use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_provisionGet ProvisionRead-onlyInspect
Look up the exact text of a specific legal provision or standards-catalog control. Three addressing forms: (1) jurisdiction + law + article — use this when someone asks 'show me Article 5 of GDPR', 'what does Section 12 of the Swedish Work Environment Act say', or 'read me the text of DORA Article 11'. A U.S. federal regulation is addressed by its CFR citation: get_provision(jurisdiction='US', law='45 CFR', article='164.410') (also '45 C.F.R.' + '§ 164.410', or law='45 CFR Part 46' + article='Part 46' for a part) reaches the one corpus that serves that CFR part; (2) canonical_ref — the exact ref a search row's citation.lookup hint advertises (e.g. get_provision(canonical_ref='loi-2018-07-30:art-64', jurisdiction='BE')): the gateway decomposes it and resolves the same way. Pass jurisdiction alongside canonical_ref when the ref does not embed one (relayed hints already include it). (3) law as a bare corpus/source id + article as the native control/entity id, NO jurisdiction — for non-jurisdictional standards catalogs (e.g. get_provision(law='nist-800-53', article='AC-5') for NIST SP 800-53, and the same shape for nist-csf-2, nist-800-82r3, nist-ai-rmf, nist-ssdf-800-218): a search row's citation.lookup hint for these corpora already advertises this exact shape — replay it verbatim. For a national statute you have not seen in a search row, search first and replay that row's citation.lookup; a law name resolves only where Ansvar has an alias for that name. Returns the full provision text with citation metadata. A member-state jurisdiction plus an EU framework article that has a verified national transposition returns the NATIONAL transposing provision, with meta.transposition naming the swap; pass jurisdiction='EU' for the framework text itself. Where no such mapping applies, the same field may instead carry a typed disclosure describing Ansvar's verified coverage for that pair. When a national transposition IS served, the CELEX and instrument name that response reports are themselves valid law input in that jurisdiction — replay either. When a law name matches several documents or does not resolve (near matches, reason_code=law_name_unresolved), each meta.ambiguous_candidates item is an executable get_provision retry: retry_args contains jurisdiction, law (the chassis doc_id), and the original article, or jurisdiction plus canonical_ref when the resolver supplied one; retry_kind identifies which addressing form it uses, and label carries the served document title (up to 120 characters, empty when unavailable). The text content is one JSON document. Its evidence_summary field carries the 'Sources used' markdown table (the audit receipt per returned row) or a labelled zero-result note. Result rows carry url/title/subtitle display fields alongside their citation when available. meta.render_contract carries the versioned evidence-curation contract. Search in the corpus's primary language (en), then fetch the hits in the user's language with the language argument of get_provision (a code, or a short list of codes for versions side by side). Search lookup hints may include source_id, the exact routed corpus that served the row. It is valid only with the hint's nonblank canonical_ref; law and article must remain empty. Replay the whole args object unchanged so a document present in multiple corpora cannot be substituted. Do not infer source_id from the legal document id.
| Name | Required | Description | Default |
|---|---|---|---|
| law | No | Either the instrument the provision belongs to — a framework id ('GDPR', 'DORA') or the corpus's own law identifier — or, for a non-jurisdictional standards catalog, the bare corpus source id ('nist-800-53', 'nist-csf-2'). | |
| article | No | Article or section number within the instrument ('5', '5(1)(a)'), or the native control id when law is a bare standards-catalog source id ('AC-5'). | |
| language | No | Edition language of the EU legislation text. One code, or a list of up to 3 codes to receive the versions side by side, each with its own citation and `language_served`. A language the requested instrument lacks falls back to English and says so in `language_fallback`. Omit for the English default. Served editions: en, nl, de, bg. | |
| source_id | No | Exact routed corpus id from a search row's citation.lookup hint. Valid only with that hint's nonblank canonical_ref; law and article must remain empty. When present, that corpus's exact hit or miss is authoritative: the gateway does not fall through to a sibling corpus. Replay the hint value; do not infer it from the legal document id. | |
| jurisdiction | No | ISO-2 code of the jurisdiction that owns the provision, such as EU, SE, or BE. Required for the jurisdiction+law+article form, and alongside a canonical_ref that does not embed one. Leave empty for the bare-source-id form (law='nist-800-53'). | |
| canonical_ref | No | The exact reference a search row's citation.lookup hint advertises, such as 'loi-2018-07-30:art-64'. Replay it verbatim instead of decomposing it yourself; the gateway resolves it the same way as jurisdiction+law+article. |
get_regulatory_intelligence_statusGet Regulatory Intelligence StatusARead-onlyInspect
Report what this service actually monitors and how current each source is: the enrolled sources, their publisher, channel kind and jurisdictions, when each last synced successfully, its freshness state (current / stale / critical / unfetched / baseline-only), how many records it holds, and when its baseline backfill ran. Also reports the state of the signed licensing verdict that governs which sources may be fetched at all.
Read this before concluding anything from an empty search: a source that is not enrolled, or whose state is critical, is not covered, and this tool says so plainly. enrolled means the current verdict clears the source AND its acquisition proof is verified.
Also reports the state of the curated obligations calendar behind get_regulatory_deadlines: obligations.dataset_state is ok (the newest signed dataset is what serves), degraded (a newer dataset exists that this service could not read, so the previous one is still serving — resolution_reason says why, anomalous_release names the release, degraded_since says when that was last confirmed), or unavailable (none ever loaded, so the deadlines tool refuses). It also reports how many curated rows and pending-instrument rows are held, when the curators last changed the dataset, and which signed generation this service consumed. That is the free surface for a premium tool — a caller whose deadlines request refused, or came back degraded, can find out here why, without a tier.
The lane_f block reports the fleet-derived event lane: publications detected on the official indexes the corpus fleet itself watches, consumed only when THREE gates pass — the signed licensing verdict clears the fleet source (with verified acquisition), a signed per-target eligibility decision exists at the detection's exact target configuration digest, and a current signed events artifact verified. It carries the events-artifact state, the inbox counts (pending / stored / invalid), and suppressed_duplicates — publications observed by both an enrolled registry source and a fleet target are served ONCE, by the registry lane, and every suppression is counted here rather than silently dropped.
The verdict block also carries disposition_summary: the disposition-class counts exactly as the consumed signed artifact delivered them, or null. Null is 'this service has no counts to report' and never 'the register is empty' — the consumed generation carried none, no verdict has been consumed yet, or this server is running ahead of the migration that stores them. Its keys are exactly enrolled_event_feed (fleet event-feed sources in the signed launch set), cleared_event_feed (how many of those the verdict clears) and register. register is one of exactly two shapes: the projection, whose keys are exactly generated_at, fleet_sha, total_rows, by_disposition (keys exactly event_feed, signal_only, blocked) and unclassified; or unavailable_reason alone, which says the register could not be read when the artifact was published. The register numbers project a separate artifact generated at its own time — read its generated_at and fleet_sha before comparing them with anything else here, and read unclassified before treating the classes as complete.
Example: "Using Ansvar, which regulatory sources are you monitoring and how fresh are they?"
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, non-destructive, closed-world behavior, so the bar is lower. The description adds substantial behavioral context beyond that: it explains that unenrolled or critical sources are not covered, that `null` disposition counts never mean the register is empty, that duplicates are suppressed and counted rather than silently dropped, and that the obligations dataset can be degraded or unavailable. This is rich, non-redundant 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?
The description is an approximately 450-word essay dense with nested key specifications, backticks, and repeated state explanations. It is front-loaded with purpose, but far from appropriately sized: many granular return-value details could be compressed or delegated to an output schema (which is absent). It reads like documentation rather than a tool description.
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 carries the full burden of explaining return values, and it does so exhaustively: source enrollment, freshness states, licensing verdict state, obligations dataset state, the `lane_f` fleet lane, and the `disposition_summary` block with its null semantics and exact key shapes. Nothing an agent needs to interpret the tool's output 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?
The tool takes zero parameters, so the baseline is 4. There are no parameters for the description to clarify, and it does not attempt to add meaning to a non-existent 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 opening sentence states a specific verb and resource: 'Report what this service actually monitors and how current each source is.' It distinguishes itself from siblings by naming `get_regulatory_deadlines` and positioning itself as 'the free surface for a premium tool.' An agent can tell what this tool does and how it differs from the deadlines tool without opening either.
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 explicit usage contexts: 'Read this before concluding anything from an empty search' and 'a caller whose deadlines request refused, or came back degraded, can find out here why.' It implicitly contrasts with `get_regulatory_deadlines`, but stops short of stating when not to use this tool, so it misses the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflow_threatsGet Workflow ThreatsARead-onlyInspect
Review the threats identified during a threat-modeling workflow. Use this when someone asks 'what threats were found', 'show me the risk assessment results', or 'list the identified vulnerabilities'. Returns threats with severity ratings and recommended mitigations from completed STRIDE analysis steps.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | Yes | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds context about the prerequisite ('completed STRIDE analysis steps') and mentions that returns include severity ratings and mitigations, which is useful beyond the annotations but not deeply behavioral (e.g., no auth, rate limits, or error-handling nuances).
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 three sentences with no redundant phrasing. Front-loaded with the main purpose, followed by example queries and a summary of return content. Every sentence 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?
For a simple read-only tool with one parameter and an output schema, the description covers purpose, usage triggers, return content, and a prerequisite (completed STRIDE steps). The schema handles parameter semantics, annotations handle safety, and the output schema presumably handles return structure. Nothing significant 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%, and the workflow_id parameter has a rich description in the schema itself ('as returned by start_workflow. Recover a lost id with list_workflows.'). The tool description adds no additional parameter meaning, so the baseline 3 for high schema coverage applies.
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 tool's function with a specific verb ('Review') and resource ('threats identified during a threat-modeling workflow'). It also provides example natural-language queries ('what threats were found'), which helps the agent map user intent to the tool. This differentiates it from sibling tools like start_workflow or get_progress by focusing on the threat output.
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 explicitly says 'Use this when someone asks ...' with concrete example phrases, giving clear context for when the tool is appropriate. It does not mention alternatives or exclusions, but the context is strong enough to distinguish it from siblings without needing an explicit alternative list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_coverageList CoverageARead-onlyInspect
Show which countries, frameworks, and legal domains are available. Use this BEFORE calling search when the user's topic doesn't name a jurisdiction (e.g., 'what does the law say about consumer protection'); then present the returned jurisdictions to the user or ask which applies. Examples:
• 'Which countries do you cover?' → list_coverage()
• 'Do you have German law?' → list_coverage(jurisdiction='DE')
• 'What jurisdictions for NIS2?' → list_coverage(domain='cybersecurity')
• 'Which countries have drone law?' → list_coverage(domain='aviation') (also accepts 'drone' / 'uas')
• 'Which countries have court decisions?' → list_coverage(content_kind='court-decisions')
Returns a jurisdictions array (each with code, name, region, laws, provisions, domains, content_kinds, counts_complete, and uncounted_sources) plus framework and source listings. An incomplete-count row also carries coverage_note explaining why. NOTE: laws/provisions are WHOLE-JURISDICTION corpus totals — the response's count_scope is whole_jurisdiction. Under a domain filter the jurisdiction list is narrowed to that domain but the counts are NOT domain-scoped; do not report them as a per-domain count. The domain-specific signal is the (domain-filtered) sources/frameworks. Search in the corpus's primary language (en), then fetch the hits in the user's language with the language argument of get_provision (a code, or a short list of codes for versions side by side).
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Legal domain to narrow the jurisdiction list to, such as 'cybersecurity' or 'aviation' ('drone' and 'uas' are accepted for the latter, 'telecom' for 'telecommunications-media'). The law and provision counts stay whole-jurisdiction; the domain-scoped signal is the returned sources and frameworks. | |
| region | No | Geographic region to narrow the jurisdiction list to, such as 'europe'. Empty returns every region. | |
| content_kind | No | Kind of legal text to narrow the jurisdiction and source lists to: 'statute', 'court-decisions', 'preparatory-works' or 'disciplinary-decisions'. Frameworks are not classified by kind. Not combinable with jurisdiction (the single-jurisdiction view lists its content_kinds). An unknown value is an error listing the valid values. | |
| jurisdiction | No | ISO-2 code to report on alone, such as DE. Empty returns every jurisdiction in scope. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnly/openWorld/destructive). The description adds non-obvious behavioral context: the response shape (`jurisdictions` array and its fields), that `count_scope` is `whole_jurisdiction`, that counts are NOT domain-scoped under a `domain` filter, and that incomplete rows carry a `coverage_note`. These caveats directly prevent an agent from misreporting counts.
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 instruction, then examples that each earn their place by mapping a real user phrasing to a call. The trailing sentence about searching in 'en' and fetching with get_provision's `language` argument drifts into sibling-tool workflow and is mild scope creep for a coverage-listing tool.
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 documented, yet the description still summarizes them and flags the count-scoping caveat. For a read-only discovery tool with 100% schema coverage, nothing an agent needs to call 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. The description earns extra credit by showing parameter values in worked examples (jurisdiction='DE', domain='cybersecurity', content_kind='court-decisions') and by restating the domain-vs-count scoping rule that governs how `domain` behaves.
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 opens with a concrete verb+resource: 'Show which countries, frameworks, and legal domains are available.' It immediately distinguishes itself from the sibling `search` by framing itself as a pre-search discovery step, so an agent can route between the two without inspecting 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?
Explicit when-to-use: 'Use this BEFORE calling `search` when the user's topic doesn't name a jurisdiction,' followed by the follow-up action ('present the returned jurisdictions to the user or ask which applies'). Five worked query-to-call examples remove any remaining ambiguity about invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workflowsList WorkflowsARead-onlyInspect
List your organisation's workflows (id, type, status, current step, last update). Filter with status='active', 'completed', or 'cancelled'. Results are paginated with limit (default 20, max 100) and offset; follow next_offset until null. Use it to recover a lost workflow_id or review past assessments.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum workflows per page (default 20, maximum 100). | |
| offset | No | Number of workflows to skip before this page. Follow the response's next_offset until it is null. | |
| status | No | Restrict the listing to 'active', 'completed', or 'cancelled'. Empty returns every status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds behavioral context about pagination: 'Results are paginated with limit (default 20, max 100) and offset; follow next_offset until null.' It also lists the returned fields, which is useful beyond annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the purpose. It uses four short sentences, each adding value: purpose, filters, pagination, and use cases. No redundant or filler content. Well-structured and easy to parse.
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 the read-only nature, the presence of an output schema, and comprehensive annotations, the description covers all essential aspects: purpose, parameters, pagination behavior, and use cases. It is complete for a straightforward list operation, with no significant gaps in context.
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 largely restates what the schema already provides (e.g., status values, limit default and max, offset semantics). It does not add significant new meaning beyond the schema, 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 tool's function: 'List your organisation's workflows' with specific fields (id, type, status, current step, last update). This distinguishes it from siblings like list_workflow_types (which lists types) and get_current_step (which retrieves a specific step). The verb 'List' plus resource 'workflows' is unambiguous.
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 provides clear guidance on when to use the tool: 'Use it to recover a lost workflow_id or review past assessments.' This gives concrete use cases. However, it does not explicitly exclude alternatives or mention when not to use it, retaining a clear context but no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workflow_typesList Workflow TypesARead-onlyInspect
Find the authoritative live structured-workflow registry. Call this before start_workflow instead of guessing an id from examples or a static catalog. It covers every deployed workflow family, including risk/TARA, DPIA/FRIA, regulatory and medical-device gap analysis, procurement, document review, drone/OT workflows, and vulnerability decisions. Each entry carries workflow_type, base_type, display_name, description, produces (the final deliverable), required_slots, overridable_configurable, legal-review state, plus gateway-added minimum_tier and available_to_caller fields. Every tier sees the full directory; which rows are marked available depends on the caller — free and solo the seven included rows (threat_model, gap_analysis with its NIS2, DORA, CRA and AI Act variants, dpia), Premium the interview-grounded rows (adding LINDDUN, TARA, FRIA, the jurisdictional DPIA and gap variants, SORA, drone/OT, machinery conformity, enterprise risk), Team and Company every live row. A row locked by TIER carries tier_caveat: which tier runs it, what that tier adds, and the upgrade URL — so a tier-locked row is never a bare false. Discovery service failures and malformed responses fail explicitly; no static list is returned as if it were live.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial behavioral context beyond that: the tool is 'live' and authoritative, failures 'fail explicitly,' and no static list is returned as if live. It also details tier-locking behavior with caveats, such as 'a tier-locked row is never a bare false,' which is not inferable 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?
The description is a single dense paragraph but is front-loaded with the core purpose. Each sentence provides meaningful information: purpose, usage, output fields, tier behavior, and failure handling. It is longer than minimal but every sentence earns its place; no wasted words. The structure is logical and readable.
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 it has zero parameters and an output schema, the description is exceptionally complete. It explains the tool's role, when to invoke it, what fields each entry carries, how tier availability affects results, and how errors are handled. There are no significant gaps in understanding the tool's behavior and context.
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 the schema covers 100% with nothing to explain. Per the baseline for 0-param tools, this earns a 4. The description adds value by describing the output fields (workflow_type, base_type, produces, required_slots, etc.), which is useful even though an output schema exists.
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 it provides 'the authoritative live structured-workflow registry,' with specific verb and resource. It distinguishes itself from start_workflow by saying to call it 'before start_workflow instead of guessing an id,' and from static catalogs by emphasizing 'live.' It also enumerates covered workflow families, fully clarifying the tool's scope.
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 tells the agent when to use this tool: 'Call this before start_workflow instead of guessing an id from examples or a static catalog.' It also explains tier-dependent availability, which is crucial for deciding whether a workflow can be started. It does not describe exclusions for other sibling tools, but the direct call-to-action and context are strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_subagentsRecommend SubagentsARead-onlyInspect
Plan the parallel sub-analyses for a threat-modeling phase. Given the current phase of a threat_model workflow (its id comes from get_current_step) and your workflow context, returns the recommended breakdown: which analysis prompts to run, with what arguments, which can run in parallel, and an inline fallback for MCP clients that cannot invoke prompts. phase_id is one of: phase_0b_scope_check, phase_1_scope_and_dfd, phase_2_stride_enumeration, phase_2b_domain_challenge, phase_3_scoring, phase_3b_threat_enrichment, phase_5_mitigation, gap_assess_controls. Optional — the workflow works without it; use it to speed up large systems by fanning phases out to subagents.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes | The workflow context to plan against — the system description, scope, and material accumulated so far. Richer context produces a more specific breakdown. | |
| phase_id | Yes | The threat_model phase to plan, from get_current_step. One of: phase_0b_scope_check, phase_1_scope_and_dfd, phase_2_stride_enumeration, phase_2b_domain_challenge, phase_3_scoring, phase_3b_threat_enrichment, phase_5_mitigation, gap_assess_controls. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, the description reveals what the tool returns: 'which analysis prompts to run, with what arguments, which can run in parallel, and an inline fallback for MCP clients that cannot invoke prompts.' This adds concrete behavioral context and confirms it is a planning-only operation.
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 three compact sentences, front-loaded with the primary purpose, followed by the return shape and usage context. No wasted words; every sentence 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?
With an output schema present, the description need not detail return fields, but it summarizes them anyway. It covers the phase enum, the source of the ID, the optionality, and the fallback behavior, making it complete for an AI agent to select and invoke 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 coverage is 100%, so the baseline is 3. The description adds value by linking phase_id to 'get_current_step' and noting that 'Richer context produces a more specific breakdown,' which goes beyond the bare schema definitions.
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 opens with a specific verb+resource: 'Plan the parallel sub-analyses for a threat-modeling phase.' It clearly distinguishes this tool from siblings by focusing on workflow phase planning and returning a breakdown, rather than executing or mutating workflow state.
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 explicitly says when to use: 'Optional — the workflow works without it; use it to speed up large systems by fanning phases out to subagents.' It also tells the agent where the phase_id comes from (get_current_step), which is a clear contextual trigger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_workflowResume WorkflowAInspect
Continue a compliance workflow that was paused or interrupted. Use this when someone says 'let's continue the gap analysis', 'pick up where we left off on the threat model', or 'resume my DPIA'. Requires the workflow_id from the original start_workflow call.
| Name | Required | Description | Default |
|---|---|---|---|
| workflow_id | No | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description adds the context that this resumes a paused workflow. It does not disclose specific side effects or state changes, but with annotations the bar is lower. The description adds moderate value beyond the structured fields.
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, front-loaded with the purpose, then usage examples, then the prerequisite. Every element earns its place with no redundancy or fluff.
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?
The tool is simple (one parameter, no required fields, output schema present). The description combined with the schema fully covers what the agent needs: what it does, when to use it, and how to obtain the workflow_id. No gaps remain.
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% and the schema description for workflow_id already explains it comes from start_workflow and can be recovered via list_workflows. The description repeats the requirement without adding new parameter nuances, so it earns the baseline for high 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 clearly states the tool continues a paused or interrupted compliance workflow, using a specific verb ('Continue') and resource ('compliance workflow'). It also distinguishes from siblings by giving concrete example utterances and referencing start_workflow as the origin of the required ID.
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?
Provides explicit usage scenarios with example phrases and a clear prerequisite (workflow_id from start_workflow). It does not explicitly mention when not to use or name alternative tools, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scope_workflowScope WorkflowARead-onlyInspect
Scope a compliance workflow down to ONE concrete workflow id before spending a run. This answers what the catalog cannot: which of the registry's ids fits THIS user's system, jurisdiction and framework. Call it with whatever you already know — every argument is optional — and it returns either the next scoping question with its allowed options (put that question to the user, then call again with their answer) or the single workflow_type to start, why that one, whether this caller may run it, and what a higher tier adds. Unmetered and visible at every tier: scoping never spends a run, and the recommendation is the same id whatever the caller pays, so a free caller sees what the product does before buying it. Deterministic — questions, options and the recommendation are projections of the workflow registry, never a guess. Every answer carries the registry snapshot it was computed from (fetched_at, age_seconds): the snapshot refreshes on an interval, so re-scope rather than replay an id across a registry change, and treat list_workflow_types as the authority when the two disagree. Typical opening: the user says 'Using Ansvar, we need a NIS2 gap analysis for our Dutch plant' — call scope_workflow(objective='gap_analysis', framework='nis2', jurisdictions=['NL']), then pass the id it returns to start_workflow. When the user asks which laws or regulations apply to their product, service or entity ('Using Ansvar, which laws apply to our EV charger in Sweden?'), the objective is 'regulatory_applicability_register'. Ambiguity comes back as the next question, never as a list of maybes, and every question's options are the complete set this tool accepts — for a framework it does not list, call list_workflow_types and start_workflow directly. A missing or stale registry snapshot fails explicitly; no static catalog is served as if it were live.
| Name | Required | Description | Default |
|---|---|---|---|
| framework | No | Control-set key the assessment is against, such as 'nis2', 'dora', 'cra' or 'eu_ai_act'. Pass 'none' when the user is not assessing against a framework. Take the value from the framework question's options rather than guessing a spelling — the key and the id suffix differ (gap_analysis_ai_act binds eu_ai_act). | |
| objective | No | What the user needs produced, as a workflow family value from a previous scope_workflow question's options — for example 'gap_analysis', 'threat_model', 'dpia', 'risk_assessment', or 'regulatory_applicability_register' for which laws apply to a product, service or entity. Leave empty on the first call and this tool asks for it. | |
| system_kind | No | Which kind of system is under assessment, as the exact value from a system_kind question's options — that question is how an IT product, an OT plant and a drone operation are told apart when framework and jurisdiction cannot separate them. | |
| jurisdictions | No | ISO-2 codes the assessment covers, such as ['NL'] or ['SE', 'EU']. Workflows with no jurisdictional variant stay eligible — they are the generic form. Pass ['unscoped'] to ask for that generic form on purpose. | |
| documents_available | No | Whether the user has documents (policies, SoA, supplier contracts) to ground the assessment in. Recorded and reported back; it does not change which workflow is recommended, because the registry publishes no per-workflow document requirement to decide it on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint/destructiveHint=false/openWorldHint=false), the description discloses unmetered cost, tier-invariant recommendations, determinism as a projection of the registry, snapshot provenance fields (fetched_at, age_seconds), instruction to re-scope rather than replay across a registry change, and explicit failure on a missing or stale snapshot with no static catalog substitution. This is unusually rich behavioral context for a read-only tool.
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 sibling routing before the detail, and structured as what/why/how/guarantees. It is long (~300 words) with some near-redundancy between 'Unmetered and visible at every tier: scoping never spends a run' and 'the recommendation is the same id whatever the caller pays', which costs it a point.
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?
Even though an output schema exists (so return values need not be explained), the description still names the return shape (next question with options, or the single workflow_type plus rationale and tier note), covers failure modes and staleness, and closes the ambiguity question ('ambiguity comes back as the next question, never as a list of maybes'). Nothing an agent needs to call 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 baseline is 3, but the description adds genuinely new meaning: the iterative call pattern ('call it with whatever you already know — every argument is optional', empty objective on first call triggers a question), and semantics for documents_available ('does not change which workflow is recommended'). It also maps natural language to the objective value ('which laws apply ... EV charger in Sweden' -> 'regulatory_applicability_register').
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 verb and resource with scope: 'Scope a compliance workflow down to ONE concrete workflow id before spending a run', and immediately positions it against siblings ('this answers what the catalog cannot', 'treat list_workflow_types as the authority when the two disagree', 'pass the id it returns to start_workflow'). An agent can distinguish it from list_workflow_types and start_workflow without opening a 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?
Explicit when-to-use with worked examples ('the user says Using Ansvar, we need a NIS2 gap analysis for our Dutch plant'), an explicit when-not plus the alternative to take ('for a framework it does not list, call list_workflow_types and start_workflow directly'), and the iterative protocol ('put that question to the user, then call again with their answer'). Nothing about routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchRead-onlyInspect
Search requires at least one jurisdiction, framework, sector, or source; it does not auto-detect scope from the query. Use for 'what does the law say about X in country Y' or 'which regulations cover Z'. QUERY SHAPE: queries are keyword-matched (FTS5, implicit AND — every term must occur in the SAME provision). Pass one or two canonical concept terms per call; never a multi-concept compound. A compound such as 'incident reporting deadline personal data breach' returns 0 even when each concept on its own returns hits — so ask one concept per call and combine the answers yourself. Two terms describing ONE concept ('personal data') are fine; 2-3 alternative terms can be joined with a bare uppercase OR (e.g. 'spoofing OR tampering' matches either term). OR is for synonyms of ONE concept, not for related concepts — 'dismissal OR termination' yes, 'encryption OR breach notification' no (ask those one per call). Other FTS operators (AND, NOT, NEAR) are stripped. STRICT MISS: when a search completes cleanly and no result matched your terms strictly, the response carries meta.outcome = 'NO_STRICT_MATCH'. The recovery fields — meta.recommended_action, meta.recommended_scopes, meta.broadening_available — are set on any qualifying strict miss, INCLUDING a partial fan-out where outcome stays null, so read them whenever present, not only under an outcome. On a partial fan-out meta.broadening_available stays null when the missing leg makes it unknowable — null there means unknown, never 'no'. On recommended_action = 'RETRY_ONE_CONCEPT_PER_CALL', re-issue the search with ONE concept per call. This action is reserved for an implicit-AND multi-concept compound; an honored uppercase-OR query remains a canonical one-concept shape and does not gain the split action or candidates. Only together with this action, meta.recommended_queries may list 1-3 optional one-concept fallback queries derived from your own terms, each already checked in your scope to return a strict match (verified_hits; rows not merged); issue only the ones you judge relevant, one per call. The field is absent for every other action or no action, including an honored uppercase-OR miss. On a miss without safe candidates, meta.recovery_guidance explains how to choose a focused phrase while retaining domain and negation; its source_languages are source metadata, not your query's detected language. On 'REFORMULATE_OR_USE_EXACT_REFERENCE', retry the same concept using the instrument's wording or use an exact lookup hint. Short queries can miss too; do not infer that the law is absent. On recommended_action = 'OFFER_BROADENING_TO_USER' — and wherever meta.broadening_available is true — relaxed matches exist and are withheld: tell the user, offer a re-run with allow_broadening=true (served rows are stamped match_mode='broadened' and pass the same relevance floor), and re-run only if the user accepts — never broaden on your own. An honored uppercase-OR strict miss with withheld relaxed matches carries this offer action with meta.recommended_queries absent. meta.recommended_scopes names scope ids that were not searched. If 0 results, tell the user; do not answer from training data. SCOPE: discover ids with list_coverage or describe_capabilities(section='sources'). An unresolved scope refuses before dispatch with isError=true and structuredContent.error='unresolved_scope'. Read corrections for the offending parameter and optional registered values. Choose the intended scope; suggestions do not establish legal equivalence. Change only the offending value and retain other arguments. frameworks= selects sources declaring coverage. Non-owner rows require the requested framework identity to serve as strict matches; otherwise they are withheld with a count, or served as broadened matches when allow_broadening=true. Framework scope does not map controls to transposition articles. For cross-framework control mapping, frameworks=['ISO_27001','SOC_2'] includes Security Controls MCP. sectors= reaches industry MCPs across jurisdictions; combining jurisdictions= and sectors= is an INTERSECTION and an empty intersection errors with the jurisdictions that carry that sector. Use sources=['data-use-license'] for software licences, SPDX, dataset licences, and vendor TOS. LANGUAGE: use the corpus language (SE: konsumentskydd; DE: Datenschutz; FR: protection des consommateurs). Keep CJK compounds unspaced (個人情報保護, not 個人情報 保護); spaced tokens are ANDed. Examples: search(query='konsumentskydd', jurisdictions=['SE']); search(query='vehicle cybersecurity', sectors=['automotive']); search(query='huurovereenkomst', jurisdictions=['NL'], court='GHAMS', date_from='2023-01-01') filters case-law rows (premium+); read exact court values from unfiltered results first. TIER LIMITS: free permits at most one value per jurisdiction, framework, or source axis; no sectors= or premium fan-out, with 100 searches/day and 3 concurrent calls. Daily search budgets: solo 750/seat; premium 5,000/seat; team 50,000 and company 500,000 pooled per organisation. Solo lifts scope limits; premium+ adds server-side fan-out to agency guidance, case law, and preparatory works alongside primary legislation. There is no separate search_case_law or search_preparatory_works tool; search_guidance can search guidance alone. Call get_my_capabilities for your budget and remaining quota. RANKING: requested rows precede injected companion rows; explicit sources and sectors remain requested. Where primary-law window fill is enabled, the quota-protected primary-lane prefix precedes premium companion rows while retaining fused order. A jurisdiction-only search may retain up to half the window (rounded up) for primary-law rows that matched the caller's own terms — strict first, then the exact term-bridge tail, never a broadened one — before filling remaining slots from the fused ranking; explicit source, framework, and sector scope membership is unchanged. The text content is one JSON document. Its evidence_summary field carries the 'Sources used' markdown table (the audit receipt per returned row) or a labelled zero-result note. Result rows carry url/title/subtitle display fields alongside their citation when available. meta.render_contract carries the versioned evidence-curation contract. Search in the corpus's primary language (en), then fetch the hits in the user's language with the language argument of get_provision (a code, or a short list of codes for versions side by side).
| Name | Required | Description | Default |
|---|---|---|---|
| court | No | Exact-match filter on the issuing court of case-law rows: the corpus's own `court` value exactly as its case-law rows carry it (Dutch courts are codes such as HR, RVS, CRVB, CBB, GHAMS, RBDHA; other corpora may carry a court name). Read the value from the `court` field of case-law rows returned without the filter before filtering. Applies to case-law evidence only, which premium+ fan-out adds inside `search`; primary-law provisions have no court and are unaffected. A value that matches no case-law row is disclosed in meta.message, never served as a silent empty. Refused on tiers without case-law fan-out. | |
| limit | No | Maximum result rows in the response (default 10) — rows from all resolved sources are relevance-fused, deduplicated, and trimmed to this count. Values above 50 are clamped to 50, not rejected; narrow the scope or refine the query instead of raising the limit. | |
| query | Yes | Search terms, matched with FTS5 implicit AND against each resolved corpus. Pass one or two canonical concept terms in the corpus language (SE: konsumentskydd, DE: Datenschutz), never a multi-concept compound. A bare uppercase OR between 2-3 terms is honoured as a disjunction (either term matches); other uppercase FTS operators (AND, NOT, NEAR) are stripped, not honoured. At most 500 characters: a longer query (a pasted case description, say) is refused before any source is searched, with isError=true and structuredContent error='validation_error', code='query_too_long'. Split the matter into separate issue queries of 2-5 legal terms, one call per issue, and merge the results. | |
| date_to | No | Inclusive upper bound as a full ISO date YYYY-MM-DD on the decision date of case-law rows and the issue date of preparatory-work and agency-guidance rows; must not precede date_from. Premium+ evidence only; primary-law provisions are unaffected. | |
| sectors | No | Industry-sector scope ids such as automotive or insurance; maximum 5. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| sources | No | Exact corpus source ids such as eu-regulations or ietf-rfcs, read from describe_capabilities(section='sources') — never a hash, UUID, or document reference; a country code such as LI or DE belongs in jurisdictions=, not here. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| date_from | No | Inclusive lower bound as a full ISO date YYYY-MM-DD (a bare year such as 2023 is refused — pass 2023-01-01) on the decision date of case-law rows and the issue date of preparatory-work and agency-guidance rows. Premium+ evidence only; primary-law provisions carry no date and are unaffected. | |
| frameworks | No | Registered framework scope ids such as GDPR or NIS2 — never a jurisdiction code (LI, DE, EU go in jurisdictions=). Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| legal_areas | No | Publisher area-of-law ids, for the corpora that carry them; maximum 10. Ids are the publisher's own, case-sensitive (Rechtspraak: civielRecht, civielRecht_verbintenissenrecht; wetten.overheid.nl carries its own rechtsgebied ids), and a parent id also matches its sub-areas. Statute and regulation rows carry the area of the WHOLE act, so a hit is an article of an act classified in that area; court decisions carry the court's own area for each decision. The filter reaches legislation and case-law rows only — agency-guidance and preparatory-works rows are never area-filtered. A corpus that carries no area metadata serves its rows unfiltered; when at least one source applied the filter, unfiltered rows rank behind the filtered ones and fill at most two thirds of the window, so a filtered search can return fewer rows than limit (the count held out is in meta.search_scope.legal_areas_unfiltered_dropped). Every source that served unfiltered rows is named under meta.search_scope.legal_areas_not_applied with a reason (corpus_unclassified, no_envelope, not_forwarded), the sources that applied it under legal_areas_applied, and any id a corpus does not know under legal_areas_unknown_ids; a zero-row answer for a known id is a real answer. A source that knows NONE of the requested ids returns no rows under the filter: meta.message names it, and an empty answer carries recommended_action = 'CHECK_LEGAL_AREA_IDS' (drop legal_areas or add an id from that source's scheme). Legal order stays on jurisdictions=: legal_areas=['civielRecht'] with jurisdictions=['NL','EU'] filters the Dutch case-law rows and keeps the EU rows, flagged unfiltered. No tier gate. | |
| workflow_id | No | Id of the caller's own active included workflow run (Free and Solo), when this search is part of that run. Searches that name the run draw from its own allowance of 300 searches instead of the daily search budget, so a run is not cut off by the daily limit. At the run allowance the search is refused with cap='run_search_allowance'; it does not spill onto the daily budget. An id the gateway cannot verify as an active run you started (unknown, ended, or another account's) is not an error: the daily budget applies. Ignored on Premium, Team and Company, whose daily budgets a run does not reach. Does not change what is searched. | |
| document_refs | No | Exact edition keys from document discovery; 1–5 unique elx- keys with 24 lowercase hex digits. Accepted only with one sources entry advertising exact_document_filter and no jurisdictions, frameworks or sectors. Keys are OR-combined within that source. | |
| jurisdictions | No | ISO-2 jurisdiction scope codes such as SE or EU; maximum 10. A country code such as LI or DE belongs here and on no other axis. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| allow_broadening | No | Controlled-vocabulary term_bridge rows serve at the default, stamped match_mode='bridged'; meta.query_broadened_sources discloses requested_query, served_query and mode. Default false: a source that finds no strict match for the query is withheld instead of serving relaxed (OR-broadened) matches as if they were ordinary hits; the response names the withheld sources and count. Pass true to include those rows — each is stamped match_mode='broadened' — only after the user has accepted a broaden offer or asked for relaxed matches; never broaden unprompted. Relaxed rows pass the same on-topic relevance floor as strict rows, so an accepted re-run can still withhold them — disclosed in the response, never silently served. |
search_by_productSearch By ProductARead-onlyInspect
Find CVEs affecting a specific product and version. Useful for vulnerability assessment of software components.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results | |
| vendor | No | Vendor name filter (e.g., 'apache', 'microsoft') | |
| version | No | Specific version to check (e.g., '2.4.49') | |
| product_name | Yes | Product name to search (e.g., 'apache', 'nginx') | |
| version_operator | No | Version comparison operator |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds no additional behavioral context such as pagination, rate limits, or result format, so it only minimally adds to what annotations provide.
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 only two sentences, with no unnecessary words. Both sentences contribute to understanding the tool's purpose and typical use, making it highly concise and well-structured.
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 the tool's moderate complexity (5 parameters, all documented) and strong annotations (read-only), the description is adequate. It conveys the core purpose and use case, while the schema covers parameter details. The lack of an output schema is offset by the clear implication that the tool returns CVE data.
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 parameters are well-documented in the schema. The description only mentions product and version conceptually, which doesn't add new meaning beyond 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 clearly states the tool finds CVEs for a specific product and version, which is a specific verb+resource. It distinguishes itself from generic search tools by emphasizing specificity, but doesn't explicitly differentiate from sibling tools like search_cve.
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 a clear context for use: vulnerability assessment of software components. It implies the tool is for targeted CVE lookups but does not provide exclusions or mention alternative tools, so it doesn't fully meet the 5-criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cveSearch CveARead-onlyInspect
Search CVEs by keyword, severity, score range, and filters. Returns matching CVE records with CVSS scores, KEV status, and EPSS data. Use get_cve_details for full information on a specific CVE. Supports full-text search on descriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return | |
| offset | No | Pagination offset | |
| cwe_ids | No | Filter by CWE IDs (e.g., ['CWE-79', 'CWE-89']) | |
| has_kev | No | Only CVEs in CISA KEV catalog | |
| keyword | No | Full-text search in CVE description | |
| cvss_max | No | Maximum CVSS v3 score (0-10) | |
| cvss_min | No | Minimum CVSS v3 score (0-10) | |
| epss_min | No | Minimum EPSS score (0-1) | |
| severity | No | Severity levels to include | |
| has_exploit | No | Only CVEs with public exploits | |
| published_after | No | Published after date (YYYY-MM-DD) | |
| published_before | No | Published before date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context by stating the return payload includes CVSS scores, KEV status, and EPSS data, and that full-text search on descriptions is supported. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and about 40 words. It is front-loaded with the primary action, followed by return data and an alternative tool reference. Every sentence earns its place without redundancy or filler.
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?
Even though there is no output schema, the description specifies the key return fields (CVSS, KEV, EPSS) and points to get_cve_details for deeper information. It does not mention pagination limits or result ordering, but the schema covers the limit/offset parameters. For a complex 12-parameter search tool, the description provides sufficient context without needing to enumerate every aspect.
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%, with each parameter already documented concisely. The description's reference to 'keyword, severity, score range, and filters' is a high-level summary that doesn't add meaning beyond the schema. The note about full-text search on descriptions duplicates the keyword parameter's schema description.
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 tool's purpose: 'Search CVEs by keyword, severity, score range, and filters.' It specifies the resource (CVEs) and the action (search), and distinguishes itself from get_cve_details by directing users there for full details on a specific CVE. The verb+resource+scope is specific and actionable.
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 explicitly names get_cve_details as an alternative for full information on a specific CVE, which provides a clear when-not-to-use signal. However, it does not contrast with other search-related siblings like search_by_product or batch_search, leaving some ambiguity about when to use this tool over those.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ics_advisoriesSearch Ics AdvisoriesARead-onlyInspect
Search CISA ICS/OT security advisories (ICSA / ICSMA / ICSV) by keyword, vendor, advisory family, minimum CVSS, or publication date. Returns CISA OT advisories with affected vendors, CVE counts and severity. Use get_ics_advisory for full details. Public-domain CISA CSAF data.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| vendor | No | Affected vendor (e.g. 'Siemens', 'Schneider') | |
| keyword | No | Match advisory title or summary | |
| min_cvss | No | Minimum max-CVSS base score | |
| advisory_kind | No | Advisory family: ICSA (general ICS), ICSMA (medical), ICSV (vendor) | |
| published_after | No | Released after date (YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by stating the returned summary fields (affected vendors, CVE counts, severity) and the data source (public-domain CISA CSAF), which are not visible in 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?
Three short sentences front-load the core action, then cover return contents, sibling routing, and data source with no filler. Every sentence contributes useful information, and the structure is easy to scan.
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 read-only search tool with six optional parameters and no output schema, the description covers the filter options, result summary, full-detail fallback, and data licensing context. It could mention pagination or ordering behavior, but the provided information is sufficient for correct invocation in most 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 83%, so the schema already documents vendor, keyword, min_cvss, advisory_kind, and published_after. The description mostly restates these filter dimensions without adding new syntax or format details, which is acceptable given the high schema coverage but does not go beyond it.
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 ('Search'), a precise resource ('CISA ICS/OT security advisories'), and enumerates the advisory families (ICSA / ICSMA / ICSV) plus filter dimensions. This clearly distinguishes the tool from generic siblings like search or search_cve by tying it to CISA OT advisory data.
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 explicitly routes agents to get_ics_advisory for full details, establishing that this tool returns search summaries rather than complete records. It does not explicitly state when not to use siblings like search_cve or search_by_product, but the advisory-specific scope provides enough situational context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_workflowStart WorkflowAInspect
Begin a structured workflow selected from the live workflow registry. The registry covers threat and privacy modeling; enterprise, automotive, robot, rail, OT and UAS risk/TARA; DPIA and FRIA; regulatory, medical-device, drone and machinery gap analysis; tender review and audit; document review; SORA authorisation; vulnerability prioritisation; and deferral dossiers. Call list_workflow_types first: it is the authoritative source of exact ids, deliverables, required slots, variants, and availability for this caller. When a fresh registry snapshot is available, this tool's workflow_type input schema carries a caller-authorized enum; otherwise it remains a string rather than silently falling back to a stale catalog. The workflow engine guides the process step by step with quality gates. Each step's questions_for_user is advisory — answerable from context or uploaded documents; only steps returning requires_user_input=true carry the server-enforced human-input gate. Which types you can start is tier-fenced: free and solo include seven types (1 and 2 runs a month) — threat_model, gap_analysis with its gap_analysis_nis2, gap_analysis_dora, gap_analysis_cra and gap_analysis_ai_act variants, and dpia, each reported as JSON or as a watermarked html or pdf — at those tiers the framework argument accepts only nis2, dora, cra or eu_ai_act, and the base gap_analysis needs one of them; Premium adds the rest of the interview-grounded catalog — LINDDUN, the TARA families, FRIA and the jurisdictional DPIA and gap variants, SORA, the drone and OT types, machinery conformity, and enterprise risk — with 5 runs a month; document review, the tender family and adversary tabletop and the DORA ICT-contract and register-of-information variants require Team or Company. MiCA CASP and AMLR readiness are Premium workflows. A start SPENDS a run from the monthly allowance, and on free and solo a cancel does not hand an unused one back — name the workflow_type you intend to the user and get their OK before calling this, and check get_my_capabilities for what is left.
| Name | Required | Description | Default |
|---|---|---|---|
| framework | No | Regulatory framework the run is scoped to, such as 'nis2', 'dora', 'cra', or 'eu_ai_act'. Free and solo accept only those four, and the base gap_analysis type requires one of them. Empty leaves the workflow's own default in place. | |
| jurisdictions | No | ISO-2 codes of the jurisdictions the assessment covers, such as ['SE', 'EU']. Empty leaves the workflow to ask for scope in a later step. | |
| parent_run_id | No | supplier_assurance_review only: the workflow_id of a completed run of the same type in your organisation that this run follows, for example after new evidence arrives once a decision is recorded. The parent run and its report are never changed. Empty starts an ordinary run. | |
| workflow_type | Yes | Exact workflow type id from list_workflow_types, such as 'threat_model' or 'gap_analysis_nis2'. When a fresh registry snapshot is available this argument carries an enum of the ids this caller may start; otherwise call list_workflow_types rather than guessing an id from an example. Starting a workflow spends a run from the monthly allowance. | |
| succession_reason | No | Required with parent_run_id: why this run follows its parent, for example 'new SOC 2 report after the decision'. | |
| entity_description | No | Plain-language description of the organisation or system being assessed, used to ground the workflow's first steps — for example 'a Swedish payments SaaS processing card data for EU merchants'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and non-destructive; the description adds substantial context beyond that — run allowance spend semantics, no-refund on cancel at free/solo, the quality-gate behavior, the requires_user_input gate distinction, and enum fallback behavior when the registry snapshot is stale.
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?
Exceptionally long single paragraph with no formatting, repeating tier details ("free and solo", "Premium", "Team or Company") multiple times. Much of the run-allowance and no-refund content belongs to sibling tools (get_my_capabilities, cancel_workflow) rather than this one. Front-loaded purpose is good but the body is dense and overwrought.
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 there's an output schema and rich sibling ecosystem, most return-format concerns are covered elsewhere. The description covers tier restrictions, prerequisites, gating semantics, and cost — enough for an agent to call correctly, though redundancy with sibling tools dilutes the value.
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 each parameter already has its own description carrying framework-validity, jurisdiction ISO-2, parent_run_id/succession_reason pairing, and enum source. The tool description adds the tier-fencing angle (framework accepts only nis2/dora/cra/eu_ai_act at free/solo) but otherwise restates schema content. Baseline 3 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?
States a specific verb (Begin) and resource (structured workflow selected from live registry) and enumerates the catalog domains. Passively differentiates from siblings via enum examples matching list_workflow_types' authoritative-ids role.
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 names the prerequisite (call list_workflow_types first), names get_my_capabilities for remaining runs, names cancel_workflow's non-refund behavior on free/solo, and instructs the agent to confirm workflow_type with the user before calling. Tier-fencing tells the agent which types are/aren't available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_responseSubmit ResponseAInspect
Provide an answer to the current step in a compliance workflow. Use this when someone provides information requested by the workflow, such as 'our system processes health data' or 'we use AES-256 encryption'. The workflow engine validates the response and advances to the next step. Pass user_acknowledged=true only after the user has supplied the fields listed in user_provided_fields. evidence_references accepts document UUIDs, doc:// segment URIs, or regulatory URLs. For an unattended gate, pass approved_by='auto' and leave user_acknowledged=false so the report does not misrepresent automation as human review. approved_by accepts only 'auto'; human review is asserted via user_acknowledged, never by naming an approver.
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | Yes | Id of the step being answered, as reported by get_current_step. | |
| responses | Yes | The step's answers, keyed by the field names the step asked for. Values follow the expected input format get_current_step returned for that step. | |
| approved_by | No | Accepts only 'auto', which marks the gate as passed unattended. Human review is asserted through user_acknowledged, never by naming an approver here. | |
| workflow_id | Yes | Id of the workflow run, as returned by start_workflow. Recover a lost id with list_workflows. | |
| fetched_data | No | Supporting material the agent gathered for this step — search results, provision text, document excerpts — passed through to the workflow engine alongside the answers. | |
| evidence_tier | No | The evidence grade backing this answer, when the step asks for one. Omit unless the step's contract names it. | |
| compliance_level | No | The compliance level asserted for this step, when the step asks for one. Omit unless the step's contract names it. | |
| user_acknowledged | No | Set true only after the human has supplied the fields listed in the step's user_provided_fields. This is the assertion of human review; leave false for an unattended gate so the report does not present automation as human review. | |
| evidence_references | No | References backing the answer: document UUIDs, doc:// segment URIs, or regulatory URLs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explains that 'The workflow engine validates the response and advances to the next step,' revealing the tool's side effects beyond the annotations. It also highlights the guardrail against misrepresenting automation as human review by asserting approved_by only accepts 'auto', which is valuable behavioral context not present in 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 detailed but every sentence earns its place: it opens with the purpose, followed by usage triggers, then key parameter behaviors, and closes with the auto-approval caveat. It is appropriately sized for a tool with 9 parameters and complex gating semantics, with no filler.
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 the complex input schema, the description covers the critical context: what the workflow does, when to use it, how to handle evidence references, and how to correctly assert human vs. automated approval. With an output schema present, it doesn't need to explain return values, so the description is complete for an agent to select and invoke the tool 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 coverage is 100%, so the baseline is 3. The description adds meaningful semantic nuance by providing real-world examples of responses, clarifying evidence_references accepted formats, and reinforcing the distinction between approved_by='auto' and user_acknowledged for human review, which goes beyond the schema parameter descriptions.
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 uses a specific verb+resource construction: 'Provide an answer to the current step in a compliance workflow.' This clearly distinguishes the tool from siblings like start_workflow, cancel_workflow, and get_current_step by focusing on submitting a response for the current 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 description explicitly states 'Use this when someone provides information requested by the workflow' and gives concrete examples. It also covers conditional usage for unattended gates, clearly specifying when to set approved_by='auto' and user_acknowledged=false, which orients the agent on when to use this variant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_citationValidate CitationRead-onlyInspect
Verify a legal citation against the served corpus: confirms the cited provision exists and is retrievable, and returns its current served text so a quoted claim can be compared against what the provision says now. Use this when someone asks 'is this citation correct' or 'check whether Article 28 GDPR still says this' — answer the latter by comparing the returned text with the claim. It does NOT assert legal in-force status and does NOT consult amendment feeds; a valid verdict means the citation resolves in the corpus we serve. For a provision-level change comparison use diff. The text content is one JSON document. Its evidence_summary field carries the 'Sources used' markdown table (the audit receipt per returned row) or a labelled zero-result note. Result rows carry url/title/subtitle display fields alongside their citation when available. meta.render_contract carries the versioned evidence-curation contract.
| Name | Required | Description | Default |
|---|---|---|---|
| law | Yes | Instrument named in the citation being checked, as a framework id ('GDPR') or the corpus's own law identifier. | |
| article | Yes | Article or section number named in the citation, such as '28'. | |
| jurisdiction | No | ISO-2 code of the jurisdiction the citation belongs to, such as EU or SE. Omit only when the instrument is unambiguous across the fleet. |
validate_claimValidate ClaimARead-onlyInspect
Check a claim graph before relying on or presenting its conclusions. Refetch cited provisions and evidence under your scope, compare quotes, inspect dependencies, and report the result with explicit checked/not_checked lists. Evidence checks and judgment are separate fields on every node: evidence_checks (source_resolution, quotation_match, served_language, dependencies) records what the checker established; agent_assessment.declared_typing records the DET/INT typing the agent declared, attributed to the agent; evidence_ceiling is the highest typing the checked evidence permits; claim_support is always not_checked, because whether evidence supports a claim is reasoning and this check evaluates none. A matched quotation and a DET evidence_ceiling do not mean the conclusion is supported. On interpretations and conclusions, evidence_checks.stated_quantities reports whether each plain deadline, duration, percentage or euro amount in the statement appears in the cited text (all_in_cited_text, not_in_cited_text, not_checked, not_applicable; English only; stated_quantities_detail lists the missing and cited values); not_in_cited_text is a fact about the text, not a finding that the conclusion is false (a value may be derived), and claim support stays not_checked. strength is the legacy name for evidence_ceiling. A resolved evidence node (non-provision) carries a resolution verdict and caps every dependent conclusion at UNVERIFIED. Optionally check quotations in the prose answer. This does not verify legal in-force status, facts, satisfiability, entailment, or whether logic expresses the law. Served-to-this-caller verification (G4) is not checked: served rows do not yet carry request-id binding. No overall pass verdict is returned. Refetches run with concurrency up to 6 under a shared 25-second deadline; the session pool defaults to 2 sessions per downstream URL. Expiry returns bounded=true and unreached_clauses (count); unfinished clauses are unavailable, UNVERIFIED, and in not_checked with reason refetch_budget_exhausted. The summary.display_markdown field contains the presentation text, with findings and disclosures in summary.attention_items.
| Name | Required | Description | Default |
|---|---|---|---|
| graph | Yes | The claim graph as an object (a JSON-encoded string is also accepted), schema ansvar.claim-graph.v2 (or v1). Minimal working example: {"schema": "ansvar.claim-graph.v2", "question": "Must a controller notify a personal data breach?", "nodes": [{"id": "C1", "kind": "clause", "canonical_ref": "GDPR:art_33", "lookup": {"source_id": "eu-regulations", "canonical_ref": "GDPR:art_33", "jurisdiction": "EU"}, "quote": "In the case of a personal data breach, the controller shall without undue delay and, where feasible, not later than 72 hours after having become aware of it, notify the personal data breach to the supervisory authority competent in accordance with Article 55...", "quote_language": "en", "binding": "mandate"}, {"id": "K1", "kind": "conclusion", "statement": "The controller must notify the supervisory authority.", "typing": "INT", "depends_on": ["C1"]}]}. Required keys: schema, question (text) and nodes (array). Optional: variables (object mapping names to {kind: design|fact, meaning: text}; default {}) and gaps (array of {statement, reason}; default []). Every node needs id and kind. A clause needs canonical_ref, quote, quote_language and binding (mandate|prohibition|permission|designation|definition); jurisdiction is required unless lookup is supplied; pinpoint is optional. Copy each row's citation.lookup args into lookup. In v2, each clause lookup requires source_id and canonical_ref equal to the node reference. A v2 evidence node needs source_id (the routed citation.source_id), reference (the exact served address), and jurisdiction when the source is registered under several codes; quotation is optional. Missing address fields refuse before refetch with the node field path. Regulatory updates use source_id=reg-intel; CVEs use cve-intel. Pan-European preparatory works remain unsupported and explicitly refuse resolution. A fact needs statement and provenance="customer"; an assumption needs statement and provenance="assumed". An interpretation or conclusion needs statement, typing (DET|INT), and depends_on (node ids). Optional node constraint is CNF (arrays of literal strings; ! negates a variable). Conclusions may carry entails {assume: literal array, expect: SAT|UNSAT}, retained without evaluation. Optional regulatory_basis_unresolved (boolean) is preserved. Limits: 100 nodes, 60 citation refetches, 131072 UTF-8 graph bytes, 25 seconds for refetching. A large graph citing one corpus takes tens of seconds; if the refetch budget runs out the response is marked bounded, names how many clauses it did not reach, and leaves them unverified. | |
| answer | No | Optional prose answer whose quotations should be compared with refetched evidence. Maximum 65536 UTF-8 bytes (MAX_CLAIM_ANSWER_BYTES). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false. The description adds rich behavioral context beyond that: refetch scope, concurrency up to 6, shared 25-second deadline, session pool default, expiry behavior with bounded/unreached_clauses, claim_support always not_checked, resolved evidence nodes capping dependents at UNVERIFIED, and no overall pass verdict.
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 dense detail is relevant for a complex validation tool. However, the lack of bullet points or headings and minor repetition (claim_support is always not_checked; claim support stays not_checked) make the text harder to scan than it could 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?
No output schema exists, but the description explains return behavior in detail: checked/not_checked lists, summary.display_markdown, summary.attention_items, bounded and unreached_clauses on expiry, and limits. It also clarifies what is not checked, making it complete for a complex tool.
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 schema already documents both graph and answer parameters in detail. The description adds that answer quotations may optionally be compared, but it does not add new syntax, formats, or constraints for the graph parameter 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 ('Check') and resource ('claim graph') and scopes the tool to before relying on or presenting conclusions. However, it does not explicitly mention sibling tools like validate_citation or verify_citations, so the boundary between this and related validation tools is left implicit.
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 context for use: before relying on or presenting a claim graph's conclusions, and optionally for checking quotations in a prose answer. It also lists things the tool does not verify (legal in-force status, facts, satisfiability, entailment), but names no alternative tool for those cases, so alternatives are missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_citationsVerify CitationsARead-onlyInspect
Verify submitted legal citations against what this gateway actually serves, so a report can record which of its citations are established evidence and which are not. For each subject you supply a reference (and the source_id the row's citation.lookup hint carried, plus the quotation your text relies on), the gateway re-retrieves that provision under YOUR scope through the source-pinned exact lookup, checks the PRODUCER-declared identity of the row it got back against the reference you asked for, and only then compares your quotation with the retrieved body. A displayed reference is never used to decide which row answers a subject. Verdicts per subject: quote_checked (reference resolved and the quotation is in the body), reference_resolved (reference resolved, no quotation was submitted), quote_mismatch, no_quotation_submitted (a quote-bearing subject whose quotation was empty — a refusal, NOT a mismatch), identity_mismatch (the row's producer identity names a different provision), identity_absent, reference_unparseable, not_served, withheld and unavailable. Coverage is advertised, never assumed: producer identity exists TODAY ONLY on the source-pinned exact lookup paths, so a subject with no source_id, or one on a corpus they do not cover, returns identity_absent rather than passing. Entity subjects are the second such path: when source_id names a controls, framework, standards or threat-technique catalog, reference is that row's entity id (a control, clause or technique id such as AC-4(5), A.5.1 or T1059) and the gateway re-retrieves it from that catalog by id — the lane follows the source, not the shape of the string. Court decisions and preparatory works are the third: when source_id names a decision or preparatory-works corpus, reference is that row's single opaque address (an ECLI, a neutral citation, the corpus's own case id, a proposition number) and the gateway re-retrieves it FROM THAT CORPUS — never from another decision corpus of the same jurisdiction — and additionally requires the producer's own court, case number and decision date before a decision verifies. Both lanes compare references byte for byte: these id spaces carry no equivalent spellings. For those two lanes source_id is the ROUTED CORPUS ID the row came from (for example dutch-court-decisions or swedish-preparatory-works), because a decision hint carries the reference and the jurisdiction, not the corpus. It is not the citation's mcp_server, which is that corpus's display name and resolves to no routed id; the response's coverage block lists the corpus ids each of these lanes covers today. Regulatory updates are the fourth: when source_id names the regulatory-update service, reference is the record id that service emitted and the gateway re-fetches that record from it, byte for byte. Because a regulatory update is a live feed rather than a built corpus, such a verdict also carries a freshness block — the record's own publication and observation dates, the feed it came from and that service's own reported data age — and a verdict this gateway cannot date refuses (identity_absent) instead of establishing. A quotation on this lane is compared with the publisher's own title text, which is the only verbatim text the record carries: the service serves no summary and no provision body. CVE records are the fifth: when source_id names the CVE service, reference is the CVE id (CVE-2021-44228) and the gateway re-fetches that record from it, byte for byte, comparing a quotation with the publisher's own description. Such a verdict carries a freshness block too — the record's publication and modification dates, and the declared sync state, age and interval of the feed it was served from — and because that service publishes its own freshness contract, a feed it reports as no longer current, or one older than the sync interval it declares for itself, answers identity_absent with reason cve_pin_feed_stale instead of establishing anything — and so does a miss from such a feed, because an absence read from a stale mirror is not an absence. A KEV listing or an EPSS score is NOT verified on that lane: they are other feeds' assertions about the CVE rather than publisher text of it, and a quotation of one reads quote_mismatch. Their two feeds' ages are stated on the verdict but do not refuse it — the one deliberate exception to the stale-feed rule, scoped to feeds the checked text does not come from. The response's coverage block lists which corpora each lane covers today; a subject on a corpus a lane does not yet cover answers identity_absent. A source_id that names a source alias (a row served through edpb or uk-law carries the alias as its citation.source_id) is resolved to the alias's corpus under the alias's own tier; the verdict keeps your source_id and names that corpus in resolved_source_id. First-party doc:// document pinpoints are not verified here (reference_unparseable). withheld means licensing or tier suppression and never means the law does not exist; not_served means no corpus in your scope serves that reference. No verdict asserts legal in-force status, currency, pinpoint correctness, or that the provision supports your conclusion. Limits: 60 subjects a call, one lookup a subject under a shared 25-second budget with concurrency 6; on exhaustion the response is marked bounded and the unreached subjects are unavailable, never verified and never reported as absent law. Lookups run under your own tier and entitlements and count against your normal lookup quota. With attest=true, premium and above receive signed evidence attestations for permitting subjects: integrity and provenance, never legal validity; free and solo keep ordinary verdicts with attestation_refused=tier.
| Name | Required | Description | Default |
|---|---|---|---|
| attest | No | Request signed evidence attestations (premium and above); defaults to false. | |
| subjects | Yes | Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint, or the row's citation.source_id when that names a source alias such as edpb; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. language (optional — the edition language of a secondary-language row, such as bg or nl, exactly as the lookup that served it named it; the quotation is then compared with that edition. Omit it for the default edition). Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. For calendar rows use source_id reg-intel, reference equal to the obligation_id, and identity_shape obligation_id. identity_shape record_id (or omitted) selects publication replay; the two id grammars can overlap. Unknown keys are refused, not ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond annotations (which only declare readOnly/openWorld/destructive). It explains concurrency (6), time budget (25s), subject limit (60), bounded response on exhaustion, tier-dependent attestation, the refusal semantics (withheld, not_served, identity_absent), the specific stale-feed rule and exception, and the 'never means the law does not exist' caveat. It also clarifies that attestation is integrity/provenance, not legal validity.
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 very long (over 500 words) and dense with jargon. While it contains necessary information, it is not front-loaded: key operational limits and verdict meanings are buried in the middle. It could be restructured with bullet points or clearer sections. Every sentence may earn its place, but the delivery is not concise.
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 the complexity (multi-lane verification, many verdicts, tiered attestation), the description is thorough. It covers all lanes, edge cases (stale feed refusal, alias resolution, doc:// pinpoints), limits, and what verdicts do not assert. With an output schema present, it doesn't need to explain return values, and it doesn't.
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 schema already has 100% description coverage, including detailed per-key semantics for subjects (subject_id, reference, source_id, quotation, language, identity_shape). The description reiterates some of this (e.g., source_id needed, quotation length, lanes) but does not consistently add meaning beyond the schema; it mainly restates with some extra context about lanes. With high schema coverage, baseline 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 opens with a specific verb and resource: 'Verify submitted legal citations against what this gateway actually serves.' It then distinguishes itself from validation tools by explaining the gateway re-retrieves provisions to establish evidence, and enumerates the verdicts. The sibling 'validate_citation' is close, but the description's scope of 'established evidence' and the per-lane retrieval behavior differentiates it implicitly.
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 when to use it — to record which citations are established evidence — and provides detailed per-lane conditions for source_id and reference types. But it doesn't explicitly state when to prefer this over 'validate_citation' or 'validate_claim', which are likely alternatives. It also doesn't mention prerequisites beyond tier for attestation.
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.
1 tool update
- Changed
describe_capabilities3 fields changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"Jurisdiction code with canonical aliasing; matches a source's primary jurisdiction or one it serves (serves_jurisdiction_via marks a multi-jurisdiction match); requires section='sources'."New value: +"Market code for section='law_map', or jurisdiction code with canonical aliasing for section='sources'; matches a source's primary jurisdiction or one it serves (serves_jurisdiction_via marks a multi-jurisdiction match)." - changed
Input schema / properties / query / descriptionPrevious value: -"Source query: case-insensitive tokens, ranked by field hits; requires section='sources'."New value: +"Case-insensitive source tokens for section='sources'; product id, title tokens or EU act key for section='law_map'." - changed
Input schema / properties / section / descriptionPrevious value: -"Return one section alone: 'sources', 'addons', 'tour', 'use_cases', or a category id from the summary view's index. Empty returns every section. An unknown value is an error listing the valid ids."New value: +"Return one section alone: 'sources', 'addons', 'tour', 'use_cases', 'law_map', or a category id from the summary view's index. Empty returns every section. An unknown value is an error listing the valid ids."
1 tool update
- Changed
generate_report1 field changed- added
Input schema / properties / include_reportAdded value: +{ + "default": true, + "description": "false returns only the delivery receipt (with its display_markdown), any rendered artifact links and the relay block; use it when your client limits tool output size. Default true returns the full report.", + "title": "Include Report", + "type": "boolean" +}
1 tool update
- Changed
search1 field changed- added
Input schema / properties / workflow_idAdded value: +{ + "description": "Id of the caller's own active included workflow run (Free and Solo), when this search is part of that run. Searches that name the run draw from its own allowance of 300 searches instead of the daily search budget, so a run is not cut off by the daily limit. At the run allowance the search is refused with cap='run_search_allowance'; it does not spill onto the daily budget. An id the gateway cannot verify as an active run you started (unknown, ended, or another account's) is not an error: the daily budget applies. Ignored on Premium, Team and Company, whose daily budgets a run does not reach. Does not change what is searched.", + "title": "Workflow Id", + "type": "string" +}
1 tool update
- Changed
verify_citations1 field changed- changed
Input schema / properties / subjects / descriptionPrevious value: -"Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint, or the row's citation.source_id when that names a source alias such as edpb; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. language (optional — the edition language of a secondary-language row, such as bg or nl, exactly as the lookup that served it named it; the quotation is then compared with that edition. Omit it for the default edition). Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. Unknown keys are refused, not ignored."New value: +"Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint, or the row's citation.source_id when that names a source alias such as edpb; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. language (optional — the edition language of a secondary-language row, such as bg or nl, exactly as the lookup that served it named it; the quotation is then compared with that edition. Omit it for the default edition). Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. For calendar rows use source_id reg-intel, reference equal to the obligation_id, and identity_shape obligation_id. identity_shape record_id (or omitted) selects publication replay; the two id grammars can overlap. Unknown keys are refused, not ignored."
1 tool update
- Changed
scope_workflow1 field changed- changed
Input schema / properties / objective / descriptionPrevious value: -"What the user needs produced, as a workflow family value from a previous scope_workflow question's options — for example 'gap_analysis', 'threat_model', 'dpia', 'risk_assessment'. Leave empty on the first call and this tool asks for it."New value: +"What the user needs produced, as a workflow family value from a previous scope_workflow question's options — for example 'gap_analysis', 'threat_model', 'dpia', 'risk_assessment', or 'regulatory_applicability_register' for which laws apply to a product, service or entity. Leave empty on the first call and this tool asks for it."
2 tool updates
- Changed
get_provision1 field changed- added
Input schema / properties / languageAdded value: +{ + "anyOf": [ + { + "enum": [ + "en", + "nl", + "de", + "bg" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "en", + "nl", + "de", + "bg" + ], + "type": "string" + }, + "maxItems": 3, + "minItems": 1, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "default": null, + "description": "Edition language of the EU legislation text. One code, or a list of up to 3 codes to receive the versions side by side, each with its own citation and `language_served`. A language the requested instrument lacks falls back to English and says so in `language_fallback`. Omit for the English default. Served editions: en, nl, de, bg." +}
- Changed
verify_citations1 field changed- changed
Input schema / properties / subjects / descriptionPrevious value: -"Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint, or the row's citation.source_id when that names a source alias such as edpb; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. Unknown keys are refused, not ignored."New value: +"Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint, or the row's citation.source_id when that names a source alias such as edpb; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. language (optional — the edition language of a secondary-language row, such as bg or nl, exactly as the lookup that served it named it; the quotation is then compared with that edition. Omit it for the default edition). Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. Unknown keys are refused, not ignored."
1 tool update
- Changed
verify_citations1 field changed- changed
Input schema / properties / subjects / descriptionPrevious value: -"Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. Unknown keys are refused, not ignored."New value: +"Array of subject objects, each checked independently and echoed back in this order. Keys: subject_id (required, your own opaque id, unique within the call, returned verbatim); reference (required, the canonical reference to verify, e.g. the canonical_ref a search row's citation.lookup hint carried); source_id (optional but needed for a verifiable result — the routed corpus id from that same lookup hint, or the row's citation.source_id when that names a source alias such as edpb; without it the lookup is unpinned, carries no producer identity and the verdict is identity_absent); quotation (optional — supply the exact text your report relies on and it is compared with the retrieved body; omit the key entirely for a reference-only claim. Supplying it empty declares a quote-bearing claim with nothing to compare and returns no_quotation_submitted. A quotation shorter than 25 characters (6 for Chinese, Japanese or Korean text), elision marks excluded, is too short to be evidence and returns no_quotation_submitted too, unless it is the provision's whole text; quote a full clause. Maximum 60 subjects a call; a quotation is capped at 16384 UTF-8 bytes. Unknown keys are refused, not ignored."
1 tool update
- Changed
start_workflow2 fields changed- added
Input schema / properties / parent_run_idAdded value: +{ + "default": "", + "description": "supplier_assurance_review only: the workflow_id of a completed run of the same type in your organisation that this run follows, for example after new evidence arrives once a decision is recorded. The parent run and its report are never changed. Empty starts an ordinary run.", + "title": "Parent Run Id", + "type": "string" +} - added
Input schema / properties / succession_reasonAdded value: +{ + "default": "", + "description": "Required with parent_run_id: why this run follows its parent, for example 'new SOC 2 report after the decision'.", + "title": "Succession Reason", + "type": "string" +}
1 tool update
- Changed
search1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Search terms, matched with FTS5 implicit AND against each resolved corpus. Pass one or two canonical concept terms in the corpus language (SE: konsumentskydd, DE: Datenschutz), never a multi-concept compound. A bare uppercase OR between 2-3 terms is honoured as a disjunction (either term matches); other uppercase FTS operators (AND, NOT, NEAR) are stripped, not honoured."New value: +"Search terms, matched with FTS5 implicit AND against each resolved corpus. Pass one or two canonical concept terms in the corpus language (SE: konsumentskydd, DE: Datenschutz), never a multi-concept compound. A bare uppercase OR between 2-3 terms is honoured as a disjunction (either term matches); other uppercase FTS operators (AND, NOT, NEAR) are stripped, not honoured. At most 500 characters: a longer query (a pasted case description, say) is refused before any source is searched, with isError=true and structuredContent error='validation_error', code='query_too_long'. Split the matter into separate issue queries of 2-5 legal terms, one call per issue, and merge the results."
1 tool update
- Changed
validate_claim3 fields changed- added
Input schema / properties / graph / anyOfAdded value: +[ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "string" + } +] - changed
Input schema / properties / graph / descriptionPrevious value: -"JSON object using schema ansvar.claim-graph.v1 or ansvar.claim-graph.v2. Required keys: schema (\"ansvar.claim-graph.v1\" or \"ansvar.claim-graph.v2\"), question (text), variables (object mapping names to {kind: design|fact, meaning: text}), gaps (array of {statement, reason}), and nodes (array). Every node needs id and kind. A clause needs canonical_ref, quote, quote_language and binding (mandate|prohibition|permission|designation|definition); jurisdiction is required unless lookup is supplied; pinpoint is optional. Copy each row's citation.lookup args into lookup. In v2, each clause lookup requires source_id and canonical_ref equal to the node reference. A v2 evidence node needs source_id (the routed citation.source_id), reference (the exact served address), and jurisdiction when the source is registered under several codes; quotation is optional. Missing address fields refuse before refetch with the node field path. Regulatory updates use source_id=reg-intel; CVEs use cve-intel. Pan-European preparatory works remain unsupported and explicitly refuse resolution. A fact needs statement and provenance=\"customer\"; an assumption needs statement and provenance=\"assumed\". An interpretation or conclusion needs statement, typing (DET|INT), and depends_on (node ids). Optional node constraint is CNF (arrays of literal strings; ! negates a variable). Conclusions may carry entails {assume: literal array, expect: SAT|UNSAT}, retained without evaluation. Optional regulatory_basis_unresolved (boolean) is preserved. Limits: 100 nodes, 60 citation refetches, 131072 UTF-8 graph bytes, 25 seconds for refetching. A large graph citing one corpus takes tens of seconds; if the refetch budget runs out the response is marked bounded, names how many clauses it did not reach, and leaves them unverified."New value: +"The claim graph as an object (a JSON-encoded string is also accepted), schema ansvar.claim-graph.v2 (or v1). Minimal working example: {\"schema\": \"ansvar.claim-graph.v2\", \"question\": \"Must a controller notify a personal data breach?\", \"nodes\": [{\"id\": \"C1\", \"kind\": \"clause\", \"canonical_ref\": \"GDPR:art_33\", \"lookup\": {\"source_id\": \"eu-regulations\", \"canonical_ref\": \"GDPR:art_33\", \"jurisdiction\": \"EU\"}, \"quote\": \"In the case of a personal data breach, the controller shall without undue delay and, where feasible, not later than 72 hours after having become aware of it, notify the personal data breach to the supervisory authority competent in accordance with Article 55...\", \"quote_language\": \"en\", \"binding\": \"mandate\"}, {\"id\": \"K1\", \"kind\": \"conclusion\", \"statement\": \"The controller must notify the supervisory authority.\", \"typing\": \"INT\", \"depends_on\": [\"C1\"]}]}. Required keys: schema, question (text) and nodes (array). Optional: variables (object mapping names to {kind: design|fact, meaning: text}; default {}) and gaps (array of {statement, reason}; default []). Every node needs id and kind. A clause needs canonical_ref, quote, quote_language and binding (mandate|prohibition|permission|designation|definition); jurisdiction is required unless lookup is supplied; pinpoint is optional. Copy each row's citation.lookup args into lookup. In v2, each clause lookup requires source_id and canonical_ref equal to the node reference. A v2 evidence node needs source_id (the routed citation.source_id), reference (the exact served address), and jurisdiction when the source is registered under several codes; quotation is optional. Missing address fields refuse before refetch with the node field path. Regulatory updates use source_id=reg-intel; CVEs use cve-intel. Pan-European preparatory works remain unsupported and explicitly refuse resolution. A fact needs statement and provenance=\"customer\"; an assumption needs statement and provenance=\"assumed\". An interpretation or conclusion needs statement, typing (DET|INT), and depends_on (node ids). Optional node constraint is CNF (arrays of literal strings; ! negates a variable). Conclusions may carry entails {assume: literal array, expect: SAT|UNSAT}, retained without evaluation. Optional regulatory_basis_unresolved (boolean) is preserved. Limits: 100 nodes, 60 citation refetches, 131072 UTF-8 graph bytes, 25 seconds for refetching. A large graph citing one corpus takes tens of seconds; if the refetch budget runs out the response is marked bounded, names how many clauses it did not reach, and leaves them unverified." - removed
Input schema / properties / graph / typeRemoved value: -"string"
Related MCP Connectors
EU regulations (GDPR, DORA, NIS2, AI Act, etc.) via Ansvar Gateway. Cited, OAuth + paid.
Swedish law + work env. via Ansvar Gateway. Cited, OAuth + paid tier.
CVE intelligence, STRIDE, OWASP test cases via Ansvar Gateway. Cited, OAuth + paid.
US federal + state law via Ansvar Gateway. Cited, OAuth + paid tier.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceConnects AI hosts to a deterministic, cited regulatory-compliance reference so agents can look up laws, search regulations, compute which requirements a product triggers, and find related Controls, vendors, enforcement actions, and counsel with primary-source links. It also exposes the accepted feature/market/audience catalog and a token verifier for grounding what was served.6 npmMIT- AlicenseNot gradedqualityBmaintenanceEnables searching and quoting EU legislation with verifiable EUR-Lex citations, including GDPR, NIS2, DORA, and the EU AI Act.12 npmMIT

Legalizeofficial
AlicenseNot gradedqualityBmaintenanceEnables AI assistants to search and read consolidated legislation from multiple countries, retrieve exact law texts as of any historical date with citations and git commit SHAs, and create webhook or email subscriptions to track legal changes.2MIT- FlicenseAqualityAmaintenance40 regulation-and-deadline linters (CRA/CSAF, PCI DSS 6.4.3, WCAG 2.1 AA, DORA, NIS2, EU AI Act, KSeF, NF-e) that AI agents call over MCP. Free checks on the open file; licence key unlocks workspace scan and CI exit code.3-
Glama MCP Gateway
Add one secure layer between your agents and this server.