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 46 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
There is meaningful overlap among the verification tools: validate_citation, verify_citations, validate_claim, and diff all revolve around checking legal references/text, and an agent could easily misselect among them. Similarly, batch_search and search_cve both target CVE retrieval, and describe_capabilities versus get_my_capabilities cover related capability questions. Descriptions do differentiate them, but the boundaries require careful reading rather than being self-evident.
Most tools follow a predictable verb_noun snake_case pattern (batch_search, check_kev_status, get_cve_details, list_workflows, start_workflow, validate_claim). A few outliers (diff, search) use bare single tokens, but these are readable and reasonably intuitive. Overall the convention is consistent with only minor deviations.
35 tools is on the heavy side, especially since one server bundles two large domains (EU legal/compliance intelligence and CVE/ICS vulnerability intelligence). The count is defensible given the breadth, but the surface feels like two products merged into one, pushing it toward the borderline-heavy end of the scale.
Core workflows are well covered (search, provision lookup, diff, citation verification, workflow lifecycle, CVE/KEV/EPSS/exploit enrichment) with clear lifecycle support. The main gap is that get_changes references a companion search_regulatory_updates tool that is not present in the surface, leaving a described boundary partially unserved. Minor gaps otherwise.
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 WorkflowAInspect
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 only mark readOnlyHint=false and destructiveHint=false, but the description adds crucial behavioral details: idempotency ('returns the same result'), irreversibility ('cannot be resumed'), and persistence ('record stays visible in list_workflows'). It also explains the impact on resume_workflow's active listing, which annotations cannot convey.
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, front-loaded with the core action, then condenses essential caveats (idempotency, resume exclusion, listing visibility) into a compact, well-structured format. Every sentence adds value.
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 single-parameter cancellation tool with an output schema, the description covers the core operation, irreversible side effects, idempotency, and the relationship to sibling tools (resume_workflow, list_workflows). It is complete enough for an agent to invoke safely and 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 has 100% parameter description coverage, including how to obtain workflow_id and how to recover a lost id. The description adds no additional parameter semantics beyond what the schema already provides, 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 opens with 'Cancel an active workflow by id', a specific verb+resource combination. It distinguishes itself from resume_workflow by noting cancelled workflows cannot be resumed and are excluded from its active listing.
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 clearly states when to use the tool (to stop an active workflow) and implicitly warns against use if resumption may be needed ('cannot be resumed'). However, it does not explicitly name alternative tools or provide a when-not-to-use list beyond the resumption caveat.
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' | 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, domain, jurisdiction, 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).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Sources per page, clamped to [1, 50]; requires section='sources'. | |
| query | No | Source query: case-insensitive tokens, ranked by field hits; requires section='sources'. | |
| 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', 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 | 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'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only and non-destructive, and the description adds considerable behavior beyond that: detail validation happens before section validation, every view is tier-aware, gated families are shown with caveats rather than omitted, workflow lists are TTL-cache reconciled with live/stale/unavailable statuses, and degraded subsystems are surfaced via service_notices and tool_status. 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 long but well-structured and front-loaded, starting with the core purpose and default view before detailing edge cases. Nearly every sentence carries distinct information, though the length is substantial and some repository/file-location details could be seen as beyond what the agent needs for invocation.
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 discovery tool with 8 parameters and no enums, the description covers defaults, section routing, filter restrictions, error behavior, pagination cursor continuation, tier-aware output, caching/status semantics, degraded-system notices, and the relationship to the sibling tool. With an output schema present, the description does not need to restate return-value shapes.
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%, but the description adds cross-parameter constraints and semantics not visible in the schema: query/domain/jurisdiction/cursor/limit require section='sources', detail is validated before section even when section is passed, and unknown section values produce an error listing valid ids. It also enriches the meaning of section values like 'addons', 'tour', and category ids.
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 clear verb+resource: 'Discover what Ansvar can do for your agent,' then specifies the summary/full/section modes. It also differentiates itself from its closest sibling by naming get_my_capabilities as a companion limited to live tier/quota only.
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 explicit usage context for each mode: default summary for orientation, detail='full' for the complete catalog, section= for isolated sections, and filter parameters only with section='sources'. It explicitly contrasts with get_my_capabilities, telling the agent that live tier/quota queries belong to that sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffDiffARead-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 response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered.
| 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. |
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 is known to be safe. The description adds significant behavioral context: it describes the structured diff (added, removed, modified text), the 'Sources used' audit table with zero-result note, and meta.render_contract for reproducing source attributions. This goes well beyond what annotations provide and gives the agent a clear picture of the output and its provenance.
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, each earning its place: the first states the core function, the second provides usage triggers with examples, and the third details the output format including the audit table and meta contract. It is front-loaded with the primary purpose and contains no fluff or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by thoroughly explaining the return value: a structured diff with added/removed/modified text, a 'Sources used' section, and meta.render_contract. Combined with the exhaustive parameter schema and safety annotations, the agent has all necessary information to invoke the tool correctly and interpret results. The mention of zero-result note also handles an edge case.
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 covers all 5 parameters with descriptions (100% coverage), so the baseline is 3. The tool description does not elaborate on parameter details further, but it implicitly reinforces semantics through example queries ('DORA amendment', 'GDPR Article 17'). Since the schema already explains parameters clearly and the description adds minimal extra meaning, a 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+resource: 'Compare two versions of a legal provision to see what changed.' It distinguishes the tool from siblings like get_provision or search by focusing on the diffing use case, reinforced with concrete example queries ('what changed in the latest DORA amendment', 'differences in GDPR Article 17 after the update'). This fully clarifies the tool's purpose.
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...' followed by three representative user requests, giving clear context for when the tool is appropriate. It does not name alternatives or provide when-not guidance, but the usage scenarios are specific enough to differentiate from sibling tools. A missing explicit exclusion keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 team tier; on free and solo an included run also returns html or pdf carrying an Ansvar watermark. Every other tier receives the report as JSON, and 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnlyHint/destructiveHint annotations. It discloses refusal behavior with failure feedback, render failure handling ('attach render_error and never drop the report JSON'), tier-based restrictions, watermark behavior on free/solo, and the policy of refusing unsupported formats instead of quietly downgrading. This is rich behavioral context that the annotations alone do not 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 front-loaded with the core purpose, then usage triggers, then behavioral details, each sentence earning its place. Despite its length, it is dense with actionable information and has no filler or redundancy.
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 description covers the return format ('structured report with findings, citations, and recommendations'), failure modes, tier-specific behavior, error keys, and even the fact that render failures never drop the JSON. With an output schema present and full parameter coverage, this description is complete for the tool's complexity.
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 provides 100% coverage for both parameters, so the baseline is 3. The description adds meaningful behavior around the format parameter: 'branded rendered artifacts as short-lived download URLs', 'sibling render key', and explicit tier consequences. However, there is a slight inconsistency between the schema enum (json/html/pdf) and the description's mention of docx/all, which creates minor ambiguity even though the schema's own description also lists those values. Hence 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Produce the final compliance report from a completed workflow.' It also provides concrete trigger phrases ('generate the gap analysis report', 'I need the DPIA report as a document') that distinguish it from sibling tools like start_workflow or get_workflow_threats. This is a clear, differentiated statement of purpose.
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 guidance is given via example user requests. It also states preconditions ('from a completed workflow', 'Refuses until every quality gate passes') and an explicit when-not: formats the caller's tier does not serve are refused rather than downgraded. This fully meets the 5-level criteria of explicit when/when-not and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changesGet ChangesARead-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 response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered.
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnly/destructive annotations by disclosing important runtime behaviors: empty responses are not evidence of no amendments, capability misses name supported scopes, responses include a 'Sources used' section, and meta.render_contract carries the evidence-curation contract.
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 overly verbose and repetitive, with long clauses and duplicated concepts like capability-miss behavior and source attribution. It would benefit from tighter structuring and shorter sentences.
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 absence of an output schema, the description supplies important output context including the 'Sources used' markdown table, zero-result note behavior, and the render_contract field, making it reasonably complete for correct invocation.
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 covers 100% of parameters, and the description adds useful operational nuances such as limit clamping, per-corpus coverage, amendment-capable dispatch for jurisdictions, and the regulation/regulation_id alternative.
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 'find[s] observed rows from legislative change feeds' and distinguishes it from related tools such as diff and search_regulatory_updates, making the purpose and boundaries explicit.
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 provides explicit when-to-use guidance with examples like 'what laws changed in Sweden this month', specifies the amendment-capable scope condition, and tells the agent to use diff for known provisions and search_regulatory_updates for newly published acts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. 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 declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false. The description goes far beyond that by detailing counter reset at UTC midnight, behavior under Redis (shared counters, no multiplication with workers), failure handling for document service (returns null and reason instead of zero), and service_notices for degraded state. This is rich behavioral context that an agent needs, fully disclosed.
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 extremely long (~400 words) for a no-parameter tool, far beyond what is typically needed. While it is front-loaded with the main purpose and each sentence adds informational value, it is not 'appropriately sized' – details like development-without-Redis configuration and worker semantics could be trimmed. The structure is good (it flows from purpose to fields to limits), but it lacks conciseness.
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 has an output schema, but the description still explains every returned field (tier, capabilities, limits, usage_today, documents, tool_surface, workflow_discovery, upgrade_url, service_notices). It covers edge cases (null with unavailable_reason, team/company pooling, budget sharing) and provides the full context an agent needs to interpret the response. Nothing 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 has zero parameters and the schema confirms an empty object. The description explicitly says 'takes no arguments', which is all that is needed. Since there are no parameters to document, the baseline 4 is appropriate – the statement adds clarity without redundancy.
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 returns 'Tier, capabilities, limits, and live usage for the calling identity' – a specific verb and resource. It also names the sibling tools that share the same budget (get_provision, validate_citation), preventing confusion with other metadata endpoints. The purpose is unambiguous and distinct.
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 tells the agent when to call it: 'Use this to decide what tools and fan-out paths are available before calling them, or to check remaining quota before issuing more requests'. It also explains why (avoid wasted retries, decide whether to upgrade) and that it takes no arguments. This is direct guidance on when and why to use this tool instead of siblings.
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 ProvisionARead-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 response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered. 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'). | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, which already signal a safe read operation. The description adds substantial behavioral context beyond that: the national-transposition swap (returning the national provision and naming it in meta.transposition), the typed disclosure when no mapping applies, the ambiguous-candidates retry mechanism with retry_args and retry_kind, the 'Sources used' markdown table, and the meta.render_contract for evidence curation. It even cautions against inferring source_id to prevent substitution across corpora. 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?
Although the description is long, every sentence serves a purpose and the structure is exemplary. It starts with the core purpose, then systematically walks through the three addressing forms with examples, then covers edge cases (transposition, ambiguity, source_id constraints), and ends with response details. There is no filler; the length is justified by the tool's complexity and the need to prevent misuse. It is front-loaded with the most critical information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity—three addressing forms, national transposition logic, ambiguous candidate retries, source_id constraints, and response metadata—the description is remarkably complete. It covers what the tool returns (full text, metadata, sources-used section, render contract) even though there is no output schema. It also anticipates common failure modes (law_name_unresolved, near matches) and tells the agent exactly how to recover. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has descriptions for all five parameters, but the tool description enriches them significantly. It explains how the parameters combine into three distinct addressing forms, gives exact examples for each, clarifies the role of jurisdiction in canonical_ref (pass it when the ref does not embed one), and imposes validity rules on source_id and the bare-source-id form. This is precisely the kind of semantic depth that helps an agent invoke the tool correctly, exceeding the baseline set by a 100% coverage 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 opens with a clear, specific statement of the tool's function: 'Look up the exact text of a specific legal provision or standards-catalog control.' It immediately distinguishes three addressing forms and gives concrete examples (e.g., 'Article 5 of GDPR', '45 CFR § 164.410', 'nist-800-53 AC-5'). This goes far beyond a vague purpose and clearly separates it from sibling tools like search, which finds rows rather than resolving exact text.
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 when-to-use guidance for each of the three addressing forms, including when to prefer search first ('For a national statute you have not seen in a search row, search first and replay that row's citation.lookup'). It also states when not to use certain parameters (e.g., 'source_id... is valid only with the hint's nonblank canonical_ref; law and article must remain empty') and how to handle ambiguity. No other tool is confused with this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
Response shape: verdict (licensing-verdict state), obligations (calendar dataset state), lane_f (events pipeline counters), and sources (per-source enrolment, publisher, jurisdictions, last sync, freshness state).
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?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial behavioral context beyond that: the meaning of 'enrolled,' the freshness state taxonomy, the degraded dataset behavior with resolution_reason and anomalous_release, and the condition under which the deadlines tool refuses to serve. This fully discloses what the tool reports and how states should be interpreted.
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 well-structured into paragraphs covering source status, obligations calendar state, response shape, and an example. It front-loads the core purpose and then adds necessary interpretive context; while a bit verbose, every section serves agent decision-making.
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-parameter, read-only status tool with no output schema, the description is exceptionally complete: it defines all reported states, explains edge cases, gives the response shape, and provides an example natural-language prompt. An agent would know exactly what this tool returns and when to rely on it.
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 parameter-level semantics are not needed. The description focuses entirely on return semantics and state interpretation, which is the appropriate substitute; the baseline of 4 for a no-parameter tool 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 states a specific verb and resource: 'Report what this service actually monitors and how current each source is.' It clearly enumerates the returned dimensions (sources, freshness states, verdict, obligations dataset state), making the tool's scope unmistakable and differentiating it from generic status or freshness tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool, including explicitly telling callers to read it before concluding anything from an empty search and explaining it is the diagnostic surface for refused or degraded get_regulatory_deadlines calls. It does not name sibling alternatives directly, but the specialized use cases are clearly articulated.
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.
| 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?
Beyond the readOnly annotation, it discloses a non-obvious behavioral caveat: counts remain whole-jurisdiction and are not domain-scoped, so they must not be reported as per-domain counts. It also explains that incomplete rows carry coverage_note and that the domain-specific signal comes from sources/frameworks.
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 every sentence earns its place: core purpose first, then usage timing, examples, return shape, and the critical count-scope caveat. The bulleted examples make scanning easy and the warning is clearly separated.
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 coverage tool with four optional parameters and an output schema, the description fully explains what the agent needs: when to call it, what each example query means, what the response contains, and an important interpretation pitfall. Nothing material 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 input schema already covers all four parameters at 100%, so the baseline is 3. The description adds value by showing exact parameter values through examples and by linking natural-language queries to parameter choices, while also reinforcing how domain affects the response semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Show which countries, frameworks, and legal domains are available') and is packed with concrete example user queries that map to tool invocations. It separates list_coverage from the sibling search tool by positioning it as the jurisdiction-discovery entry point.
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 to call this BEFORE search when the user's topic doesn't name a jurisdiction, and gives five natural-language examples covering different parameters. This gives an agent clear decision criteria and names the relevant alternative (search).
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. 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'. 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 readOnlyHint=true annotation, the description discloses determinism, unmetered access, tier-independent recommendations, snapshot freshness (fetched_at, age_seconds), explicit failure on missing/stale snapshots, and the fact that no static catalog is served as live. This substantially exceeds the annotation baseline.
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; the first sentence front-loads the purpose, and every subsequent clause adds needed operational detail. Slightly verbose for the format, but aptly sized for an interactive tool with snapshot, tier, and failure-mode nuances.
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 output schema presence and complexity, the description fully covers the iterative question/response cycle, final recommendation details, authorization visibility, snapshot metadata, and disagreement handling with list_workflow_types. Failure modes are also specified; no significant gap remains.
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 interactive usage context: all arguments optional, take values from previous question options, use ['unscoped'], and the typical invocation example. The schema already carries the detailed field descriptions, so the marginal value is useful but not transformative.
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 precise verb and resource: 'Scope a compliance workflow down to ONE concrete workflow id'. It clearly distinguishes itself from siblings by stating it answers what the catalog cannot and explicitly contrasts with list_workflow_types. The return behavior (question vs recommendation) is also specified.
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 when-to-use and when-not-to-use guidance: call with any known info, use list_workflow_types and start_workflow directly for unlisted frameworks, and re-scope on registry changes. Includes a concrete typical opening example with parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearchARead-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 response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered.
| 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. | |
| 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description goes far beyond that: it discloses strict-miss semantics (meta.outcome='NO_STRICT_MATCH'), withheld relaxed matches, daily quotas, concurrency limits, ranking/companion-row behavior, and error contracts (unresolved_scope, query_too_long). This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical constraint (at least one scope axis is required) is front-loaded, which is good, but the body is enormously oversized for a single search tool and repeats material already present in the schema and in meta-field documentation. Many sentences document downstream response contracts rather than what an agent needs to select or invoke this 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 12-parameter, no-output-schema tool with complex tiering and recovery flows, the description is more than complete — it covers scope resolution, query shaping, miss handling, budgets, and ranking. Nothing needed 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 schema already documents each parameter; the baseline would be 3. The description nonetheless adds non-schema meaning — e.g., the query-length refusal, OR-vs-AND handling, broadening semantics tied to allow_broadening, and the cross-axis intersection rule for jurisdictions+sectors — so it exceeds the 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?
The opening line states the core function — a keyword search that requires at least one jurisdiction/framework/sector/source scope — and explicitly distinguishes itself from siblings by noting there is no separate search_case_law or search_preparatory_works tool and that search_guidance handles guidance alone. It is a clear verb+resource, though the purpose is buried under a very long protocol body.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is exhaustively covered: explicit query-shape rules (one concept per call, bare OR for synonyms only, AND/NOT/NEAR stripped), tier limits, when to use sources vs jurisdictions, and how to respond to each recommended_action. Alternatives and when-not-to-do-things (never broaden unprompted) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. | |
| 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. | |
| 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 only say readOnlyHint=false, destructiveHint=false, openWorldHint=false. The description carries the real behavioral burden and does so richly: it discloses that starting SPENDS a run, that a cancel does not refund runs on free/solo, that questions_for_user is advisory while requires_user_input=true gates are server-enforced, that the workflow_type enum is caller-authorized only when a fresh registry snapshot exists, and that output can be JSON or watermarked html/pdf. This adds substantial context beyond the annotations with no contradiction.
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 and dense — roughly 300 words across several clauses — and is not a model of brevity. However, every sentence earns its place given the tool's complexity: tier-fencing, variant catalogs, run allowances, and advisory-vs-enforced input gates all need to be stated. The core purpose is front-loaded in the first sentence, and the parameter/semantic details follow logically. Slightly over-length but justified; not padded.
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 elaboration. The description covers prerequisites (list_workflow_types first, get_my_capabilities for allowance), tier restrictions, run-allocation consequences, the input-gate model, and output formats. For a stateful, tier-fenced workflow launcher with side effects, everything an agent needs to call it correctly is present. Nothing material 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 adds genuine value: it explains that workflow_type must come from list_workflow_types rather than guessing from an example, that the enum is caller-authorized and may degrade to a string, and that the base gap_analysis type requires a framework. It also clarifies the framework argument accepts only nis2/dora/cra/eu_ai_act on free/solo. This exceeds baseline by tying parameters to the live-registry semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb+resource ('Begin a structured workflow selected from the live workflow registry') and enumerates the exact catalog covered — threat/privacy modeling, risk/TARA, DPIA/FRIA, gap analysis, SORA, etc. It distinguishes itself from siblings like list_workflow_types (the authoritative id source) and list_workflows. An agent can clearly tell what this tool does and what it is not.
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 instructs 'Call list_workflow_types first' and names get_my_capabilities as the check for remaining allowance, and cancel_workflow as the companion. It gives tier-fencing rules (free/solo seven types, Premium adds the interview-grounded catalog, Team/Company required for document review/tender/adversary), which routes the agent to the correct usage path. It even mandates getting user OK before calling — explicit when-to-use guidance with named alternatives.
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 CitationARead-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 response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered.
| 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. |
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 significant behavioral context: it confirms the citation resolves in the served corpus rather than asserting real-world legal status, explains the response returns current served text, and describes the output structure including the 'Sources used' section and meta.render_contract. This goes far beyond the annotations and sets accurate 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 front-loaded with the primary purpose and is information-dense. However, the final sentence is a long, run-on construction that combines the 'Sources used' section, the zero-result note, and meta.render_contract into a single sentence. It is still efficient, but slightly less crisp than a fully bulleted or shorter structure would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema, the description does a thorough job of explaining what the response will contain: current served text, a 'Sources used' table, a zero-result note, and meta.render_contract. It also covers limitations and alternatives, making it complete for an agent to know when to use the tool and what to expect.
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 parameters law, article, and jurisdiction are already fully described in the schema. The description does not add any parameter-specific meaning beyond what the schema provides; it discusses the overall behavior but not the semantics of individual arguments. This meets the baseline but does not exceed 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 opens with 'Verify a legal citation against the served corpus', which is a specific verb+resource+method. It clearly distinguishes from siblings by stating what it does NOT do (assert legal in-force status, consult amendment feeds) and explicitly names 'diff' as the alternative for provision-level change comparison. This fully differentiates it from tools like get_provision or search.
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 when to use the tool: "Use this when someone asks 'is this citation correct' or 'check whether Article 28 GDPR still says this'". It also provides an exclusion by noting it does not assert legal in-force status and does not consult amendment feeds, and it names 'diff' as the alternative for provision-level changes. This is clear, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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. 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; 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, openWorldHint, and destructiveHint annotations, the description explains source-pinned lookup, producer identity checks, byte-for-byte comparison, verdict semantics, stale-feed refusal behavior, attestation provisions, and tier restrictions. This gives an agent a rich, accurate picture of what will and will not happen.
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, but the density is justified by five distinct lookup lanes, many verdicts, freshness rules, and tier semantics. It is front-loaded with purpose and contains little filler, though the single unbroken block of text makes scanning harder than a structured format would.
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?
Everything an agent needs to invoke this tool correctly is present: verdict vocabulary, lane routing rules, coverage and freshness behaviors, authentication and tier requirements, quotas and concurrency, and explicit boundaries. With an output schema also available, no critical operational detail 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 complete, but the description adds essential meaning: source_id must be the routed corpus id rather than the citation's mcp_server, reference semantics differ by lane, empty quotation is a refusal rather than a mismatch, and quotation length rules are elaborated. This materially improves correct invocation beyond the schema alone.
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 the tool 'Verify submitted legal citations against what this gateway actually serves' with a clear resource and goal, and the verdict list makes its behavior concrete. However, it does not explicitly distinguish itself from the sibling tool validate_citation, which likely overlaps in purpose, so it misses the top tier for sibling differentiation.
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 the tool applies, including limits, quota effects, tier-gated attestation, and explicit exclusions such as 'First-party doc:// document pinpoints are not verified here' and KEV/EPSS quotations not being verified on the CVE lane. It does not name alternative sibling tools or provide direct 'use X instead' guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
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"
2 tool updates
- Changed
describe_capabilities2 fields changed- added
Input schema / properties / content_kindAdded value: +{ + "default": "", + "description": "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.", + "title": "Content Kind", + "type": "string" +} - changed
Input schema / properties / domain / descriptionPrevious value: -"Exact declared domain; requires section='sources'. Unknown values return an empty page."New value: +"Exact declared domain ('telecom' is accepted for 'telecommunications-media'); requires section='sources'. Unknown values return an empty page."
- Changed
list_coverage2 fields changed- added
Input schema / properties / content_kindAdded value: +{ + "default": "", + "description": "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.", + "title": "Content Kind", + "type": "string" +} - changed
Input schema / properties / domain / descriptionPrevious value: -"Legal domain to narrow the jurisdiction list to, such as 'cybersecurity' or 'aviation' ('drone' and 'uas' are accepted for the latter). The law and provision counts stay whole-jurisdiction; the domain-scoped signal is the returned sources and frameworks."New value: +"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."
2 tool updates
- Changed
describe_capabilities1 field changed- changed
Input schema / properties / jurisdiction / descriptionPrevious value: -"Exact declared jurisdiction with canonical aliasing; requires section='sources'."New 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'."
- Removed
probe_corpus
2 tool updates
- Changed
describe_capabilities1 field changed- changed
Input schema / properties / limit / defaultPrevious value: -12New value: +4
- Added
validate_claim
1 tool update
- Changed
verify_citations1 field changed- added
Input schema / properties / attestAdded value: +{ + "default": false, + "description": "Request signed evidence attestations (premium and above); defaults to false.", + "title": "Attest", + "type": "boolean" +}
1 tool update
- Added
verify_citations
1 tool update
- Changed
search1 field changed- changed
Input schema / properties / legal_areas / descriptionPrevious value: -"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. Legal order stays on jurisdictions=: legal_areas=['civielRecht'] with jurisdictions=['NL','EU'] filters the Dutch rows and keeps the EU rows, flagged unfiltered. No tier gate."New value: +"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."
1 tool update
- Changed
search1 field changed- changed
Input schema / properties / legal_areas / descriptionPrevious value: -"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. 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. 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. Legal order stays on jurisdictions=: legal_areas=['civielRecht'] with jurisdictions=['NL','EU'] filters the Dutch rows and keeps the EU rows, flagged unfiltered. No tier gate."New value: +"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. Legal order stays on jurisdictions=: legal_areas=['civielRecht'] with jurisdictions=['NL','EU'] filters the Dutch rows and keeps the EU rows, flagged unfiltered. No tier gate."
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 gradedqualityBmaintenanceEnables searching and quoting EU legislation with verifiable EUR-Lex citations, including GDPR, NIS2, DORA, and the EU AI Act.131 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- FlicenseAqualityBmaintenance40 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-
- AlicenseNot gradedqualityBmaintenanceAcquis gives your assistant exact, verifiable access to EU digital regulation. Instead of paraphrasing from training data, it returns the verbatim provision of the current consolidated version — with the full citation (act, article, paragraph, point), its in-force status, the consolidation date, and a deep link to EUR-Lex so every claim can be checked. The legal text is rendered from the signed cMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.