Skip to main content
Glama
Mipiti
by Mipiti

Mipiti MCP Server

MCP (Model Context Protocol) server for Mipiti — security posture platform.

Lets AI coding agents (Claude Code, Claude Desktop, Cursor, etc.) generate and manage threat models, controls, assumptions, compliance mapping, and evidence programmatically.

The Mipiti backend hosts an MCP server at https://api.mipiti.io/mcp. No installation needed — just configure your MCP client to connect.

Claude Code (quickstart)

claude mcp add --transport http Mipiti https://api.mipiti.io/mcp

You'll be prompted to log in via your browser (OAuth). That's it.

OAuth (manual config)

MCP clients with OAuth support (Claude Code, Claude Desktop, Cursor) automatically prompt you to log in via your browser. Add to your project's .mcp.json:

{
  "mcpServers": {
    "mipiti": {
      "type": "http",
      "url": "https://api.mipiti.io/mcp"
    }
  }
}

On first connection, your MCP client opens a browser window where you approve access with your Mipiti account. Tokens refresh automatically.

API Key

For clients without OAuth support, or headless/CI environments, create an API key in Settings:

{
  "mcpServers": {
    "mipiti": {
      "type": "http",
      "url": "https://api.mipiti.io/mcp",
      "headers": {
        "X-API-Key": "your-api-key"
      }
    }
  }
}

Related MCP server: threatmodel-mcp

Standalone Package (Alternative)

If you prefer running the MCP server locally (e.g., for development or self-hosted instances), install the mipiti-mcp package. This is a thin HTTP client that calls the Mipiti API.

pip install mipiti-mcp
# Or run directly with uvx
uvx mipiti-mcp

Environment Variables

Variable

Required

Default

Description

MIPITI_API_KEY

Yes

Your Mipiti API key

MIPITI_API_URL

No

https://api.mipiti.io

API base URL

SERVER_VERSION

Yes

Identifier for the running server's MCP surface (instructions, tool docstrings, schemas, behavior). Sent on every tool call. Clients invalidate cached MCP guidance when this changes. For local runs, any sentinel string is fine ("local", "dev"). For deployed runs, use a value that changes when this package's source changes (commit SHA is typical).

Claude Code (standalone)

{
  "mcpServers": {
    "mipiti": {
      "command": "uvx",
      "args": ["mipiti-mcp"],
      "env": {
        "MIPITI_API_KEY": "your-api-key",
        "SERVER_VERSION": "local"
      }
    }
  }
}

Tools (139)

Threat Modeling

Tool

Description

generate_threat_model

Generate a complete threat model from a feature description. Runs a multi-step AI pipeline producing trust boundaries, assets, attackers, control objectives, and assumptions. Progress reported automatically via MCP protocol — the tool blocks until complete. Optional provenance_* params record where the description came from at creation (for a repository: provenance_kind="code" + provenance_repo_url + provenance_commit_sha).

set_model_provenance

Record where a model's description came from (code / ticket / document / manual / mixed). code with a commit SHA means the code is authoritative and the model follows it; anything else means the description is intent and the code is measured against it. Bumps the model version.

refine_threat_model

Refine an existing threat model based on an instruction. Creates a new version. Only affected entity types are modified — unaffected entities are preserved server-side.

query_threat_model

Ask a question about an existing threat model.

get_threat_model

Get the full details of a specific threat model (trust boundaries, assets, attackers, assumptions). Use include_cos=True to include control objectives.

list_threat_models

List all saved threat models with IDs, titles, versions, and creation dates. Supports source filter and include_assessment_summary=True to inline per-model posture counts in one call (avoids N+1 looping assess_model).

rename_threat_model

Rename a model (metadata only, no new version). Titles must be unique within a workspace (case-insensitive).

delete_threat_model

Permanently delete a model and all its data.

export_report (scope="model")

Export as PDF, HTML, or CSV.

export_report (scope="model", format="archive")

Export the self-contained JSON audit archive (every version, controls, assertions with CI verdicts, findings, attestations, sufficiency signatures). Independently verifiable: the verdicts in it are the origin's record of what it claimed, which is what a third party checks against the signatures.

import_threat_model_archive

Restore an audit archive into a target workspace. Fresh model_id per import; title collisions auto-suffix. The restored model arrives unverified — the origin's assertion verdicts and run-attested flags are not credited in the importing workspace, which earns them by running verification against code it can reach.

Entity CRUD

Tool

Description

add_asset / edit_asset / remove_entity (entity_type="asset")

Targeted single-entity changes for assets. Creates a new version.

add_attacker / edit_attacker / remove_entity (entity_type="attacker")

Same for attackers. surface_extent (whole: the attacker's operations range over any entry of the interface it reaches; point: one named entry) is an operator declaration: supplying it attests it and requires change_reason on either tool, and an attested whole makes the objectives that attacker anchors for-all obligations. A create declares only whole; narrowing is an edit_attacker call, checked against the objectives the attacker anchors.

get_entity

Read one entity of any kind. An attacker also carries surface_extent and surface_extent_source, which says whether a person attested it.

Trust Boundaries

Tool

Description

get_threat_model

Returns existing trust boundaries (along with assets, attackers, assumptions). Review current boundaries before adding or modifying.

add_trust_boundary / edit_trust_boundary / remove_entity (entity_type="trust_boundary")

CRUD for trust boundaries. Defines where trust transitions occur in the system architecture. Attackers are positioned at boundaries; COs are annotated with boundary reachability. Changes auto-generate boundary assumptions for newly unreachable COs.

Controls

Tool

Description

get_controls

List controls with current status. Use summary_only=True for compact response.

get_control_objectives

List COs with which controls cover each one. Pair with get_reachability_verdicts for per-CO composer reachability state.

update_control_status

Mark implemented or not_implemented. Requires at least one assertion first.

refine_control

Modify a control's description with justification. Platform evaluates whether the mitigation group still covers the COs.

regenerate_controls

Regenerate controls. Supports mode="per_co" and co_ids to target specific COs.

import_controls

Import controls from JSON or free text, auto-mapped to COs and deduplicated.

delete_control

Soft-delete with justification. Blocked if it's the only control covering a CO.

check_control_gaps

AI-powered gap analysis across all controls.

get_mitigation_groups / set_mitigation_groups

Inspect and modify how controls are grouped into mitigation paths for a CO (AND within groups, OR across groups). Platform AI-evaluates whether proposed changes preserve CO coverage.

set_control_objective_cal

Set per-CO ISO/SAE 21434 Cybersecurity Assurance Level (1-4). Persisted on the control_objectives identity side-table; survives soft-delete + revival; no new model version.

Assumptions and Attestation

Tool

Description

get_threat_model

Returns existing assumptions (along with assets, attackers, trust boundaries). Review current assumptions before adding or modifying.

add_assumption

Add an assumption, optionally linking it to COs via linked_co_ids.

edit_assumption

Update description and/or linked COs.

remove_entity (entity_type="assumption")

Soft-delete (preserved for audit). Linked COs are no longer mitigated by it.

restore_assumption

Restore a soft-deleted assumption. Re-attestation required.

submit_attestation

Record that a responsible party affirmed an assumption holds. Provide attested_by, statement, expires_at. A claim, never a proof over every site: it can cover an existential clause and never a for-all one.

list_attestations

Attestation history for an assumption.

set_control_assumption_groups

Declaratively set a control's assumption group structure: mark it externally handled by a single assumption (shorthand), clear that status (control reverts to not_implemented), or express compound cases with multiple groups (within a group = AND, across groups = OR; e.g. "AWS KMS + quarterly review"). Attested groups count as active for mitigation group completeness.

get_control_assumption_groups

Inspect the current assumption group structure on a control. Groups express alternative sets of external claims (within = AND, across = OR).

convert_assumption_to_controls

Generate controls for assumption-covered COs and retire the assumption linkage.

Assertions and Evidence

Tool

Description

get_assertion_types

The catalogue as data: every type, what it proves, its soundness class, its params (an array-valued param carries its item schema), and the class vocabulary. Read-only.

submit_assertions

Submit typed, machine-verifiable claims about system properties (30 assertion types). Each object may carry covers: the objective id (CO-NN) or clause ids (cls_…) it proves; a declared binding survives review, an undeclared one is inferred and capped below sound credit.

list_assertions / delete_assertion

List or delete assertions for a control.

add_evidence / remove_evidence

Attach auxiliary metadata (docs, links). Evidence is contextual — only assertions prove implementation.

get_verification_report

Shows verified, partially verified, and unverified controls with sufficiency details.

get_sufficiency

Quick check: do assertions for a single control collectively cover all aspects? For the per-clause work list read get_control_work_order: where the order names a required class for a clause, required_evidence carries the class, the clause id to bind evidence to, and a submission skeleton to fill in. A claim that carries a soundness_tier reports its weakest clause's tier.

get_scan_prompt

Returns targeted prompts for scanning the codebase against not_implemented controls.

get_review_queue

The workspace review queue, ranked: escalation, proposal, open_assumption, stale_control (implemented/verified controls not checked in 90+ days). Escalations and proposals are decided with decide_proposal. Start here for periodic maintenance.

submit_findings / list_findings / update_finding

Report and track negative findings (gap discovery).

preview_finding_remediation

Read-only. Returns a structured diff describing the changes a subsequent apply_finding_remediation call would make. Diff shape depends on the finding's kind (e.g. for structural_duplicate_controls: which controls would be kept, which dropped, the union of CO mappings + framework refs that would land on the survivor). Call before apply_finding_remediation so the operator can confirm.

apply_finding_remediation

Mutates state: commits the changes preview_finding_remediation showed. Requires a non-empty justification (one-line operator rationale) recorded on the audit trail. The agent is responsible for the preview-then-apply norm — surface the diff and get explicit confirmation before calling.

Evidence soundness classes

Every assertion type declares the class of the fact it reports, and the class bounds what a passing verdict can establish. get_assertion_types returns it per type; the platform and the CI verifier hold their own tables equal to the catalogue's.

Class

A pass establishes

Types

presence

A named construct, configuration value, dependency, file or pattern occurrence exists in the tree. Existence, not behaviour; a test file existing is presence.

function_exists, class_exists, test_exists, the configuration, dependency, semantic and RTL structure types

under_approximating_scan

A syntactic scan over a scope with no false-positive guarantee. A clean result proves the absence of the syntactic form only.

pattern_matches, pattern_absent, no_plaintext_secret

existential_witness

A signed statement that a named execution ran and passed at this commit. Proves the path it drove and nothing beyond it.

test_attested

sound_over_approximation

Every site in a declared scope that can violate the property was enumerated, and each is a declared safe form or a reviewed exception. Sound modulo the declared sink list.

sink_default_deny

by_construction

The sink accepts only a declared boundary type, and every construction site of that type is default-denied.

typed_boundary

A clause that ranges over every entry of a surface (every endpoint, every query, every frame) is credited only by one of the two sound classes bound to it with covers; a test proves only the path it drove, and an attestation is a responsible party's claim. Which types carrying those classes a platform takes is a read, not an assumption: get_control_work_order's assertion_contract.sound_types names them, and where it names none the acts that remain are to scope the asset to the component the attacker actually reaches, attest a point extent with its reason, or record a risk acceptance or a not-applicable disposition. The two sound types take a declared scope, the sinks through which the property could be violated (a call, a constructor, a macro, a store to a named target such as an HDL assignment, or a module instantiation), a reviewed allowlist, and the property in one sentence; sink_default_deny adds the accepted safe_forms, typed_boundary the boundary_type and its constructors. Hardware sources are covered by the same rule.

Agent work orders & delegation

Tool

Description

get_control_work_order

The ticket for implementing one control: scan brief, what counts as proof (assertion contract), acceptance criteria, steps, reconcile rules, what this agent may decide on its own, open proposals, and the model's provenance. Call before implementing a control. Read-only.

reconcile_model

Reconcile the model with the code: pass the paths changed since the recorded commit and your observations (mechanism_named, component_present, component_absent, forbidden_behavior). The platform decides the consequence of each; proposals are never applied on the agent's word, except a component change on a code-derived model, which is applied and queued for a person's review.

create_proposal

Raise a change of scope or design (add_component, remove_component, design_change). Raising is not deciding: a person (or an agent under a delegation rule) decides it with decide_proposal; design changes are never applied automatically.

list_proposals

Proposals and escalations on a model with their status (proposed / applied_pending_review open; accepted / rejected / reverted / superseded closed). A refused judgment (403 with escalation_id) appears as a decision_request; poll here until a person resolves it. Read-only.

decide_proposal

Accept or reject a proposal. A judgment: refused with 403 and an escalation_id unless the workspace's delegation policy names the decision for this agent at the proposal's tier. Do not retry a refusal.

get_design_leverage

What eliminating each attacker position or asset by design would remove from the matrix, ranked by critical then high at-risk objectives removed. include_design_moves=True authors a concrete design_move per row; turn one into a design_change proposal with create_proposal. Read-only.

list_decisions

The model's decision ledger: every judgment recorded on it (finding dismissed / remediated, risk accepted, not-applicable declared, proposal accepted / rejected / reverted, escalation resolved), newest first, with who decided and whether it was within the delegation policy. Append-only; nothing edits it. Call before raising a proposal or asking for a judgment, so you do not propose what a person rejected or ask again for what was already decided. Read-only.

Assurance

Tool

Description

assess_model

Deterministic assessment of all COs. Returns mitigated/at_risk/unassessed with risk_reason (missing_controls, pending_attestation, expired_attestation, coverage_gap, insufficient_by_design). For per-CO reachability state call get_reachability_verdicts.

get_findings_risks

Workspace-scoped triage dashboard: open findings, active risk acceptances, and at-risk COs across every model the workspace can access. Entry point when asked "what's open?".

get_risk_view (scope="model")

Per-model Prioritized Risk View: one row per live CO with derived risk tier, asset impact, attacker likelihood, control coverage, and open-finding count.

get_risk_view (scope="system")

Cross-model variant of get_risk_view (scope="model"): same shape, aggregated across every model in a System (model_id + model_title attached per row).

get_remediation_leverage

Per-model remediation plan: the not-yet-satisfied controls ranked by how many COs each one closes, plus a greedy minimal fix order (summary / ranked / greedy_plan). Use to prioritize which controls to implement first for the shortest path to coverage.

list_risk_acceptances

All risk acceptances on a model — risks explicitly accepted instead of mitigated. Includes CO id, owner, justification, status, review deadline.

create_co_disposition

Record that a control objective does not apply to this system (owner, justification, review deadline). The sibling of a risk acceptance: an acceptance says the exposure is real and is being carried, a disposition says the objective does not apply here at all. The objective stays in the matrix and in every coverage count, reported in its own class — what is suppressed is work (no controls generated, no coverage gap raised), never the accounting.

list_co_dispositions

Every signed judgment on a model's objectives, both kinds. Expired and revoked entries are included: a lapsed decision is part of the audit trail. Optional kind filter.

recompute_verdicts

Force-enqueue a fresh evaluation of every control's coverage verdict and every live CO's group-sufficiency verdict, bypassing the quiet-period batching. Response carries an informational cost estimate and a spend status object — exhausted means the work is queued and resumes automatically, never dropped.

recompute_verdicts (dry_run=True)

Pre-flight informational cost estimate for recompute_verdicts (carries computed_at + the pricing rate_version; nothing is charged from the estimate — actuals are metered as evaluation runs).

Functional Conformance

Proves a feature does what it was specified to do (Capability × Condition), verified by the same assertion + CI engine as security controls.

Tool

Description

generate_functional_objectives

Derive capabilities (behaviours the feature must deliver), Given-When-Then functional objectives (walking each capability against a taxonomy of operating conditions), and a concrete implementable test per objective — so the agent implements the tests rather than deciding what to test. Requires a Pro plan; billable. refresh=true re-derives.

list_capabilities / get_capability

Read the capability decomposition.

get_functional_objectives

Read the functional objectives (the test plan).

get_functional_coverage

Per-objective + per-test state (verified / covered / failing / untested), the Capabilities × Conditions matrix, and applicable / missing-objective / not-applicable cell accounting.

check_functional_gaps

Actionable gaps: applicable conditions with no objective yet, plus objectives that are failing or untested.

get_scan_prompt (kind="functional")

The agent brief: per not-yet-verified test, its implementation brief and the objectives it proves; plus objectives with no test and applicable conditions with no objective.

add_functional_test

Manually register an extra test satisfying one or more objectives (generation already specifies the tests; a manual test survives regeneration).

submit_functional_test_assertions

Submit evidence assertions for a functional test (verified in CI, same as control evidence).

Composition (recursive-tree effective model)

Views over the effective model — own entities composed with everything inherited from ancestor threat models on the recursive tree. Backend-gated by TREE_COMPOSITION_ENABLED; when off, read tools return a stable empty body with flag_enabled: false and the write tool returns 503.

Tool

Description

get_composition_overview

Index: counts + tree metadata (parent_id, ancestor_chain, depth, child_ids) + structural warnings. Cheapest call — use first to learn whether composition is enabled and orient on the tree.

list_effective_entities

Effective entity set keyed by kind (trust boundaries, components, assets, attackers, attack paths). Each entry carries provenance (own vs inherited) and a fully-qualified id for cross-model references.

list_effective_control_objectives

Effective COs tagged with origin (own / cross / inherited). Pair with get_effective_coverage and get_reachability_verdicts (composed=True).

get_effective_coverage

Per-CO coverage with credited inheritance: own_credit, inherited_credit, and the list of contributing controls (with the owning model id, origin, verification status, mitigation group). This is what drives the composition coverage view, not per-model get_verification_report.

get_reachability_verdicts (composed=True)

Per-CO reachability verdicts over the composed effective topology — same kinds (reachable / unreachable / indeterminate) as get_reachability_verdicts, but evaluated against the merged tree. Use on child models when ancestor topology matters.

list_effective_attack_paths

Effective AttackPath set + lifted missing/dangling suggestions computed against the composed reach surface.

list_reconciliation_candidates

Paginated reconciliation candidates between this model and its ancestors. Tier certain is a deterministic match safe to auto-apply; tier heuristic is fuzzy and needs review.

apply_certain_reconciliation_match

Mutating. Apply a certain-tier candidate from list_reconciliation_candidates: soft-deletes the descendant's own duplicate so the inherited entity becomes canonical. Server re-validates against current live state and refuses heuristic-tier candidates (those need operator-driven structural-divergence review). Bumps model version; returns the standard _do_entity_crud envelope ({model, controls_carried, controls_orphaned, orphaned_control_ids}).

reject_reconciliation_candidate

Mutating. Persist the operator's "these are NOT duplicates" decision at org scope so the candidate detector filters this pair out of the active queue on subsequent reads. Idempotent on the natural key (model_id, kind, own_qid, inherited_qid). Does NOT bump model version (rejection is org state). Returns the persisted record — keep the id if the operator may unreject later.

unreject_reconciliation_candidate

Mutating. Remove a persisted rejection by surrogate id (from list_reconciliation_candidates (disposition="rejected") or the return value of reject_reconciliation_candidate). The pair becomes eligible to surface in the active queue again on the next read. Returns {ok: true}.

list_reconciliation_candidates (disposition="rejected")

List the persisted rejections on a model in rejected_at ascending order — the same set the candidate detector consults to filter the active queue. Use to render a rejected section in a triage view or to find the surrogate id needed by unreject_reconciliation_candidate.

lift_composition_entity

Mutating. Promote a shared-anchor entity from two sibling descendants to their lowest common ancestor: each source's copy is soft-deleted and the inherited entity becomes canonical for every descendant of the LCA. Server re-detects field-level and attached-state conflicts against current live state; pass field_resolutions / attached_state_resolutions keyed by the conflict keys returned in the 400 detail. Server also runs an over-application gate against the LCA's descendant set; pass acknowledged_third_party_subtrees to acknowledge extra reach or skip_overapplication_gate=true to override after explicit operator confirmation. Bumps version on the LCA + both source descendants; returns {lift_id, lca_model, descendant_a_model, descendant_b_model, applied_migrations, lift_event} — the lift_event block matches the audit pack's lift_history entry.

split_composition_entity

Mutating. Inverse of lift_composition_entity: push an ancestor-owned entity down to one or more target descendants and soft-delete the ancestor's copy. A new local id is minted on each target; attached state (assertions, jira mappings, risk acceptances) on the ancestor's entity is duplicated to every target. Bumps version on the ancestor + every target descendant; returns {split_id, ancestor_model, descendant_models, applied_duplications, split_event} — the split_event block matches the audit pack's split_history entry.

preview_undo_composition (event_type="lift")

Read-only. Compute the inverse plan (or divergence refusal) for a prior lift_applied event WITHOUT mutating state. Returns {plan, refusal} — exactly one is non-null. Surface this to the operator before calling undo_composition_event (event_type="lift") so the confirmation step shows the state operations the apply would commit, or the enumerated reasons the divergence detector would refuse.

undo_composition_event (event_type="lift")

Mutating. Apply the inverse of a previous lift_applied event. Re-runs the divergence detector immediately before applying and refuses with 409 + a structured refusal block (detail.refusal.reasons) when state has materially evolved since the forward lift. On success, persists the inverse state operations across the LCA + every affected source descendant and emits a structured lift_undone activity event citing original_event_id so the audit pack chains undo to its forward. Returns {undone_event_id, original_event_id, applied_state_ops, models: {lca_model, source_descendant_models}}.

preview_undo_composition (event_type="split")

Read-only. Counterpart to preview_undo_composition (event_type="lift") for splits. Same {plan, refusal} shape; the plan block carries the split-specific inverse operations (restore at the ancestor, tombstone the duplicated copies on every target descendant).

undo_composition_event (event_type="split")

Mutating. Mirror of undo_composition_event (event_type="lift") for splits. Same divergence-detector contract — refuses with 409 + structured refusal block when state has evolved. On success, restores the ancestor's entity, tombstones the duplicated copies on every target descendant, and emits a structured split_undone activity event citing original_event_id. Returns {undone_event_id, original_event_id, applied_state_ops, models: {ancestor_model, descendant_models}}.

Cross-model dependencies (delegation)

Declared reliance edges (distinct from the parent/composition tree, which is containment): a model depends on a control implemented in another model — for systems built on shared services (auth, logging, shared data) rather than sub-parts. The target is always a provider control (credit terminates at a proven mechanism). Reliance is workspace-scoped: a consumer can only delegate to provider models in the same workspace (these tools don't see models across workspace boundaries). Backend-gated by RECURSIVE_TREE_ENABLED; credit effects further gated by FOUNDATION_DELEGATION_ENABLED.

Tool

Description

declare_foundation

Mark a shared-service model as a foundation that advertises specific controls (provides) other models can delegate to. A capability advertises a control, never an objective.

create_reliance

Declare a single dependency. delegated (consumer has no local control for an objective; provider handles it — pass source_objective_id) or relied_upon (consumer keeps its own control but its validity depends on the provider's — pass source_control_id). Enters draft; runs LLM semantic validation.

confirm_reliance

Promote a draft edge to active — the credit-soundness gate. Refused unless validation returned valid; a partial/mode-mismatch is never silently credited.

delete_reliance

Remove a reliance edge.

list_reliance

A model's dependency edges (as consumer) plus who relies on it (as provider — the blast radius before changing its controls).

propose_attach_foundation

Read-only. Propose which of a consumer's objectives each foundation capability covers (scored). Feed the chosen subset to attach_foundation.

attach_foundation

Bulk-create draft delegation edges for the selected (objective, provider control) pairs. Each runs LLM validation; none credits until confirmed.

Tags (grouping)

Overlapping, semantics-free grouping of models (the Affiliation primitive) — for audit scopes, ad-hoc selections, or portfolios. A model may carry many tags; a tag never affects posture or credit.

Tool

Description

create_group (kind="tag") / delete_group

Create or remove a tag (deleting affects the grouping only, not the member models).

add_model_to_group (kind="tag") / remove_model_from_group

Manage membership; a model can belong to many tags at once.

list_groups (kind="tag") / list_model_groups

Browse the workspace's tags, or a model's tags.

get_risk_view (scope="tag")

Aggregate per-CO risk across a tag's members. Delegation-aware (a CO mitigated via a verified cross-model delegation reads as covered).

select_compliance_frameworks (scope="tag")

Make a tag a compliance/audit scope: select frameworks for the tag, propagated to its members.

get_compliance_report (scope="tag")

Cross-model compliance coverage report scoped to a tag's members (the tag equivalent of the system compliance report).

export_report (scope="tag")

Signed auditor HTML for a tag — member reports + cross-model dependency graph + attestation status (the tag equivalent of the system auditor export).

Compliance

Tool

Description

list_compliance_frameworks

Available frameworks (OWASP ASVS, ISO 27001, SOC 2, NIST CSF, GDPR, FedRAMP, PCI DSS, EU CRA).

select_compliance_frameworks

Select frameworks for a model.

get_compliance_report

Coverage report for a selected framework.

auto_map_controls

AI-powered semantic mapping of controls to framework requirements.

map_control_to_requirement

Manual control-to-requirement mapping.

auto_remediate_compliance

LLM-powered gap closure — proposes new assets, attackers, and controls for uncovered framework requirements.

Components

Tool

Description

add_component / edit_component / remove_entity (entity_type="component")

Components bridge trust boundaries (security architecture) to repositories (code organization). Component(id, name, repo_url, path, trust_boundary_ids) scopes controls to the codebase that implements them. Used for multi-repo systems and per-repo threat models. edit_component also accepts optional per-component level grades: target_sl (IEC 62443 Security Level, 1-4), eal (Common Criteria Evaluation Assurance Level, 1-7), fips_level (FIPS 140-3 Security Level, 1-4).

Systems and Workspaces

Tool

Description

update_organization

Set per-organization level grades: target_ml (IEC 62443-4-1 Maturity Level, 1-5), csf_tier (NIST CSF Tier, 1-4). Admin-only. Use clear_target_ml / clear_csf_tier to explicitly reset to NULL.

list_groups (kind="system") / get_group / create_group (kind="system")

Manage systems (groups of related models).

add_model_to_group (kind="system")

Add a model to a system.

get_system_dependencies

Cross-model dependency graph with satisfaction status for assumptions linked to other models.

link_system_dependency

Link a cross-model assumption to a target model — dual-path satisfaction (controls OR manual attestation).

select_compliance_frameworks (scope="system") / get_compliance_report (scope="system")

System-level compliance aggregation.

Setup and Operations

Tool

Description

get_setup_status

Check which onboarding steps are done.

complete_setup_step

Mark an onboarding step as done (mcp_configured, mipiti_verify_installed, ci_secret_added, ci_pipeline_added).

CWE Classification

Tool

Description

get_cwe_catalog

Get the platform's CWE reference catalog status (current MITRE version, entry count). Reports enabled: false when not turned on for this instance.

get_model_cwe_tags

List CWE weakness classifications tagged onto a model's control objectives, with a staleness marker for tags whose catalog entry has since been deprecated, redefined, or removed.

classify_model_cwe

Classify a model's control objectives against the platform CWE catalog. Grounded — the model may only select from the catalog's current candidates, and every returned id is re-validated before storage.

Development

git clone https://github.com/Mipiti/mipiti-mcp.git
cd mipiti-mcp
pip install -e ".[dev]"
python -m pytest -v

Local Testing with Claude Desktop

{
  "mcpServers": {
    "mipiti": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/mipiti-mcp", "mipiti-mcp"],
      "env": {
        "MIPITI_API_KEY": "your-key"
      }
    }
  }
}

License

Proprietary. Copyright (c) 2026 Mipiti, Inc. All rights reserved. See LICENSE for details.

Available Tools

139 tools
accept_coverage_divergencesAccept Coverage DivergencesA

Accept a set of coverage divergences as mapping changes, in one batch.

Each accepted missing_mapping ADDS its CO to the control; each spurious_mapping REMOVES it. Applied as one version per affected control. Each item is validated independently — the response separates applied from skipped (stale / would-orphan / already in that state), so a partial batch still lands its valid items.

Read the rows first with get_verdict_divergence; to accept only the high-confidence ones, filter its coverage rows by p_covers (near 1.0 for missing_mapping, near 0.0 for spurious_mapping) before passing them here.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesJSON array of {"control_id", "co_id", "kind"} objects, where kind is "missing_mapping" or "spurious_mapping".
model_idYesID of the threat model.
change_reasonYesWhy these mapping changes are appropriate (min 10 chars). Recorded on every affected control's version history.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden and does so well: it discloses that missing_mapping adds coverage while spurious_mapping removes it, that changes are batched as one version per affected control, that validation is per-item, and that partial batches still apply valid items.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clear one-sentence summary, then uses compact paragraphs to add essential behavioral detail and usage workflow. Every sentence contributes information, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating batch tool with no annotations, the description covers core effects, validation behavior, and prerequisite workflow. The presence of an output schema reduces the need to describe return values. Minor missing context is the meaning of server_version, but overall the description is sufficient for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the baseline is 3; the description adds value beyond the schema by explaining the behavioral meaning of each item kind and by advising how to filter coverage rows before constructing the items array. The only gap is server_version, which remains undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Accept a set of coverage divergences'), the resource ('coverage divergences'), and the batch scope ('as mapping changes, in one batch'). It also differentiates the semantics of the two item kinds, making the tool's specific role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit sequencing guidance: read rows first with get_verdict_divergence, optionally filter by p_covers, then pass items here. It does not explicitly contrast with sibling dismiss_verdict_divergences, but the prerequisite workflow is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_assetAdd AssetA

Add a new asset to a threat model. Creates a new version.

Authoring contract: name the data or resource being protected and the security property at stake (Confidentiality / Integrity / Availability / Usage) — not a mechanism, control, or capability. Name the thing whose exposure or corruption is the harm (e.g. "per-organization key-wrapping material", not "KMS encryption"). An asset phrased as a mechanism is flagged with a quality_warning and the control objectives derived from it may be under-specified.

There is no asset status to set: an asset that does not apply is recorded with a non-applicability assumption or create_co_disposition.

The caller supplies identity-bearing fields (name, description, security_properties, notes) plus optional component scoping; the backend LLM-reasons the factor decomposition (and composes the impact rating from it). The same prompt the generation pipeline uses for LLM-produced assets is reused here, so factors are calibrated consistently regardless of who introduced the asset. Override any factor post-create via edit_asset with a change_reason for the audit trail.

component_ids (optional) links the asset to one or more deployable units. Components are the canonical bridge between security architecture (trust boundaries) and code organization (repos); linking assets here flows boundary context into the reachability graph. Multi-component is the right shape for multi-instance assets (e.g., a session token on client + cache).

LLM-gated against a re-add of a previously soft-deleted asset on the same model. Three possible outcomes:

  • Normal create — fresh asset with a new ID. Returns the envelope {"model": ThreatModel, "controls_carried": N, ...}.

  • Auto-restore — proposal matched a soft-deleted asset; that asset is un-deleted (CO tombstones revive). Response carries auto_restored: True, restored_asset_id, and discarded_fields.

  • Similar-verdict rejection{"accepted": False, "classification": "similar", "candidate_restore_id": "A-N", ...}; nothing saved.

Fails with a tool error on:

  • 503 — restore-candidate evaluator OR factor-reasoning evaluator unavailable. Retry with backoff.

  • 502 — restore-candidate evaluator returned malformed response. Retry same prompt.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesAsset name (required).
notesNoOptional notes.
model_idYesID of the threat model.
descriptionNoOptional description (recommended — feeds the factor-reasoning prompt).
component_idsNoComma-separated component IDs scoping the asset (e.g., "CMP1,CMP2"). Empty / omitted = unscoped. Validated against components declared on the model.
server_versionYes
security_propertiesNoComma-separated properties, e.g. "C,I,A" (default: "C").

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden — and it delivers richly. It discloses side effects (creates a new version), gating behavior (LLM-gated against re-add of soft-deleted assets), the three possible outcomes with their response signatures (normal create, auto-restore with revived CO tombstones, similar-verdict rejection), and explicit failure modes (503 and 502 with retry guidance). This is exceptional behavioral disclosure for an unannotated mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured and front-loaded: the core purpose leads, then the authoring contract, then outcomes, then errors. Bold headers, bulleted outcome lists, and bold inline flags make it scannable. Every section adds distinct information rather than padding, though it borders on being dense enough to skim past details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a complex, LLM-gated mutation tool with an output schema, the description is complete: it covers the accepted shapes, the contract for a good asset, the three possible returns, and the failure modes. Nothing an agent needs to invoke it correctly — including what happens after invoking — is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (86%), so the schema already documents most parameters. The description adds genuine meaning beyond it: it explains that description feeds the factor-reasoning prompt, that component_ids is the canonical architecture-to-code bridge and multi-component is right for multi-instance assets, and it frames the authoring contract for name. It does not elaborate on server_version or notes, but those are self-evident, so the description compensates where it matters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Add a new asset to a threat model' — and immediately distinguishes its effect by noting 'Creates a new version.' The description sets this apart from sibling tools like edit_asset (which overrides post-create) and add_component/add_attacker by naming the precise resource being added. An agent can tell this from its siblings without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description names edit_asset as the alternative for post-create overrides, and create_co_disposition for recording non-applicability — giving clear routing advice. The component_ids paragraph also explains when multi-component is the right shape. However, it does not explicitly contrast with add_component or add_attacker (the other 'add_*' family members), so sibling differentiation is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_assumptionAdd AssumptionA

Add an assumption. Creates a new model version.

Assumptions represent security properties outside the system owner's trust boundary. When linked to COs and attested, they mitigate those COs in the assessment.

Optionally attach a structured exclusion predicate (the exclusion_* params). The reachability composer matches active

  • attested assumptions with predicates against COs deterministically — class-3 (deterministic computation) evidence in addition to the operator-attested class-1 evidence. Pass any subset of the fields; unspecified fields default to wildcard ("*"). When exclusion_co_ids is non-empty, it takes precedence over the match fields.

Use this to resolve a CO whose composer verdict is indeterminate because no structural primitive backs an operator non-applicability claim: set exclusion_co_ids=<co_id> (and optionally the attacker/asset/property fields), and the composer will derive unreachable / reason: assumption_excludes on subsequent loads, with the assumption's structured predicate as the audit-trail cause.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
descriptionYesWhat is assumed (e.g., "Customer restricts CI runner egress").
linked_co_idsNoOptional comma-separated CO IDs this assumption covers.
server_versionYes
assumption_typeNo"external" (default, allows manual attestation) or "non_applicability" (requires CI verification, no manual attestation).external
exclusion_co_idsNoComma-separated CO IDs the predicate matches explicitly. When non-empty, overrides the match fields.
exclusion_asset_idNo"*" or concrete asset ID.
exclusion_attacker_idNoPredicate match — "*" wildcard (default when any other exclusion_* param is set) or concrete attacker ID.
exclusion_property_matchNo"C" | "I" | "A" | "U" | "*".
exclusion_attacker_vectorNoOne of "Network" | "Adjacent" | "Local" | "Physical" | "*".
exclusion_asset_component_idNo"*" or concrete component ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the mutation side effect, the attestation/mitigation lifecycle, deterministic class-3 evidence behavior, wildcard defaults, and precedence rules. This is strong behavioral context, though it does not cover operational concerns like permissions or reversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and side effect, then organizes the advanced exclusion predicate behavior into a focused section. It is fairly long, but the content earns its place given the tool's complexity and 11 parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with no annotations, an output schema, and high schema coverage, the description covers the essential operational context: side effects, matching behavior, defaults, precedence, and a concrete use case. It does not spell out every assumption lifecycle step, but the schema and output schema cover the structured details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 91%, setting a high baseline. The description adds meaningful semantics beyond the schema: it explains that any subset of exclusion_* fields can be passed, unspecified fields default to wildcard, exclusion_co_ids takes precedence, and the predicate feeds deterministic composer evidence. This exceeds the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: "Add an assumption." and clearly states the side effect "Creates a new model version." This distinguishes add_assumption from related operations like edit_assumption without relying on the title alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete, decision-relevant scenario: use this to resolve a CO with an "indeterminate" composer verdict by setting exclusion_co_ids. It provides clear context for when the exclusion_* predicate mechanism is appropriate, though it does not explicitly name alternatives or state when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_attackerAdd AttackerA

Add a new attacker to a threat model. Creates a new version.

Authoring contract: capability names the operations the attacker can perform from its position and what they achieve — not just the access or vantage point. Phrase it as "From [position], the attacker can [concrete operations] …" (e.g. "From the network path between the API server and the database, the attacker can read and alter requests and responses to exfiltrate data in transit or inject forged responses"). A capability that states only access is flagged with a quality_warning and the control objectives derived from it may be under-specified.

The caller supplies identity-bearing fields (capability, position, archetype, trust_boundary_ids); the backend LLM-reasons the factor decomposition. Override any factor post-create via edit_attacker with a change_reason. Mirror of add_asset semantics.

Three outcomes (normal create / auto-restore / similar-rejection) mirror add_asset. 503 on factor-reasoning or restore-candidate evaluator outage, 502 on malformed restore-candidate response.

surface_extent says how much of the reached interface this attacker's operations range over. An attacker ranging over the whole interface makes the objectives it appears in for-all obligations, which only a sound witness (typed_boundary / sink_default_deny) can credit. Declaring it here is an operator statement about the attacker's reach, recorded attested with its change_reason, so a create takes the two together. Only whole is declarable on a create: narrowing to one named entry is a statement about the objectives the attacker anchors, and a create has none yet — add the attacker, then narrow it with edit_attacker and a change_reason, where the narrowing is checked against the assets those objectives defend. There is no attacker status to set.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
positionNoPosition/access level.
archetypeNoArchetype (e.g., "insider", "external").
capabilityYesAttacker capability description (required).
change_reasonNoRequired when ``surface_extent`` is supplied — documents the declaration for the audit trail.
server_versionYes
surface_extentNo``"whole"`` when, from its position, the attacker's operations range over ANY entry of the interface it reaches (any endpoint, request, row, file, message or frame). Recorded as attested by this call and requires ``change_reason``. Omit to leave it undeclared, which is the ordinary case.
trust_boundary_idsNoComma-separated trust boundary IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full transparency burden and does so thoroughly. It discloses that the call creates a new version, that the backend LLM-reasons the factor decomposition, that three outcomes mirror add_asset, that 503/502 errors can occur, and that surface_extent is recorded as an attested operator statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense, with important constraints front-loaded and clearly separated. It loses a point for some redundancy, such as mentioning the add_asset mirror twice, and for an extended rationale about for-all obligations that could be tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create operation with backend reasoning, side effects, error conditions, and an attestation parameter, the description covers all the non-obvious context an agent needs. It explains versioning, alternative routing, failure modes, the capability contract, and the special surface_extent workflow, while output format is covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high at 88%, but the description still adds significant meaning beyond the schema. It defines the capability authoring contract with a concrete pattern and quality_warning consequence, and it explains surface_extent's create-time restriction and attestation semantics in ways the schema does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: "Add a new attacker to a threat model." It also distinguishes itself from the sibling edit_attacker by noting that post-create factor overrides and surface narrowing happen there, and it names add_asset as its semantic mirror.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: use this tool to create an attacker, and use edit_attacker afterward to override factors or narrow surface_extent. It also tells the caller that only "whole" is declarable at create time and that narrowing belongs on a later edit, which prevents a common misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_componentAdd ComponentA

Add a component to a threat model.

Components bridge security architecture to code organization. They map trust boundaries to repos so controls can be scoped to the codebase that implements them. They also drive the deterministic reachability composer's asset-boundary derivation: an asset's trust-boundary footprint is the union of its components' trust_boundary_ids.

Generation reads no components, so add or edit them after generate_threat_model, not before.

A component with empty repo_url is either speculative (your own code, not linked to a repo yet) or external (e.g. a third-party service, the customer's IdP, or other external infrastructure you call but don't own). The component's trust boundary tells them apart: bind an internal-zone component to its repo via edit_component; leave an external-zone component unbound — its component_unbound finding is a permanent external-dependency marker, not a gap to close. Binding by "some client code touches it" is wrong: client code for external dependencies lives in your repo too.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesComponent name (e.g., "Backend API", "Auth Worker").
pathNoPath within repo for monorepos (e.g., "services/auth").
model_idYesID of the threat model.
repo_urlNoRepository URL (e.g., "github.com/org/backend"). Empty string is valid for speculative components — pass a real URL once you've identified the codebase.
server_versionYes
trust_boundary_idsNoComma-separated trust boundary IDs that this component spans (its deployment zone). Drives reach decisions for any asset scoped to this component.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses important behavioral traits: the tool's relationship to generation (must be called after generate_threat_model), the meaning of empty repo_url, and the permanent external-dependency marker behavior of component_unbound findings. It doesn't explicitly state side effects like whether it overwrites existing components or requires specific permissions, but the disclosed context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is moderately long but every sentence earns its place. It front-loads the core purpose, then provides essential context about components, generation ordering, and the repo_url/trust boundary semantics. The structure is logical, though the final warning about client code could be seen as slightly tangential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 params, output schema present, many siblings), the description is quite complete. It covers the tool's role, when to use it, key parameter semantics, and common pitfalls. It doesn't describe the return value, but an output schema exists, so that's not required. It could mention prerequisites like needing a valid model_id, but that's likely implied by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 most parameters well. The description adds meaning beyond the schema by explaining the semantic distinction between speculative and external components (empty repo_url) and how trust_boundary_ids drive reach decisions. It doesn't add detail for every parameter, but the schema covers them adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Add a component to a threat model.' It goes beyond a simple definition by explaining what components are, how they relate to trust boundaries and repos, and how they drive the reachability composer. This distinguishes it from sibling tools like edit_component and add_trust_boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: 'Generation reads no components, so add or edit them after generate_threat_model, not before.' It also explains when a component with empty repo_url is speculative vs external, and explicitly warns against a common mistake ('Binding by "some client code touches it" is wrong'). This is strong, actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_evidenceAdd EvidenceA

Attach an auxiliary evidence item (doc, link, or artifact reference) to a control. Mutating.

Evidence is contextual metadata only — it does NOT count toward a control's implementation status; only assertions prove controls. Use remove_evidence to detach an item.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoOptional file path or URL pointing at the artifact.
typeNoEvidence type — one of "code", "test", "config", "document", "link" (default "code").code
labelNoHuman-readable description of the evidence (required).
model_idYesID of the threat model.
control_idYesID of the control.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and it deliberately discloses 'Mutating.' to signal side effects. It further clarifies a non-obvious behavioral nuance: evidence does not affect a control's implementation status. It stops short of covering dupicate-attachment behavior, permissions, or reversibility beyond pointing to remove_evidence, but the mutation disclosure plus semantic caveat is solid for a simple attach operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three terse sentences with zero waste: the action is front-loaded, 'Mutating.' is a compact side-effect flag, and the semantic caveat plus sibling routing each earn their place. The paragraph break after the first sentence aids scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward mutation tool with an output schema present, the description plus schema cover the essentials: what it does, that it mutates, how it relates to status, and how to undo it. The only notable gap is the required server_version parameter having no description in either schema or description, and no statement about duplicate-attachment behavior, but these are minor against an otherwise complete definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83% (all parameters except server_version are documented), so the schema carries most of the parameter weight. The description adds marginal value by reinforcing the 'metadata-only' nature of the item and the type list already in the schema. It does not elaborate on server_version or label requirements, but the baseline 3 is appropriate given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('attach'), names the resource ('auxiliary evidence item... to a control'), and enumerates the item types (doc, link, artifact reference). It also differentiates from siblings by clarifying that evidence is not an assertion and naming remove_evidence as the inverse, so an agent can distinguish it from add_assumption or submit_assertions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: evidence is contextual metadata and does not count toward implementation status, with 'only assertions prove controls' serving as an implicit when-not signal. It explicitly points to remove_evidence for detaching. It does not name the exact alternative tool for proving controls (e.g., submit_assertions), but the guidance is strong enough to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_functional_testAdd Functional TestA

Hand-author a single functional test and map it to one or more objectives. Mutating.

Generation (generate_functional_objectives) already specifies the tests to implement, so use this only to register an extra test that generation did not produce; a manually-added test survives regeneration/refresh. For bulk-registering tests that already exist in your codebase, use import_functional_tests instead. This records the test at the status you claim — it does not run or verify anything; CI verification happens only when you attach TEST_EXISTS/TEST_ATTESTED evidence via submit_functional_test_assertions.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNonot_implemented | implemented | verified — an operator claim only; an independent CI run is what actually verifies the test. Defaults to not_implemented.not_implemented
model_idYesID of the threat model.
descriptionYesWhat the test proves.
component_idsNoComma-separated component ids the test exercises (optional).
server_versionYes
functional_objective_idsYesComma-separated objective ids the test satisfies (at least one required; get them from get_functional_objectives).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the operation is mutating, that it records only the status the caller claims, that it does not run or verify anything, that CI verification happens separately, and that manually-added tests survive regeneration/refresh.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, mutation flag, routing to alternatives, and the no-verification caveat. It is dense but not bloated, 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus the rich schema cover purpose, alternatives, side effects, and the existence of an output schema means return values need no explanation. The only gap is that the required server_version parameter is undocumented in both the tool description and the input schema, which an agent may need to fill correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (83%), so the schema already documents most parameters; the description adds little parameter-specific meaning beyond reaffirming one-or-more objective mapping and the status-as-claim behavior. The required server_version parameter remains unexplained in both the description and schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'hand-author a single functional test and map it to one or more objectives.' It also names what the tool is not — generation and bulk import — which clearly distinguishes it from nearby siblings such as generate_functional_objectives and import_functional_tests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: use only to register an extra test that generation did not produce, use import_functional_tests for bulk-registering existing tests, and attach verification evidence via submit_functional_test_assertions. This leaves no ambiguity about when to choose this tool over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_model_to_groupAdd Model To GroupA

Add a threat model to a group as a member. Mutating.

Links the model into the group without moving or copying it — the model stays independently editable. Both the group and the model must already exist.

kind values:

  • "tag": add the model to a tag. Membership is overlapping — a model may belong to many tags. Returns the updated tag payload.

  • "system": add the model to a system container for portfolio-level risk and compliance reporting. Returns an ok result.

Note: member REMOVAL is tag-only (see remove_model_from_group); the API has no remove-member endpoint for systems.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes``"tag"`` or ``"system"``.
group_idYesID of the tag or system.
model_idYesID of the threat model to add.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full behavioral burden and does so well. It states the operation is mutating, clarifies that the model is linked without moving or copying, notes that the model remains independently editable, and discloses per-kind return behavior and an API limitation regarding system member removal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized with a clear purpose sentence, a short behavioral note, and a structured list for kind values. Every sentence adds useful information, and the removal caveat is placed as a closing note without bloating the main explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with four required parameters and no annotations, the description covers prerequisites, kind-specific behavior, return expectations, and the key limitation around removal. The output schema handles return structure, so the description is complete enough for an agent to decide when and how to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes kind, group_id, and model_id, but the description adds valuable meaning: the semantic difference between 'tag' and 'system', the implications of overlapping tag membership, and distinct return payloads. The server_version parameter remains undocumented in both schema and description, preventing a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Add a threat model to a group as a member,' which clearly identifies the operation. It further distinguishes itself from the sibling remove_model_from_group and explains the tag vs. system semantics, making the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use each kind ('tag' vs. 'system'), states prerequisites (both entities must already exist), and flags an important usage boundary: member removal is tag-only and points to remove_model_from_group. This gives the agent clear, actionable guidance on when this tool is appropriate and when it is not.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_trust_boundaryAdd Trust BoundaryC

Add a trust boundary. Creates a new model version.

ParametersJSON Schema
NameRequiredDescriptionDefault
passesNoOptional comma-separated AttackVector values the boundary allows through (subset of "Network,Adjacent,Local,Physical"). Omit for the methodology default (passes-everything). Narrowing this set is what makes a boundary block specific attacker vectors in the deterministic reachability composer.
sealedNoOptional. Set True to declare the boundary has NO lateral ingress — the only way into its zone is crossing the perimeter (an air-gap / network-segmented enclave). On its own this is a suggestion: only an ATTESTED seal lets reachability decisively rule an asset unreachable instead of indeterminate, and the attestation is recorded with ``edit_trust_boundary`` (``seal_source="attested"`` with a ``change_reason``). Default False (assume a lateral pivot is possible). Set it only when the isolation is real and attestable.
crossesNoOptional comma-separated asset IDs that cross this boundary.
model_idYesID of the threat model.
descriptionYesWhat this boundary represents (e.g., "Public network to API server").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the full burden of behavioral disclosure. It only states 'Creates a new model version,' which is vague and does not explain side effects such as versioning implications, reversibility, permission requirements, or what happens to existing boundaries. The description fails to disclose any meaningful behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, consisting of two short sentences. It is front-loaded with the primary action and avoids redundancy. While it is arguably under-specified, it is efficiently structured with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 6 parameters, an output schema, and a complex domain (trust boundaries in threat models), the description is insufficient. It does not clearly explain the model versioning behavior, any prerequisites, or the effect on the overall model. It also fails to reference the rich parameter semantics that the schema provides, leaving the agent without a clear operational picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides detailed descriptions for 5 of 6 parameters (83% coverage), so the description is not required to explain parameters. The description adds no additional meaning beyond what the schema already offers, earning the baseline score for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Add' and resource 'trust boundary', making the primary purpose obvious. However, it does not differentiate from the sibling edit_trust_boundary beyond the verb difference, and the added 'Creates a new model version' is ambiguous about whether that is a side effect or a separate action. Purpose is clear but not fully distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus edit_trust_boundary or other model-modifying tools. The description does not mention prerequisites, the distinction between adding vs editing boundaries, or any context that would help an agent decide between alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_certain_reconciliation_matchApply Certain Reconciliation MatchA

Apply a certain-tier reconciliation candidate. Mutates state.

Soft-deletes the descendant's own duplicate entity; the inherited entity becomes the canonical surface for the effective-model resolver. Use after surveying candidates via list_reconciliation_candidates. Certain-tier candidates apply directly; heuristic-tier candidates need operator review of the structural divergence and are refused server-side unless confirm_heuristic=True is passed to acknowledge the divergence.

The server re-validates the candidate against current live state before applying; if the model has moved since the candidate was detected, returns 400 and the operator should refresh the candidate list and retry. Bumps model version and emits an activity event on success.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesEntity kind — one of ``"assets"``, ``"attackers"``, ``"components"``.
own_qidYesQualified id of the descendant's own duplicate (e.g. ``"child:A1"``).
model_idYesID of the descendant threat model the duplicate is on.
inherited_qidYesQualified id of the canonical entity on the ancestor (e.g. ``"parent:A1"``).
server_versionYes
confirm_heuristicNoAcknowledge and apply a heuristic-tier candidate despite its structural divergence. Default False — heuristic-tier matches are refused server-side without this flag. Leave False for certain-tier candidates.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It discloses that the operation mutates state, soft-deletes an entity, bumps the model version, emits an activity event, and may return 400 if the candidate is stale. This gives an agent a realistic picture of side effects and failure modes before calling the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then systematically covers effects, workflow, tier differentiation, error handling, and side effects in a logical order. Every sentence carries useful information; there is no filler or redundancy. It is appropriately sized for a mutation tool with this level of complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and a complex mutation with concurrency implications, the description is remarkably complete. It explains preconditions (use after listing candidates), the tier rules, server-side re-validation and 400 handling, and success effects (version bump, activity event). No critical behavioral aspect needed for correct invocation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers 5 of 6 parameters with descriptions, putting the baseline at 3. The description adds meaning beyond the schema by explaining the behavior of confirm_heuristic (heuristic-tier refused without it) and implying that server_version acts as an optimistic concurrency token during re-validation. However, server_version itself remains undocumented in both schema and description, so the added meaning is strong but not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Apply' and the specific resource 'certain-tier reconciliation candidate', and explains exactly what the operation does: soft-deletes the descendant's duplicate and makes the inherited entity canonical. It also distinguishes itself from sibling reconciliation tools by noting that certain-tier candidates apply directly while heuristic-tier candidates require the confirm_heuristic flag. This is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to use this after surveying candidates via list_reconciliation_candidates, providing clear sequencing. It also describes the alternative path for heuristic-tier candidates, which require operator review and the confirm_heuristic flag, and notes that they are refused server-side without it. This gives an agent actionable guidance on when to invoke this tool versus other reconciliation actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_control_changesetApply Control ChangesetA

Apply a batch of control operations atomically as ONE transaction.

Use this to reorganize a model's controls in a single step — for example to deduplicate controls (remap several onto the right objectives and delete the redundant ones at once), instead of many separate calls. All operations commit together or not at all.

Mapping-only: remap/delete/set_groups change objective mappings and retire controls but never re-author a control's description, so a kept or reused control keeps its status, evidence, and assertions. The orphan guard is evaluated on the FINAL state of the batch, so a delete paired with a covering remap or add in the same changeset is allowed; a changeset that would leave any previously-covered control objective uncovered is rejected as a whole and nothing is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesJSON array of operation objects. Each object has an "op" of "remap", "delete", "add", or "set_groups": - remap: {"op": "remap", "control_id": "CTRL-03", "co_ids": ["CO1", "CO2"]} - delete: {"op": "delete", "control_id": "CTRL-09", "reason": "duplicate of CTRL-03"} - add: {"op": "add", "description": "...", "co_ids": ["CO5"], "mitigation_group": 1} - set_groups: {"op": "set_groups", "co_id": "CO1", "groups": {"1": ["CTRL-03"], "2": ["CTRL-04"]}}
model_idYesID of the threat model.
change_reasonYesWhy this reorganization is appropriate (min 10 chars). Recorded on every affected control's version history.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure and does so thoroughly. It explains atomic all-or-nothing commit, mapping-only semantics, preservation of status/evidence/assertions, and the orphan guard evaluated on the final state. This is exemplary transparency for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but every sentence earns its place. It front-loads the core purpose, then adds necessary transaction and constraint details without repetition or fluff. The structure is well organized for a complex tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully addresses the tool's complexity: atomicity, operation types, orphan guard behavior, and mapping-only effects. An output schema exists, so return values are covered elsewhere. The only minor gap is server_version, which is neither described in the schema nor the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so most parameter meaning is already provided by the schema. The description adds valuable context about operation behaviors but does not significantly elaborate on individual parameter semantics beyond what the schema already includes. server_version remains undocumented, but the high schema coverage keeps this at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Apply a batch of control operations atomically as ONE transaction.' It clearly distinguishes this batch tool from single-operation siblings like remap_control and delete_control by emphasizing atomic, multi-operation changes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use it: to reorganize controls in one step, such as deduplication, 'instead of many separate calls.' It does not explicitly name alternative tools or exclude single-operation cases, but the context is clear enough for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_finding_remediationApply Finding RemediationA

Apply the remediation for a finding. Mutates state.

Commits the changes preview_finding_remediation showed. The justification is recorded in the audit trail and shown in any future review of why this cleanup was run.

DO NOT call this without first calling preview_finding_remediation and showing the operator the diff. The agent's role is to surface what's about to happen and get explicit operator confirmation; the platform records who acted but doesn't enforce the preview-then-apply norm — the agent does.

Returns 404 if the finding doesn't exist; 409 if the finding is already remediated or dismissed; 400 if justification is empty; 422 if the finding's kind has no automatic remediation handler.

ParametersJSON Schema
NameRequiredDescriptionDefault
finding_idYesID of the finding to remediate.
justificationYesOne-line operator rationale recorded on the audit trail. Must be non-empty.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the operation mutates state, commits previewed changes, records justification in the audit trail, does not enforce the preview-then-apply norm itself, and documents all relevant error statuses (404, 409, 400, 422). This gives the agent a strong model of side effects and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose first, then workflow/audit context, then the critical safety warning, then error semantics. Each sentence adds relevant operational value and none feel redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the safety-critical workflow, audit implications, and error handling, and an output schema exists so return-value documentation is not required. The only notable gap is server_version, which remains unexplained, preventing a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds useful meaning for finding_id and justification by tying them to error codes and audit-trail behavior, but server_version has no schema description and the description does not clarify its purpose or format. With only 67% schema coverage and no description of server_version, the parameter semantics are only partially compensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action ('Apply the remediation for a finding'), explicitly states it mutates state, and distinguishes itself from preview_finding_remediation by describing this as the follow-up commit step. An agent can immediately tell what this tool does and how it differs from its preview sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit, direct usage rule: DO NOT call this without first calling preview_finding_remediation and showing the operator the diff. It also defines the agent's responsibility to obtain explicit operator confirmation, making the when-to-use and workflow clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assess_modelAssess ModelA

Run the deterministic assurance assessment over a threat model. Read-only — no LLM calls, no mutation.

Evaluates each control objective from its controls' implementation status and returns summary counts (mitigated / at_risk / unassessed) plus progressive metrics (defined / implemented / verified). For LLM-based reasoning about which COs are under-covered and what controls to add, use check_control_gaps instead.

Use summary_only=True to get just the counts without per-CO assessments.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax control objectives to return (0 = all).
offsetNoSkip the first N control objectives.
statusNoOptional filter — "mitigated", "at_risk", or "unassessed".
model_idYesID of the threat model to assess.
summary_onlyNoIf True, return only summary counts (no per-CO details).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It explicitly states the tool is read-only, makes no LLM calls, performs no mutation, and is deterministic. It also describes what the assessment computes and returns, including summary counts and progressive metrics. This goes well beyond the structured schema and gives the agent a confident mental model of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: purpose first, behavioral safety second, output summary third, alternative routing fourth, and a practical usage tip last. Every sentence adds value and there is no redundant text repeating schema fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete given the output schema exists and covers return values. It explains purpose, safety, result semantics, and the alternative tool. The only notable gap is that server_version is a required parameter with no schema description and no explanatory mention in the description, which is a small but real completeness gap for a required input.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 five of six parameters well. The description adds useful context for summary_only and reinforces the allowed status values. However, it does not help with server_version, the one parameter lacking schema documentation, and it adds no deeper semantics for limit, offset, or model_id beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Run the deterministic assurance assessment over a threat model.' It clearly explains what the tool evaluates and returns, and distinguishes itself from check_control_gaps by naming that sibling explicitly. An agent can tell exactly what assess_model does and what it does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: for LLM-based reasoning about which control objectives are under-covered and what controls to add, use check_control_gaps instead. It also explains when to use summary_only=True. This is clear when-to-use and when-not-to-use guidance, not just implied context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assign_to_componentsAssign To ComponentsA

Replace an asset's or a control's component scope. Mutating.

Components are the canonical bridge between security architecture (trust boundaries) and code organization (repos). target_type selects what is being scoped:

  • "control" — replace a control's component scope. A control scoped to one or more components is visible to coding agents working in those repos (matched via Component.repo_url + Component.path); an unscoped control is visible everywhere. Use when wiring a previously unscoped control to the component(s) that implement it, adding a second component to a cross-cutting control (e.g. "all microservices enforce JWT validation"), or correcting a wrong assignment. target_id is the control ID (e.g. "CTRL-03").

  • "asset" — replace an asset's component scope. Linking assets to components flows boundary context into reachability derivation without giving Asset its own trust_boundary_ids. Multi-component is the right shape for a multi-instance asset (e.g., a session token on client + cache + DB — each component handles a distinct instance). target_id is the asset ID (e.g. "A1").

Both variants are mechanical / non-AI-gated and validate only that every referenced component exists on the model.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
target_idYesID of the asset or control to scope (must match ``target_type``).
target_typeYesEither "asset" or "control" — which entity to scope.
change_reasonYesWhy this scope is appropriate (min 10 chars). Captured in the version history.
component_idsYesComma-separated component IDs (e.g., "CMP1,CMP2"). Empty string = unscoped (a control becomes visible to every coding agent; an asset loses its explicit code-ownership binding). Every supplied ID must exist on the model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it flags the operation as 'Mutating,' states both variants are 'mechanical / non-AI-gated,' and discloses the only validation rule. It also explains downstream effects like visibility to coding agents and boundary context flowing into reachability derivation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and mutation flag are front-loaded, and the two variants are organized in clean bullets. Every sentence earns its place, with concrete examples and domain rationale that support correct invocation rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since an output schema exists, return-value documentation is not required. The description covers both target types, appropriate use cases, replacement semantics, unscoping via empty string, and validation rules, making it complete enough for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already high at 83%, and the description still adds meaningful value for target_type, target_id, and component_ids with examples, empty-string behavior, and multi-instance asset guidance. It leaves server_version undocumented in both schema and description, which prevents a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Replace an asset's or a control's component scope.' The two target_type variants are fully spelled out with examples, so an agent can distinguish this from siblings like add_component or edit_component.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit 'Use when' scenarios for the control variant: wiring an unscoped control, adding a second component to a cross-cutting control, and correcting a wrong assignment. It explains the asset variant's purpose for reachability, but it does not name when-not-to-use conditions or alternative sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

associate_functional_testAssociate Functional TestA

Associate a functional test with one or more functional objectives.

Use this after suggest_functional_test_mappings, or to hand-map a test to the objectives it covers. The platform verifies each association is applicable before accepting it and returns any it declined under rejected_mappings.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes
functional_test_idYesThe functional test to associate.
functional_objective_idsYesComma-separated objective ids the test covers.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses that the platform verifies each association before accepting it and returns declined mappings under 'rejected_mappings'. This is useful behavioral context, though it does not cover side effects or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each earning its place: what it does, when to use it, and what behavior to expect. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four required parameters and an output schema, the description provides essential operational context, usage timing, and behavior. It does not explain 'server_version', but the output schema and remaining context make the tool sufficiently usable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema already documents most parameters. The description adds some context about the association intent and the rejection behavior, but it does not compensate for the undocumented 'server_version' parameter or add deeper meaning to the parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific operation: associating a functional test with one or more functional objectives. It names the related sibling tool suggest_functional_test_mappings, which helps distinguish this tool from other mapping-related tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit usage timing: 'Use this after suggest_functional_test_mappings, or to hand-map a test to the objectives it covers.' This clearly explains when the tool is appropriate, though it does not enumerate exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

attach_foundationAttach FoundationA

Create draft delegation edges for selected (objective, control) pairs.

selections is a list of {"source_objective_id": ..., "provider_control_id": ...} (typically the operator-confirmed subset of propose_attach_foundation). Each becomes a delegated draft edge that runs LLM validation; none carries credit until separately confirmed. Returns {created, failed}.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesthe consumer model.
selectionsYeslist of {source_objective_id, provider_control_id} dicts.
server_versionYes
foundation_model_idYesthe foundation to delegate to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden. It clearly states that edges are draft, run LLM validation, carry no credit until separately confirmed, and returns {created, failed}. This is solid behavioral disclosure, though it doesn't cover failure semantics or side effects in depth.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, front-loaded with the main action, and each sentence adds critical information: input shape, relationship to proposal, draft/validation behavior, credit semantics, and return value. No redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four parameters and an output schema, the description covers the essential input semantics, the draft nature, the validation behavior, and the return shape. It lacks some detail about error cases or prerequisites, but the references to propose_attach_foundation and separate confirmation provide enough workflow context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema already explains most parameters. The description adds valuable detail for 'selections' by showing its expected structure and relationship to propose_attach_foundation, but it adds little meaning for model_id, foundation_model_id, or server_version beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it creates draft delegation edges for selected (objective, control) pairs. It also references the sibling propose_attach_foundation, placing this tool in context as operating on a confirmed subset of that proposal, which distinguishes it from related attach/propose operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: selections are typically the operator-confirmed subset of propose_attach_foundation. This implies the tool is used after proposal and before final confirmation, but it does not explicitly state when not to use it or directly compare it to alternatives such as confirm_reliance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

auto_map_controlsAuto Map ControlsA

LLM-map a model's existing controls to a framework's requirements. Requires PRO tier. Mutating: writes control-to-requirement mappings. Runs as a background job (typically 20-45s); this tool waits for completion and returns the result.

Sits between the manual map_control_to_requirement (one mapping at a time) and the full auto_remediate_compliance loop (which also excludes non-applicable requirements and proposes new entities for remaining gaps). auto_map_controls only creates mappings from controls that already exist — it never adds or excludes entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idNoOptional single control ID to map; omit to map all of the model's controls.
framework_idYesID of the compliance framework.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the operation is mutating, runs as a background job, waits for completion, returns results, requires PRO tier, and only maps existing controls. This is strong transparency for a complex asynchronous write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and constraint, followed by concise behavioral details and then sibling differentiation. Every sentence contributes useful information with minimal jargon or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's complexity — async, mutating, tier-gated, with multiple sibling tools — the description covers what it does, how it behaves, its scope limitations, and its relationship to alternatives. The presence of an output schema means return-value detail is not required here. This is a complete and actionable description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the schema already documents model_id, control_id, and framework_id. The description adds context about 'existing controls' and 'never adds or excludes entities,' which indirectly clarifies scope, but it does not add meaningful per-parameter semantics beyond the schema, especially for server_version.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'LLM-map a model's existing controls to a framework's requirements.' It clearly distinguishes itself from siblings by naming map_control_to_requirement and auto_remediate_compliance and explaining how auto_map_controls differs from both.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage placement is provided: it 'sits between' the manual single-mapping tool and the full auto-remediation loop. It also states exactly what it does not do — it never adds or excludes entities — so an agent can decide when to prefer it over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

auto_remediate_complianceAuto Remediate ComplianceA

Automatically close compliance gaps for a framework. Requires PRO tier.

Three-phase loop: (1) auto-map existing controls to unmapped requirements, (2) exclude requirements for non-applicable taxonomy primitives, (3) suggest and apply new assets/attackers for remaining gaps.

Phase (3) routes every proposal whose name matches a soft-deleted asset/attacker through the same restore-candidate LLM gate add_asset uses, so reanimating a previously removed entity reinstates its stable ID and every CO tombstone + control tied to it (rather than spawning a duplicate fresh ID). The response distinguishes assets_added / attackers_added (genuinely new) from assets_restored / attackers_restored (revived soft- deletes) and lists restored_asset_ids / restored_attacker_ids. Proposals the gate classified as similar (or that fail-closed on an unavailable / malformed gate response) appear under skipped with a per-entry reason — the operator decides whether to restore manually or rephrase.

Converges automatically: stops when fully covered or when no further progress can be made.

This runs automatically when a framework is selected, but can be re-triggered manually if the model changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
framework_idYesID of the compliance framework.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers exceptionally. It discloses the restore-candidate LLM gate shared with add_asset, the side effect of reinstating stable IDs along with CO tombstones and tied controls, fail-closed behavior when the gate is unavailable, per-entry skip reasons, response field distinctions (restored vs newly added), and automatic convergence.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense, with purpose and prerequisite front-loaded before the phase breakdown. The phase-3 paragraph is the most verbose section, yet nearly every clause carries operational significance for a tool with this side-effect complexity. Minor tightening of the restore-candidate explanation would be possible without losing value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with zero annotations, the description covers prerequisites, the full operational loop, side effects on soft-deleted entities, failure modes, concurrency behavior, and trigger conditions. The output schema covers return values, so the response-field explanation is bonus. The one real gap is server_version, a required parameter whose meaning appears nowhere in the schema or description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: model_id and framework_id are documented in the schema, and the description adds contextual meaning by tying framework to the remediation target and noting that model changes justify re-triggering. However, server_version is a required parameter with no schema description and no description-side compensation, leaving its semantics entirely unknown.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and scope: "Automatically close compliance gaps for a framework." The three-phase loop then concretely defines what 'close' means (map controls, exclude non-applicable requirements, apply new assets/attackers), which clearly differentiates it from mapping-only siblings like auto_map_controls and check_control_gaps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context: it runs automatically when a framework is selected, can be manually re-triggered when the model changes, and requires PRO tier. However, it never explicitly names alternatives or states when not to use this tool (e.g., when only control mapping is needed versus full remediation with asset/attacker creation), leaving some routing inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_control_gapsCheck Control GapsA

Analyze control coverage and surface control objectives that lack sufficient controls. Read-only (does not mutate the model); runs as a polled background job and uses LLM reasoning.

Complements the deterministic assess_model (which scores each CO's mitigated / at_risk / unassessed status from control implementation state) by reasoning about which COs are under-covered and where new controls are needed. Use this to decide what controls to add; use assess_model to score the current state.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it does so well: it explicitly states the tool is read-only, does not mutate the model, runs as a polled background job, and uses LLM reasoning. These are meaningful behavioral traits beyond what the schema alone reveals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core purpose, the second covers behavior, and the final paragraph distinguishes the tool from its sibling. No sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, behavior, async execution, and the key alternative, and an output schema exists to cover return values. The main gap is the unexplained server_version parameter, and the description does not mention how to obtain or poll the background job's result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: model_id has a description but server_version does not. The description adds no parameter-level guidance at all, leaving server_version's meaning and format unexplained. It does not compensate for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verbs ('Analyze', 'surface') tied to a clear resource: control coverage and control objectives lacking sufficient controls. It also explicitly differentiates itself from assess_model, making its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: used to decide what controls to add, while assess_model is used to score the current state. It also contrasts its LLM-based reasoning with assess_model's deterministic computation, so an agent can choose correctly between the two.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_functional_gapsCheck Functional GapsA

Get the actionable functional gaps for a model.

Read-only; no side effects. Returns the subset of the coverage report that needs action: applicable conditions with no objective yet, and objectives that are failing or have no passing test. Use this to decide what to implement or fix next; for the complete coverage matrix and all states use get_functional_coverage instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model to analyse for functional gaps.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden of behavioral disclosure. It explicitly states the operation is read-only, has no side effects, and describes what the returned subset contains (conditions with no objective, failing objectives, objectives with no passing test). This is meaningful behavioral context beyond the bare function name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it leads with the action, states the read-only nature, explains the return value, and then provides routing guidance. Every sentence adds value, with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a read-only filtering tool: it explains purpose, scope, return behavior, and the sibling alternative, while the output schema covers return structure. The main gap is that server_version is left undocumented, so the agent may not know what value to provide for that required parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the description does not compensate for the undocumented server_version parameter. model_id is explained in the schema, but server_version has no description and no additional meaning is provided in the tool description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') with a defined resource ('actionable functional gaps for a model') and clearly distinguishes the returned subset from the full coverage report. It also explicitly contrasts itself with the sibling get_functional_coverage, so an agent can differentiate the two without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use this tool: to decide what to implement or fix next. It also names the alternative, get_functional_coverage, and explains that the alternative should be used when the complete coverage matrix and all states are needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

classify_model_cweClassify Model CweA

Classify a model's control objectives against the platform CWE catalog.

Grounded: the model may only select from the catalog's current-version candidate ids, and every returned id is re-validated against the catalog before storage — a hallucinated or deprecated id is never persisted. Skips control objectives already tagged at the catalog's current version unless force is set. Returns a summary: {status, catalog_version, cos, classified, tags_written, skipped}. 404s if CWE classification is not enabled on this instance.

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNore-classify control objectives even if already tagged at the catalog's current version (default false).
model_idYesID of the threat model to classify.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: grounding constraints, re-validation before persistence, skip-if-already-tagged behavior, force semantics, the summary shape, and a 404 failure condition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, and each subsequent clause adds distinct behavioral information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers return summary, idempotence, and errors, and an output schema exists, so the main gap is the unexplained required 'server_version' parameter. It is otherwise sufficiently complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the missing description is for the required 'server_version' parameter. The description reinforces 'force' and 'model_id' but adds no meaning for 'server_version', so the agent still cannot tell what value to supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific verb ('Classify'), a concrete resource (a model's control objectives), and the target catalog, which makes the tool's job unmistakable and distinguishes it from sibling reads like get_cwe_catalog and get_model_cwe_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear this is the tool to use when classifying against the CWE catalog, and the skip/force behavior implies idempotent reclassification. However, it never explicitly states when not to use it or names an alternative for retrieving catalog IDs or existing tags.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

complete_setup_stepComplete Setup StepA

Mark one onboarding setup step as done. Mutating: updates the workspace onboarding checklist. Call after actually performing the corresponding setup action on the user's behalf.

Check current progress with get_setup_status first to avoid re-marking completed steps. An unrecognized step_id is rejected without any state change.

ParametersJSON Schema
NameRequiredDescriptionDefault
step_idYesThe step to mark complete, one of "mcp_configured", "mipiti_verify_installed", "ci_secret_added", "ci_pipeline_added".
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that the operation is mutating, updates the checklist, and rejects unrecognized step_id values without changing state. This is strong behavioral disclosure, though it stops short of discussing permissions, idempotency on already-completed steps, or side effects beyond the checklist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core purpose stated in the first sentence. The subsequent sentences provide actionable usage guidance and an important failure behavior without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, mutation semantics, call timing, and invalid-input behavior, and an output schema exists to document return values. However, the required server_version parameter is left entirely unexplained, which is a meaningful gap for an agent trying to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes step_id and its allowed values, but server_version has no schema description and the tool description does not explain it either. With only 50% schema coverage, the description should compensate for the undocumented required parameter, but it never mentions server_version at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Mark one onboarding setup step as done') and the resource it affects (workspace onboarding checklist). It also explicitly identifies the operation as mutating, which distinguishes it from read-only sibling tools like get_setup_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: call after performing the actual setup action. It also instructs the agent to check get_setup_status first to avoid re-marking completed steps, providing a clear workflow and an alternative tool reference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

confirm_relianceConfirm RelianceA

Promote a draft reliance edge to active (the credit-soundness gate).

Refuses unless LLM validation returned valid. A partial result or a mode mismatch is refused (never silently credited). Returns the updated edge.

ParametersJSON Schema
NameRequiredDescriptionDefault
edge_idYesID of the reliance edge to confirm.
server_versionYes
accept_partial_as_relied_uponNoreserved for partial-coverage handling.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses refusal semantics, the 'never silently credited' guarantee, and the return value. However, 'mode mismatch' is undefined, and it does not state what happens on failure beyond refusal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. The main action is first, followed by refusal conditions and the return value. Every sentence adds useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and has an output schema, so the description need not explain return shape. But the required server_version parameter is completely undocumented in both the schema and the description, and 'mode mismatch' is unexplained. An agent could struggle to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; edge_id and accept_partial_as_relied_upon are described, but server_version has no schema description and the description does not clarify it. The description's 'partial result is refused' adds some meaning to the partial-coverage parameter, but the undocumented required parameter remains a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource: 'Promote a draft reliance edge to active,' and adds the gate context 'credit-soundness gate.' This clearly distinguishes it from reliance lifecycle siblings like create_reliance, list_reliance, and delete_reliance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear precondition: use this only when LLM validation returned 'valid'; partial results or mode mismatches are refused. It does not explicitly name alternative tools or say 'use X instead,' but the activation context is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_assumption_to_controlsConvert Assumption To ControlsA

Convert a violated or retired assumption to controls.

Generates controls for the COs that were covered by this assumption, then retires the assumption's CO linkage. Use when an assumption is no longer valid and the system owner needs to implement controls instead.

Side effect on control-level linkage: this assumption is also removed from every assumption_groups entry on every control that referenced it. Any group left empty by the removal is dropped, and any control that no longer has at least one complete group reverts to not_implemented. Underlying assumptions are not deleted — only the linkages.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
assumption_idYesID of the assumption to convert.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so thoroughly. It discloses the side effect on control-level linkage, removal of the assumption from assumption_groups, dropping of empty groups, reverting of controls to not_implemented, and clarifies that underlying assumptions are not deleted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary action and use case, followed by a compact and well-organized side-effect disclosure. Every sentence adds meaningful information; there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with complex side effects and an output schema present, the description covers the main behavior, the triggering condition, the affected entities, and the non-destructive aspect. An agent has enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%; model_id and assumption_id are minimally described but server_version has no schema description and is also absent from the tool description. The description reinforces the role of assumption_id through its behavioral text but adds no parameter-level meaning and completely ignores the undocumented required server_version parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb and resource: 'Convert a violated or retired assumption to controls.' It clearly distinguishes this from sibling tools like add_assumption/edit_assumption and regenerate_controls by stating the conversion action and the control-generation outcome.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use the tool: 'Use when an assumption is no longer valid and the system owner needs to implement controls instead.' It gives a clear condition but does not explicitly name alternative tools or exclusion cases, so it falls just 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.

create_co_dispositionCreate Co DispositionA

Record that a control objective DOES NOT APPLY to this system — a signed, expiring judgment, not a dismissal.

The sibling of create_risk_acceptance, and the distinction between them is the claim being made. A risk acceptance says the exposure is real and we are carrying it. A disposition says this objective does not apply here at all — the asset is not handled the way the objective assumes, the attacker position does not exist in this deployment, the capability is not present.

The objective is not removed. It stays in the control-objective matrix, stays in every coverage count, and is reported in its own class alongside the owner and justification recorded here. That is the point: a reviewer can see the judgment and challenge it. An objective that simply vanished would be indistinguishable from one nobody modelled.

What it does change is work: no controls are generated for the objective and no coverage gap is raised against it, because an objective that does not apply is not a gap.

review_by is required and is not a formality — the claim stops applying on that date, and the objective returns to whatever posture its controls give it, gap included. Choose a date by which someone can realistically re-check that the claim still holds.

Use create_risk_acceptance instead when the objective DOES apply and the exposure is being carried deliberately. If an objective is only unaddressed rather than inapplicable, neither tool is right — add controls.

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerYesWho owns the judgment (name / role). They answer for it.
model_idYesID of the threat model.
review_byYesISO 8601 date the claim expires (e.g. "2027-02-06T00:00:00Z").
justificationYesWhy the objective does not apply to this system.
server_versionYes
control_objective_idYesThe objective being declared not applicable.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavioral traits. It does this thoroughly: the objective remains in the matrix, no controls are generated, no coverage gap is raised, and the claim expires at review_by. This goes far beyond what the schema alone communicates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core claim and then structured into clear behavioral, temporal, and alternative-usage sections. It is longer than strictly necessary, but the length is justified by the nuance of the tool and the need to prevent confusion with create_risk_acceptance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 required parameters, no annotations, and an existing output schema, the description covers the tool's semantics, side effects, timing constraints, and sibling distinctions thoroughly. An agent has enough information to decide when to call it and what the call will do.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high at 83%, so the baseline is already solid. The description adds meaningful semantics beyond the schema, especially for review_by: it is 'not a formality,' the claim stops applying on that date, and the date should be realistic for re-checking. It also reinforces that owner is the accountable party.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Record that a control objective DOES NOT APPLY to this system.' It also explicitly distinguishes this from create_risk_acceptance by defining the type of claim being made, so an agent can tell the tools apart without needing to compare schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: use create_risk_acceptance when the objective DOES apply and the risk is carried deliberately, and use neither tool when an objective is merely unaddressed rather than inapplicable. It also explains the operational consequences of using this tool, giving clear context for when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_groupCreate GroupA

Create a group (tag or system), optionally seeding tag members. Mutating.

A "group" is a named collection of threat models. Group names are unique per workspace within their kind.

kind values:

  • "tag": an overlapping, semantics-free grouping — for viewing/ reporting without asserting any relationship between members and without moving credit. Honors model_ids as an initial member seed. Returns the created tag.

  • "system": a named grouping for portfolio-level risk and compliance reporting. Systems are NOT seeded at creation — model_ids must be omitted/empty for kind="system" (passing members raises); add them afterward with add_model_to_group(kind="system", ...). Returns the created system with its new ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes``"tag"`` or ``"system"``.
nameYesthe group name (unique within the workspace for its kind).
model_idsNooptional initial member model ids — ``"tag"`` only.
descriptionNooptional description.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

There are no annotations, so the description carries the full burden of behavioral disclosure. It openly states the operation is mutating, explains uniqueness constraints, documents that passing model_ids for system groups raises an error, and describes what is returned for each kind.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a front-loaded summary followed by focused bullet-style explanations. Every sentence adds meaningful context, and the format makes the tag/system distinction easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and the tool's branching behavior between tag and system kinds, the description is complete: it covers creation rules, error conditions, follow-up actions, and return values. The existence of an output schema reduces the need to describe the full response shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, and the description adds significant meaning to the kind and model_ids parameters: it explains valid values, semantics, seeding rules, and constraints. However, server_version is undocumented in both the schema and the description, so the description does not fully cover every parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a group, specifies the two kinds (tag and system), and describes what each kind means. It distinguishes this creation tool from related operations like add_model_to_group by explaining seeding and post-creation member addition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance by separating tag versus system behavior, states that system groups cannot be seeded at creation, and directs users to add_model_to_group for adding members later. This gives an agent a clear decision path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_proposalCreate ProposalA

Raise a proposal to change a model's scope or design. Call this when the code or your analysis says the model should gain or lose a component, or that an attacker position or asset should be removed by design; do not edit the model directly for those changes. Mutating: persists a proposal record.

A proposal is a change of scope or design. Raising one is not deciding it: a person (or an agent under a delegation rule that names the decision) decides it with decide_proposal. Design changes are never applied automatically. Poll list_proposals for the outcome.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesOne of ``add_component`` (payload ``{name, repo_url?, path?, trust_boundary_ids?}``), ``remove_component`` (payload ``{component_id}``), ``design_change`` (payload ``{target_kind: "attacker"|"asset", target_id, design_move}``; take ``design_move`` from ``get_design_leverage``).
payloadYesJSON object string with the fields for ``kind``.
evidenceNoOptional JSON object string, e.g. ``{paths: [], symbols: [], note: ""}``, pointing at what you saw.
model_idYesID of the threat model.
rationaleYesWhy this change is right (what in the code or design supports it).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it delivers well. It explicitly says 'Mutating: persists a proposal record,' clarifies that raising a proposal does not decide it, states that 'Design changes are never applied automatically,' and directs polling 'list_proposals' for the outcome. This is strong behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then usage triggers, then the mutation warning, then the workflow context. Although it is longer than average, every sentence earns its place, and the second paragraph clarifies the decision workflow rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool complexity, missing annotations, and an output schema being present, the description is largely complete: it covers purpose, trigger conditions, side effects, decision workflow, and follow-up. A small gap is that the initially stated trigger conditions emphasize removal ('should lose a component' and 'removed by design') even though the schema supports broader design-change payloads, but the opening 'change of scope or design' mitigates this.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 83%, so the baseline is 3 even without parameter detail in the tool description. The description does not add parameter-level semantics, but the schema already explains 'kind', 'payload', 'evidence', 'model_id', and 'rationale'. The only undocumented parameter, 'server_version', is left to inference but is not a major burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object ('Raise a proposal to change a model's scope or design') and immediately distinguishes itself from direct model editing. It even names the sibling tools it interacts with ('decide_proposal', 'list_proposals', 'get_design_leverage'), so an agent can tell exactly what this tool is and is not for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'Call this when the code or your analysis says the model should gain or lose a component, or that an attacker position or asset should be removed by design.' It also states a key exclusion ('do not edit the model directly for those changes') and delegates decision and outcome-checking to 'decide_proposal' and 'list_proposals'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_relianceCreate RelianceA

Declare a cross-model dependency: this model relies on a provider control.

Two modes (the target is ALWAYS a provider control — credit terminates at a proven mechanism):

  • delegated: this model does NOT implement an objective locally; it is handled entirely by the provider's control. Pass source_objective_id.

  • relied_upon: this model has its OWN control whose validity depends on the provider's control. Pass source_control_id.

The provider must be a model in the SAME workspace as the consumer (reliance is workspace-scoped and does not reach across workspace boundaries). The edge enters draft and runs LLM semantic validation; it carries no credit until confirmed via confirm_reliance (and only when validation returned valid). Returns the created edge.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes"delegated" or "relied_upon".
model_idYesthe consumer model declaring the dependency.
server_versionYes
provider_model_idYesthe model whose control satisfies the dependency.
source_control_idNoconsumer control id (required for "relied_upon").
provider_control_idYesthe provider's control (the credit terminus).
source_objective_idNoconsumer objective id (required for "delegated").

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It clearly discloses that the edge enters draft state, runs LLM semantic validation, carries no credit until confirmed, only receives credit when validation returned 'valid', and returns the created edge. This is strong transparency for a creation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and scannable: a front-loaded purpose, a clear two-mode breakdown using backticks and dashes, and no filler sentences. Every sentence contributes either a mode rule, a prerequisite, or a lifecycle fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 7-parameter, two-mode creation tool, the description covers the essential context: mode semantics, conditional parameter usage, workspace scoping, lifecycle behavior, and the return value. It is only slightly incomplete because the required server_version parameter is unexplained and error/idempotency behavior is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaningful parameter semantics by mapping modes to conditional parameters: delegated -> source_objective_id, relied_upon -> source_control_id. It also clarifies provider_control_id as the 'credit terminus' and adds a workspace-constraint meaning for provider_model_id. However, the required server_version parameter remains undocumented in both the schema and the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Declare') and a clear resource ('cross-model dependency'), then immediately explains the core concept: this model relies on a provider control. The lifecycle note (draft -> confirm_reliance) also helps distinguish this tool from siblings like list_reliance, confirm_reliance, and delete_reliance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The two modes are explicitly defined with conditions for choosing each: delegated means no local implementation and requires source_objective_id; relied_upon means the model has its own control and requires source_control_id. It also states the workspace-scoping prerequisite and the required follow-up step through confirm_reliance, giving concrete when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_risk_acceptanceCreate Risk AcceptanceA

Record that an operator explicitly ACCEPTS the residual risk on a control objective instead of mitigating it — the write counterpart to list_risk_acceptances.

Use when a control objective's residual risk is a deliberate, documented decision rather than an unaddressed gap: the acceptance carries an owner, a justification, and a review deadline, and reads as active until it expires or is revoked. Prefer this over leaving a known-and-accepted risk implicit — it makes the decision auditable and forces a revisit by the deadline. An accepted objective is still surfaced (as accepted, not unaddressed) when triaging at-risk objectives.

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerYesWho owns the acceptance (name / role).
model_idYesID of the threat model.
review_byYesISO 8601 date to revisit the acceptance (e.g. "2027-02-06T00:00:00Z").
justificationYesWhy the risk is accepted (the rationale of record).
server_versionYes
control_objective_idYesThe control objective whose residual risk is accepted.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and discharges it well: it discloses the lifecycle ('reads as active until it expires or is revoked'), the record contents (owner, justification, review deadline), and the triage effect (surfaced as accepted, not unaddressed). This adds real behavioral context beyond the bare mutation implied by 'create'. It stops short of covering permissions or revocation mechanics, which keeps it at a 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short paragraphs, front-loaded with the core purpose in the first sentence. Each subsequent sentence contributes a distinct fact — usage condition, lifecycle, triage effect — rather than restating schema fields. It is longer than a minimal definition but every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with six required parameters and zero annotations, the description covers purpose, when to use it, record contents, lifecycle, and downstream visibility; the output schema relieves it of explaining return values. The remaining gaps — who is authorized to accept and what server_version should contain — are minor against the strong selection and invocation guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, which is high, so the baseline is 3; the description adds collective framing by naming owner, justification, and review deadline as the components of an acceptance and linking review_by to expiry. It does not add per-parameter detail beyond the schema and leaves server_version unexplained, so it does not fully close that gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Record that an operator explicitly ACCEPTS the residual risk on a control objective instead of mitigating it' — and self-identifies as 'the write counterpart to list_risk_acceptances', which separates it from the read sibling. The behavior is unambiguous and goes well beyond a paraphrase of the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition ('Use when a control objective's residual risk is a deliberate, documented decision rather than an unaddressed gap') and tells the agent to prefer this over leaving accepted risk implicit, citing auditability and the forced review deadline. It names the read counterpart but does not name an alternative tool for the unaddressed-gap case, so the when-not is implied rather than fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decide_proposalDecide ProposalA

Accept or reject a proposal. Call this only when the workspace's delegation policy names this decision for this agent at the proposal's tier (the delegation block of get_control_work_order says what you may decide). Mutating: closes the proposal and applies an accepted change.

This is a judgment. The call is refused with HTTP 403 and an escalation_id unless the delegation policy permits it; the refusal parks the decision for a person as a decision_request. Do not retry a refusal: report the escalation_id, poll list_proposals for the outcome, and continue other work.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional note recorded with the decision.
decisionYes``accept`` or ``reject``.
model_idYesID of the threat model.
proposal_idYesID of the proposal to decide.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses mutation side effects, authorization requirements, HTTP 403 refusal behavior, creation of a decision_request, and the escalation_id. It even warns that this is a judgment call, which is useful context for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, followed by policy, mutation, and failure handling. Every sentence adds information, and there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition covers purpose, permission precondition, side effects, error behavior, escalation semantics, and follow-up actions. Since an output schema exists, not detailing the return value is acceptable. The agent has enough context to invoke this tool correctly and handle refusals gracefully.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents most parameters. The description adds high-level meaning to decision and proposal_id through context like "Accept or reject a proposal," but it does not add details beyond the schema for note, model_id, or server_version. The baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: "Accept or reject a proposal." It further clarifies the effect with "Mutating: closes the proposal and applies an accepted change," which clearly distinguishes this mutation tool from read-only proposal and work-order siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit precondition: "Call this only when the workspace's delegation policy names this decision for this agent at the proposal's tier." It also tells the agent exactly what to do on refusal: report the escalation_id, poll list_proposals, and continue other work, including "Do not retry a refusal."

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

declare_foundationDeclare FoundationA

Mark a model as a shared foundation that advertises providable controls.

Mutating: records this model as a foundation and stores its advertised controls; other models can then delegate to them (see propose_attach_foundation / attach_foundation). A foundation is a shared service (auth, logging, a shared datastore) whose controls other models can rely on.

Each entry in provides advertises one of THIS model's controls as providable: {"control_id": "CTRL-07", "capability_label": "Validates session tokens", "description": "..."}. A capability always advertises a control (a proven mechanism), never an objective.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the model to declare as a foundation.
providesYesList of advertised-control dicts. ``control_id`` is required per entry; ``capability_label`` and ``description`` describe what the control provides to consumers.
visibilityNoWho may delegate to this foundation. "workspace" (default) makes it discoverable to every model in the workspace; "explicit" limits it to models explicitly attached.workspace
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It explicitly labels the operation as 'Mutating' and states that it 'records this model as a foundation and stores its advertised controls,' plus the downstream consequence that other models can then delegate. It also adds an important semantic rule: capabilities always advertise controls, never objectives. It does not cover permissions or reversibility, but the core behavior is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well organized: a one-line purpose, a concise mutation/effect paragraph, and an example-backed parameter explanation. Every sentence earns its place, and the most important semantic constraint is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a mutating tool with an output schema: it explains the mutation, the relationship to delegation, the meaning of provides entries, and the foundation concept. The only notable gap is that the required server_version parameter is left entirely unexplained in both the schema and description, which an agent may need to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the schema already documents model_id, provides, and visibility, while server_version has no description. The tool description adds real value for the provides parameter by giving a concrete example object and clarifying that each entry advertises one of this model's controls. It also emphasizes that capability entries represent proven controls, not objectives, which prevents misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific, action-oriented statement: 'Mark a model as a shared foundation that advertises providable controls.' It clearly identifies the resource (a model), the operation (declaring/recording it as a foundation), and the purpose (advertising controls). It also distinguishes itself from related sibling tools by referencing propose_attach_foundation and attach_foundation as the follow-up delegation steps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains that declaring a foundation enables other models to delegate to it, and explicitly points to propose_attach_foundation and attach_foundation for that downstream step. It also clarifies what kind of model qualifies as a foundation via the shared-service examples. It does not explicitly state when not to use the tool, but the cross-tool guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_assertionDelete AssertionA

Permanently delete a single assertion from a control or assumption. Mutating and destructive: the assertion record is removed, not soft-deleted, and its contribution to sufficiency/verification is dropped. It does NOT itself re-run verification; sufficiency is re-evaluated on subsequent reads.

Use to retract a claim that was submitted in error or that get_verification_report flagged as misaligned (off-topic for the control's current description). To add assertions use submit_assertions; to inspect them first use list_assertions. Only "own" assertions can be removed here — inherited assertions come from composed models and must be managed on their source model.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idNoID of the control the assertion belongs to (omit if it belongs to an assumption).
assertion_idYesID of the assertion to delete.
assumption_idNoID of the assumption the assertion belongs to (omit if it belongs to a control).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and meets it thoroughly. It states the operation is mutating and destructive, that deletion is permanent and not soft-delete, that sufficiency contribution is dropped, that verification is not re-run, and that inherited assertions cannot be removed here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: the destructive behavior, the side-effect caveat, the intended use cases, the sibling alternatives, and the ownership limitation. The most important warning about permanent deletion is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no annotations, the description is complete. It covers use cases, side effects, behavioral nuances, and routing to alternatives, while the output schema handles return-value expectations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the baseline is 3. The description adds contextual meaning about control versus assumption targets and the ownership restriction, but it does not materially expand on the individual parameters beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Permanently delete a single assertion from a control or assumption.' It also clarifies scope (own assertions only) and distinguishes itself from related operations by naming submit_assertions and list_assertions as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: to retract erroneous claims or assertions flagged as misaligned by get_verification_report. It also names the add and inspect alternatives and states an important exclusion: inherited assertions must be managed on their source model.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_controlDelete ControlA

Soft-delete a security control, optionally with a justification. Destructive (mutating): the control is retired, not permanently erased.

Blocks with HTTP 409 when the control is the ONLY control covering any control objective — removing it would leave that CO uncovered. Add a replacement control (or refine the threat model) before deleting.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoOptional justification recorded in the audit trail (recommended).
model_idYesID of the threat model.
control_idYesID of the control to delete.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavioral traits. It explicitly states that the operation is destructive/mutating, that it is a soft delete rather than a permanent erase, and that it can block with HTTP 409 under a specific coverage condition. This is substantial and goes well beyond a generic description, though it stops short of covering permissions or reversibility details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the core action, the second clarifies destructiveness, and the third explains the blocking condition and required remedy. Every sentence contributes necessary operational information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity and the presence of an output schema, the description covers the essential operational context: what the operation does, its side effects, and the key failure mode. It does not explain server_version semantics or mention any other restrictions, but the core invocation context is sufficiently complete for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so the schema already documents most parameters. The description adds context about the justification being optional and about the 409 condition, but it does not add meaningful detail for model_id, control_id, or server_version beyond what the schema provides. This is adequate given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Soft-delete a security control,' which immediately distinguishes this from other control-related tools. It also clarifies the semantic nuance ('retired, not permanently erased'), removing ambiguity about the lifecycle impact. This clearly separates it from hard-delete or update operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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 will succeed or fail, including the HTTP 409 blocking condition and the prerequisite to add a replacement control or refine the threat model. It does not explicitly name alternative sibling tools or state when not to use the tool, but the practical guidance is strong enough to guide invocation correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_groupDelete GroupA

Delete a tag group (the grouping only; member models are not affected).

Deletion is supported for TAGS ONLY — systems have no delete endpoint on this API. A tag is an overlapping, semantics-free grouping; removing it leaves its member models untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYesID of the tag to delete.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It clearly states that member models are not affected, deletion applies only to the grouping wrapper, and systems cannot be deleted through this API. This is meaningful context beyond the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action. There is slight redundancy in stating twice that member models are unaffected, but overall it is well-structured and avoids unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential operational context for a delete tool: what gets deleted, what does not get deleted, and an explicit unsupported use case. An output schema exists, so return value details are not required. The main omission is the purpose of server_version.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% because server_version has no description. The description adds useful meaning to tag_id by explaining tags are 'overlapping, semantics-free grouping,' but it never explains what server_version is or how it should be supplied. The description does not fully compensate for the missing schema detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Delete a tag group' with a clear scoping statement that only the grouping is removed, not member models. It also distinguishes itself from other delete_* siblings by emphasizing that deletion is supported for TAGS ONLY.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit when-not-to-use signal: 'Deletion is supported for TAGS ONLY — systems have no delete endpoint on this API.' This prevents misuse on systems, though it does not name a specific alternative tool for system deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_relianceDelete RelianceA

Delete a cross-model reliance / delegation edge. Destructive and immediate.

Mutating: permanently removes the edge. Any credit the consumer model derived from it (a delegated objective or a relied-upon control) is withdrawn, which can move the consumer's coverage/posture. Does not affect either model's own controls. Returns {deleted: True, edge_id}.

Use list_reliance to find the edge_id first. To pause an edge without deleting, there is no toggle — deletion is the only removal path.

ParametersJSON Schema
NameRequiredDescriptionDefault
edge_idYesID of the reliance edge to delete.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It fully discloses that the operation is destructive, immediate, and permanently removes the edge; explains downstream effects on consumer coverage/posture; clarifies that either model's own controls are unaffected; and states the return value. This is exemplary transparency for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and destructive nature, then expands into side effects, return value, and usage guidance. Each paragraph serves a distinct purpose with no filler or repetition, and the formatting makes the critical warnings immediately visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive operation, the description thoroughly covers behavior, side effects, return value, and how to obtain the required edge_id. The only meaningful gap is the undocumented server_version parameter, which prevents a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%; server_version is a required parameter but has no schema description and is not mentioned in the tool description. The description does add useful context for edge_id by saying to find it via list_reliance, but it leaves server_version completely unexplained, so the description does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Delete a cross-model reliance / delegation edge.' It clearly distinguishes this tool from related sibling operations like create_reliance, confirm_reliance, and list_reliance by focusing on removal and stating destructive permanence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs the agent to use list_reliance to find edge_id first, and states that there is no toggle to pause an edge—deletion is the only removal path. This provides clear when-to-use and prerequisite guidance, plus an explicit exclusion for a potential alternative action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_threat_modelDelete Threat ModelA

Delete a threat model and all associated data. Destructive and permanent — cannot be undone.

Mutating: removes the model along with every version, its controls, assertions, findings, attestations, and tag/reliance memberships. Reliance edges from other models that pointed at this one are invalidated, which can move those consumers' posture.

Confirm intent before calling. To keep a copy first, use export_report (scope="model", format="archive") (a self-contained, re-importable JSON archive). Returns {deleted: True, model_id}.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model to delete.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It clearly states the operation is destructive, permanent, and mutating; enumerates exactly what is removed; explains downstream effects on reliance edges and consumer posture; and documents the return value. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the most critical fact ('Destructive and permanent'), then gives a concise but complete list of side effects, followed by usable guidance and the return shape. Every sentence earns its place; no filler or redundant restating of the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is highly complete for a destructive operation: it covers permanence, affected data, indirect effects on other models, a backup path, and the response. The only notable gap is the unexplained required server_version parameter, which weakens end-to-end invocability.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: model_id is described, but the required server_version parameter has no description and no enum or format guidance. The tool description adds nothing about either parameter, so an agent cannot confidently determine what server_version should be.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Delete a threat model and all associated data.' It sharply distinguishes this from sibling deletion tools by emphasizing the permanent, cascade-deleting scope, so an agent can tell it apart from delete_control, delete_assertion, delete_group, or remove_entity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational guidance: confirm intent before calling and export an archive if a copy is needed. It does not explicitly enumerate when not to use this tool versus nearby siblings, but the destructive scope and backup advice effectively frame when it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dismiss_verdict_divergencesDismiss Verdict DivergencesA

Dismiss a set of divergences (the structural model was right, the LLM was not) WITHOUT changing the model.

Use for rows you have reviewed and judged not valid. A dismissal is keyed to the divergence's current verdict input hash, so it auto-clears (the row reappears) once the underlying control or objective changes. Works for coverage AND group_sufficiency rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesJSON array of {"kind", "co_id", "control_id"?, "group_id"?} objects. control_id is required for coverage kinds; group_id for group_sufficiency.
reasonYesWhy these divergences are being set aside (min 1 char).
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it discloses that dismissal is keyed to the current verdict input hash, that dismissals auto-clear when underlying control or objective changes, and that the model itself is not modified. This goes well beyond a generic 'dismiss' statement, though it does not cover auth/permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three dense sentences with no filler. The core purpose and key constraint ('WITHOUT changing the model') are front-loaded, and the hash-keyed auto-clear behavior is explained in one well-placed sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and moderate complexity, the description covers what the tool does, when to use it, its non-destructive character, and the important auto-clearing behavior. The provided input schema covers parameter structure and an output schema exists, so return-value explanation is not needed. A small gap is the lack of explicit alternative-tool routing when the structural model is wrong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is about 75%: items, reason, and model_id are described, though server_version is not. The description adds useful framing about coverage vs group_sufficiency row kinds, but it does not materially explain parameter formats or semantics beyond what the schema already provides, so a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource: 'Dismiss a set of divergences' and clarifies the semantic meaning ('the structural model was right, the LLM was not'). It also explicitly scopes the tool to coverage and group_sufficiency rows and emphasizes that the model is not changed, which helps distinguish it from model-modifying sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: use for rows that have been reviewed and judged not valid, and for the specific case where the structural model is correct. It does not explicitly name alternative tools or state when not to use this tool, but the guidance is strong enough to orient an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_assetEdit AssetA

Edit an existing asset. Only provided fields changed.

When changing identity fields, hold to the asset authoring contract: name the data/resource protected and its security property, not a mechanism — otherwise the result is flagged with a quality_warning (see add_asset). There is no status field to set.

The composed impact is server-derived from the factor fields; there is no way to set it directly. To change the rating, set factor values (the platform composes the new rating) and supply change_reason documenting the operator override of the LLM-generated factors. The reason is captured in the rating-revision audit trail.

LLM-gated on identity-bearing fields (name, description, security_properties). Factor and notes edits skip the gate.

Outcomes when identity fields change:

  • Accepted edit (LLM classifies as preserve) — normal envelope response.

  • Rejected edit (LLM classifies as replace / ambiguous) — {"accepted": False, ...}; nothing saved. Soft-delete + add-new instead.

Editing a soft-deleted asset is rejected — restore_entity (entity_type="asset") first. 503 on evaluator outage, 502 on malformed response, 400 when factor fields are sent without change_reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name (optional).
notesNoNew notes (optional).
asset_idYesID of the asset (e.g., "A1").
model_idYesID of the threat model.
descriptionNoNew description (optional).
blast_radiusNo"Isolated" | "Multiplicative" | "Cascading".
change_reasonNoRequired when any factor field is supplied — documents the operator override of LLM-generated factors for the audit trail.
recoverabilityNo"Trivial" | "Manageable" | "Permanent".
server_versionYes
usage_subscoreNo"None" | "Low" | "High".
impact_rationaleNoNew rationale (optional).
regulatory_scopeNo"None" | "Notification" | "Legal".
integrity_subscoreNo"None" | "Low" | "High".
security_propertiesNoComma-separated properties (optional).
availability_subscoreNo"None" | "Low" | "High".
confidentiality_subscoreNo"None" | "Low" | "High".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden and satisfies it: it discloses LLM gating on identity-bearing fields, the rejected-edit response shape, that nothing is saved on rejection, server derivation of impact, audit-trail capture, and specific 503/502/400 error conditions. This is far beyond a generic 'edit' statement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but earns its length for a 16-parameter mutation tool: it is front-loaded with the core behavior, then uses bold labels, bullets, and error summaries to make the constraints scannable. There is no filler or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the presence of an output schema, and no annotations, the description covers all decision-relevant behavior: partial-update semantics, LLM gating, audit trail, soft-delete handling, and error conditions. An agent has enough context to invoke it correctly without opening sibling definitions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 94% schema coverage, the description adds grouping semantics the schema alone does not convey: identity-bearing fields vs factor/notes fields, the no-status-field caveat, the requirement to send change_reason with factor fields, and the impossibility of setting impact directly. It clarifies the relationship between change_reason and the factor/rating parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence 'Edit an existing asset. Only provided fields changed' states a specific verb and resource with scope, and the rest clarifies it updates rather than creates (contrasting with add_asset). It is clearly distinct from sibling edit tools for other entity types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing and preconditions: soft-deleted assets require restore_entity first, rating changes require setting factor values plus change_reason, there is no status field to set, and rejected edits must be handled by soft-delete + add-new. It names alternatives (add_asset, restore_entity) and the conditions that select them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_assumptionEdit AssumptionB

Edit an assumption. Creates a new model version.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
descriptionNoNew description (omit to leave unchanged).
assumption_idYesID of the assumption to edit (e.g., "AS1").
linked_co_idsNoNew comma-separated CO IDs; replaces the existing linkage (omit to leave unchanged).
server_versionYes
clear_exclusionNoWhen True, removes the predicate entirely (the assumption becomes prose-only). Mutually exclusive with the exclusion_* params — if both are sent, the exclusion_* params win.
exclusion_co_idsNoComma-separated CO IDs the predicate matches explicitly; when non-empty, overrides the match fields. Supplying any exclusion_* param rewrites the whole predicate (unspecified fields default to "*").
exclusion_asset_idNo"*" or a concrete asset ID.
exclusion_attacker_idNoPredicate match — "*" wildcard or a concrete attacker ID.
exclusion_property_matchNo"C" | "I" | "A" | "U" | "*".
exclusion_attacker_vectorNoOne of "Network" | "Adjacent" | "Local" | "Physical" | "*".
exclusion_asset_component_idNo"*" or a concrete component ID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It does disclose one meaningful side effect — editing creates a new model version — which is valuable versioning context that the schema does not state. However, it omits other behavioral traits like the predicate-rewriting semantics and the mutual exclusivity between clear_exclusion and exclusion_* params, both of which remain buried in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero wasted words; the primary operation is front-loaded and the versioning side effect follows immediately. It is efficiently structured, though for a 12-parameter tool arguably under-specified rather than optimally sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The rich 92%-covered schema and the presence of an output schema carry most of the load, so an agent that reads the schema can likely invoke this tool correctly. However, the description alone offers no when-to-use guidance and does not explain the versioned workflow implied by the required server_version param. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 92%, so the baseline of 3 applies; the schema thoroughly documents the exclusion_* rewrite behavior, defaults, and mutual exclusivity. The description contributes no parameter-level meaning, and notably it does not clarify the one required param without a schema description (server_version), which is a minor missed opportunity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Edit an assumption" is a specific verb-plus-resource statement that clearly identifies the operation and, by verb choice alone, distinguishes it from the sibling add_assumption. The second sentence, "Creates a new model version," adds precision about what an edit entails, though the description never explicitly contrasts it with sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to edit an assumption versus adding one (add_assumption) or converting assumptions to controls (convert_assumption_to_controls). There are no prerequisites, exclusions, or contextual cues beyond the bare operation itself, leaving the agent to infer applicability.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_attackerEdit AttackerA

Edit an existing attacker. Only provided fields changed.

When changing identity fields, hold to the attacker authoring contract: capability names the operations performable from the position ("From [position], the attacker can [operations] …"), not just access — otherwise the result is flagged with a quality_warning (see add_attacker).

The composed likelihood is server-derived from the factor fields; to change the rating, set factor values and supply change_reason for the audit trail.

LLM-gated on identity-bearing fields (capability, archetype, position). Factor and trust_boundary edits skip the gate.

503 on evaluator outage, 502 on malformed response, 400 when factor fields, surface_extent or attest_surface_extent are sent without change_reason.

Attesting surface_extent is a person's audited structural declaration, ledgered like a factor override and forking a model version: "whole" makes every objective the attacker appears in a for-all obligation. "point" is REFUSED where an asset on one of those objectives is implemented by several components and is not split-knowledge — reaching any one of them reaches the asset, so a narrowing to one named entry would not be true of it — and it never makes a clause whose own text is universal existential.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
positionNoNew position (optional).
archetypeNoNew archetype (optional).
capabilityNoNew capability (optional).
attacker_idYesID of the attacker (e.g., "T1").
attack_vectorNo"Network" | "Adjacent" | "Local" | "Physical".
change_reasonNoRequired when any factor field, ``surface_extent`` or ``attest_surface_extent`` is supplied — documents the operator override for the audit trail.
server_versionYes
surface_extentNo``"whole"`` (operations range over ANY entry of the interface reached) or ``"point"`` (one named entry). Supplying it attests it; requires ``change_reason``.
attest_positionNoOperator-attest the attacker's current position without changing it — e.g. to confirm a fully external attacker's empty crossed set so an objective blocked on an unpositioned attacker can be resolved. Pass ``true`` to attest.
user_interactionNo"None" | "Required".
attack_complexityNo"Low" | "High".
trust_boundary_idsNoComma-separated trust boundary IDs — the boundaries this attacker has crossed (its position). Replaces the existing set. Changing it operator-attests the position, which lets reachability trust it for a decisive verdict.
privileges_requiredNo"None" | "Low" | "High".
likelihood_rationaleNoNew rationale (optional).
attest_surface_extentNoRecord the extent already on the attacker as attested, without changing its value. Pass ``true`` to attest; requires ``change_reason``.
capability_prevalenceNo"Commodity" | "Targeted" | "Rare".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden and does so thoroughly: patch semantics, LLM gating, server-derived likelihood, quality_warning on contract violations, specific HTTP error conditions, and surface_extent attestation with forking and refusal rules. This goes far beyond a generic 'edit' description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the essential edit semantics and dense with useful detail; no filler sentences. The surface_extent paragraph is long and intricate, but it encodes necessary refusal and forking semantics, so it earns its place despite being heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 17-parameter mutation tool with no annotations and an output schema present, the description covers all non-obvious behavior: patch semantics, gating, error responses, audit trail requirements, and attestation constraints. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 94%, but the description adds critical meaning beyond it: capability must name operations performable from the position, likelihood is server-derived and cannot be set directly, change_reason triggers and error conditions, and surface_extent attestation has deep structural consequences. Without this, several parameters would be ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

First sentence, 'Edit an existing attacker. Only provided fields changed,' names the exact verb/resource and clarifies patch semantics. It is unambiguously distinct from sibling creation/editing tools and even references add_attacker for the authoring contract.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational context: edits an existing attacker, only supplied fields change, identity fields are LLM-gated, and change_reason is required for factor/surface_extent edits. It does not explicitly contrast with alternatives like add_attacker or edit_asset, but its scope is unmistakable and the 'see add_attacker' pointer helps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_componentEdit ComponentA

Edit a component's properties.

Per-component level grades are orthogonal axes — set whichever apply to the program the component is in scope for. Leave a field unset (None) to keep the current server-side value; backend treats absent fields as "unchanged".

ParametersJSON Schema
NameRequiredDescriptionDefault
ealNoCommon Criteria Evaluation Assurance Level (1-7). For components subject to CC certification.
nameNoNew name (empty = unchanged).
pathNoNew path (empty = unchanged).
model_idYesID of the threat model.
repo_urlNoNew repo URL (empty = unchanged).
target_slNoIEC 62443 target Security Level (1-4). For industrial / OT components that need a 62443 zone target.
fips_levelNoFIPS 140-3 Security Level (1-4) for the cryptographic module embedded in this component.
component_idYesID of the component (e.g., "CMP1").
server_versionYes
trust_boundary_idsNoNew trust boundary IDs (comma-separated, empty = unchanged).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It meaningfully explains the non-obvious partial-update behavior ('backend treats absent fields as unchanged') and clarifies that grade fields are independent orthogonal axes. This goes well beyond a bare 'edit a component', though it does not cover permissions, validation, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then adds only the essential behavioral nuances. The 'orthogonal axes' metaphor is slightly dense but earns its place by framing the partial-update model. It is not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus a 90%-covered schema is largely sufficient for calling the tool: required IDs are in the schema and partial-update semantics are stated. However, it lacks guidance on how this tool relates to sibling edit tools, and it leaves the required server_version parameter unexplained. The presence of an output schema mitigates some of the gap, but the overall guidance is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 90%, so the baseline is 3. The description adds valuable semantics beyond the schema by explaining that per-component grades are orthogonal and that leaving fields unset preserves server-side values. This clarifies how to handle the nullable grade fields and the empty-string fields in practice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Edit') and the resource ('a component's properties'), which distinguishes it from other edit_* siblings that target different resources. However, it does not explicitly differentiate itself from sibling tools by scope or use case, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives solid operational guidance about partial updates ('absent fields are unchanged') and when to set grade fields ('set whichever apply'), but it does not explicitly say when to use this tool versus alternatives like edit_asset or edit_trust_boundary. Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_trust_boundaryEdit Trust BoundaryB

Edit a trust boundary. Creates a new model version.

ParametersJSON Schema
NameRequiredDescriptionDefault
tb_idYesID of the trust boundary (e.g., "TB1").
passesNoNew comma-separated AttackVector values the boundary allows through (subset of "Network,Adjacent,Local,Physical"). Use the empty string to set "blocks all"; omit to leave unchanged. Reach-relevant — narrowing or widening this set can flip CO verdicts.
sealedNoNew isolation flag. True declares NO lateral ingress (the only way in is crossing the perimeter — an air-gap / segmented enclave), which lets reachability decisively rule the boundary unreachable; False assumes a lateral pivot is possible. Reach-relevant — changing it can flip CO verdicts. Setting it records an operator attestation of the seal. Omit to leave unchanged.
crossesNoNew comma-separated asset IDs.
model_idYesID of the threat model.
descriptionNoNew description.
seal_sourceNo"attested" | "unattested". Only an operator-attested seal lets reachability decisively rule an objective unreachable past the boundary; an unattested (default/model-suggested) seal is treated as pivotable. Use "attested" to attest a boundary already marked sealed without re-toggling it; "unattested" retracts. An attested seal implies ``sealed``. Requires ``change_reason``.
change_reasonNoRequired when ``passes``, ``sealed``, or the seal attestation actually changes. Captured in the audit trail; documents why the boundary's vector filter, isolation claim, or attestation changed.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It does disclose one important side effect—edits create a new model version—which is valuable behavioral context for a mutation tool. However, it does not mention the audit trail, change_reason requirements, attestation implications, or whether edits are reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is only two sentences and front-loads the core purpose. The first sentence is somewhat redundant with the tool name, but the second earns its keep by revealing the versioning side effect.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool, this is barely adequate. The rich paramether schema and presence of an output schema compensate for much of the missing detail, but the description alone does not fully convey the implications of editing a trust boundary, such as versioning consequences and the audit/change_reason context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 89%, so the schema already explains most parameter semantics. The tool description adds no parameter-level details, but with high schema coverage the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Edit a trust boundary') and adds a meaningful distinguishing behavior ('Creates a new model version'). It clearly identifies this as the editing counterpart to add_trust_boundary and other edit_* tools, though it does not explicitly name a sibling alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool vs. add_trust_boundary or other editing tools. The verb 'Edit' implies use for existing trust boundaries, but no exclusions, alternatives, or context signals are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_reportExport ReportA

Export a threat model or a tag cohort as a downloadable document. Read-only; no side effects on the source.

scope selects what is exported and how scope_id is read; format selects the representation:

  • scope="model" (scope_id = model id) supports format ∈ {csv, pdf, html, archive}:

    • csv — the model's current state rendered as CSV; returned inline as UTF-8 text in content.

    • pdf / html — rendered document returned base64-encoded in content_b64 (with content_type). Runs as a server-side job; progress is reported automatically while it completes, which may take time for large models.

    • archive — the self-contained, independently-verifiable JSON audit bundle: every version, controls, assertions (with Tier 1 / Tier 2 verdicts and attested flags), findings, risk acceptances, assumption overrides, attestations, and instance sufficiency signatures; each control's per-clause evidence basis travels with it. Those verdicts are the origin's record of what it claimed, which is what a third party checks against the signatures; an importing workspace credits what its own verification establishes (see import_threat_model_archive). Returned as {..., "envelope": <dict>}; feed the envelope to import_threat_model_archive to restore it into any workspace. Model scope only.

  • scope="tag" (scope_id = tag id) supports only format="html": the signed auditor report, aggregating every member model's report plus the cross-model dependency graph and attestation status into one HTML document, returned inline in content. csv, pdf, and archive are rejected for tag scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYesexport boundary — "model" or "tag".
formatNo"csv" (default), "pdf", "html", or "archive". Tag scope requires "html"; "archive" is model-only.csv
scope_idYesid of the model or tag selected by ``scope``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: 'Read-only; no side effects on the source,' inline vs base64 return details, server-side job behavior with automatic progress reporting, the archive envelope's verification semantics, and format rejection rules for tag scope. These are behavioral facts beyond the input schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary sentence is front-loaded and the body is organized as a scannable markdown list. Despite its length, the content is dense and useful, covering format-specific behavior without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-format export tool with two scope modes and an asynchronous path, the description covers output encoding, job duration expectations, scope restrictions, and relationships to import_threat_model_archive. With an output schema also present, nothing important is left ambiguous.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description substantially enriches the scope and format parameters, mapping each scope value to valid formats, return encoding, and meaning of scope_id. The one gap is server_version, which is required but neither the schema nor the description explains its intended value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Export a threat model or a tag cohort as a downloadable document,' and then precisely distinguishes the two scope modes and format options. This clearly separates it from read-only siblings like get_threat_model and list_threat_models.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use the tool (to produce a downloadable/exportable artifact in a read-only operation) and states hard constraints such as tag scope allowing only html and archive being model-only. It does not explicitly name alternatives or say 'use X instead,' so it falls just short of a fully explicit routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_functional_objectivesGenerate Functional ObjectivesA

Derive capabilities, functional objectives, and the concrete tests to implement from the feature spec.

Capabilities are the behaviours the feature must deliver; each is walked against a taxonomy of operating conditions (nominal, boundary, invalid input, dependency failure, concurrency, …) to produce testable Given-When-Then objectives — and then a concrete, implementable test is specified for each objective (so the agent implements the tests rather than deciding what to test). Requires a Pro plan. Billable — may take some time. refresh=true re-derives from scratch, replacing prior generated (not manually authored) capabilities, objectives, and tests.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoRe-generate from scratch instead of serving cached output.
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and does so well. It explains side effects: refresh=true re-derives from scratch and replaces prior generated content while preserving manually authored content. It also discloses billing, time cost, and the systematic taxonomy-driven process.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then adds a precise definition of the internal concepts, and finishes with operational constraints. Every sentence earns its place, and the length is appropriate for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the presence of an output schema, the description covers the input requirements, workflow, output nature, side effects, and usage constraints. An agent has enough context to invoke the tool correctly and understand its consequences.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema describes model_id and refresh, and the description adds meaningful depth to refresh by specifying that it replaces prior generated (not manually authored) capabilities, objectives, and tests. However, server_version remains undocumented in both the schema and description, so coverage is not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'derive', and names the resource: capabilities, functional objectives, and concrete tests from a feature spec. It clearly distinguishes this generation tool from retrieval siblings like get_functional_objectives by emphasizing that it creates testable Given-When-Then objectives and implementable tests.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context about when to use the tool (from a feature spec, requires Pro plan, billable, may take time) but does not explicitly contrast it with related alternatives like get_functional_objectives, add_functional_test, or import_functional_tests. Usage is implied rather than explicitly routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_threat_modelGenerate Threat ModelA

Generate a complete threat model from a feature description.

Analyzes the feature using the Security Properties (Confidentiality, Integrity, Availability, Usage) methodology with capability-defined attackers. Produces trust boundaries, asset inventory, attacker inventory, control objective matrix, and assumptions.

Runs a multi-step AI pipeline. Progress is reported automatically.

Similar-model short-circuit: if the backend finds an existing model in the workspace whose feature description substantially overlaps with the new one, it does NOT generate a duplicate. This tool returns {"similar_models": [{"id", "title", "reason"}, ...], "suggestion": "..."} with the candidate IDs instead. The agent should then either:

  • Call refine_threat_model on one of the candidates to extend the existing model (usually the right answer — avoids duplicate modeling of the same system and preserves control/assertion history).

  • Retry this tool with force=True to bypass the check and create a genuinely new model anyway (e.g., when the similarity is superficial and the operator confirmed the new model is distinct).

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNoSkip the similar-model detection and always create a new model. Default False — the check fires unless the operator / agent has explicit reason to bypass it.
parent_idNoOptional ID of an existing model to wire the new model under as a child on the recursive composition tree. The child then inherits the parent's topology and participates in composition (delta / inherited control credit). Default None — the model is created flat.
provenance_refNoBranch or tag name at that commit (optional).
server_versionYes
provenance_kindNoWhere the description came from, one of ``code``, ``ticket``, ``document``, ``manual``, ``mixed``. Empty (default) records nothing. For an existing repository pass ``provenance_kind="code"`` with ``provenance_repo_url`` and ``provenance_commit_sha`` (the HEAD you gathered from): the code is then authoritative and the model follows it. Any other kind means the description is intent and the code is measured against it. The same record can be set later with ``set_model_provenance``.
feature_descriptionYesDescription of the feature or system to threat model. Can be a few sentences or a detailed spec.
provenance_repo_urlNoRepository URL the description was gathered from (``code`` kind).
provenance_commit_shaNoCommit SHA the description was gathered at (``code`` kind).
provenance_source_refNoIdentifier of the ticket or document the description came from (``ticket`` / ``document`` kinds).
provenance_source_urlNoURL of that ticket or document.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the multi-step AI pipeline, automatic progress reporting, and the critical non-obvious behavior: if an overlapping model exists, generation is short-circuited and no duplicate is created. It also names the exact return shape for that case. This is high-value behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then methodology, then the important short-circuit behavior. Every section earns its place, and the length is justified by the need to explain a non-obvious control flow. There is no filler or tautology.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex generation tool with 10 parameters and no annotations, the description covers the essential context: what the model is based on, the methodology used, produced artifacts, async pipeline behavior, and the similar-model branch. With an output schema available, return-value details are not needed. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 90%, so the schema already documents most parameters. The description adds meaningful semantics by explaining the force parameter in context: it bypasses the similar-model short-circuit. It also clarifies the rationale behind choosing refine_threat_model versus forcing a new model. These additions go beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb-resource pair: 'Generate a complete threat model from a feature description.' It also names the methodology (Security Properties), the concrete artifacts produced (trust boundaries, asset inventory, attacker inventory, control objective matrix, assumptions), and distinguishes itself from refine_threat_model by explaining the relationship. This makes it easy for an agent to know exactly what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly addresses the similar-model short-circuit and gives a decision procedure: call refine_threat_model to extend a candidate, or retry with force=True to bypass. It even indicates the usual right answer, which is strong usage guidance beyond a generic 'use for X' statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_assertion_typesGet Assertion TypesA

List the assertion types submit_assertions accepts, with their params.

Read-only. Returns the catalogue as structured data: every type, what it proves, its soundness class, which params it requires, which it accepts (an array-valued param carries its item_schema), and a worked example. soundness_classes defines the five classes by the fact a pass establishes, weakest to strongest — presence, under_approximating_scan, existential_witness, sound_over_approximation, by_construction — and sound_classes names the two that can credit a for-all clause. covers gives the accepted form of a binding declaration.

Call this before writing assertions. submit_assertions names the types and their required params in its own description, but descriptions are prose a client may present only in part, and a half-list reads exactly like a whole one. This returns data, so what you get back is the complete contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
typesNoOptional comma-separated type names to return (e.g. "file_exists,pattern_absent"). Omit for all of them.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It states "Read-only" and describes the return payload in detail: every type, what it proves, its soundness class, required/optional params, item_schema for array params, a worked example, and the semantics of soundness_classes, sound_classes, and covers. This goes well beyond a generic list call and gives the agent a clear expectation of behavior and output structure, even without an output schema reference.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical, but every sentence contributes meaningful detail: purpose, output semantics, and usage rationale. It is front-loaded with the core purpose and then expands. While slightly verbose, it avoids redundancy and earns its length through dense, relevant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return-value details could be omitted, but the description still explains the output's semantic structure, which is valuable. The main gap is the unexplained server_version parameter, but the tool itself is simple and well-contextualized. Overall, the description is sufficient for correct invocation, with only that minor parameter gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only 50% coverage, with server_version lacking any description. The tool description does not mention either of the tool's own parameters (types, server_version), so it adds no semantic value beyond the schema. Since the description is expected to compensate for schema gaps, the failure to explain server_version is a significant omission, leaving the agent without guidance on a required parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement of purpose: "List the assertion types submit_assertions accepts, with their params." It clearly specifies the resource (assertion types) and the action (list), and immediately connects to the sibling tool submit_assertions, distinguishing itself as the authoritative catalogue. This is unambiguous and fully differentiates the tool from its siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance: "Call this before writing assertions." It explains why this tool is preferred over relying on submit_assertions' prose description, noting that prose may be partially presented and a half-list reads like a whole one. This provides a clear when-to-use directive and justifies why the structured data is superior, covering the alternative explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_capabilityGet CapabilityA

Get one capability with its component and asset bindings.

Read-only; no side effects. Use when you already have a capability_id (e.g. from list_capabilities) and need its full detail; to enumerate all capabilities of a model, use list_capabilities instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model the capability belongs to.
capability_idYesID of the capability to fetch.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries the behavioral disclosure burden, and it does so effectively by stating 'Read-only; no side effects.' It also clarifies the result scope (one capability with bindings). It does not mention response errors or auth requirements, but for a simple single-item read operation this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short, front-loaded sentences. The main purpose appears first, followed by read-only clarification and then explicit usage routing to list_capabilities. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool's behavioral profile is simply a read-only fetch, which is adequately described. Usage context and alternatives are explicit. Since an output schema already exists, the description does not need to explain return values. Nothing necessary for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes model_id and capability_id, so the description adds little beyond reinforcing that capability_id comes from list_capabilities. The server_version parameter has no schema description and is not clarified in the tool description, though verbose descriptions may come from the schema context. Overall, the description does not significantly elevate parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: 'Get one capability with its component and asset bindings.' It also distinguishes itself from list_capabilities by specifying singular retrieval ('one capability') and the need for a known capability_id, making it easy for an agent to select correctly among many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: when you already have a capability_id and need full detail. It also names the alternative, list_capabilities, and explains when to use that instead. This is direct, actionable guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_compliance_reportGet Compliance ReportA

Compliance gap-analysis report for one framework at a chosen scope. Read-only; no side effects. System/tag scopes require PRO tier.

Evaluates every framework requirement against the mapped controls in scope and classifies each as covered, partial, uncovered, unmapped, or excluded, then returns coverage counts plus per-requirement rows. The framework must first be activated at the same scope via select_compliance_frameworks (with the matching scope), otherwise there is nothing to report on.

scope selects the boundary and how scope_id is read:

  • "model" — a single threat model (scope_id = model id).

  • "system" — rolled up across every model in a System, a group of related threat models (scope_id = system id).

  • "tag" — rolled up across every member model of a tag cohort, a freely-composed set of models (scope_id = tag id).

Filtering / pagination:

  • level — level filter for level-aware frameworks; returns only requirements at or below this level (e.g. 1 for L1 only). Omit (or 0) for all levels. Honored for all scopes.

  • status — one of "covered", "partial", "uncovered", "unmapped", "excluded"; empty = all statuses. Model and system scopes only.

  • offset / limit — per-requirement row pagination; offset skips the first N rows, limit caps rows returned (0 = no explicit limit). Model and system scopes only.

A tag report is neither paginated nor status-filtered; passing status, offset, or limit with scope="tag" raises an error rather than silently returning unfiltered rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
levelNooptional level filter; omit for all levels.
limitNomax requirement rows to return, 0 = no explicit limit (model/system scopes only).
scopeYesreport boundary — "model", "system", or "tag".
offsetNoskip the first N requirement rows, pagination (model/system scopes only). Default 0.
statusNooptional per-requirement status filter (model/system scopes only).
scope_idYesid of the model, system, or tag selected by ``scope``.
framework_idYesframework to report on (already selected at this scope; see ``list_compliance_frameworks``).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses read-only/no side effects, error behavior for unsupported tag-scope pagination or status filters, prerequisite activation, and the shape of the returned report. Even the tier limitation is exposed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured into clear sections: overview, prerequisite, scope semantics, and filtering/pagination. Every paragraph earns its place, and the most critical constraints (read-only, PRO tier, prerequisite) come first. It is long but appropriately so for a complex 8-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, scope-dependent behavior, output schema present), the description is complete. It covers all scope interpretations, all filter semantics, parameter restrictions, prerequisite workflow, and error mode. No critical detail an agent needs to call or interpret the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 88% of parameters, so baseline is 3, but the description adds substantial meaning: it interprets scope_id per scope, explains level/status/offset/limit semantics per scope, names the enumeration of status values, and clarifies that tag scope errors on pagination/status args. This clearly exceeds schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Compliance gap-analysis report for one framework at a chosen scope,' and later details the exact output (coverage counts plus per-requirement rows). It clearly differentiates itself from sibling report tools by focusing on one framework, requirement-level classification, and scope semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: when the framework must be activated, what each scope means, PRO-tier requirements for system/tag scopes, and which parameters are invalid for tag scope. However, it does not explicitly name alternative tools or state when to prefer another report tool, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_composition_overviewGet Composition OverviewA

Composition index for a model — counts, tree metadata, warnings.

Read-only; no side effects. Cheapest call in the composition surface (~1-2KB). Use it first to learn whether composition is available for this model, where the model sits on the recursive tree (parent + ancestor chain + child ids), how many own vs inherited entities and COs there are per kind, and whether any structural warnings (cycle, parent missing, max depth exceeded) need surfacing before drilling into sub-resources.

Return shape::

{
  model_id, model_version, flag_enabled,
  tree: {parent_id, ancestor_chain, depth, child_ids},
  counts: {
    entities: {kind: {own, inherited}, ...},
    control_objectives: {total, live, covered, uncovered,
      indeterminate, by_origin: {own, cross, inherited}},
    reconciliation_candidates: {certain, heuristic},
  },
  warnings: [str, ...],
}

When composition is not available on the backend, the same shape is returned with all counts zeroed and flag_enabled: false — detect that rather than handling an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and discharges it thoroughly: it declares 'Read-only; no side effects', gives cost/size expectations (~1-2KB, cheapest), and discloses the critical edge case — when composition is unavailable the call returns zeroed counts with flag_enabled false rather than throwing, so an agent won't mis-handle it as an error. It also explains the tree/counts/warnings semantics a caller needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every part earns its place: a one-line summary, a usage/context paragraph, a structured return-shape block, and a edge-case caveat. The essential summary is front-loaded and the special behavior is last, making it easy to scan despite the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema covers the return shape, and the description adds the behavioral and usage context around it, including the unavailable-backend case. The only material gap is the meaning of server_version, which is required but left undocumented both in the schema and the description; otherwise an agent has everything needed to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers 50% of parameters: model_id has a description, but server_version has none, and the tool description does not clarify what server_version is or how it affects the call. The description adds context about the output being keyed by model_id and model_version, but it does not compensate for the undocumented required parameter, so the score stays at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line — 'Composition index for a model — counts, tree metadata, warnings' — names a specific verb and resource and states exactly what is returned. The description further distinguishes this from the many sibling tools by positioning it as the 'cheapest call in the composition surface' and the one to 'use it first', setting it apart from the other composition, coverage, and entity tools. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use it first to learn whether composition is available for this model' is an explicit when-to-use directive, and 'before drilling into sub-resources' implies the alternative path of calling more specific tools. It does not name particular sibling alternatives or state when not to use it, so it falls short of a 5, but it gives clear context well above the minimum.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_control_assumption_groupsGet Control Assumption GroupsA

Get the current assumption group structure for a control.

Assumption groups define alternative sets of external claims that can satisfy a control:

  • Within a group: AND — all assumptions must be active and attested

  • Across groups: OR — any complete group is sufficient to mark the control as externally handled

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idYesID of the control (e.g., "CTRL-03").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It explicitly indicates a read-only operation ('Get') and adds meaningful domain behavior: assumptions within a group are ANDed, groups are ORed, and a complete group marks the control as externally handled. It does not discuss auth or error cases, but the getter nature and semantics are transparent enough for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the purpose, followed by a concise bulleted explanation of the AND/OR semantics. Every sentence adds value and no filler exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only control query with an output schema, the description gives the essential domain model: assumption groups, external claims, AND within groups, OR across groups, and the effect on externally-handled status. It could additionally state that this is the read counterpart to set_control_assumption_groups, but the sibling names already make that connection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes model_id and control_id, but server_version is undocumented, and the description adds no parameter-level detail. With 67% schema coverage, the description does not need to restate everything, but it also does not compensate for the missing server_version context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get') and a resource ('assumption group structure') scoped to a control, then defines exactly what that structure means with an AND/OR explanation. This clearly distinguishes it from write-oriented siblings like set_control_assumption_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word 'Get' and 'current' provide clear retrieval context, and the description implies when an agent would want to inspect the assumption group structure. It does not explicitly name alternatives or state when not to use it, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_control_generation_statusGet Control Generation StatusA

Poll the async control-generation status for a threat model.

When generate_threat_model / refine_threat_model return a controls_status other than complete, controls are being authored in the background — poll this until a terminal state, then read the controls.

Return shape: {status, mode, target_cos, ready_cos, error_message, elapsed_seconds} (or {status: "none"} when controls were built inline). status is queued | generating | deferred | complete | failed | skipped | none:

  • deferred — today's background-analysis budget is used up; generation resumes automatically at the daily reset (relay this to the user).

  • failederror_message says why (e.g. insufficient credits).

  • ready_cos / target_cos — coverage progress.

  • elapsed_seconds — time since queued; if it stays queued with a large elapsed, generation may not be progressing — surface that instead of polling forever.

Read-only; no side effects (polling does not trigger or alter generation).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose control-generation status to poll.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it does so thoroughly. It explicitly states read-only semantics, 'no side effects (polling does not trigger or alter generation)', explains each terminal and non-terminal status, describes error_message content, and gives progress fields ready_cos/target_cos with elapsed_seconds semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then proceeds logically through triggering condition, return shape, status meanings, and polling caveats. Every sentence adds actionable information; there is no filler or repetition of obvious schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is impressively complete for a polling tool: it covers when to call, terminal states, error/deferred handling, progress semantics, and the absence of side effects. The one gap is the server_version parameter, whose meaning and required value are left entirely to the schema's bare string definition. Since an output schema exists and return fields are already described, this is a minor completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the description does not compensate for the undocumented server_version parameter at all. It adds little beyond the schema for model_id, which the schema already describes as the threat model ID. For a required parameter that appears only as a bare string with no description in the schema, the tool description should provide at least some semantic context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Poll the async control-generation status for a threat model.' It clearly distinguishes this from sibling tools like generate_threat_model, refine_threat_model, and regenerate_controls by framing it as the polling complement to those background-authoring operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: after generate_threat_model/refine_threat_model return a non-complete controls_status, poll until terminal state, then read the controls. It also gives guidance on non-obvious outcomes such as deferred (budget exhausted, retry at reset) and stuck queued with large elapsed_seconds (surface to user rather than polling forever).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_control_objectivesGet Control ObjectivesA

Get the control objective matrix, or one control objective. Read-only.

Two modes, selected by whether co_id is set:

  • Matrix mode (co_id omitted) — returns the model's COs, each with references to the controls that cover it. By default returns a compact summary (total count only); pass offset/limit to page through full CO records.

  • Single mode (co_id set) — returns that one CO's typed fields, the IDs of any controls that map to it, and the deterministic reachability verdict (the structural derivation that backs any reach claim on the CO). Tombstoned COs (removed: true) are returned with the flag set; the verdict is omitted because reach state is frozen at the removal version. offset/limit are ignored in this mode.

For pass/fail assurance scoring use assess_model.

ParametersJSON Schema
NameRequiredDescriptionDefault
co_idNoIf set, single mode — return this one control objective (e.g. ``CO3``) with its verdict. If omitted, matrix mode.
limitNoMatrix mode — max to return (0 = summary only, no per-CO records).
offsetNoMatrix mode — skip the first N control objectives.
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it does so thoroughly: read-only semantics, mode-dependent return contents, tombstone handling, verdict omission, and ignored parameters are all disclosed. This goes well beyond a minimal 'gets data' phrasing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a short opening summary followed by clear bullet-style mode breakdowns. Every sentence carries useful information, and the critical read-only and mode-selection cues are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the tool's behavioral complexity: mode selection, pagination, summaries vs full records, tombstone behavior, verdict semantics, and a pointer to the correct sibling. An output schema is present, so the description need not restate return values, and an agent has enough information to invoke this tool correctly in either mode.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the schema already documents most parameters. The description adds meaningful context beyond the schema by explaining that co_id selects the mode, that limit=0 means summary-only, and that offset/limit are ignored in single mode.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (control objective matrix or a single control objective) and the action (Get), and it explicitly frames the operation as read-only. It also distinguishes itself from the sibling assess_model by routing pass/fail assurance scoring to that tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It specifies exactly when to use each mode based on whether co_id is set, describes defaults for matrix mode, and states that offset/limit are ignored in single mode. It also explicitly names assess_model as the alternative for pass/fail assurance scoring.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_controlsGet ControlsA

Get implementation controls for a threat model — list or single-control detail. Read-only (with one list-mode side effect, below).

Two modes, selected by whether control_id is set:

  • List mode (control_id omitted) — returns the controls that should be implemented to satisfy the model's control objectives, as {"controls": [...], "total": N, "returned": M}. One side effect: if controls have never been generated for this model, the first call triggers generation. Generation may finish inline or continue in the background — if results look incomplete, poll get_control_generation_status and re-read once it reports complete. The filters (status, co_id, component_id), pagination (offset/limit), and the include_deleted / include_orphaned / summary_only toggles apply only in this mode. By default list mode excludes ORPHANED controls (controls whose every mapped CO is tombstoned because its asset/attacker pair was removed in a later version); pass include_orphaned=True to include them — each returned control carries a boolean orphaned field so callers can render the distinction.

  • Detail mode (control_id set) — returns a single control directly (NOT wrapped in an array) with verified-status enrichment and an orphaned flag derived from the live CO set. 404 if the control doesn't exist on the requested version. Pass version to read the control as of a specific model version. The list-mode filters, pagination, and toggles are ignored in this mode.

Objective mapping is not coverage credit. The control-objective ids a control carries record which objectives it is ATTACHED to, not which ones it is required to satisfy. Within an objective, a control is either a member of a required mitigation group or it is defense-in-depth, which is tracked but earns no mitigation credit. A control that is defense-in-depth on every objective it touches can be fully implemented and fully verified without moving a single objective out of at-risk. Read get_mitigation_groups for the per-objective role before deciding a control is worth evidence work — the id list alone will not tell you whether proving it changes anything.

Two different status fields — do not conflate them. status is the operator-set implementation state (not_implemented / implemented / verified). verification_status and is_verified are the EVIDENCE state, derived from the control's assertions:

  • "verified" — every assertion passes both tiers AND they collectively cover the whole control description.

  • "partially_verified" — deliberately covers three distinct situations, so it does not by itself tell you what to fix: some assertion FAILED a tier, or all passed but leave clauses of the description UNPROVEN, or the control leaned on an operator attestation that has since EXPIRED. Call get_sufficiency on the control to find out which.

  • "pending" — assertions exist, some still awaiting evaluation.

  • "unverified" — no assertions submitted at all.

A control with assertion_count well above zero and every tier passing can still read partially_verified; that is the normal state for evidence narrower than the description promises, and the fix is more assertions (or a narrower description), never a verdict recompute.

A for-all clause — one that ranges over every entry of a surface — is credited only by a sound type bound to it with covers; an attestation never substitutes. What each clause still needs is served per clause by get_control_work_order in required_evidence.

Filtering status="implemented" returns controls the operator marked implemented that have NOT been promoted to verified — the right filter for "what still needs evidence work". It reads this model's OWN stored controls; controls inherited through composition are counted by assess_model but are managed on their source model.

ParametersJSON Schema
NameRequiredDescriptionDefault
co_idNoList-mode filter — control objective ID.
limitNoList mode — max controls to return (0 = all).
offsetNoList mode — skip the first N controls (pagination).
statusNoList-mode filter — "implemented", "not_implemented", or "verified".
versionNoDetail mode only — model version to read the control from. 0 (default) uses the latest. Ignored in list mode.
model_idYesID of the threat model.
control_idNoIf set, detail mode — return this one control's full record directly (e.g. ``CTL-12``). If omitted, list mode.
component_idNoList-mode filter — component ID (e.g., "CMP1").
summary_onlyNoList mode — if True, returns only id, description, status, assertion_count, and assumed_by per control (much smaller response).
server_versionYes
include_deletedNoList mode — include soft-deleted controls (default False).
include_orphanedNoList mode — include controls mapped only to tombstoned COs (default False).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It openly reveals the list-mode side effect (triggering generation), the possibility of background completion, the default exclusion of orphaned controls, the direct return in detail mode vs array in list mode, the 404 behavior, and the distinction between two status fields. It even explains the nuanced semantics of 'partially_verified' and the behavior of filtering by status. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is well-structured with bolded section headers and bullet-like formatting. Each sentence adds necessary nuance for a tool with this complexity. The opening sentence front-loads the core purpose and modes. While it could arguably be trimmed slightly, the structure makes it navigable and the length is justified by the operational details required.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 12 parameters, the presence of an output schema, and the many sibling tools, the description is remarkably complete. It covers modes, side effects, status semantics, filtering behavior, inherited controls, and references to related tools for deeper needs. Nothing an agent needs to correctly invoke this tool appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, but the description adds significant meaning beyond the schema. It explains how control_id selects the mode, that filters/pagination/toggles apply only in list mode, that version only applies in detail mode, and interprets the status field. It also clarifies the meaning of include_orphaned and the orphaned flag. The description enriches every parameter's semantic context, going well beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 ('Get implementation controls for a threat model') and immediately distinguishes the two modes (list vs single-control detail). It also flags the side effect in list mode, which sets it apart from purely read-only siblings. This makes the tool's purpose unmistakable and differentiates it from related tools like get_control_work_order or get_control_generation_status.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use each mode based on whether control_id is set, and details when to poll get_control_generation_status. It also warns that objective mapping is not coverage credit, directing users to get_mitigation_groups for role determination, and clarifies the correct filter for 'what still needs evidence work'. It clearly routes to alternatives like get_sufficiency and get_control_work_order where appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_control_work_orderGet Control Work OrderA

Get the work order for one control. Call this BEFORE implementing a control: it is the ticket. Read-only; no side effects.

The work order bundles everything an implementing agent needs in one read: the scan brief (where to look and what to look for), what counts as proof (the assertion_contract: which assertion types apply grouped by soundness class, the evidence rule, the universal rule, what to submit with, and when the control counts as verified), the acceptance_criteria and steps, the reconcile_rules to follow when the code disagrees with the model, the delegation block (what this agent may decide on its own and what must be escalated), any open_proposals on the control, and the model's provenance (whether the code or the description is authoritative).

The proof the order asks for is stated by-construction first. Where the order names a required class for a clause, required_evidence[] carries one entry per such clause: the clause text, its clause_id (the value to put in covers), its quantifier, the required_class that closes it, what is missing, and a suggested_submission skeleton (type, params_template, covers). The skeleton is a fill-in, not a submission: its <...> placeholders are values only you can supply, and one left unreplaced is refused — before the submission leaves this client and again when it arrives — by the same format rule, because a placeholder that validated would be recorded as a claim about your code that nothing backs. For a for-all clause the required class is [by_construction, sound_over_approximation] and the suggestion prefers typed_boundary — declare the type the sinks accept and its constructors — else sink_default_deny — declare the sinks that realise the clause, the safe forms, a reviewed allowlist. When evidence of the wrong class is already bound, missing says so: the evidence is the wrong CLASS, not merely incomplete. acceptance_criteria[] is GENERATED from those entries — a clause that has to hold at every site the attacker reaches is named as such, so no number of tests reads as closing it. steps[] reads: for each clause, submit the class the order names, bound with covers.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idYesID of the control to implement (e.g. "CTRL-03").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and meets it: it states 'Read-only; no side effects' outright and discloses a notable behavioral rule — that an unreplaced placeholder is refused both at the client and on arrival by the same format rule. This is exemplary behavioral disclosure for a read tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The opening is well front-loaded (verb, timing, safety in two sentences), but the remainder is several dense paragraphs detailing return-value semantics — required_evidence[], assertion_contract, acceptance_criteria generation, steps, for-all clauses — that an output schema could carry. This is far more prose than a get tool needs, so it is over-specified rather than concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a genuinely complex domain, the description richly explains why to call it and what the returned order contains, adding semantic nuances the output schema cannot convey (the skeleton is a fill-in not a submission; wrong evidence class vs incompleteness; acceptance_criteria being generated). The sole practical gap is the undefined server_version. It is over-explanatory rather than under-specified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%: model_id and control_id are described, but server_version is undocumented in the schema and the description adds nothing about it. The description never mentions any of the three parameters or provides formats/value guidance beyond the schema's CTRL-03 example, so it does not compensate for the server_version gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opener 'Get the work order for one control' states a specific verb and resource, and 'Call this BEFORE implementing a control: it is the ticket' sharply positions it against siblings like get_controls (list), refine_control (mutate), delete_control (destroy), and update_control_status (state change). An agent can tell exactly what this tool is for and how it differs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use guidance is given ('Call this BEFORE implementing a control: it is the ticket'), which sequences the agent correctly relative to implementation. It does not name exclusions or alternative tools to consider instead, but the timing context and read-only framing effectively route the agent away from the mutating siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_cwe_catalogGet Cwe CatalogA

Get the platform's CWE reference catalog status.

Returns {enabled, current_version, entry_count, versions}. When CWE classification is not turned on for this instance, enabled is false and the rest is empty — this is a normal informational response, not an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the burden of behavioral disclosure. It does so by explaining the returned fields and, importantly, calling out the disabled-CWE edge case as a normal informational response rather than an error. It does not discuss authentication or side effects, but for a read-only status tool the main behavioral surprise is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states action and resource, the second gives the return shape, and the edge-case clarification earns its place. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple status tool and the description covers return semantics and the disabled-case behavior, aided by the presence of an output schema. However, the complete absence of server_version guidance is a real gap: an agent cannot reliably know what to pass for a required field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter, server_version, with 0% schema description coverage, and the description never mentions it or explains what values or formats are expected. The description adds no meaning beyond the bare property name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Get') and resource ('platform's CWE reference catalog status'), and further clarifies what is returned (`{enabled, current_version, entry_count, versions}`), which distinguishes it from sibling CWE-related tools like get_model_cwe_tags or classify_model_cwe.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when an agent needs CWE catalog status, such as checking whether CWE classification is enabled, but it gives no explicit when-to-use guidance, exclusions, or alternatives. The sibling list contains related tools, but the description does not route between them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_design_leverageGet Design LeverageA

Rank what eliminating each attacker position or asset BY DESIGN would remove from the matrix. Call this when deciding whether to change the design instead of implementing controls: it shows which single design change retires the most critical and high at-risk objectives. Read-only; no side effects.

Each row in ranked is an attacker or asset with the objectives its removal would take out of the matrix (objectives_removed, broken down by tier in removes), how many of those are currently at risk (removes_at_risk / removes_at_risk_by_tier), and the controls that would be retired. Rows are ranked by critical, then high, at-risk objectives removed. design_move (a concrete change of design that would eliminate the row) is filled only when include_design_moves is true. To act on a row, raise a design_change proposal with create_proposal; never apply a design change yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoNumber of rows to return. Default 5.
model_idYesID of the threat model.
server_versionYes
include_design_movesNoAlso author a ``design_move`` per row. Default False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to inherit safety traits, the description carries the full burden, and it does well: it declares 'Read-only; no side effects,' explains the ranking order, discloses that design_move is populated only when include_design_moves is true, and describes the per-row fields. It does not cover edge cases such as empty results, tie-breaking, or failure behavior, which keeps it one step short of excellent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is rich but tightly organized: purpose, invocation context, output semantics, and the follow-up action rule each occupy clear, purposeful sentences. There is no filler, tautology, or unnecessary repetition, and the important 'never apply a design change yourself' rule is included without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only analytical tool with an output schema, the description supplies the call context, ranking semantics, row field meanings, and the required next step via create_proposal. It does not define the matrix or critical/high at-risk terminology, and server_version remains undocumented, but overall it is well above the minimum needed 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so model_id, top, and include_design_moves are already documented in the schema. The description adds useful context by clarifying that design_move is filled only when include_design_moves is true, but it does not explain server_version or provide additional parameter-level detail beyond the schema, placing it at the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific action: ranking what eliminating each attacker position or asset BY DESIGN would remove from the matrix. It clearly distinguishes this from remediation-focused tools by framing the purpose as changing design instead of implementing controls, and it anchors the follow-up action to create_proposal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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: 'Call this when deciding whether to change the design instead of implementing controls.' It also gives clear post-call guidance by instructing the agent to raise a design_change proposal and never apply a design change itself. However, it does not name sibling alternatives or state explicit when-not-to-use conditions, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_effective_coverageGet Effective CoverageA

Effective coverage rollup with credited inheritance.

Read-only. Per effective CO: whether it is covered, how much credit comes from controls owned by this model vs inherited from ancestors, and the list of contributing controls (with the owning model id, origin tag, verification status, and mitigation group). This is the surface that drives the composition view's coverage / compliance numbers — it reflects composed (own ⊕ inherited) math, NOT the per-model coverage shown by get_verification_report.

Return shape::

{
  model_id, flag_enabled,
  coverage: [
    {co_qid, is_covered, own_credit, inherited_credit,
     contributing_controls: [{control_id, owner_model_id,
       origin, is_verified, mitigation_group}, ...]},
    ...
  ],
  total, page, page_size,
}

When composition is not available on the backend, coverage is empty and flag_enabled: false.

Paginated: omitting page / page_size defaults to page=1, page_size=100 — a single call no longer returns every coverage row.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo1-indexed page number (default ``1``).
originNofilter coverage rows by contributing-control origin — one of ``"own" | "cross" | "inherited"``. When omitted, rows with any origin mix are returned.
model_idYesID of the threat model.
page_sizeNocoverage rows per page (default ``100``).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and it delivers: it declares the operation read-only, specifies the exact return shape, explains the empty-coverage fallback when composition is unavailable, and documents pagination defaults. This is far beyond what structured fields would provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but well-structured: a one-line summary, a precise behavior paragraph, an explicit return-shape block, and two short notes on fallback behavior and pagination. Every sentence earns its place and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is comprehensive: it covers read-only semantics, return structure, composition-unavailable behavior, pagination, and the distinction from get_verification_report. The only notable gap is that server_version is a required parameter with no schema description and no explanation in the tool description, leaving an agent unsure what value to pass.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the baseline is 3 and the schema already documents page, origin, model_id, and page_size. The description adds useful conceptual context about 'own' versus 'inherited' credit and explains pagination behavior, but it does not add significant meaning for the opaque server_version parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Effective coverage rollup with credited inheritance.' It clearly defines what is returned per effective control objective and explicitly contrasts itself with get_verification_report, so an agent can distinguish it from a very similar sibling without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states this drives the composition view's coverage/compliance numbers and that it reflects composed own ⊕ inherited math rather than per-model coverage. It names get_verification_report as the alternative for per-model coverage, giving the agent a clear selection rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_entityGet EntityA

Get a single entity of any core type by ID. Read-only.

Dispatches on entity_type to the per-type read and returns that type's native record as-is (not wrapped in an array):

  • asset — the asset's typed fields. Soft-deleted assets carry deleted: true; the caller decides whether to surface them. entity_id e.g. A-01.

  • attacker — the attacker with its factor decomposition, its surface_extent (unset / point / whole) and surface_extent_source, which says whether a person attested it. Soft-deleted attackers carry deleted: true. entity_id e.g. T-03.

  • component — the component. Speculative components (repo_url="") are returned as-is: the empty repo IS the lifecycle state, not an error. entity_id e.g. CMP-01.

  • trust_boundary — the boundary incl. its passes set (closed-vocabulary subset of {Network, Adjacent, Local, Physical}). entity_id e.g. TB-Net.

  • assumption — the assumption with its override applied (mirrors list_assumptions' merge for one entity: typed fields, the structured exclusion predicate when present, and the override layer — status / justification / linked CO IDs / target model). Soft-deleted assumptions carry deleted: true. entity_id e.g. AS-01.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
entity_idYesID of the entity to fetch.
entity_typeYesWhich entity to read — one of ``asset``, ``attacker``, ``component``, ``trust_boundary``, ``assumption``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden and does so thoroughly: it discloses read-only behavior, as-is return shape, soft-delete semantics, speculative component handling, assumption override merging, and closed vocabularies. This goes far beyond what the schema provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-sentence summary followed by a scannable per-type bullet list. Each bullet adds real semantic value with concrete examples, and there is no filler or repetition of schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a dispatch tool spanning five entity types with no annotations, the description supplies everything needed to call it correctly: type-specific IDs, return shapes, edge cases, and controlled values. The presence of an output schema reduces the need to enumerate return fields exhaustively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the description needs to add value, and it does with per-type entity_id formats and dispatch semantics for entity_type. The server_version parameter remains undocumented, but the parameters that affect correct invocation are well clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Get'), a specific resource ('single entity of any core type by ID'), and the read-only nature. The per-type bullets make the scope explicit and distinguish this from siblings like get_threat_model or list_effective_entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly indicates this tool is for fetching one entity by ID and limits itself to five core types. It does not explicitly name alternative list/search tools or state when not to use it, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_findings_risksGet Findings RisksA

Workspace-scoped triage dashboard: open findings, active risk acceptances, and at-risk Control Objectives across every model the workspace can access.

Use this as the entry point when an operator asks "what's open?" or "what should I work on next?" — one round-trip returns all three categories with model context and risk dimensions (severity, status, risk_tier, owner, review_by) so the agent can triage without per-model fan-out. The endpoint is read-only and fast; it composes from existing per-model queries server-side.

Returns the envelope verbatim: {workspace_id, evaluated_at, models, findings, risk_acceptances, at_risk_cos, summary}. summary carries totals (open_findings, total_findings, active_risk_acceptances, total_risk_acceptances, at_risk_cos) for quick health-check responses.

ParametersJSON Schema
NameRequiredDescriptionDefault
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it delivers: it explicitly states the endpoint is read-only and fast, composes server-side from existing per-model queries, and returns the envelope verbatim. This gives an agent a clear mental model of the operation's safety and behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: purpose first, usage trigger second, return envelope third. Each sentence adds substantive information, and there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers scope, contents, usage context, and return shape in enough detail for an agent to understand what the tool provides. The only notable missing context is the meaning of 'server_version' and how it relates to workspace-triage behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole required parameter 'server_version' has no schema description and no coverage in the tool description. The description never mentions the parameter, its purpose, format, or allowed values, leaving the agent to guess what to pass. With 0% schema description coverage, the description needed to compensate and did not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific resource ('workspace-scoped triage dashboard') and enumerates exactly what it returns: open findings, active risk acceptances, and at-risk Control Objectives across every model. This distinguishes it from siblings like list_findings and list_risk_acceptances by emphasizing the aggregate, multi-model scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit trigger ('what's open?' or 'what should I work on next?') and positions the tool as the entry point, with the benefit of no per-model fan-out. It does not explicitly name an alternative tool or state when not to use it, so it falls just short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_functional_coverageGet Functional CoverageA

Get the full functional coverage report for a model.

Read-only; no side effects. Returns per-objective state (verified / covered / failing / untested), the Capabilities × Conditions matrix, and the applicable / missing-objective / not-applicable cell accounting. This is the complete picture; when you only need the actionable subset (what to implement or fix next), use check_functional_gaps instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose functional coverage to report.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden for safety-relevant behavior. It explicitly states 'Read-only; no side effects' and goes beyond the output schema by characterizing the report contents and its relationship to the actionable subset. This is strong behavioral context, though it does not cover topics like authentication or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: purpose, safety and return contents, and sibling-tool routing. The most important information is front-loaded and no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema already covers return-value structure, and the description usefully describes the report scope and read-only nature. However, the required server_version parameter is left completely unexplained, which is a real gap for correct invocation. The rest of the context is strong, but this input ambiguity prevents a higher score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema documents model_id, but server_version has no schema description and the tool description never mentions it. With only 50% schema coverage, the description needed to compensate for the undocumented required parameter, but it does not, leaving the agent without enough meaning to populate server_version confidently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Get'), a concrete resource ('full functional coverage report'), and a scope ('for a model'). It also signals that this is the complete picture, unlike the actionable subset, which distinguishes it clearly from sibling check_functional_gaps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to prefer a different tool: 'when you only need the actionable subset ... use check_functional_gaps instead.' This gives a clear selection rule against at least one strongly related sibling and makes the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_functional_objectivesGet Functional ObjectivesA

List a model's functional objectives, or fetch one by id. Read-only; no side effects.

A functional objective is a Capability × Condition test plan expressed as a Given-When-Then statement. functional_objective_id selects the behaviour:

  • omitted / empty string -> list every functional objective for the model (the full functional test plan).

  • a functional-objective id -> return just that one objective's detail, including its capability, condition, Given-When-Then statement, and current test state.

For pass/fail coverage state across all objectives use get_functional_coverage; for the actionable gaps use check_functional_gaps.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose functional objective(s) to read.
server_versionYes
functional_objective_idNoOptional. Omit (or pass "") to list every objective; pass an id (from a prior list call) to fetch that one.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It states 'Read-only; no side effects' and explains the branching behavior for omitted vs provided functional_objective_id, including what detail a fetch returns. It does not mention error cases or permissions, but the disclosed behavior is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: read-only status is front-loaded, the functional objective concept is explained briefly, parameter behavior follows, and sibling tool routing closes it out. Every sentence contributes to correct invocation, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return-value structure, and the description covers purpose, modes, parameter semantics, and alternative tools. The only notable gap is the undocumented required server_version parameter, which prevents the description from being fully complete for a 3-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaningful semantics to functional_objective_id beyond the schema, clarifying that omission/empty string lists all objectives and a prior-list id fetches one detail. It also identifies model_id as the threat model whose objectives are read. However, server_version remains semantically undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List a model's functional objectives, or fetch one by id.' It clearly distinguishes this tool from related siblings by name (get_functional_coverage, check_functional_gaps) and explains the two operational modes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the list mode versus the fetch-by-id mode based on functional_objective_id. It also names the exact sibling tools to use for pass/fail coverage and actionable gaps, giving the agent unambiguous routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_functional_satisfaction_groupsGet Functional Satisfaction GroupsA

Read the satisfaction-group structure for a functional objective. Read-only; no side effects.

A satisfaction group is a set of functional tests that together satisfy the objective: AND within a group (every test in the group must be verified), OR across groups (any one complete group satisfies the objective). Returns the current numbered groups plus any tests associated with the objective but not placed in a group.

Use before set_functional_satisfaction_groups to see the current structure, or to trace why an objective is / isn't satisfied. This is the functional analog of get_control_assumption_groups / get_mitigation_groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes
functional_objective_idYesThe objective whose groups to read.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses read-only/no side effects, explains the AND/OR group semantics, and states what the return includes (numbered groups plus unplaced tests). This is valuable behavioral context beyond a bare 'get'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: front-loaded purpose, then semantics, then usage guidance. Every sentence adds unique value with no repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is an output schema, so return details are covered elsewhere. The description sufficiently covers the tool's role, semantics, read-only nature, and relationship to siblings. Minor gap: no mention of error conditions or prerequisites, but not critical for this simple get operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% (server_version lacks a description). The description reinforces the meaning of functional_objective_id by explaining what a satisfaction group is, but doesn't add new details about server_version or model_id beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb ('Read') and resource ('satisfaction-group structure for a functional objective'). It distinguishes itself from siblings by explicitly positioning itself as the functional analog of get_control_assumption_groups / get_mitigation_groups and by implying the read counterpart to set_functional_satisfaction_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage context: 'Use before set_functional_satisfaction_groups to see the current structure, or to trace why an objective is / isn't satisfied.' It also names the sibling alternatives, making the selection decision clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_functional_test_sufficiencyGet Functional Test SufficiencyA

Read the sufficiency verdict for a functional test. Read-only; no side effects.

Reports whether the test's attached evidence adequately proves the objective(s) it is associated with, together with the reasoning behind the verdict. This is the functional-conformance analog of get_sufficiency (which covers security controls). The verdict is computed asynchronously after evidence is submitted, so it may read as pending or absent until evaluation completes.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes
functional_test_idYesThe functional test to assess.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states the tool is read-only with no side effects and explains that the verdict is computed asynchronously after evidence submission, so it may appear pending or absent. This is strong, actionable behavioral context beyond the bare function.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the key read-only nature and purpose. Each sentence earns its place: the first states scope and safety, the second clarifies evidentiary meaning, and the third distinguishes from a sibling while noting async behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, safety, sibling distinction, and async behavior, and an output schema exists for return values. The main gap is the undocumented required server_version parameter, which reduces completeness slightly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 67%, and one required parameter, server_version, has no description in the schema. The tool description does not mention parameters at all, so it fails to compensate for the undocumented required parameter or add meaning to the parameter list.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the specific resource—the sufficiency verdict for a functional test—and states what it does: reports whether attached evidence proves associated objectives and explains the verdict. It also names the sibling get_sufficiency as a distinct security-control analog, making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly positions this tool as the functional-conformance counterpart of get_sufficiency, which covers security controls, giving the agent a clear selection rule relative to the most similar sibling. It also adds timing guidance about async computation, so agents know to expect pending or absent results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_groupGet GroupA

Get a system group by ID, including summaries of its member threat models. Read-only; no side effects.

Single-group fetch is supported for SYSTEMS ONLY — tags have no fetch-by-id endpoint; enumerate tags with list_groups(kind="tag") and a single model's tag memberships with list_model_groups. A system is a named grouping of threat models for portfolio-level risk and compliance reporting. Discover system IDs with list_groups(kind="system"); add members with add_model_to_group(kind="system", ...).

ParametersJSON Schema
NameRequiredDescriptionDefault
system_idYesID of the system to retrieve.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it explicitly states 'Read-only; no side effects.' It also clarifies the semantic scope of a system group and its relationship to threat models. While it does not describe error behavior or pagination, the read-only disclosure and scope clarification are meaningful 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and read-only disclosure, followed by important scope distinctions and discovery guidance. It is slightly verbose in the middle section, but every sentence carries routing or semantic value. Overall it is efficiently structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers scope, side effects, output contents, alternative tools, and ID discovery, and an output schema exists to document return values. The main gap is the unexplained server_version parameter, which prevents full contextual completeness for invoking the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema documents system_id but leaves server_version undescribed, and schema coverage is only 50%. The description adds useful context for system_id by explaining what a system is and how to discover system IDs, but it gives no additional meaning for server_version. It partially compensates for the coverage gap but not completely.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Get a system group by ID, including summaries of its member threat models.' It clearly distinguishes itself from sibling group tools by stating that single-group fetch is for systems only, not tags. This makes the tool's purpose immediately identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent when to use this tool versus alternatives: tags have no fetch-by-id endpoint, so enumerating tags should go through list_groups(kind='tag') and list_model_groups. It also explains how to discover system IDs via list_groups(kind='system') and how to add members with add_model_to_group(kind='system', ...). This is exemplary routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mitigation_groupsGet Mitigation GroupsA

Get the current mitigation group structure for a control objective.

Returns the grouped view of controls for this CO with details (id, description, status) for each control:

  • groups: numbered groups (within=AND, across=OR)

  • defense_in_depth: tracked but not required for mitigation

  • unmapped: model controls not mapped to this CO (available for assignment)

Use cases:

  • Before set_mitigation_groups to see the current structure

  • When reviewing a CO's assessment to understand why it is at_risk or mitigated

  • When deciding which unmapped controls to assign to a CO

ParametersJSON Schema
NameRequiredDescriptionDefault
co_idYesID of the control objective (e.g., "CO5").
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does a solid job: it discloses the output categories (groups, defense_in_depth, unmapped), the semantics of grouping (within=AND, across=OR), and that unmapped controls are available for assignment. It does not explicitly state that the operation is read-only, but 'Get the current structure' and the use case 'Before set_mitigation_groups' make this clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured and front-loaded: purpose first, then return details as a compact list, then concrete use cases. Every segment earns its place and the overall length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the key semantics an agent needs: what the return groups mean, why defense_in_depth is tracked but not required, and how unmapped controls are used. With an output schema present, the lack of detailed return-field explanations is acceptable, though the description could more fully explain the within/across AND/OR logic.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, with co_id and model_id already documented in the input schema. The description adds no additional meaning for the parameters themselves and does not explain server_version, which is undocumented even though it is required. This is adequate but not improved beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the current mitigation group structure for a control objective and specifies the returned grouped view with details. It is not a tautology and is distinguishable from generic 'get' tools, though it does not explicitly contrast itself with similar group-fetching siblings like get_control_assumption_groups or get_functional_satisfaction_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A dedicated 'Use cases' section explicitly tells the agent when to call this tool: before set_mitigation_groups, when reviewing a CO's assessment, and when deciding which unmapped controls to assign. It gives clear context but does not state when not to use it or name alternative group-fetching tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_model_cwe_tagsGet Model Cwe TagsA

List CWE weakness classifications tagged onto a model's control objectives.

Each tag's name/description are resolved from the platform's CWE catalog, never model-authored. A tag whose CWE id has since been deprecated, redefined, or removed by MITRE carries a stale reason (missing / deprecated / changed) — re-run classify_model_cwe to refresh it. 404s if CWE classification is not enabled on this instance.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model to inspect.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility for behavior disclosure. It does so thoroughly: tags are resolved from the platform CWE catalog and never model-authored, stale tags are characterized with specific reasons (missing/deprecated/changed), and a 404 is documented when the feature is disabled. This is strong behavioral context for a read-only list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, and every subsequent sentence adds meaningful behavioral or error context. It is compact, avoids repetition of the tool name, and contains no filler or redundant restatement of the input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value details do not need to be repeated. The description covers purpose, data provenance, stale semantics, refresh action, and the relevant 404 error condition. The main gap is the undocumented required server_version parameter, which prevents full completeness for an agent trying to invoke the tool correctly without further context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, with server_version left completely undocumented in both the schema and the description. The description indirectly clarifies model_id by discussing 'a model's control objectives,' but it adds nothing to explain the required server_version parameter. With low schema coverage, the description should compensate for the gap and does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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: 'List CWE weakness classifications tagged onto a model's control objectives.' This clearly states what the tool does and separates it from the related classify_model_cwe sibling by referencing that tool for refreshing stale tags. However, it does not explicitly contrast itself with get_cwe_catalog, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names classify_model_cwe as the action to re-run when a tag is stale, which gives the agent a condition-based routing choice. It also notes the 404 failure mode when CWE classification is not enabled. It does not provide broader when-to-use versus when-not-to-use guidance relative to other catalog-related siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reachability_verdictsGet Reachability VerdictsA

Per-CO reachability verdicts for a model — flat or composed topology.

composed selects which topology the verdicts are derived over:

  • composed=False (default) — FLAT: verdicts over THIS model's own structural primitives only (components, asset.component_ids, trust_boundary.passes, attacker.trust_boundary_ids + attack_vector, Assumption.exclusion predicates). Pure derivation, NOT persisted on the CO — re-running against the model JSON is deterministic, the verification an auditor performs. Pass co_id to retrieve a single verdict (skips the cross-CO loop); page / page_size / kind_filter are ignored in this mode. Returns {model_id, model_version, verdicts: [...]} where each verdict carries co_id, kind ("reachable" | "unreachable" | "indeterminate"), reason (structural label: boundary_blocks_vector / assumption_excludes / attacker_unpositioned / asset_unbounded / no_shared_boundary / missing_entity), narration, and (when applicable) boundary_id / assumption_id.

  • composed=True — COMPOSED: the same verdict semantics evaluated over the merged effective tree (own components and trust boundaries combined with everything inherited from ancestors, qualified ids for cross-model references). Use this when the model is a child on the composition tree and you need reach state that reflects the ancestor topology, not just the local model document. Paginated via page / page_size and filterable via kind_filter; co_id is ignored (the composed surface has no single-CO lookup). Returns {model_id, flag_enabled, verdicts: [{co_qid, asset_qid, attacker_qid, kind, reason}, ...], total, page, page_size}. When composition is disabled on the backend, verdicts is empty and flag_enabled: false — fall back to composed=False for the per-model derivation.

When a flat verdict is indeterminate, address the gap via the standard model-edit affordances:

  • attacker_unpositionededit_attacker setting trust_boundary_ids

  • asset_unboundedassign_to_components (target_type="asset") or edit_asset with component_ids

  • no_shared_boundary → re-position attacker, re-scope asset, OR add_assumption with structured exclusion

  • missing_entity → restore the missing asset/attacker, or remove the orphaned CO

Use this before relying on per-CO reach state for triage, auto-remediation, or audit responses. The model_coherence_report tool surfaces the same gaps as actionable findings; this tool exposes the raw verdicts when you need the structured data (boundary_id citations, narration strings) that the findings summarize.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoCOMPOSED mode only. 1-indexed page number (default ``1``). Ignored when ``composed=False``.
co_idNoFLAT mode only. Optional CO id — when set, returns a single verdict; 404 if the CO doesn't exist or is tombstoned. Ignored when ``composed=True``.
composedNoWhen False (default), derive over this model's own topology (flat). When True, derive over the composed effective tree (own ⊕ inherited).
model_idYesID of the threat model.
page_sizeNoCOMPOSED mode only. Verdicts per page (default ``100``). Ignored when ``composed=False``.
kind_filterNoCOMPOSED mode only. Restrict verdicts to one kind — one of ``"reachable" | "unreachable" | "indeterminate"``. Named ``kind_filter`` (not ``kind``) to disambiguate from the verdict object's own ``kind`` field. When omitted, all verdict kinds are returned. Ignored when ``composed=False``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that flat derivation is pure and not persisted, that results are deterministic, that certain parameters are ignored per mode, that co_id returns a 404 for missing or tombstoned COs, and that composed mode returns empty verdicts with flag_enabled: false when composition is disabled.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but tightly structured with bold mode headers, code formatting, and bullets. It front-loads the purpose, then explains mode behavior, return shapes, and remediation guidance. Every section earns its place and the formatting makes the length navigable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool of this complexity. It covers both modes, parameter interactions, pagination, fallback behavior, error cases, and the relationship to sibling tools. The output schema also exists, but the description goes beyond it by explaining mode-dependent return shapes and edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is already high at 86%, the description adds substantial meaning beyond the schema. It explains mode-specific parameter behavior, qualified IDs for cross-model references, exact reason enum semantics, and maps each indeterminate reason to concrete remediation actions. This is far more than the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the exact function: 'Per-CO reachability verdicts for a model — flat or composed topology.' It clearly differentiates the two modes and explicitly contrasts this tool with model_coherence_report, so an agent can distinguish it from a large sibling tool list without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Use this before relying on per-CO reach state for triage, auto-remediation, or audit responses.' It also names model_coherence_report as the alternative for actionable findings and explains when composed=True vs composed=False is appropriate, including fallback behavior when composition is disabled.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_remediation_leverageGet Remediation LeverageA

Remediation-leverage plan for a model: which controls to implement first to close the most control objectives with the least work.

Returns the model's not-yet-satisfied controls ranked by how many control objectives each one closes (ranked), plus a greedy minimal fix order — the sequence of controls that reaches the most mitigated objectives with the fewest controls (greedy_plan) — and a summary of the collapse (total objectives, currently mitigated, how many controls the plan needs). Use to prioritize implementation work: a single call tells the agent which controls give the highest leverage, so it can tackle the shortest path to coverage instead of fixing objectives one at a time. Read-only.

Composed models: each entry in ranked and greedy_plan also carries its owning model — owner_model_id and owner_model_title — and an inherited flag. inherited is true when the control is authored on an ancestor model, meaning the fix lands on that model rather than the one being assessed; summary.inherited_candidate_controls counts them. Surface the owning model so the operator knows which high-leverage fixes belong to a parent model. A flat (non-composed) model reports every control as owned by the assessed model.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It states the operation is read-only, explains the returned structures, and highlights composed-model behavior: owner_model_id, owner_model_title, inherited flag, and summary.inherited_candidate_controls. This goes well beyond the schema and helps the agent understand side effects and ownership semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense but every section earns its place: core output, use case, and composed-model nuance. The front-loaded first paragraph gives the essential purpose and returns, while later details address edge cases. It could be tightened slightly, but the structure is logical and not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool complexity and existing output schema, the description covers the main outputs, the use case, read-only behavior, and composed-model edge cases. The only notable gap is the missing semantics for server_version, which would matter for an agent trying to invoke this correctly in varied environments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only describes model_id as 'ID of the threat model' and leaves server_version undescribed. The tool description does not clarify server_version at all and adds no parameter-level detail beyond what the schema already provides. With 50% schema description coverage, this leaves one required parameter semantically opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool returns a remediation-leverage plan ranking controls by leverage and a greedy minimal fix order. It is specific about the resource (a model) and the output shape (ranked, greedy_plan, summary), making it distinguish itself functionally from most siblings, though it does not explicitly name or contrast an alternative tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use to prioritize implementation work' and explains that a single call gives the shortest path to coverage, contrasting with fixing objectives one at a time. It gives clear context for when to call this tool, but does not discuss when not to use it or name a specific alternative tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_review_queueGet Review QueueA

Returns the workspace's review queue: what needs a decision or a re-check, ranked. Read-only; no side effects.

Each row carries an item_type, one of escalation (a judgment an agent was refused and parked for a person), proposal (an open change of scope or design), open_assumption, or stale_control (an implemented/verified control whose assertions have not been checked in 90+ days). Rows are ranked in that order. Escalations and proposals are decided with decide_proposal; for each stale control, verify its assertions against the codebase. Start here for periodic maintenance.

ParametersJSON Schema
NameRequiredDescriptionDefault
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure — and it delivers: 'Read-only; no side effects', the exact ranking order of row types, the semantics of each item_type, and the 90+ day threshold for stale_control. This is precisely the behavioral context annotations would otherwise supply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is exemplary: purpose and read-only guarantee front-loaded, then item types, then ranking order, then follow-up routing, closing with a one-line usage directive. Each sentence earns its place, and the detail on item types is justified because each type demands a different action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly covers purpose, content taxonomy, ranking, and follow-up routing, and the presence of an output schema relieves it of explaining return values. The single genuine gap is the undocumented server_version parameter, which prevents full completeness for a tool an agent must invoke.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema exposes one required parameter, server_version, with 0% schema description coverage, yet the description never mentions it. The agent is left unable to know what value to pass or how it affects the queue. The parameter name is mildly self-descriptive, but the description contributes zero compensation for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with 'Returns the workspace's review queue: what needs a decision or a re-check, ranked' — a specific verb, a specific resource, and an explicit scope. The four item_type definitions (escalation, proposal, open_assumption, stale_control) clearly differentiate it from overlapping siblings like list_decisions, list_proposals, and get_controls.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit entry point: 'Start here for periodic maintenance.' It also routes follow-up actions precisely — 'Escalations and proposals are decided with decide_proposal' and stale controls require verifying assertions against the codebase. The only omission is an explicit when-not-to-use contrast with list_decisions/list_proposals, but the routing is strong enough to compensate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_risk_viewGet Risk ViewA

Prioritized Risk View — one row per live Control Objective — at a chosen scope. Read-only; no side effects.

scope selects the aggregation boundary and how scope_id is interpreted:

  • "model" — a single threat model (scope_id = model id). One row per live CO with derived risk tier, asset impact, attacker likelihood, control coverage counts (coverage_ratio), and open-finding count (open_findings). Tombstoned COs are excluded; pair with get_threat_model if historical context is needed. Use to triage which COs need attention on one model — a single call ranks the work, no per-CO fan-out.

  • "system" — every model in a System, a group of related threat models (scope_id = system id). Same row shape as model with model_id and model_title added per row, so rows can be grouped/filtered by source model without an extra lookup. Use for posture queries spanning multiple models in the same product or service.

  • "tag" — every member model of a tag, a freely-composed cohort (scope_id = tag id). One delegation-aware row per CO across members (delegation_mitigated / delegating_controls): a CO mitigated via a verified cross-model delegation reads as covered, consistent with each model's own assessment. Use for a portfolio/audit-scope posture rollup.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYesaggregation boundary — "model", "system", or "tag".
scope_idYesid of the model, system, or tag selected by ``scope``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses read-only/no-side-effects, tombstoned CO exclusion, delegation-aware aggregation semantics, and that rows are per live CO with derived metrics. This goes well beyond the schema and removes ambiguity about side effects and filtering.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line purpose and read-only note, then uses clearly separated bullets for each scope. Each bullet earns its place by adding scope-specific behavior and use cases. The length is justified by the tool's branching semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists and the description already explains row shapes, exclusions, delegation behavior, and scope semantics, nothing essential is missing for an agent to invoke it correctly. Edge cases like tombstoned COs and model grouping are explicitly handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers scope and scope_id only tersely, but the description adds rich meaning for both, explaining how each scope value changes the interpretation of scope_id and the resulting row shape. server_version still lacks any semantic explanation, which prevents a 5, but the main parameters are thoroughly clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States clearly what the tool does: returns a prioritized risk view of one row per live Control Objective at a chosen scope. It is explicitly distinguished from sibling get_threat_model by noting that historical context should be requested there, and the scope variants make the resource and behavior unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance for each scope value: triage on a single model, posture queries across a system, and portfolio/audit rollups with tags. It also names an alternative tool (get_threat_model) for the case where tombstoned COs and historical context are needed, so an agent can choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_scan_promptGet Scan PromptA

Get guidance prompts for scanning a codebase. Read-only; no side effects.

kind selects which scan brief to return:

  • "security" (default) — prompts telling the agent what evidence to look for per security control; only NOT_IMPLEMENTED controls are included (implemented ones need no scan). Use this to drive a gap-discovery pass, then record what is missing with submit_findings and what is present with submit_assertions. Pass control_id to scope the prompt to one control; empty (default) returns prompts for all not-yet-implemented controls.

  • "functional" — the agent brief for implementing functional-conformance tests. Generation specifies the functional tests, so for each test not yet verified this returns its implementation brief and the objectives it proves; it also reports objectives_without_tests (regenerate or add a test) and missing_objectives (applicable conditions with no objective yet). Drive test implementation from it, then call submit_functional_test_assertions with TEST_EXISTS + TEST_ATTESTED assertions so CI verifies each test; read the resulting pass/fail state via get_functional_coverage. control_id does not apply to this kind and is ignored.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo"security" (default) or "functional" — which scan brief.security
model_idYesID of the threat model.
control_idNoSecurity kind only — optional single control to scope the prompt to. Empty (default) returns prompts for all not-yet-implemented controls. Ignored when kind="functional".
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden and does so well: it explicitly states 'Read-only; no side effects.' It also reveals behavioral details such as only NOT_IMPLEMENTED controls being included, the default behavior of kind, and control_id being ignored for functional. This goes well beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer but well-organized by mode, with the core statement and read-only guarantee front-loaded. Most sentences earn their place because they explain mode-specific behavior and workflow. Some phrasing is dense and could be tightened, but the structure is effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists and the tool is read-only, the description covers everything needed to select and call it correctly: both modes, default behavior, parameter applicability, and downstream tools. The only minor omission is server_version semantics, but the required parameter is visible in the schema and the overall operational context is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the schema already describes kind, model_id, and control_id reasonably. The description adds meaningful context for kind and control_id, including mode-specific behavior and downstream workflow impact. However, server_version remains undocumented in both the schema and description, preventing a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns guidance prompts/scan briefs for scanning a codebase, with a simple verb+resource framing. It further distinguishes the two kinds of scan briefs (security and functional), so an agent can tell what this tool is for without confusion from its many siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided for both modes: use the security kind for gap-discovery and then submit_findings/submit_assertions; use the functional kind to drive test implementation and then submit_functional_test_assertions and read get_functional_coverage. It also clearly states that control_id is ignored for functional, preventing misapplication.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_setup_statusGet Setup StatusA

Get the workspace onboarding checklist with completed and pending steps. Read-only.

Call this before suggesting or performing setup actions so already-done steps aren't repeated; mark a step done with complete_setup_step. Takes no arguments beyond the version header.

ParametersJSON Schema
NameRequiredDescriptionDefault
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and clearly states the operation is read-only. It also clarifies that the only parameter is a version header, preventing an agent from expecting functional arguments. This is meaningful behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero waste. The purpose is front-loaded, the usage guidance follows immediately, and the parameter clarification is concise. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only status tool with an output schema, the description gives enough context: what it returns, when to call it, and what arguments it needs. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by explaining that the tool 'takes no arguments beyond the version header,' which directly clarifies the sole required parameter, server_version. It doesn't specify format details, but it correctly prevents misuse.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 ('workspace onboarding checklist') and clearly distinguishes the tool from the large sibling set. It also names the complementary mutation tool, complete_setup_step, which helps an agent understand the tool's role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: call this before suggesting or performing setup actions to avoid repeating completed steps. It does not explicitly list exclusions or alternative query tools, but the context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sufficiencyGet SufficiencyA

Sufficiency verdict for a single control: whether its submitted assertions collectively cover every aspect of the control. Read-only.

Returns the LLM sufficiency status and reasoning for one control, evaluated server-side from the current assertion set (no CI round-trip). Use this for a focused check on one control after submitting assertions; for the whole-model rollup with tier1/tier2 pass/fail counts and drift/misalignment details across all controls, use get_verification_report instead. A verdict carries a freshness of fresh | stale | pending beside its status: stale means the control description, the assertion set or the rules the verdict was computed under have moved since. A stale read with no re-evaluation already queued queues one, so calling again shortly does converge; a stale read that is already waiting adds nothing. For the whole-model rollup, which also refreshes stale controls on read, use get_verification_report.

This is the surface that explains a control stuck at verification_status: "partially_verified". Returns status ("sufficient" | "insufficient" | "pending"; staleness rides in freshness, not in the status) and, when insufficient, a details breakdown naming EACH uncovered clause of the control description and what evidence would close it — a concrete work list, not a score. A claim that carries a soundness_tier reports its weakest clause's tier: a control is proven no more strongly than the thinnest clause it rests on, so the composed tier is read as that bound and never as a control-level pass. Act on it by submitting the named assertions with submit_assertions; if a clause is uncloseable because the control describes a mechanism the system does not actually use, that is a signal to refine_control instead of manufacturing evidence.

The per-clause work list is served by get_control_work_order: where the order names a required class for a clause, required_evidence carries the clause id to put in covers, the clause text and its quantifier, the required_class that closes it and a suggested_submission skeleton whose <...> placeholders you replace before submitting. It is stated by-construction first — for a for-all clause the required class is [by_construction, sound_over_approximation], so prefer typed_boundary (declare the type the sinks accept and its constructors), else sink_default_deny (declare the sinks that realise the clause, the safe forms, a reviewed allowlist). When evidence of the wrong class is bound, class_mismatch is set: the evidence is the wrong CLASS, not merely incomplete, and more of it will not help. An attestation covers an existential clause and never a for-all one; the only legitimate non-mitigation exit for a for-all clause is a risk acceptance or a not-applicable disposition.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idYesID of the control (e.g., "CTRL-01").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that the verdict is evaluated server-side with no CI round-trip, explains the freshness states (fresh/stale/pending), reveals that a stale read with no queued re-evaluation queues one, and clarifies that staleness rides in freshness rather than status. It also explains the composed soundness tier bound and the class_mismatch semantics, which are non-obvious behaviors an agent needs to interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but information-dense, and the core purpose is front-loaded in the first sentence. Every paragraph adds distinct value: verdict semantics, freshness behavior, the partially_verified use case, the work-order relationship, and the by-construction guidance. It is not padded, though it could be tightened slightly without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a read-only diagnostic tool with an output schema. It covers what the tool returns (status, freshness, details breakdown), how to interpret the composed tier, what to do next (submit_assertions or refine_control), and how it relates to get_control_work_order. The output schema exists, so return-value documentation is not the description's job, and nothing an agent needs to call or act on this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%: model_id and control_id are documented in the schema, but server_version has no description. The tool description does not add parameter-level detail beyond what the schema provides, so it does not compensate for the undocumented server_version. Baseline 3 is appropriate because the schema covers most parameters, but the description adds no extra semantic value for them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Sufficiency verdict for a single control' and immediately distinguishes it from the whole-model rollup by naming get_verification_report. It also explains the verdict semantics (status plus freshness) and the concrete use case of diagnosing a control stuck at partially_verified, so an agent can tell exactly what this tool is for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool ('focused check on one control after submitting assertions') and when not to ('for the whole-model rollup... use get_verification_report instead'). It also names the sibling get_control_work_order for the per-clause work list and gives actionable follow-ups (submit_assertions, refine_control), so usage context and alternatives are fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_system_dependenciesGet System DependenciesA

Get the cross-model dependency graph for a system. Read-only; no side effects.

Returns every assumption in the system's member models that is linked to another member model (a cross-model dependency), with its satisfaction status. A dependency is satisfied when either the target model's mapped controls are implemented or a valid manual attestation exists.

Use to see which assumptions are met by other models' controls, find unsatisfied dependencies, or check system-level completeness. Create these links with link_system_dependency.

ParametersJSON Schema
NameRequiredDescriptionDefault
system_idYesID of the system.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full behavioral disclosure burden. It explicitly says 'Read-only; no side effects' and explains the satisfaction rule for dependencies, including the control-implementation and manual-attestation conditions. This goes well beyond minimal disclosure, though it does not mention pagination or authorization.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short paragraphs with the core purpose front-loaded, followed by behavioral detail and use cases. Every sentence earns its place; there is no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description does not need to explain the return structure. It provides enough context to invoke the tool confidently and understand the dependency-satisfaction semantics. The only notable gap is the unexplained server_version required parameter, which slightly weakens overall completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%. system_id is trivially described as 'ID of the system' in the schema, and server_version has no schema description and no mention in the description either. The description does not compensate for the missing server_version semantics, which an agent would need to call this required parameter correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 the cross-model dependency graph for a system.' It then defines what that graph contains—assumptions linked to other member models with satisfaction status—and is clearly distinguishable from sibling tools like link_system_dependency, which creates the links rather than reading them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit use cases: see which assumptions are met by other models' controls, find unsatisfied dependencies, or check system-level completeness. It also directs the agent to link_system_dependency for creating links, which prevents confusion with the write counterpart. This is strong practical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_threat_modelGet Threat ModelA

Get a specific threat model by ID.

Returns the full threat model including trust boundaries, assets, attackers, control objectives, and assumptions.

Important for agents reading model state:

  • Assets and attackers may carry deleted: true (soft-deleted). Exclude these when showing "what's in the model now"; include them only when discussing history or offering restore. Restore an entity via restore_entity (entity_type="asset") / restore_entity (entity_type="attacker").

  • Control objectives may carry removed: true (tombstone — the (asset, attacker) pair was removed in a later version). Exclude these from coverage math and LLM prompts; they exist to keep CO IDs stable so controls referencing them can be detected as "orphaned" rather than silently rebinding.

ParametersJSON Schema
NameRequiredDescriptionDefault
versionNoOptional specific version number. Defaults to latest.
model_idYesID of the threat model.
include_cosNoInclude control objectives inline.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden and does so well. It reveals soft-deleted assets/attackers, tombstoned control objectives, how to treat them in prompts and coverage math, and which restore_entity calls to use. This is decision-critical behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A one-sentence summary is followed by two tightly scoped bullets, and every sentence adds agent-relevant detail. The formatting is front-loaded and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly covers return semantics and hidden model-state behavior, and an output schema is present to document the return shape. The main gap is server_version, a required parameter with no schema or description explanation, which prevents full self-sufficiency.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents three of the four parameters, so the description does not need to repeat them. However, it does not clarify the required server_version parameter or explicitly reconcile its claim that control objectives are included with the include_cos default of false.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a concrete verb ('Get'), a specific resource ('threat model'), and a selection mechanism ('by ID'), and it enumerates the contents of the returned full threat model. This differentiates it from lineage tools like list_threat_models, though it does not explicitly name alternative tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames this as the endpoint for agents that need the full model state and gives operational context for interpreting that state. It does not explicitly say when to prefer query_threat_model or list_threat_models, so exclusion guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verdict_divergenceGet Verdict DivergenceA

Where the LLM's verdicts disagree with the model's authored state.

Two coverage divergence kinds, distinguished by the LLM's p_covers (probability the control covers the CO), shown as "model confidence":

  • missing_mapping: HIGH p_covers, but the CO is NOT mapped — the LLM is confident the control covers it, so it should be mapped. Accepting ADDS the mapping.

  • spurious_mapping: LOW p_covers, but the CO IS mapped — the LLM is confident the control does NOT cover it, so the mapping is likely wrong and inflates apparent coverage. Accepting REMOVES the mapping. Only confident rows surface; the uncertain middle band is dropped. So a ~100%-confidence row is a strong "add" and a ~0%-confidence row is a strong "remove" — both are actionable, in opposite directions.

Rows are sorted by confidence, so the strongest calls come first. Each section is paginated: its pagination.filtered_total reports the full count, so when it exceeds the rows returned, raise limit (up to 500) or page with offset to review every divergence — not only the first page.

Also returns group_sufficiency divergences (observation-only). Apply coverage rows with accept_coverage_divergences; set aside rows the structural model got right with dismiss_verdict_divergences.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOptional filter — "missing_mapping", "spurious_mapping", or "group_sufficiency". Empty returns all kinds.
limitNoMax rows per section (clamped to 1-500, default 100). Set to 500 to pull an entire section in one call.
offsetNoSkip the first N rows of each section, for pagination.
model_idYesID of the threat model.
server_versionYes
include_dismissedNoWhen true, return ONLY previously-dismissed rows (the undo view) instead of the active list.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral disclosure burden, and it does so richly. It explains that the uncertain middle band is dropped, rows are sorted by confidence, pagination includes filtered_total, and group_sufficiency divergences are observation-only. This gives the agent important behavior beyond the raw schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: definition, divergence kinds, confidence interpretation, pagination behavior, and follow-up tool routing. It is front-loaded with the core concept and then progressively adds operational details without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations and moderate complexity, the description is remarkably complete. It covers what the tool returns, how to interpret confidence, how pagination works, and how to act on the results. The existence of an output schema means the exact return structure does not need to be spelled out in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (83%), but the description goes beyond it by explaining the meaning of kind values (missing_mapping vs spurious_mapping) and how they map to add/remove actions. It also clarifies the semantics of limit and offset in the pagination context, which adds value beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: returns cases where the LLM's verdicts disagree with the model's authored state. It then details the two coverage divergence kinds (missing_mapping and spurious_mapping) plus group_sufficiency, giving the agent a precise idea of the resource and its semantics. This is a specific verb+resource definition that clearly separates it from generic 'get' tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong context on when and how to use the tool: it says only confident rows surface, sections are paginated, and it tells the agent to follow up with accept_coverage_divergences or dismiss_verdict_divergences. It stops short of explicitly stating when not to use it relative to other 'get' tools like get_reachability_verdicts, so it is clear but lacks an explicit exclusion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_verification_reportGet Verification ReportA

Get verification report with summary stats and sufficiency gaps.

Returns tier1/tier2 pass/fail/pending counts, per-control verification status, and sufficiency details.

Each per-control sufficiency block carries:

  • status: "sufficient" | "insufficient" | "pending" | "stale". "stale" means the cached verdict no longer reflects the current control description or active assertion set; a background re-evaluation has been triggered automatically on this read — call this tool again shortly for a refreshed verdict.

  • details: human-readable LLM reasoning.

  • misaligned_assertion_ids: assertions whose stated subject is off-topic for the control's current description (common after a control has been refined or regenerated). Treat as a directive: rebind to the right control, supersede via delete_assertion, or rewrite. Do NOT treat them as evidence. A non-empty list forces the verdict to "insufficient".

  • stale: boolean shortcut for status == "stale", kept distinct so an INSUFFICIENT verdict that's also stale (the prior insufficient decision was computed under outdated inputs) can be flagged without overloading status.

A drift item means the accepted evidence changed (a test's definition, a witness's scope or allowlist) and its verdict was withdrawn until reviewed again.

By default returns summary only (no per-assertion details). Set summary_only=False to include full assertion details and drift items.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax control entries to return (0=all).
offsetNoSkip first N control entries.
statusNoFilter by verification status: "verified", "partially_verified", "pending", "unverified".
model_idYesID of the threat model.
summary_onlyNoOmit per-assertion details and drift items (default True).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral transparency burden, and it does so impressively. It discloses a real side effect: a stale cached verdict automatically triggers a background re-evaluation on this read, so the agent knows a second call is needed for the refreshed result. It also clarifies the semantics of `misaligned_assertion_ids` as a directive rather than evidence, and explains how drift items behave, all of which goes far beyond what the input schema alone conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a clean summary sentence and then organized with bullet lists for the `sufficiency` block and drift items, which makes a complex output easy to read. A small redundancy exists around `stale` (status value plus boolean shortcut), and the overall length is long, but every sentence contributes to the needed semantics. This is well-structured and not overly padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is reasonably complex with six parameters and a detailed output structure, but the description goes deep into the crucial parts of the output: the meaning of each per-control status value, the handling of `misaligned_assertion_ids`, and the effect of drift. Since an output schema exists, it does not need to spell out every return field. A modest gap is the unstated purpose of `server_version` and the exact tier1/tier2 distinction, so it is not a perfect 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 83%, so the input schema already documents the parameters (`limit`, `offset`, `status`, `model_id`, `summary_only`, `server_version`). With that high baseline, the description is not expected to compensate heavily, and it mostly restates the `summary_only` default instead of adding new semantics to the parameters. Therefore a baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Get verification report with summary stats and sufficiency gaps' and goes on to list the concrete contents (tier1/tier2 counts, per-control verification status, sufficiency details). This makes the tool's purpose clear enough to distinguish it from many siblings like get_review_queue or get_controls. However, it never names or contrasts a specific sibling alternative, so it stops short of the explicit differentiation that earns a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is meant for retrieving verification reports and explains how to control the output volume ('By default returns summary only... Set summary_only=False to include full assertion details'). It also gives a narrow operational hint to call again after a stale result. Yet it does not explicitly say when to choose this over similar tools such as get_sufficiency or check_control_gaps, and never provides a when-not-to-use or alternative recommendation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_compliance_frameworkImport Compliance FrameworkA

Import a custom compliance framework. Requires PRO tier.

Use this when your customer's program (regulatory, contractual, or internal) is not covered by Mipiti's 11 built-in frameworks. After import, the framework is selectable on threat models exactly like a built-in.

Schema (top-level fields): - name (required): framework display name - version (optional): e.g. "1.0" - description (optional): one-paragraph description - level_definitions (optional, level-aware frameworks only): map keyed by stringified integer level ("1", "2", …) because the key IS the cumulative-filter ordinal (level <= target_level) and the level: int field on every requirement. Non-integer keys are rejected with HTTP 400. Human labels are decoupled — "Baseline" / "Hardened" / "SL3" / "CAL Critical" live in the name field, not the key. Each value is {"name", "description", "source"}. Ships the per-level legend to the LLM prompt and the framework-target UI. source is "authoritative" when paraphrased from the published standard, "mipiti_convention" when you defined the tiers yourself. - requirements (required, non-empty list): each entry takes id (required), description (required), level (optional integer, default 1), chapter_id / chapter_name / section_id / section_name / title (optional grouping), scope (optional, "component" default or "system" for requirements covered if ANY model satisfies them), level_specific_text (optional map of per-tier text; same stringified-integer-key rule as level_definitions).

Example minimal body::

{
  "name": "ACME Internal Baseline",
  "version": "2026.1",
  "requirements": [
    {"id": "ACME-1", "description": "All endpoints authenticate", "level": 1},
    {"id": "ACME-2", "description": "TLS 1.3 in transit", "level": 1}
  ]
}

Example with per-level legend + per-requirement parameters::

{
  "name": "ACME Tiered",
  "level_definitions": {
    "1": {"name": "Baseline", "description": "Minimum.",
          "source": "authoritative"},
    "2": {"name": "Hardened", "description": "Sensitive data.",
          "source": "mipiti_convention"}
  },
  "requirements": [
    {"id": "ACME-PWD",
     "description": "Passwords meet policy",
     "level": 1,
     "level_specific_text": {
       "1": "Min 8 characters.",
       "2": "Min 14 + MFA required."
     }}
  ]
}
ParametersJSON Schema
NameRequiredDescriptionDefault
framework_jsonYesA JSON string containing the framework body. (String not dict so the JSON shape stays explicit on the wire.)
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden, and it does so well: it discloses the PRO-tier requirement, the post-import availability on threat models, and the HTTP 400 rejection for non-integer level keys. It does not cover idempotency or whether an existing framework with the same name is overwritten, but the disclosed behaviors are substantial and directly relevant.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but appropriately sized for the complex payload it documents. It is front-loaded with purpose and usage, then structured into clear top-level fields and examples. Every section earns its place, especially because the input schema does not carry the nested framework schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The framework_json side is exceptionally well covered, including validation, field semantics, and examples. However, the required server_version parameter is never explained, which is a concrete blocker for correct invocation. The output schema exists, so return-value detail is not required, but the missing parameter documentation prevents the description from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description richly documents the framework_json body, including every top-level field, validation rules, and examples. However, server_version is a required parameter with no description in either the schema or the description, leaving a significant gap. With only 50% schema coverage, the description compensates heavily for framework_json but still leaves server_version unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Import a custom compliance framework.' It further distinguishes itself from built-in frameworks by stating the import is for programs not covered by Mipiti's 11 built-ins and that after import it behaves like a built-in, which separates it from sibling tools like list_compliance_frameworks or select_compliance_frameworks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance: 'Use this when your customer's program (regulatory, contractual, or internal) is not covered by Mipiti's 11 built-in frameworks.' It does not explicitly name alternatives or state when not to use it, but the context is specific enough to route an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_controlsImport ControlsA

Import existing security controls into a threat model.

Accepts structured JSON or free-text. Controls are auto-mapped to COs and deduplicated against existing ones. The parse/map/dedup runs as a background job (polled for progress), then — because this mutates the model — you are asked to confirm before the controls are saved.

ParametersJSON Schema
NameRequiredDescriptionDefault
auto_mapNoAuto-map controls to COs using LLM (default: True).
model_idYesID of the threat model.
free_textNoFree-text controls (narrative/CSV/bullets).
source_labelNoOrigin label (e.g., "ISO 27001").
controls_jsonNoJSON array of {description, co_ids?, framework_refs?}.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden of behavioral disclosure and does so exceptionally well. It explicitly mentions the background job with polling for progress, mutation of the model, and a confirmation step before controls are saved. It also discloses auto-mapping and deduplication behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. The main purpose is front-loaded, followed by input format, background execution, and confirmation behavior. Every sentence adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—background jobs, progress polling, auto-mapping, deduplication, and confirmation—the description covers all critical operational aspects. An output schema exists, so return-value details are not needed in the description. The only minor omission is expanding 'COs', but the schema's co_ids and the sibling context make it recoverable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 83%, so the baseline is 3. The description adds some context connecting 'structured JSON or free-text' to the controls_json and free_text parameters, but the schema already documents those parameters well. It does not clarify the undocumented server_version parameter, but the description is not required to compensate heavily given high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Import existing security controls into a threat model.' It further distinguishes this from sibling import tools by mentioning structured JSON/free-text input, auto-mapping to COs, and deduplication against existing controls. 'COs' is a domain abbreviation, but the overall purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states the use case: importing existing security controls into a threat model, with structured JSON or free-text as input. It does not explicitly name alternatives or say when not to use this tool, but the context is strong enough that an agent can infer 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.

import_functional_testsImport Functional TestsA

Register tests that already exist in your codebase against a model's functional objectives, so tests you already have count toward functional conformance — not only Mipiti-specified tests. Mutating (bulk).

Scan the repo's test suite and pass the tests here. Optionally associate each with the objective ids it covers (from get_functional_objectives); the platform verifies each association is applicable before accepting it and returns any it rejected under rejected_mappings. A test with no (or a rejected) association is still imported, unmapped, so it can be associated later (see suggest_functional_test_mappings / associate_functional_test). For a single hand-authored test, use add_functional_test instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
tests_jsonYesA JSON array of test objects. Each object supports ``test_name``, ``file_path``, ``framework``, ``description``, ``status`` (not_implemented | implemented | verified — an operator claim; an independent CI run is what verifies it), and ``functional_objective_ids`` (list of objective ids the test covers). At least ``test_name`` or ``description`` is required per test; the rest are optional.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden and largely succeeds: it explicitly flags 'Mutating (bulk),' explains that associations are verified by the platform, and describes that rejected or missing associations still result in the test being imported unmapped. It does not detail side effects like idempotency or whether existing tests are overwritten, but the disclosed workflow behavior is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, mutation warning, workflow, fallback behavior, and the alternative tool. The description is dense but well-structured, front-loading the core purpose and bulk-mutation nature before explaining details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough for a bulk-import tool with an output schema: it covers the use case, parameters' semantics for the main payload, mutation behavior, rejection handling, and routing to related tools. The unresolved server_version parameter and the lack of clarity around 'Mipiti-specified tests' prevent a perfect score, but overall it is highly usable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds rich meaning to tests_json, explaining the optional fields, the status enum meanings, and association behavior beyond the schema. model_id is adequately described in the schema. However, server_version is a required parameter with no schema description and no mention in the tool description, leaving a significant semantic gap for a required input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Register tests that already exist in your codebase against a model's functional objectives' so existing tests 'count toward functional conformance.' It names the specific resource (tests/functional objectives) and distinguishes itself from add_functional_test by noting bulk import of existing tests vs. a single hand-authored test.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use this tool: when importing existing tests from the codebase in bulk. It provides a clear exclusion: 'For a single hand-authored test, use add_functional_test instead.' It also explains follow-up workflows via suggest_functional_test_mappings / associate_functional_test for unmapped tests.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_threat_model_archiveImport Threat Model ArchiveA

Import a JSON audit archive (from export_report (scope="model", format="archive")) into a target workspace.

Mutating: creates a NEW threat model in the target workspace. Requires write access to that workspace. A fresh model_id is assigned on every import, so the same envelope can be imported any number of times without collisions; title collisions in the target workspace auto-suffix (imported YYYY-MM-DD). Non-destructive — never overwrites or touches an existing model.

Use to move or clone a model between workspaces or across instances; the envelope round-trips through export_report (scope="model", format="archive") first.

The restored model arrives UNVERIFIED. The tier verdicts on its assertions, the attested flag on a verification result, and the facts a verification run reported are the origin's record of what it claimed — kept with the model as that record, and not credited here: a verdict belongs to the run that produced it and the judge that decided it, and this workspace has neither. Verification is earned here by running it against code this workspace can reach, so plan for a restored model to read unverified until it has.

ParametersJSON Schema
NameRequiredDescriptionDefault
envelopeYesThe full archive dict returned by ``export_report (scope="model", format="archive")``.
workspace_idYesTarget workspace to import into.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral transparency burden. It discloses that the operation is mutating, requires write access, assigns a fresh model_id on each import, auto-suffixes title collisions, is otherwise non-destructive, and that restored models arrive UNVERIFIED. This is unusually rich and actionable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and mutation effect, and the longer unverified-model paragraph is purposeful rather than filler. Still, the final paragraph is somewhat verbose and could be tightened without losing meaning, so it is not maximally concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage, prerequisites, safety, idempotence, collision behavior, and post-import verification state, and the output schema presumably handles return-value details. The main gap is the unexplained server_version parameter, and the lack of annotations means the description must do all the work, which it almost does.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents envelope and workspace_id, and the description adds useful semantics: the envelope comes from export_report and the target workspace must be writable. However, the required server_version parameter is never explained anywhere in the description or schema, so a necessary input remains opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Import a JSON audit archive' into a target workspace, and clearly distinguishes this from sibling import tools by emphasizing it creates a NEW threat model. It also ties the archive format to export_report (scope="model", format="archive"), making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool: 'Use to move or clone a model between workspaces or across instances,' and even names the required companion export operation. It does not explicitly list exclusions or compare against other import siblings such as import_controls or import_compliance_framework, but the intended context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lift_composition_entityLift Composition EntityA

Promote a shared-anchor entity from two sibling descendants to their lowest common ancestor. Mutates state across THREE models.

The operator has confirmed (via the composition lift-candidate view) that the entity local_id_a on descendant_a_id and the entity local_id_b on descendant_b_id are the same logical thing and should be modeled once on the LCA. The route's model_id is the operator's current context model — typically the LCA, but the server accepts any ancestor of both descendants.

Conflict resolution. The server re-detects field-level and attached-state conflicts against current live state before applying. If new conflicts have surfaced since the operator's last candidate fetch, the call returns 400 with the missing conflict keys; refresh the lift-candidate view and resubmit with resolutions covering every key. Each entry in field_resolutions / attached_state_resolutions is "keep_a" | "keep_b" | "keep_both" (union for list/set fields; falls back to B for scalars).

Over-application gate. The lift extends visibility to every descendant of the LCA, not just the two source descendants. The server runs an over-application gate that refuses lifts touching descendants outside an acknowledged set; pass acknowledged_third_party_subtrees to acknowledge specific subtrees, or skip_overapplication_gate=True to override entirely after explicit operator confirmation.

Each affected model (LCA + both descendants) bumps version and emits a model_refined activity event; a structured lift_applied event with the full lift_event payload lands on the LCA. The audit pack surfaces this under lift_history. Reverse it with undo_composition_event (event_type="lift") (preview first via preview_undo_composition (event_type="lift")); the inverse operation is split_composition_entity.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesEntity kind — one of ``"assets"``, ``"attackers"``, ``"components"``.
model_idYesOperator's context model — the model whose composition view surfaced the candidate. Treated as a route anchor only; doesn't have to be the LCA.
local_id_aYesLocal id of the entity on ``descendant_a_id``.
local_id_bYesLocal id of the entity on ``descendant_b_id``.
lca_model_idYesTarget ancestor model id (the LCA, or any ancestor higher up the chain).
server_versionYes
descendant_a_idYesFirst source descendant model id.
descendant_b_idYesSecond source descendant model id.
field_resolutionsNoOptional per-field resolution map (e.g. ``{"description": "keep_both", "tags": "keep_a"}``).
lca_descendant_idsNoOptional snapshot of the LCA's descendant set used by the over-application gate. Omit to let the server compute it via BFS.
skip_overapplication_gateNoWhen True, bypass the gate after explicit operator confirmation. Default False.
attached_state_resolutionsNoOptional per-state-key resolution map (e.g. ``{"state:assertions/AS3": "keep_b"}``).
acknowledged_third_party_subtreesNoOptional list of subtree roots the operator has acknowledged as in-scope for the lift.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it delivers thoroughly. It discloses that the tool mutates state across three models, re-detects conflicts against live state and returns 400 with missing keys, bumps versions, emits model_refined and lift_applied events, writes to lift_history, and can be reverted via undo. This is exemplary transparency for a destructive/complex mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but appropriately so for a 13-parameter, three-model mutation tool. It is well structured with clear paragraphs for conflict resolution, over-application gate, and side effects, and every sentence adds operational guidance rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity, the absence of annotations, and the presence of an output schema, the description is complete enough for an agent to call the tool correctly. It covers preconditions, error behavior, gate overrides, side effects, audit trail, and reversal path. No critical operational gap is apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 92%, yet the description still adds meaningful semantics beyond the schema: it defines the resolution enum values (keep_a/keep_b/keep_both), explains union behavior for list/set fields, clarifies the over-application gate, and explains how acknowledged_third_party_subtrees and skip_overapplication_gate interact. This is value beyond the input schema, not repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: promote a shared-anchor entity from two sibling descendants to their lowest common ancestor. It clearly distinguishes itself from related tools by naming the inverse operation (split_composition_entity) and the undo path (undo_composition_event), so an agent can tell it apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the exact precondition: the operator has confirmed via the composition lift-candidate view that the two entities are the same logical thing. It also instructs when to refresh and resubmit after conflicts, and explicitly points to undo_composition_event and split_composition_entity as the reverse/inverse operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assertionsList AssertionsA

List active assertions for a control or assumption.

Provide exactly one of control_id or assumption_id.

Returns a flat list of assertions. Each assertion carries an origin field: "own" for assertions submitted directly against this model's control or assumption, "inherited" for assertions contributed through model composition (composed models whose assertions apply here). Inherited assertions are included in the listing.

Each assertion also carries three INDEPENDENT verdict fields. Read them together — a passing tier check is not the same as sufficient evidence:

  • tier1_status — mechanical check: the named file, symbol, or pattern is actually there. "pass" | "fail" | "pending".

  • tier2_status — semantic check: the cited code meaningfully implements the claim. "pass" | "fail" | "pending".

  • coherence_status — advisory consistency signal across the control's evidence set. "pending" here does NOT block the control from verifying, does NOT mean a verdict is missing, and is NOT a reason to trigger a recompute.

An assertion can pass BOTH tiers while its control stays unverified, because verification is decided per CONTROL, not per assertion: a control verifies only when its assertions collectively cover every clause of the control description. Read get_sufficiency for that verdict; never infer it from the tier fields here.

Each assertion also carries covers (the objective or clause ids it was declared to prove; empty when undeclared) and, where the platform surfaces it, tier1_attested and evidence_provenance (whether the run that verified it was signed and by what class of identity).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idNoID of the control (omit if using assumption_id).
assumption_idNoID of the assumption (omit if using control_id).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: it discloses that inherited assertions are included, that the three verdict fields are independent, that coherence_status 'pending' does NOT block verification, and that passing tiers does not mean the control verifies. It also explains the meaning of origin, covers, tier1_attested, and evidence_provenance. This is rich behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every section earns its place: the one-of constraint, the origin field, the three verdict fields with their caveats, and the pointer to get_sufficiency. It is front-loaded with the core purpose and the most critical usage rule. Slightly verbose in the verdict-field section, but the warnings are important enough to justify the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are already structured, but the description still explains the semantics of the non-obvious fields (origin, tier1_status, tier2_status, coherence_status, covers, tier1_attested, evidence_provenance). It also covers the key pitfall (per-control verification) and routes to the right sibling. For a list tool with this complexity, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description adds the critical constraint that exactly one of control_id or assumption_id must be provided, which the schema only hints at via 'omit if using...'. It also clarifies the semantics of the returned fields, which helps the agent interpret results. It doesn't document server_version or model_id, but those are self-explanatory and the schema covers them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List active assertions for a control or assumption.' It immediately distinguishes the tool's scope (active assertions, flat list) and names the two valid target types. It also differentiates from siblings like get_sufficiency and get_verification_report by explicitly saying verification is decided per control and should be read from get_sufficiency, not inferred here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit selection rule: 'Provide exactly one of control_id or assumption_id.' It also tells the agent when NOT to use this tool for a verdict: 'never infer it from the tier fields here' and directs to get_sufficiency. This is clear routing guidance relative to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_attestationsList AttestationsA

List an assumption's attestation history. Read-only; no side effects.

Returns the chronological record of attestation events recorded against the assumption (each with its actor, timestamp, and status/expiry as recorded), so you can trace why the assumption is currently attested, expired, or never attested. An assumption only mitigates its control objectives while it is active AND currently attested, so use this to diagnose coverage that depends on an attestation.

To record a new attestation use submit_attestation; for the assumption's current fields (status, description) use get_entity (entity_type="assumption").

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
assumption_idYesID of the assumption whose attestation history to list.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly states 'Read-only; no side effects' and describes the chronological return of events with actor, timestamp, and status/expiry. This is strong transparency beyond what the schema shows, though it does not mention potential limits or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: the core action appears in the first sentence, followed by return-value context, a practical diagnostic purpose, and clear alternatives. Every sentence contributes information an agent needs to select and invoke the tool correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema and only three self-explanatory parameters, so the description need not expand return types. It explains what the returned history contains, why the tool matters for coverage diagnosis, and how it relates to neighboring tools. This is sufficient for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, leaving server_version undocumented, but the parameter name is self-explanatory. The description clarifies the role of assumption_id by explaining that it identifies the assumption whose history is returned. It does not add detail about model_id or server_version, but the schema already handles most of the meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List an assumption's attestation history.' It clearly distinguishes this from the many sibling tools by focusing on the attestation timeline of an assumption, and explicitly notes it is read-only with no side effects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete guidance on when to use the tool: to diagnose coverage that depends on an active attestation. It also names alternatives explicitly — submit_attestation for recording a new attestation and get_entity for current assumption fields — making the routing decision clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_capabilitiesList CapabilitiesA

List every capability (a behaviour the feature must deliver) for a model.

Read-only; no side effects. Use this to enumerate a model's capabilities (e.g. before reviewing functional objectives). To fetch one capability's full detail use get_capability instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose capabilities to list.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the safety burden; it does so by explicitly stating 'Read-only; no side effects.' It also clarifies the semantic meaning of capability. It does not discuss authorization or list-size/pagination behavior, so it is not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: the core purpose/definition, a read-only safety note, and usage/alternative routing. The information is front-loaded and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple enumeration tool with an output schema, the purpose and safety profile are covered. However, a required parameter (server_version) is undocumented in both schema and description, which creates a real calling gap; the agent does not know what value to supply or why it is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%: server_version has no schema description, and the tool description does not explain it either. The description only paraphrases model_id as 'for a model,' adding no new parameter-level meaning, and leaves the required server_version parameter ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('List every capability') on a specific resource ('for a model'), defines the term capability, and differentiates itself from get_capability ('every' vs 'one capability's full detail'). An agent can immediately understand what the tool does and how it relates to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this to enumerate a model's capabilities (e.g. before reviewing functional objectives)' and names the alternative for a single capability: 'use get_capability instead.' This gives both a when-to-use context and an explicit exclusion/alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_co_dispositionsList Co DispositionsA

List the signed judgments recorded against this model's control objectives — risk acceptances, not-applicable dispositions, or both.

Read-only. Each entry carries the objective it names, the owner who signed it, the justification, the dates, and its status. Expired and revoked entries are included: a decision that lapsed is part of the audit trail, and hiding it would leave a reader unable to tell a judgment that was reviewed from one that was never made.

Read this before authoring a new judgment on an objective — an existing one may already cover it, or may have expired and need re-signing rather than duplicating.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOptional filter — "risk_accepted" or "not_applicable". Omit for both. Case and surrounding whitespace do not matter. A value that is neither is rejected by name rather than matched against nothing, so a typo cannot come back as an empty list you would read as "none recorded".
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does well: it declares the operation read-only, lists the fields each entry carries, and explains that expired and revoked entries are intentionally included for auditability. This goes beyond the schema and gives the agent important behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured and front-loaded: purpose first, return contents and inclusion behavior second, usage guidance last. Each sentence adds value, including the rationale for including expired and revoked entries, without excessive verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists and the description covers purpose, safety, return contents, and when to use it, the agent has enough context to invoke this tool correctly. Server_version is self-explanatory from the schema, and no pagination details are necessary for a list operation of this scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description aligns with the schema's kind parameter by mentioning 'risk acceptances, not-applicable dispositions, or both', but the schema already documents kind in detail. It adds little for model_id and nothing for server_version, and with 67% schema coverage the description does not substantially compensate for the undocumented parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it lists signed judgments recorded against a model's control objectives, including risk acceptances and not-applicable dispositions. It is clear but does not explicitly differentiate itself from sibling tools like list_risk_acceptances, so the distinction is mostly implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent to read this before authoring a new judgment, warning that an existing or expired judgment may already cover the objective. It provides clear context for when the tool is useful, though it does not explicitly state when not to use it or name alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_compliance_frameworksList Compliance FrameworksA

List the compliance frameworks available to map controls against.

Read-only; no side effects. Returns both built-in frameworks (e.g. OWASP ASVS) and any custom frameworks in the workspace. Use this to discover framework identifiers before select_compliance_frameworks (activate one for a model) or import_compliance_framework (add a custom one). Takes no arguments beyond the version guard.

ParametersJSON Schema
NameRequiredDescriptionDefault
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden. It states 'Read-only; no side effects' and specifies the return scope: built-in frameworks (e.g. OWASP ASVS) plus any custom workspace frameworks. It could add slightly more nuance about the returned list's contents, but this is strong disclosure for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences, each earning its place: purpose, behavior, usage guidance, and parameters. The core purpose is front-loaded and nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only list tool with an output schema present, the description covers purpose, behavior, workflow placement, and the parameter's role. Return-value details are covered by the output schema, so nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (server_version has no schema-level description), so the description must compensate. It clarifies that the parameter is a 'version guard' and not a functional argument, which helps, but it does not specify the expected version value or format, leaving the agent to guess what to pass.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List the compliance frameworks available to map controls against.' It distinguishes itself from siblings by naming select_compliance_frameworks (activate one) and import_compliance_framework (add a custom one) as the tools that follow on from this discovery call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the workflow: 'Use this to discover framework identifiers before select_compliance_frameworks ... or import_compliance_framework.' It names both alternatives with their purposes, so an agent knows exactly when to call this tool instead of the related ones.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_decisionsList DecisionsA

List the decision ledger of a model: every judgment recorded on it (finding dismissed or remediated, risk accepted, not-applicable declared, proposal accepted / rejected / reverted, escalation resolved), newest first, with who made it and whether it was within the workspace's delegation policy. Read-only; no side effects.

Call this BEFORE raising a proposal or asking for a judgment, so you do not propose what a person rejected or ask again for what was already decided.

The ledger is append-only. There is no tool that edits it; to undo an accepted proposal, revert or re-decide, never edit the record. Rows with outcome == "refused" are judgments a program was refused; their escalation, if any, is in list_proposals. agent is null for a person's decision.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return. 0 (default) uses the server default.
decisionNoOptional kind filter, one of ``finding_dismissed``, ``finding_remediated``, ``risk_accepted``, ``not_applicable_declared``, ``proposal_accepted``, ``proposal_rejected``, ``proposal_reverted``, ``escalation_resolved``. Empty (default) returns every kind.
model_idYesID of the threat model.
agent_onlyNoOnly decisions made by a program (``agent`` not null). Default False.
server_versionYes
outside_policy_onlyNoOnly decisions made outside the delegation policy in force at the time (``within_policy`` false). Default False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does so thoroughly: read-only, no side effects, append-only ledger, no editing tool, special meaning of outcome == 'refused', and agent being null for human decisions. This gives an agent a reliable model of the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense paragraphs front-load the core purpose, then add usage guidance and behavioral caveats. Every sentence carries distinct information, with no filler or tautology.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with an output schema, this description is complete: it covers ordering, filtering semantics, unusual outcome rows, cross-tool routing to list_proposals, and the append-only data model. An agent can call it and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (83%), so the baseline is 3. The description adds useful meaning for filters by explaining that agent is null for person-made decisions and that decisions carry a within-policy flag, which maps to agent_only and outside_policy_only. However, the undocumented server_version parameter receives no clarifying context, preventing a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: list the decision ledger of a model, enumerating the exact judgment kinds and stating the sort order plus included attribution/policy fields. It clearly differentiates from sibling proposal and escalation tools by mentioning where escalation data lives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: call this BEFORE raising a proposal or asking for a judgment, so the agent does not repeat rejected or already-decided actions. It also names list_proposals as the source for escalations and states there is no editing tool, steering agents away from mutation attempts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_effective_attack_pathsList Effective Attack PathsB

Effective AttackPath set + lifted missing/dangling suggestions.

AttackPaths inherit from ancestors with the same own / inherited provenance as other entities. The suggestions block is the missing-path / dangling-path delta computed against the composed effective topology — a child sees the inherited baseline claims, the composed reach surface, and the delta against both.

Return shape::

{
  model_id, flag_enabled,
  effective_paths: [{kind, qualified_id, owner_model_id,
    owner_title, origin, entity}, ...],
  lattice_positions: int,
  authored_paths: int,
  suggestions: {missing_path: [...], dangling_path: [...]},
}

When composition is disabled on the backend, effective_paths is empty, the counts are zero, suggestions is empty, and flag_enabled: false.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden, and it delivers substantial behavioral detail: provenance-based inheritance, the suggestions delta computed against the composed effective topology, and the degenerate-case output when composition is disabled. It stops short of a 5 only because it never explicitly states the operation is read-only with no side effects, though 'list' makes that likely.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized well: concept, computation semantics, structured return shape, then the disabled-composition edge case. It is dense but not wasteful. It loses a point because the opening fragment is cryptic and a single plain-language sentence stating 'returns the composed effective attack paths plus missing/dangling suggestions' would make it far more readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The genuinely hard part — what 'effective' means and how suggestions are computed — is explained well, and the return shape is documented despite the presence of an output schema. Clear gaps remain: the required server_version parameter is undocumented, no guidance selects this over overlapping read siblings, and the suggestion item structure is only sketched. Adequate for a domain expert, but an agent still faces uncertainty on parameters and tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: model_id is described by the schema while server_version has no description, and the tool description adds nothing about either parameter. server_version remains a complete mystery — no hint of valid values, semantics, or relationship to the backend — so the agent must guess what to pass for a required field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies a specific resource (the effective attack-path set) and the companion suggestions block (missing/dangling deltas), and the title/name supply the 'List' verb. The concept of 'effective' is defined via composition and provenance inheritance, which helps separate it from authored-path reads. However, the opening line is a jargon-heavy fragment rather than a plain statement of function, and it never explicitly contrasts itself with sibling list_effective_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: an agent can infer this tool is for retrieving composed effective attack paths and their missing/dangling deltas. The 'when composition is disabled' clause gives a conditional under which output degrades, which is useful. But there is no explicit when-to-use/when-not-to-use guidance or naming of alternatives (e.g., list_effective_entities, get_reachability_verdicts, check_control_gaps), leaving sibling selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_effective_control_objectivesList Effective Control ObjectivesA

Effective control objectives with origin classification.

Returns every CO visible on the effective model, each tagged with its origin: own (authored on this model), cross (an inherited CO whose asset or attacker is local to this model), or inherited (purely inherited from an ancestor). Use this to see what control objectives the model is on the hook for — including those it inherits — before reading coverage or reach.

Return shape::

{
  model_id, flag_enabled,
  control_objectives: [
    {co_qid, asset_qid, attacker_qid,
     security_properties: ["C"|"I"|"A"|"U", ...],
     origin: "own"|"cross"|"inherited"},
    ...
  ],
}

When composition is disabled on the backend, returns an empty list and flag_enabled: false.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral burden. It explains what 'effective' means, defines all three origin values, gives the exact return shape, and discloses the edge case where composition is disabled (empty list with flag_enabled: false).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well structured: purpose, semantics, usage timing, return shape, and edge case each get their own section. It is slightly longer than strictly necessary, but the return-shape block is valuable given no inline output schema is shown.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a simple list operation: it covers scope, origin semantics, return shape, and a backend-specific edge case. The main gap is the undocumented server_version parameter, which prevents full call confidence.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, and the description adds no parameter-level guidance. model_id is documented in the schema, but server_version has no description in either the schema or the description, so an agent cannot tell what values or format it expects.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns') and a clear resource ('every CO visible on the effective model'), and adds a distinguishing origin classification ('own', 'cross', 'inherited'). This makes it easy to differentiate from related tools like get_control_objectives or get_effective_coverage.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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 to see what control objectives the model is on the hook for... before reading coverage or reach.' It provides clear context, though it does not explicitly name alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_effective_entitiesList Effective EntitiesA

Effective entity set (own ⊕ inherited) keyed by kind.

Returns the entity set this model sees after composition with ancestors: trust boundaries, components, assets, attackers, and (when applicable) attack paths. Each entry carries its provenance — whether it originates on this model or is inherited from an ancestor — plus a fully-qualified id so cross-model references are unambiguous.

Pair with list_effective_control_objectives and get_effective_coverage to see how inherited topology contributes to coverage credit.

Return shape::

{
  model_id, flag_enabled,
  kinds: {
    trust_boundaries: [{kind, qualified_id, owner_model_id,
      owner_title, origin, entity}, ...],
    components: [...], assets: [...], attackers: [...], ...
  },
  total, page, page_size,
}

When composition is disabled on the backend, kinds is returned with every kind mapped to an empty list and flag_enabled: false.

Omitting page / page_size defaults to page=1, page_size=100 — the response is paginated and no longer returns every entity in a single call.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNooptional single entity kind to restrict the response to (e.g. ``"attackers"``, ``"assets"``, ``"components"``, ``"trust_boundaries"``). When omitted, all kinds are returned.
pageNo1-indexed page number (default ``1``).
model_idYesID of the threat model.
page_sizeNoentries per page (default ``100``).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, and it delivers: it explains composition semantics, provenance, qualified ids, pagination defaults, and the exact behavior when composition is disabled (empty kinds and flag_enabled: false). The note that pagination means the response no longer returns every entity in a single call is especially valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and well-structured, front-loading the core result, then providing a concrete return shape, a special-case behavior, and practical pairing guidance. Every section earns its place and the code block improves scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for an agent to invoke the tool correctly: it names all required context (model's effective set after composition), documents pagination defaults, describes the response shape, and explains the disabled-composition edge case. The presence of an output schema further reduces the need to explain return values, but the description still adds valuable semantic context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents kind, page, model_id, and page_size with defaults and descriptions, so the baseline applies. The description adds no significant parameter explanation beyond the schema, aside from confirming pagination behavior which the schema also covers via defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it returns the effective entity set after composition with ancestors, keyed by kind and including provenance and qualified ids. It clearly distinguishes itself from related sibling tools like list_effective_control_objectives and get_effective_coverage by describing exactly what entity data it provides.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context for when to use the tool: to retrieve the effective entity set with provenance and fully-qualified ids, and explicitly suggests pairing it with list_effective_control_objectives and get_effective_coverage for coverage analysis. It does not explicitly state when not to use it or mention alternatives like list_effective_attack_paths, but the usage intent is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_findingsList FindingsA

List negative findings recorded on a threat model. Read-only.

Returns finding rows with their lifecycle status; use to triage gaps or to find a finding_id for update_finding / preview_finding_remediation. Each row carries an origin ("own" for findings recorded on this model, "inherited" for findings contributed through model composition, with inherited_from_* context); inherited findings are included in the listing.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOptional lifecycle filter, one of "discovered", "acknowledged", "remediated", "verified", "dismissed", "auto_resolved". Empty (default) returns all statuses. ``auto_resolved`` is closed by the platform, not by a person: the condition that produced the finding is no longer reproduced. It is deliberately distinct from ``remediated``/``verified`` (a person fixed and confirmed it) and from ``dismissed`` (a person judged it not worth fixing) — "the gap is gone" and "the gap does not matter" are opposite statements about residual risk, so they never share a status.
model_idYesID of the threat model.
control_idNoOptional filter to findings on one control. Empty (default) returns findings for all controls.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and does a good job: it declares Read-only, explains that returned rows carry lifecycle status, and clarifies the origin distinction between 'own' and 'inherited' findings, including that inherited findings are included. It does not cover pagination, ordering, or auth, but these are less critical for a read-only listing tool with an output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler. The core action and read-only nature come first, followed by return-row semantics and explicit downstream use cases. Every sentence contributes unique information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a listing tool: it covers what is returned, the origin behavior, the read-only safety profile, and concrete use cases. The only notable omission is the meaning of the required server_version parameter, since the schema leaves it undocumented and the description does not address it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the schema already gives rich meaning to status, model_id, and control_id, including the nuanced auto_resolved semantics. The description adds context about finding rows and origins but does not clarify the undocumented server_version parameter or add direct parameter-level guidance beyond the schema, so it neither compensates for the gap nor repeats excessive detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 ('List negative findings recorded on a threat model') and immediately distinguishes the tool as read-only. It also names downstream consumers of the output ('for update_finding / preview_finding_remediation'), making its role among many sibling tools unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly states when to use the tool: to triage gaps or to obtain a finding_id for later update/remediation tools. It does not explicitly name competing list/get tools or state when not to use it, so it stops short of a full exclusion-based guideline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_groupsList GroupsA

List the workspace's groups of a given kind. Read-only; no side effects.

A "group" is a named collection of threat models. Two kinds, with distinct semantics and DIFFERENT response shapes:

kind values:

  • "tag": overlapping, semantics-free groupings — for audit scopes, ad-hoc selections, or portfolios. A model may carry many tags, and a tag never affects posture or credit. Returns {"tags": [...]}.

  • "system": named groupings of threat models for portfolio-level risk and compliance reporting; unlike tags these drive system-scoped risk/compliance rollups. Returns {"items": [<system>, ...]} where each system carries id, name, description, model_count.

Discover group IDs here before the group risk/compliance/export tools or before adding/removing members. For a single model's tag memberships use list_model_groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes``"tag"`` or ``"system"``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full transparency burden. It explicitly says 'Read-only; no side effects,' discloses that the two kinds have different response shapes, and explains the semantic consequences of each kind (e.g., tags never affect posture/credit, system groups drive rollups). This is strong behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose and safety behavior, then uses clear headings and bullets for the kind distinction, and closes with usage guidance and an alternative. Every section earns its place; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, behavior, output shapes, and usage context, and the output schema exists, so return-value documentation is not a burden. It is excellent except for one notable gap: the required server_version parameter is never explained. This prevents full completeness for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description significantly enriches the kind parameter by explaining its two allowed values, their semantics, and exact response shapes. However, server_version, a required parameter, is neither described in the schema nor mentioned in the description. Since schema coverage is only 50%, the description compensates for kind but leaves a full required parameter unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'List the workspace's groups of a given kind.' It then distinguishes the two kinds and explicitly names the sibling list_model_groups as the alternative for a single model's tags, so the agent can tell this tool apart without guessing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use the tool: 'Discover group IDs here before the group risk/compliance/export tools or before adding/removing members.' It also gives an explicit exclusion: 'For a single model's tag memberships use list_model_groups.' This is clear routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_model_groupsList Model GroupsA

List the groups a given model belongs to. Read-only; no side effects.

Returns the model's TAG memberships (/api/models/{id}/tags) — tags are the overlapping grouping kind, so a model may appear under many. There is no per-model listing for systems; enumerate systems with list_groups(kind="system") and inspect membership via each system's get_group. Use list_groups(kind="tag") for all tags in the workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesthe model whose groups (tags) to list.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It explicitly says 'Read-only; no side effects', reveals the underlying endpoint, and explains tagging overlap semantics. This is strong context beyond the bare operation, though it does not discuss error conditions or authorization.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero filler. The core action and safety cue are front-loaded, followed by return semantics and routing to alternatives. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for the tool's core purpose, behavior, and differentiation from siblings. The missing semantics of server_version is a minor contextual gap, and the presence of an output schema reduces the need to describe return values in prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes model_id, and the description reinforces it. However, the required server_version parameter has no schema description and is not mentioned in the description, leaving its role unexplained. Since schema coverage is only 50%, this is a notable gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states a specific verb and resource: lists the groups (tags) a given model belongs to. It also distinguishes itself from sibling tools by noting there is no per-model listing for systems and directing users to list_groups for system enumeration and workspace-wide tag listing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: use this for a model's tag memberships, and use list_groups(kind='system') for systems and list_groups(kind='tag') for all workspace tags. It also states the tool is read-only, making its safe use context clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_proposalsList ProposalsA

List proposals and escalations on a model. Call this to poll the outcome of a proposal you raised, or of a judgment you were refused. Read-only; no side effects.

Statuses: proposed and applied_pending_review are open; accepted, rejected, reverted, superseded are closed. Kinds include add_component, remove_component, design_change, and decision_request: an escalation of a judgment this agent was refused. A 403 from update_finding, create_risk_acceptance, or decide_proposal carries an escalation_id; that escalation appears here as a decision_request. Poll it here until a person resolves it; do not retry the refused call.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOptional status filter (one of the values above). Empty (default) returns every proposal.
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so excellently: it states 'Read-only; no side effects' directly. It also explains status semantics, kinds, and the escalation lifecycle, offering substantial behavioral context beyond the bare schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficiently organized: an opening summary, a clear call-to-action, then structured status/kind information. Every sentence adds useful guidance, and critical behavioral information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description need not explain return values. It covers purpose, triggering conditions, statuses, escalation behavior, and the no-retry directive, making it fully sufficient 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description enriches the status parameter by enumerating valid status values and explaining what open versus closed means. It also explains kinds including decision_request. However, the required server_version parameter is left undocumented in both schema and description, which prevents a perfect score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'List proposals and escalations on a model.' It immediately connects the tool to polling outcomes of proposals or refused judgments, making its purpose unambiguous and distinguishable from decision-related siblings like decide_proposal and list_decisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to call it: poll for a proposal outcome or a refused judgment. It even explains the escalation flow from 403 responses and instructs the agent to poll rather than retry, giving concrete, actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reconciliation_candidatesList Reconciliation CandidatesA

Reconciliation triage surface between this model and its ancestors.

When a model inherits entities (assets, attackers, components, trust boundaries) from an ancestor and the operator has authored a locally-named entity that looks like the same real-world thing, the reconciliation engine pairs them so the operator can decide whether to alias the local entity onto the inherited qualified id. disposition selects which side of the triage queue to read:

  • disposition="active" (default) — the OPEN candidate queue: detected pairs the operator has not yet acted on. Tier certain is a deterministic match (same qid or structurally identical) and is safe to auto-apply via apply_certain_reconciliation_match; tier heuristic is a fuzzy name/description match that needs review. Previously-rejected pairs are filtered out of this queue. Paginated via page / page_size. Returns {model_id, flag_enabled, total, tiers: {certain: int, heuristic: int}, page, page_size, candidates: [{kind, own_qid, inherited_qid, tier: "certain"|"heuristic", reasons: [str, ...]}, ...]}. When composition is disabled on the backend, total is 0, candidates is empty, and flag_enabled: false.

  • disposition="rejected" — the operator's persisted "these are NOT duplicates" decisions, in rejected_at ascending order (the same set the candidate detector consults to filter the active queue). Use this to render the rejected section of a triage view, or to find the surrogate id needed by unreject_reconciliation_candidate. NOT paginated — page / page_size are ignored. Returns {model_id, flag_enabled, rejections: [{id, model_id, kind, own_qid, inherited_qid, rejected_by, rejected_at}, ...]}. When composition is disabled on the backend, rejections is empty and flag_enabled: false; the same empty list is returned with flag_enabled: true when the rejection store is not configured on the instance.

Use on child models in a recursive tree to find duplicates that should be collapsed before they distort coverage.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoACTIVE disposition only. 1-indexed page number. Default 1. Ignored when ``disposition="rejected"``.
model_idYesID of the descendant threat model.
page_sizeNoACTIVE disposition only. Items per page. Default 50. Ignored when ``disposition="rejected"``.
dispositionNoWhich side of the queue to read — ``"active"`` (default, open candidates) or ``"rejected"`` (persisted not-a-duplicate decisions).active
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses return shapes for both dispositions, pagination behavior, and that page/page_size are ignored for rejected. It also covers edge cases: composition disabled causes empty results and flag_enabled=false; an unconfigured rejection store yields empty rejections with flag_enabled=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but justified by two modes and several edge cases. The lead sentence gives the core purpose, the two disposition sections are clearly structured, and there is no filler or irrelevant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no annotations, the description covers when to use the tool, response shapes, pagination, ordering, cross-tool routing, and backend-dependent edge cases. An agent has enough context to call it correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, and the description adds meaning to disposition by defining active vs rejected, conffirms defaults, and clarifies that pagination applies only to active. It does not explain server_version, leaving a small gap, but the other parameters are well covered by the schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States it lists reconciliation candidates and defines two dispositions: active open candidates and rejected persisted non-duplicate decisions. It also references sibling actions apply_certain_reconciliation_match and unreject_reconciliation_candididate, so an agent can distinguish this list tool from mutation/reversal tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use on child models in a recursive tree to find dupicates that should be collapsed. It also explains when to use each disposition: active for pending triage, rejected for rendering the rejected section or finding the surrogate id needed by unreject_reconciliation_candidate, and routes certain-tier matches to apply_certain_reconciliation_match.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_relianceList RelianceA

List a model's cross-model dependency edges, in both directions.

Read-only; no side effects. Returns {model_id, as_consumer: [...], as_provider: [...]}. Consumer edges are this model's declared delegations / reliances on other models' controls; provider edges are other models relying on this one (its blast radius if its controls change).

Use this to inspect existing dependencies before creating or deleting edges (create_reliance / attach_foundation / delete_reliance), or to understand what breaks if this model's controls change.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the model to inspect.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and meets it: 'Read-only; no side effects' is an explicit safety guarantee. It also explains the meaning of consumer versus provider edges and calls out that provider edges represent blast radius, giving the agent real insight into the returned data. This goes well beyond a tautological statement of the tool's function.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-ordered: the action, the read-only guarantee, the return shape, the semantic definitions, and the use cases each earn their place. It front-loads the most decision-relevant information before the usage guidance. There is no redundancy with the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only list tool, the description is nearly complete: it explains output semantics, side-effect profile, and when to use it, and the output schema further covers return values. The only substantive gap is the undocumented server_version parameter, which is required but not explained anywhere. Because that parameter is the one missing piece, the definition is slightly short of fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

model_id is adequately documented in the schema ('ID of the model to inspect') and the description deepens that context by explaining the edges relative to that model. However, server_version has no schema description and is not mentioned in the tool description either, so one of the two required parameters remains semantically opaque. The 50% schema description coverage is only partially compensated for.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'List a model's cross-model dependency edges, in both directions.' This immediately distinguishes it from the many sibling tools, such as get_capabilities or get_system_dependencies, and makes the tool's core purpose unmistakable. The return-shape illustration reinforces what is being listed without conflating it with other list-type tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells the agent when to call this tool: before creating or deleting reliance edges, and when assessing what would break if a model's controls change. It also names the relevant sibling tools (create_relance, attach_foundation, delete_relance) that correspond to those edge mutations. This is direct, practical routing guidance rather than a vague hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_risk_acceptancesList Risk AcceptancesA

List all risk acceptances on a specific threat model — risks that an operator explicitly accepted instead of mitigating.

Each entry carries the CO id, owner, justification, status (active / expired / revoked), and the review deadline. Use to inspect which gaps were intentionally accepted versus genuinely unaddressed when triaging at-risk COs.

Returns risk acceptances ONLY. An objective declared not applicable is a different claim — it is not an accepted risk, and counting it as one would read a "does not apply here" as "we are carrying this exposure". Use list_co_dispositions to see those, or both together.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses entry fields, statuses, and the key semantic boundary that not-applicable objectives are excluded. It does not explicitly note side-effect-free read behavior, but 'List' strongly implies it, and the output schema covers the return structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core function, then explains usage, and ends with an important cautionary note distinguishing acceptances from N/A dispositions. The length is justified by the conceptual subtlety, though it could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 are covered. The description explains scope, entry content, and its relationship to list_co_dispositions. Missing only server_version semantics and typical list-tool constraints like pagination, which are non-essential for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: model_id has a schema description while server_version does not. The description reinforces model_id with 'on a specific threat model' but never explains server_version, leaving a gap in parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List all risk acceptances on a specific threat model.' It also explicitly distinguishes this from list_co_dispositions by clarifying that non-applicable objectives are not risk acceptances, making sibling differentiation clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit usage context: 'Use to inspect which gaps were intentionally accepted versus genuinely unaddressed when triaging at-risk COs.' It also names the alternative tool for non-applicable objectives and suggests using both together, giving the agent clear selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_threat_modelsList Threat ModelsA

List saved threat models in the current workspace.

Read-only; no side effects. Returns {items: [{id, title, version, created_at, ...}], count}. Use this to discover model IDs to pass to other tools, or for a portfolio overview.

ParametersJSON Schema
NameRequiredDescriptionDefault
sourceNoFilter by the system that created each model. One of "web", "mcp", "jira", "api". Omit (default "") to list all models regardless of source.
server_versionYes
include_assessment_summaryNoIf True, include an `assessment_summary` object per model (counts of mitigated / at_risk / unassessed control objectives plus a human-readable `message`). Use for aggregate posture queries across the workspace in a single call (e.g. "which of my models are at risk?") instead of calling `assess_model` once per model. Adds roughly 100 bytes per model. Default False.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description must carry the burden of behavioral disclosure. It explicitly states 'Read-only; no side effects' and describes the return shape as {items: [{id, title, version, created_at, ...}], count}. This is strong transparency for a list operation, though it does not mention pagination, authentication, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

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 resource, then states side-effect behavior, return shape, and intended use in a compact, scannable way.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is largely complete for a read-only list tool: it covers purpose, side-effect profile, return shape, and primary use cases. The main missing context is an explicit note about the required server_version parameter and guidance distinguishing this from get_threat_model for detailed model retrieval.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, covering source and include_assessment_summary, but the required server_version parameter has no description. The main description adds no extra parameter-level meaning beyond the schema, so the undocumented required parameter remains a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists saved threat models in the current workspace, with a specific verb and resource. It does not explicitly differentiate itself from related siblings like get_threat_model or query_threat_model, but the term 'list' plus the focus on model IDs and portfolio overview make the core purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete use cases: discovering model IDs to pass to other tools and portfolio overview. It does not explicitly say when to prefer alternatives such as get_threat_model or query_threat_model, but the use cases are helpful enough to orient an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_control_to_requirementMap Control To RequirementA

Manually map one security control to one compliance-framework requirement. Mutating: records a control-to-requirement mapping, which re-derives that requirement's coverage in the compliance report.

Use for a single, deliberate mapping you are asserting by hand. To let the LLM propose mappings across many requirements at once, use auto_map_controls; to close gaps end-to-end (map + exclude + fill), use auto_remediate_compliance.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional free-text note explaining the mapping rationale.
model_idYesID of the threat model.
confidenceNoProvenance label recorded on the mapping: "manual" (default, operator-asserted), "llm" (machine-suggested), or "verified" (human-confirmed).manual
control_idYesID of the control to map (e.g. "CTRL-01").
framework_idYesID of the compliance framework.
requirement_idYesID of the requirement to map to (e.g. "V2.1.1").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full behavioral burden. It opens with 'Mutating:' and explains the consequence: recording the mapping re-derives that requirement's coverage in the compliance report. It does not state idempotency or overwrite behavior, but the core side effect is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: the first states the action and side effect, the second gives usage guidance and alternatives. No filler, 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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and high parameter coverage, the description covers the key decision factors: what it does, that it mutates, the resulting report effect, and when to choose an alternative. Minor omissions like overwrite semantics and the unexplained required 'server_version' parameter keep it from a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, so the schema already documents most parameters with examples. The description adds only indirect context — 'asserting by hand' aligns with the confidence default 'manual' — but offers no new parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('map'), resource ('one security control to one compliance-framework requirement'), and explicitly scopes to a single deliberate mapping. It distinguishes itself from siblings by naming auto_map_controls (many at once) and auto_remediate_compliance (end-to-end gap closure).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use for a single, deliberate mapping you are asserting by hand.' Names two alternatives with the exact conditions for choosing them: batch LLM proposals via auto_map_controls, and end-to-end gap closure via auto_remediate_compliance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

model_coherence_reportModel Coherence ReportA

Static-analysis report on coherence between the model's component declarations, the code-binding strings on its controls and assertions, and the structural reachability of every CO.

Pass co_id to scope the report to findings carrying that CO id (the co_* reachability findings + the attestation cross-link findings). Component- and assertion-level findings without a CO binding are excluded in single-CO mode. 404 if the CO doesn't exist on the model.

The report carries up to twelve finding types, grouped below by concern. Each finding includes the entity IDs it concerns (co_id, asset_id, attacker_id, component_id, etc.) so the agent can dispatch the resolution tool directly without re-fetching the model.

Component / assertion bindings:

  • control_component_unknown — control references a component ID that no longer exists. Resolve: assign_to_components (target_type="control").

  • asset_component_unknown — asset references a missing component. Resolve: edit_asset (with corrected component_ids).

  • assertion_repo_mismatch — an assertion's repo does not match the repo_url of any component scoping its control. Resolve: rebind the assertion or rescope the control.

  • assertion_repo_orphan — an assertion has a repo but its control is unscoped. Resolve: assign_to_components (target_type="control") to scope the control, or correct the assertion's repo.

  • control_unscoped_with_scoped_assertions — control is unscoped, but its assertions all carry a single component's repo. Resolve: assign_to_components (target_type="control") to that component.

  • component_unbound — a component has no repo_url. Two cases, told apart by the component's trust boundary. An internal-zone component (your own code) that isn't linked yet: resolve with edit_component pointing at the real repo. An external-zone component (e.g. a third-party service, the customer's IdP, or other external infrastructure you call but don't own): leave it unbound — the finding is a permanent, auditor-visible external- dependency marker, NOT a TODO. Never bind an external component to your repo to silence this; "some client code touches it" is not a reason to bind (that client code lives in your repo for every dependency).

Reachability findings (deterministic composer; indeterminate verdicts surface as findings, never auto-decided by an LLM):

  • co_attacker_unpositioned — the CO's attacker has no positioned trust boundaries. Resolve by REPAIRING THE MODEL: edit_attacker (set trust_boundary_ids).

  • co_asset_unbounded — the CO's asset has no component-derived trust boundaries. Resolve by REPAIRING THE MODEL: assign_to_components (target_type="asset") or edit_asset (with component_ids).

  • co_no_shared_boundary — attacker and asset boundaries do not intersect. Resolve by REPAIRING THE MODEL: re-position the attacker via edit_attacker, or scope the asset to a shared component via assign_to_components (target_type="asset").

    An indeterminate verdict means the derivation could not decide, so the first move is to supply the structure it is missing. It does NOT mean the objective is inapplicable, and asserting that it is would answer a structural question with a judgment.

    co_no_shared_boundary can also fire where the connecting structure genuinely does not exist rather than merely going unstated, so supplying it is the first thing to try, not a guaranteed resolution. If the boundaries really do not meet, that is still a modelling answer.

    If the objective genuinely does not apply to this system, that is a separate claim: record it with create_co_disposition, which keeps the objective visible, owned and expiring rather than hiding it.

  • co_missing_entity — the CO references a missing asset/attacker; model state inconsistent. Resolve: restore the entity (restore_entity (entity_type="asset") / restore_entity (entity_type="attacker")) or remove the orphaned CO via refine_threat_model.

Use this before relying on component-scoped control discovery, when assertion verification fails for path/repo reasons, or to enumerate structural-completeness gaps the operator should address before treating the model as audit-ready. get_reachability_verdicts exposes the underlying composer verdicts directly when the finding-shape summary isn't enough.

ParametersJSON Schema
NameRequiredDescriptionDefault
co_idNoOptional CO id to scope the report to a single CO.
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and discharges it exceptionally: it discloses the 404 error case, the exclusion semantics of single-CO mode, that findings embed entity IDs for direct dispatch, and two non-obvious guardrails — indeterminate verdicts must never be auto-decided by an LLM, and external-zone components are permanent auditor-visible markers that must not be bound just to silence a finding. These are genuine behavioral traits no annotation schema would convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (well over 500 words), yet almost every sentence is decision-relevant: each finding type carries its resolution routing, and the guardrails prevent costly agent misbehavior. The structure is logical — purpose, scoping parameter, finding catalog, usage — though the indeterminate-verdict prose paragraphs interrupt the reachability finding list and could be folded into the reachability preamble without losing scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity tool with an output schema, this is near-totally complete: every listed finding is routed to a concrete resolution tool, the single-CO scoping model and 404 case are documented, and the 'objective doesn't apply' path is correctly deferred to create_co_disposition. Two minor gaps remain: the description promises 'up to twelve finding types' but catalogs ten, and the attestation cross-link findings are named but never defined.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% (co_id and model_id documented, server_version not), so the schema does partial work. The description substantially enriches co_id, the operative parameter, by spelling out the scoping behavior, which finding classes are excluded in single-CO mode, and the 404 condition — all beyond the schema's one-line gloss. model_id and server_version receive no extra treatment, but they are mechanically obvious API arguments.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states precisely what the tool produces — a static-analysis report on coherence among component declarations, code-binding strings, and CO structural reachability — naming both the resource (the threat model) and the analysis dimension. It also explicitly distinguishes itself from the sibling get_reachability_verdicts, which is positioned as the lower-level composer-verdict view, so an agent can tell the two apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-to-use list: before relying on component-scoped control discovery, when assertion verification fails for path/repo reasons, or when enumerating structural-completeness gaps before audit. It closes with a named alternative — get_reachability_verdicts — plus the condition that selects it, which is exactly the exclusion guidance the rubric asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_finding_remediationPreview Finding RemediationA

Preview what the platform would do to remediate a finding.

Read-only. Returns a structured diff describing the changes a subsequent apply_finding_remediation call would make. Use this BEFORE apply_finding_remediation to show the operator exactly what cleanup will happen, and get explicit confirmation before committing.

The exact shape of the diff depends on the finding's kind. For kind=structural_duplicate_controls, you get back which controls would be kept, which dropped, and the union of CO mappings + framework refs that would land on the survivor.

Returns 404 if the finding doesn't exist; 422 if the finding's kind has no automatic remediation handler.

ParametersJSON Schema
NameRequiredDescriptionDefault
finding_idYesID of the finding to preview remediation for.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears full responsibility and delivers: read-only/no-side-effects, variable diff shape by finding kind, a concrete structural_duplicate_controls example, and explicit 404/422 error semantics. This is comprehensive behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and read-only guarantee, then moves to usage, output variation, and errors in a logical order. It is longer than necessary only by a minor redundancy around confirmation, but every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, the description covers safety, usage, error cases, and output variation adequately, and an output schema exists for return values. The only substantive omission is the required server_version parameter, which is left undocumented in both the schema and prose.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the description does not compensate for the undocumented server_version parameter at all; the agent must guess its meaning and accepted values. finding_id is also described only in the schema, so the prose adds no parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 ('Preview what the platform would do to remediate a finding') and immediately defines the output as a structured diff, with the counterpart tool named. It is clearly distinguishable from apply_finding_remediation on first read.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit operational guidance: use this BEFORE apply_finding_remediation to show the operator the cleanup and obtain confirmation before committing. It does not enumerate when-not-to-use cases or compare against other preview-like siblings, but the directive is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

preview_undo_compositionPreview Undo CompositionA

Preview the inverse plan (or divergence refusal) for a prior composition event WITHOUT mutating any state. Read-only.

Read-only counterpart to undo_composition_event. Used by the confirmation flow so the operator sees what an undo would do before committing — either the inverse state operations the apply step will commit, or the enumerated reasons the divergence detector refuses the undo. Same {plan, refusal} return shape for both event types.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEither the surrogate id of the forward ``lift_applied`` / ``split_applied`` activity event, or the structured ``lift_id`` / ``split_id`` carried in the event's payload — both lookups are supported.
model_idYesThe model whose composition view originated the event. Must match the ``threat_model_id`` carried by the cited activity event; the server rejects with 404 when a caller tries to undo a sibling model's event through a different model's URL.
event_typeYesWhich forward composition event to preview undoing. One of: - ``"lift"``: preview undo of a ``lift_applied`` event. The plan block carries the lift inverse operations — tombstone the lifted LCA entity, restore the source descendants' copies, rewrite CO references. - ``"split"``: preview undo of a ``split_applied`` event. The plan block carries the split inverse operations — restore at the ancestor, tombstone the duplicated copies on every target descendant.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full responsibility for behavioral disclosure. It explicitly states 'WITHOUT mutating any state' and 'Read-only,' and describes the return shape as '{plan, refusal}' for both event types. This covers the key behavioral traits an agent needs, though it does not discuss authentication, errors, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the most important fact: this is a read-only preview that mutates no state. It then explains the relationship to undo_composition_event, the confirmation-flow use case, and the return shape without redundant or filler sentences. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, its relationship to a sibling tool, its non-mutating behavior, and its return shape enough for an agent to invoke it correctly. The schema supplies detailed parameter semantics and the output schema is present, so the remaining guidance is sufficient. No critical information appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides detailed descriptions for event_id, model_id, and event_type, so the description does not need to add much parameter-level meaning. The description adds useful background on the plan/refusal result but does not add semantic detail beyond what the schema already provides for the parameters. With 75% schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Preview') and resource ('inverse plan ... for a prior composition event') and explicitly says it is read-only. It also names its sibling 'undo_composition_event' and positions itself as the read-only counterpart, which clearly differentiates it from the actual undo operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it is used by the confirmation flow so the operator sees what an undo would do before committing. It names the alternative tool (undo_composition_event) and implies when not to use this tool (when actually committing the undo), though it does not explicitly state 'use undo_composition_event instead when ready to commit.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_attach_foundationPropose Attach FoundationA

Propose which of this model's objectives each foundation capability covers.

Read-only: returns candidate (objective ↔ provider control) pairs with a match score. Nothing is created or credited. Feed the chosen subset to attach_foundation.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesthe consumer model.
server_versionYes
foundation_model_idYesthe foundation to delegate to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states this is read-only, returns candidate pairs with match scores, and that 'Nothing is created or credited', which prevents an agent from expecting side effects. It does not mention potential edge cases or prerequisites, but the core behavioral traits are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. Every sentence adds value: the purpose, the read-only behavior, the output type, and the pointer to attach_foundation. There is no filler or redundant restating of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, no annotations, and an existing output schema, the description covers the essential context: purpose, behavior, output nature, and next step. It does not fully explain when to choose this over other read-only proposal-like siblings, but the explicit link to attach_foundation and the focus on candidate generation make the tool's role sufficiently clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, and the description adds no parameter-level meaning beyond the property names and the schema descriptions. The 'server_version' parameter has no schema description and is not explained in the tool description, leaving a gap for a required parameter. The two model-related parameters are reasonably described in the schema, but the description itself does not compensate for the missing server_version semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Propose'), a specific resource ('this model's objectives each foundation capability covers'), and a clear deliverable (candidate objective-provider control pairs with a match score). It also distinguishes itself from the sibling attach_foundation by explicitly stating that this tool is read-only and only proposes candidates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: this is a read-only proposal step and nothing is created or credited. It explicitly points to attach_foundation as the next step by saying 'Feed the chosen subset to attach_foundation', which helps an agent understand the tool's role relative to its sibling. It does not explicitly state when not to use it, but the purpose and downstream relationship are clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_threat_modelQuery Threat ModelA

Ask a natural-language question about an existing threat model.

Read-only; no side effects (no new version, no mutation). Uses AI to answer questions grounded in the model's assets, attackers, control objectives, assumptions, and current security posture, returning {model_id, answer} where answer is prose.

Use this for interpretation or summary questions ("what are the biggest gaps?", "which attackers target the token store?"). Do NOT use it to change the model — use refine_threat_model for that — and prefer get_threat_model / assess_model when you need structured data (entity lists, coverage counts) rather than a written answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model to query.
questionYesThe natural-language question to ask.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden, and it succeeds: it declares 'Read-only; no side effects (no new version, no mutation)', explains that AI is used, specifies that answers are grounded in model entities, and gives the return shape {model_id, answer}. This is unusually transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then behavior, then usage boundaries. Every sentence earns its place, and the three short paragraphs are easy to scan for an agent deciding whether to invoke this tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is remarkably complete for a read-only query tool: it covers behavior, return shape, use cases, and sibling alternatives. The only notable omission is any explanation of the required server_version parameter, which prevents a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds useful semantics for the question parameter (interpretation/summary questions, with examples) and implies model_id must reference an existing model. However, the required server_version parameter is completely undocumented in both the schema and the description, leaving a clear gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Ask a natural-language question about an existing threat model.' It also distinguishes itself from likely siblings by explicitly saying it is not for mutation (refine_threat_model) and not for structured data (get_threat_model / assess_model).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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 ('interpretation or summary questions'), when not to use it ('Do NOT use it to change the model'), and which alternatives to prefer for structured data. This leaves little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recompute_verdictsRecompute VerdictsA

Re-run coverage and group-sufficiency verdict evaluation for a model, or return the pre-flight cost estimate without enqueueing anything.

dry_run selects between enqueueing the recompute and a cost-only quote:

  • dry_run=False (default) — ENQUEUE: force a fresh evaluation of every control's coverage verdict and every live control objective's group-sufficiency verdict, bypassing the normal quiet-period batching. Evaluation runs in the background; re-read the model's divergence report (or coverage surfaces) shortly after to see updated verdicts. The response carries estimated_credits — an informational estimate; nothing is charged from it, actual usage is metered as the evaluation runs, per the account's plan. Returns {model_id, model_version, enqueued_coverage, enqueued_group_sufficiency, total_enqueued, estimated_credits, quote, governor}. When governor.exhausted is true the work is queued and resumes automatically at governor.resets_at — it is never dropped.

  • dry_run=True — QUOTE ONLY: return the informational pre-flight cost estimate and enqueue NOTHING. Nothing is charged from the estimate. It carries computed_at and the pricing rate_version in force so a stale quote is detectable. Returns {estimated_credits, computed_at, rate_version, informational, total_enqueueable, already_evaluated, governor}, where total_enqueueable is the number of jobs a recompute would enqueue and already_evaluated counts subjects that already carry a verdict (a portion short-circuit without cost, so the estimate is an upper bound). When governor.exhausted is true, new evaluation would be queued until governor.resets_at.

Scope — what this does NOT do. It evaluates control-objective COVERAGE and GROUP SUFFICIENCY only. It does not evaluate per-control sufficiency (whether a control's assertions cover its description) and it does not evaluate assertion coherence — both of those are computed on assertion write and read back with get_sufficiency / get_verification_report. So a control sitting at partially_verified, or an assertion showing coherence_status: "pending", is NOT a reason to call this tool: the verdict you want already exists, and recomputing spends credits without changing it. Reach for this only when control-to-CO MAPPINGS look wrong (see get_verdict_divergence).

Cost: this fans out across every control and live control objective, so on a large model the estimate can run to thousands of credits. Call it with dry_run=True first and surface the number to the operator before enqueueing.

Both modes return a 503-mapped error when verdict observability is unavailable on the deployment. To un-park verdicts stuck by a transient outage instead of force-enqueueing the whole model, use retry_verdicts.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoWhen True, return only the pre-flight estimate and enqueue nothing. When False (default), enqueue the recompute.
model_idYesID of the threat model to re-evaluate (or estimate for).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and meets it thoroughly: it reveals background execution bypassing quiet-period batching, that estimated_credits is informational and nothing is charged from it, governor queueing behavior with resets_at and never-dropped semantics, the 503-mapped error condition, and the cost magnitude (thousands of credits). It also documents both return shapes and exposes the upper-bound nature of the estimate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long but front-loaded and sectioned with bold heads (modes, scope exclusions, cost, error path). Every sentence carries unique information — no filler or restatement of the schema. The length is proportionate to the tool's real complexity: two behavioral modes with different return contracts and a critical negative scope that prevents wasted credits.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-complexity two-mode tool, nothing needed to call it correctly is missing: both modes' behavior and return fields, cost warning, exclusion scope, governor exhaustion handling, stale-quote detection, error mapping, and alternative entry points are all covered. An output schema exists and the description still documents return contracts in prose, exceeding the minimum bar.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; dry_run and model_id have schema descriptions while server_version does not. The description massively enriches dry_run semantics — full breakdown of both modes, return fields, governor behavior, and stale-quote detection — far beyond the schema's two-line description. However, server_version is a required parameter and receives no explanation in either the schema or the description, so the compensation is incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Re-run coverage and group-sufficiency verdict evaluation for a model, or return the pre-flight cost estimate without enqueueing anything.' It precisely names what is evaluated (coverage and group-sufficiency verdicts), distinguishes the enqueue vs. quote-only modes, and explicitly carves out what it does NOT do (per-control sufficiency, assertion coherence), separating it from siblings like retry_verdicts and get_verdict_divergence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use guidance: reach for it only when control-to-CO mappings look wrong, and NOT when a control sits at partially_verified or an assertion shows coherence_status pending. Names concrete alternatives (get_sufficiency, get_verification_report, retry_verdicts) and the conditions that select them, plus a cost-based recommendation to call with dry_run=True first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reconcile_modelReconcile ModelA

Reconcile a threat model with the code it describes. Call this after reading the code and before (or instead of) editing the model by hand: report what changed and what you observed, and the platform decides the consequence of each observation. Mutating only where the platform applies an observation (see below).

Two inputs, both optional:

  • changed_paths: the file paths that changed since the model's recorded commit. For a code-derived model compute them with git diff --name-only <commit_sha>..HEAD (the commit_sha from the model's provenance). The platform maps them onto components and reports which components changed, which paths no component claims, and whether a refresh is recommended.

  • observations: what you saw in the code that the model does not say. Each observation lands in one of four buckets by kind:

    • mechanism_named - the control's mechanism exists under another name (subject_id = control id). Follow up with refine_control using the codebase_findings returned in refine_suggested.

    • component_present - the code has a component the model lacks; include a proposal ({name, repo_url?, path?, trust_boundary_ids?}).

    • component_absent - a modelled component has no code (subject_id = component id).

    • forbidden_behavior - the code does something the model rules out (subject_id = control id, or empty).

The platform decides the consequence. Proposals are never applied on the agent's word, with one exception: a component change on a code-derived model (provenance kind="code") is applied immediately and queued for a person's review as applied_pending_review. Every other proposal waits for decide_proposal. Forbidden behaviors become findings. Observations the platform could not use come back in ignored with the reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
repo_urlNoRepository the paths belong to (optional; helps map paths in multi-repo models).
observationsNoJSON string of an **array** of observation objects, each ``{kind, subject_id?, evidence?: {paths?: [], symbols?: [], note?: ""}, proposal?: {name, repo_url?, path?, trust_boundary_ids?}}`` with ``kind`` one of ``mechanism_named``, ``component_present``, ``component_absent``, ``forbidden_behavior``. Empty/None sends no observations.
changed_pathsNoComma- or newline-separated file paths that changed since the model's recorded commit. Empty/None skips path mapping (``changed_paths`` in the response is then null).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral transparency burden. It discloses mutation semantics ('Mutating only where the platform applies an observation'), the immediate-apply exception with 'applied_pending_review', the fallback to decide_proposal, forbidden behaviors becoming findings, and ignored observations with reasons. This is exemplary disclosure of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely structured with a clear lead sentence, labeled optional inputs, and bullet-like kind explanations. Every section earns its place, and the most important guidance appears first. The formatting makes a complex set of behaviors scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex reconciliation tool with no annotations, the description is remarkably thorough: inputs, observation buckets, consequences, exceptions, and ignored outcomes are all covered. The only notable omission is that server_version, a required parameter, is not explained anywhere; otherwise, an agent has enough context to invoke the tool and interpret its role in the workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds substantial meaning beyond the schema, especially for changed_paths (including the git diff command and provenance commit_sha) and observations (explaining each kind's meaning, required fields, and consequences). However, server_version is a required parameter with no schema description and is not mentioned in the description, leaving a small gap despite the 80% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Reconcile a threat model with the code it describes.' It clearly distinguishes this tool from hand-editing and from related sibling tools like refine_control and decide_proposal by explaining that the platform decides consequences rather than the agent directly editing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is front-loaded: 'Call this after reading the code and before (or instead of) editing the model by hand.' It also names follow-up actions ('Follow up with refine_control...'), states when proposals wait for decide_proposal, and explains the exception for code-derived models. This gives an agent clear decision rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reevaluate_threat_model_factorsReevaluate Threat Model FactorsA

Re-run the LLM factor judgment on every asset and attacker in a threat model. Useful for re-baselining factors after a bug fix or feature-description change, without regenerating the whole model (which would destroy controls, assertions, components).

Each entity's factors and rationale are replaced with a fresh LLM-judged decomposition; the composed impact / likelihood is re-derived deterministically from the new factors. Each re-rating is recorded as a rating revision in the audit trail with change_reason (default: "LLM factor re-evaluation") so the starting-point regeneration is distinguishable from operator- supplied factor overrides via edit_asset / edit_attacker.

The platform's LLM factor judgment is a starting point. For deployment-specific factor adjustments (e.g., elevated regulatory_scope because your tenant is HIPAA-covered, or Commodity prevalence because your endpoint is public-internet exposed), use edit_asset / edit_attacker afterward with a change_reason documenting the operator override.

Per-entity soft-fail: an LLM failure on one entity is recorded in the response's failed_entities list (with id, kind, and reason); the remaining entities are still re-evaluated and their rating revisions persisted as they complete. The endpoint returns 503 only when every live entity failed — in which case nothing was persisted; retry when the evaluator is reachable.

Soft-deleted assets and attackers are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model to re-rate.
change_reasonNoOptional override of the audit-trail reason (default: "LLM factor re-evaluation"). Use this to thread a higher-level reason like "Re-eval after refinement bug fix shipped in vN.N.N" when running the tool as part of a broader workflow.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses that factors and rationale are replaced, that impact/likelihood is re-derived, that rating revisions are audited, the default change_reason, the soft-fail per-entity behavior, the 503 condition, and that soft-deleted entities are skipped. This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured: purpose first, then usage guidance, then behavioral details, then failure semantics. Each paragraph adds necessary information for a mutating re-rating operation. Minor redundancy and length prevent a 5, but the structure is strong.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, alternatives, side effects, audit behavior, failure modes, and exclusion of soft-deleted entities. The presence of an output schema reduces the need to explain return shapes. However, the required server_version parameter remains unexplained, which is a real gap for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds useful context for change_reason, explaining its default and audit-trail purpose, and reinforces model_id as the threat model to re-rate. However, server_version is a required parameter with no schema description and no explanation in the description, leaving its semantics unclear. The description partially compensates but does not fully cover the parameter set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Re-run the LLM factor judgment on every asset and attacker in a threat model.' It clearly differentiates this from regenerating the whole model and from operator edits via edit_asset / edit_attacker, so an agent can identify when this tool is the right fit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use the tool: re-baselining after a bug fix or feature-description change. It also names the alternatives for other cases: use edit_asset / edit_attacker for deployment-specific factor adjustments. This is concrete, actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refine_controlRefine ControlA

Refine a control's description with AI-gated CO sufficiency check.

Two modes:

  • Provide description: proposes a new description directly.

  • Provide codebase_findings: the platform proposes a description based on existing code that may already satisfy the control.

  • Both can be provided: the platform evaluates the proposed description with the codebase findings as context.

The AI evaluates whether the mitigation group still collectively satisfies all mapped control objectives. If rejected, returns {accepted: false, reason, per_co} with per-CO reasoning.

A refinement is rejected when the proposed description would reduce the protection the control currently states for an objective it is mapped to; per_co names each objective and explains why. This is a decision, not a transient error — re-wording the same narrowing will not pass it, and it applies however well-motivated the narrowing is. A control is a requirement that must be met to cover its objectives, so evidence that the system does not currently meet it means the control is UNMET, never that the control should ask for less.

Side effect on accepted refinements: every assertion attached to this control is superseded — their claims were authored against the prior description and are not guaranteed to align with the new one. The response includes superseded_assertions: <count> so the caller knows how many. Re-submit any assertion that still applies under the new description; superseded rows remain in history with superseded_by="control_refined:...".

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idYesID of the control to refine (e.g., "CTRL-03").
descriptionNoProposed new control description (optional if codebase_findings provided).
justificationNoWhy this refinement is appropriate (min 10 chars).
server_versionYes
codebase_findingsNoDescription of existing code that may already satisfy this control's objective (optional). When provided without description, the platform proposes a description.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly: it discloses the AI sufficiency check, the permanent rejection of narrowing refinements, and the side effect that all attached assertions are superseded. It also explains the response fields `per_co` and `superseded_assertions`, so callers can anticipate consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with the core action and modes, and uses bold labels for the crucial side-effect section. Some explanatory prose about why narrowing is rejected is repetitive, but it reinforces an important behavioral rule.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with no annotations, an output schema, and significant side effects, the description covers the operation, modes, rejection semantics, and assertion supersession well. The only notable gap is that it never states what happens if neither `description` nor `codebase_findings` is provided, since both are optional in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 83%, so the baseline is 3, but the description adds real semantics beyond the schema by explaining the interaction between `description` and `codebase_findings` and how the platform behaves in each mode. Required parameters like `control_id` and `server_version` are left to the schema, which is acceptable at this coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening states a specific verb and object: refine a control's description, with an AI-gated CO sufficiency check. It distinguishes itself from siblings like update_control_status or remap_control by focusing on description changes and defining two input modes. The behavior is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lays out when to provide `description`, `codebase_findings`, or both, giving practical guidance for choosing input strategy. It doesn't name alternatives such as remap_control or update_control_status, so cross-tool selection guidance is only implicit, not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refine_threat_modelRefine Threat ModelA

Refine an existing threat model based on an instruction.

Updates the model's assets, attackers, trust boundaries, and control objectives based on the instruction. Creates a new version. Progress is reported automatically.

Refine CANNOT silently replace an entity's identity under a stable ID or silently drop an entity. Behavior:

  • Preserved entities where the LLM proposed an identity- bearing rewrite (name / description / security_properties on assets; capability / archetype / position on attackers) run through a semantic-preservation guard. Rewrites classified as replace or ambiguous (or unavailable if the gate LLM is down) have their identity fields REVERTED to the pre-refine values. Each rejection shows up as an entry in the semantic_rejections array in this tool's return value — surface these to the operator.

  • Entities the LLM drops from the refined output are re- appended to the model unchanged. The only sanctioned removal path is remove_entity (entity_type="asset") / remove_entity (entity_type="attacker") (soft-delete).

  • CO IDs are stable across refinements; pairs (asset, attacker) that disappear come back as tombstones with removed=True (not renumbered). Controls that only mapped to tombstoned COs become orphaned at read time.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model to refine.
instructionYesWhat to change, e.g. "Add CSRF attack vectors".
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses preservation guarantees, the semantic-preservation guard, reverting identity fields, semantic_rejections, re-appending dropped entities, stable CO IDs, tombstones, orphaned controls, and the sanctioned removal path through remove_entity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a concise summary and then structured into clear behavior bullets. The length is justified by the non-obvious preservation, revert, tombstone, and orphan semantics it must communicate; each sentence adds needed detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, side effects, edge cases, and the key return artifact (semantic_rejections), and an output schema is present to define return values. It provides enough behavioral context for an agent to invoke the tool correctly, especially given the complex preservation guarantees.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents model_id and instruction, and the description adds some meaning by explaining what the instruction changes. However, server_version is a required parameter with no schema description and no mention in the tool description, so the parameter semantic coverage remains incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Refine'), a specific resource ('an existing threat model'), and the exact elements updated (assets, attackers, trust boundaries, control objectives), plus the fact that it creates a new version. This clearly distinguishes it from generation or query siblings like generate_threat_model or get_threat_model.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The opening sentence implies the use case: refine an existing threat model based on an instruction. However, it does not explicitly say when to use this tool over siblings like generate_threat_model or edit_asset, and it does not provide exclusion conditions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

regenerate_controlsRegenerate ControlsA

Regenerate controls from the model's control objectives. Mutating.

Re-authors controls from the current COs. Controls whose descriptions survive regeneration unchanged KEEP their implementation status, evidence, notes, assertions, and Jira / compliance mappings. Controls whose descriptions change or disappear are soft-deleted (still queryable via get_controls(include_deleted=True)). When co_ids is given, only those COs' controls are regenerated — all other controls are left as-is.

May run as a background job; this tool waits for completion and returns the final result. To rebuild everything, omit co_ids. To fix only stale/orphaned CO mappings without re-authoring control text, prefer remap_control (mechanical, no LLM).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"batch" (default) or "per_co" (most thorough — one LLM call per CO).batch
co_idsNoOptional comma-separated CO IDs to regenerate (e.g. "CO1,CO5"). Omit to regenerate all controls.
model_idYesID of the threat model.
batch_sizeNoCOs per batch in batch mode (default 15). Smaller = more accurate and more granular progress, but more LLM calls.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full behavioral disclosure. It reveals that the operation mutates, soft-deletes changed/disappeared controls, preserves attributes for unchanged controls, supports partial regeneration, can run as a background job while waiting for completion, and returns the final result. This is thorough and goes well beyond the input schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and mutation warning, then proceeds logically through behavior, edge cases, partial execution, and alternatives. Every sentence adds useful information, and there is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, mutating tool with five parameters and no annotations, the description covers the essential operational context: mutation, soft-delete semantics, partial regeneration, background execution, waiting behavior, and the correct alternative tool. An agent has enough information to decide when and how to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents most parameters. The description adds meaningful semantics for co_ids by explaining partial regeneration and for the general rebuild-vs-selective behavior. It does not add detail on server_version, but the schema mostly carries the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Regenerate controls from the model's control objectives.' It also clearly signals mutation with 'Mutating.' and distinguishes itself from the sibling remap_control by describing what regenerate_controls does versus what remap_control does. This is a precise, differentiating purpose statement.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage conditions: omit co_ids to rebuild everything, pass co_ids to regenerate only those COs' controls, and prefer remap_control when only stale/orphaned CO mappings need fixing. It also explains the partial-regeneration behavior, leaving all other controls as-is. This is strong when-to-use guidance with a named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reject_reconciliation_candidateReject Reconciliation CandidateA

Reject a reconciliation candidate. Mutates state.

Records the operator's "these are NOT duplicates" decision at org scope so the candidate detector filters this pair out of the active queue on subsequent reads. Idempotent on the natural key (model_id, kind, own_qid, inherited_qid) — re-rejecting an existing pair returns the same row. Use when list_reconciliation_candidates surfaces a pair that looks like a duplicate but the operator has confirmed it is not.

Persistence is at org scope, not model state — the rejection is durable across sessions and teammates but does NOT bump model version.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesEntity kind — one of ``"assets"``, ``"attackers"``, ``"components"``.
own_qidYesQualified id of the descendant's own entity (e.g. ``"child:A1"``).
model_idYesID of the descendant threat model.
inherited_qidYesQualified id of the ancestor's entity (e.g. ``"parent:A1"``).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states that the tool mutates state, is idempotent on the natural key, persists at org scope across sessions and teammates, does not bump model version, and returns the same row on re-rejection — excellent transparency for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense with no filler. Every sentence earns its place: purpose, state mutation, idempotency semantics, usage condition, and persistence scope are all covered in a compact, readable structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 required parameters and an output schema, the description is complete: it explains what happens, when to use it, what the durable effect is, what does not happen, and the idempotency behavior. No critical operational detail needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already cover 4 of 5 parameters. The description adds valuable semantic context by identifying which parameters form the natural key, (model_id, kind, own_qid, inherited_qid), and explaining that these define the rejection pair. It does not add specific meaning for server_version, but the schema coverage and the description's key-grouping insight go beyond the input schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Reject a reconciliation candidate' and clarifies exactly what this means — recording the operator's 'these are NOT duplicates' decision at org scope so the candidate detector filters the pair from the active queue. This clearly distinguishes it from siblings like apply_certain_reconciliation_match and unreject_reconciliation_candidate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit 'Use when' condition tied to list_reconciliation_candidates, which tells an agent precisely when to invoke the tool. It does not explicitly name alternatives like apply_certain_reconciliation_match or unreject_reconciliation_candidate, but the usage context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remap_controlRemap ControlA

Mechanical, non-AI-gated remap of a control's CO mappings.

Distinct from refine_control (AI-gated description edit) and set_mitigation_groups (AI-gated CO-centric group authoring). Use remap_control when the operator already knows the correct co_ids and just needs to persist the mapping change — e.g., restoring mappings after an asset/attacker edit left the control with stale or orphaned CO references. No LLM evaluation runs.

Rejects target co_ids that do not exist on the model or are tombstoned (the pair was removed in a later version) — map to live COs only.

ParametersJSON Schema
NameRequiredDescriptionDefault
co_idsYesComma-separated list of target CO IDs (e.g., "CO1,CO2,CO3"). Must include at least one CO.
model_idYesID of the threat model.
control_idYesID of the control to remap (e.g., "CTRL-03").
change_reasonYesWhy this remapping is appropriate (min 10 chars). Captured in the control's version history.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does so well by noting that no LLM evaluation runs, that the operation is purely mechanical, and that non-existent or tombstoned target co_ids are rejected. It does not discuss permissions, irreversibility, or whether existing mappings are replaced, but the core behavioral constraints are clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the exact purpose, the next sentences add sibling differentiation and usage context, and the final sentence documents validation behavior. Every sentence earns its place and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, the description covers purpose, usage, alternatives, and key rejection behavior. An output schema exists, so return values do not need to be explained. The only small gap is the unexplained server_version parameter and the lack of explicit statement about whether the remap replaces all existing CO mappings or merges with them, but the overall context is strong.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents most parameters. The description adds extra meaning for co_ids by clarifying that targets must be live COs and that tombstoned/nonexistent IDs are rejected, which goes beyond the schema's 'must include at least one CO'. The only notable gap is server_version, which remains undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Mechanical, non-AI-gated remap of a control's CO mappings.' It clearly names sibling tools it is distinct from (refine_control, set_mitigation_groups), eliminating ambiguity about what this tool does versus similar ones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: when the operator already knows the correct co_ids and needs to persist a mapping change. It also provides a concrete example scenario (restoring stale/orphaned CO references) and distinguishes it from AI-gated alternatives. This leaves no doubt about selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_entityRemove EntityA

Soft-delete a single entity of any core type. Mutating: creates a new model version. Reversible with restore_entity using the same entity_type — the entity's ID is preserved (never reused) so a restore reinstates the same ID and all its links. To change an entity's fields instead of removing it, use the typed edit_* tool.

Dispatches on entity_type. Per-type consequence (all derived at read time; nothing is hard-destroyed):

  • asset — the asset's (asset × attacker) CO pairs are tombstoned, orphaning any controls mapped to them.

  • attacker — control objectives anchored to this attacker are tombstoned; controls left with no live anchor become orphaned.

  • component — controls scoped to this component have their component_id cleared (the controls themselves are kept) and the component's trust-boundary contribution to asset reachability is withdrawn.

  • trust_boundary — reachability widens: attacker vectors the boundary was filtering now pass freely and its sealed/isolation claim is dropped, so CO reachability verdicts past it can flip toward reachable/indeterminate.

  • assumption — marked deleted (kept for the audit trail); linked COs are no longer mitigated by it; controls with assumed_by pointing to it are preserved as inert pointers that reconnect on restore.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
entity_idYesID of the entity to soft-delete.
entity_typeYesWhich entity to soft-delete — one of ``asset``, ``attacker``, ``component``, ``trust_boundary``, ``assumption``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and succeeds. It discloses that the operation is mutating, creates a new model version, is reversible, preserves IDs, never hard-destroys data, and enumerates per-entity-type consequences, including tombstoning, orphaning, clearing fields, and reachability impacts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core behavior and reversibility, then uses clear bullet points to organize per-type consequences. The length is justified by the complexity of the tool, and there is minimal fluff or redundancy beyond what is needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with no annotations, the description covers essential invocation context: what is affected, reversibility, side effects, and alternatives. Since an output schema exists, return-value details are not necessary, and the description provides enough information for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes model_id, entity_id, and entity_type, and the description adds meaningful semantic detail, especially for entity_type, by explaining consequences for each allowed value. The only slight gap is that server_version is required but not elaborated in either the schema description or the tool description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise action and scope: 'Soft-delete a single entity of any core type.' It then clearly distinguishes itself from the related restore_entity and typed edit_* tools, so an agent knows exactly what this tool does and how it differs from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use an alternative: 'To change an entity's fields instead of removing it, use the typed edit_* tool.' It also names restore_entity for reversal and describes per-type behavior, giving clear decision guidance for this tool versus siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_evidenceRemove EvidenceA

Remove one evidence item from a control by its position in the control's evidence array. Mutating.

Evidence is auxiliary metadata (see add_evidence); removing it does not affect the control's implementation status or any assertions. To find the index, read the control via get_controls (control_id=...) and count its evidence array from 0.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
control_idYesID of the control.
evidence_indexNoZero-based position of the item to remove within the control's ``evidence`` array (default 0 = first item).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and explicitly states 'Mutating.' It also discloses the non-effects (does not affect implementation status or assertions), which is valuable behavioral context beyond the obvious delete action. It does not mention error behavior on an invalid index or reversibility, but the core consequences are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each serving a purpose: the action, the consequence, and the how-to-find-the-index. The key term 'Mutating' is front-loaded, and there is 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple removal tool with 4 parameters, an output schema, and no annotations, this description is complete enough to call correctly. It explains what is removed, what is unaffected, and exactly how to determine the evidence_index. The only unannotated parameter is server_version, but the schema coverage is high and output schema is present, so the description need not fill that gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descrition coverage is 75%, so the baseline is 3. The description reinforces the zero-based indexing and references get_controls for finding the index, but the schema already documents evidence_index with 'Zero-based position' and a default. The description adds little new parameter meaning beyond what the input schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Remove'), resource ('one evidence item from a control'), and method ('by its position in the control's evidence array'). This clearly distinguishes it from add_evidence, get_controls, and other siblings by defining both the action and the targeting mechanism.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: evidence is auxiliary metadata, removal does not affect status or assertions, and the way to find the index is to read the control via get_controls. This is actionable guidance, but it does not explicitly list when-not-to-use or directly compare against a sibling alternative beyond referencing add_evidence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_model_from_groupRemove Model From GroupA

Remove a model from a tag group (the model itself is not deleted).

Member removal is supported for TAGS ONLY — systems have no remove-member endpoint on this API (a model added to a system via add_model_to_group(kind="system", ...) cannot be detached through this client). Removing a model from a tag leaves the model untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYesthe tag.
model_idYesthe model to remove.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description correctly carries the responsibility: it reveals the operation is non-destructive to the model ('model itself is not deleted', 'leaves the model untouched') and exposes the API limitation on systems. It doesn't cover failure modes or permission requirements, but for this simple mutation the key behavioral risk is addressed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight paragraphs, first sentence front-loads the action and scope, and each further sentence earns its place by explaining a limitation or non-deletion guarantee. No padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core behavior and limitations are covered and an output schema exists, so return values needn't be described. Missing semantics for the required server_version parameter is the main gap, and there's no note about error behavior when the model is not in the tag, so completeness is short of excellent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning beyond the schema by clarifying tag_id refers to a tag group (tags only, not systems) and that model_id refers to a model whose removal will not delete it. However, the required server_version parameter is left undocumented in both schema and description, so it is not fully explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Remove a model from a tag group', and immediately clarifies the model is not deleted. It also contrasts with add_model_to_group by emphasizing tag-only removal, so it is not confused with system-group operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says removal is supported for tags only and systems have no remove-member endpoint, so the agent knows not to use this tool for system membership. Also explains that a model added via add_model_to_group(kind='system') cannot be detached, giving a concrete when-not scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rename_threat_modelRename Threat ModelA

Rename a threat model. Metadata change only, does not create new version.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesNew name (1-120 chars).
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden, and it explicitly discloses a key side-effect trait: it is a metadata-only operation and does not create a new version. It does not discuss permissions or failure modes, but for a simple rename these are not essential.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler; the core action and the key limitation are front-loaded and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The core operation and side-effect are clear, and an output schema exists, so return values need no explanation. However, a required parameter, server_version, is left undocumented in both the schema and the description, which leaves an invocation gap; there is also no explicit routing among the many threat-model sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema documentation covers 67% of parameters (name and model_id). The description adds no parameter-specific meaning and does not clarify the undocumented server_version field, so it adds no value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Rename a threat model') and adds scope ('Metadata change only, does not create new version'), which distinguishes it from mutation tools like delete_threat_model or version-generating operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives the clear context that this tool is for renaming a threat model without creating a new version. It does not name sibling alternatives explicitly, but the no-new-version note effectively tells the agent this is not the tool for version changes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

restore_entityRestore EntityA

Un-soft-delete a single entity of any core type, reversing a prior remove_entity. Mutating: creates a new model version. Only affects an entity that is currently soft-deleted.

Dispatches on entity_type. Per-type effect:

  • asset — revives the asset's tombstoned (asset × attacker) COs with their original IDs, un-orphaning any linked controls.

  • attacker — reinstates the attacker under its original ID, revives the COs tombstoned when it was removed, and un-orphans any controls that were anchored to it.

  • component — reinstates the component under its original ID, restoring its trust-boundary contribution to asset reachability.

  • trust_boundary — reinstates the boundary: the reachability it filtered re-narrows and its sealed/isolation claim is restored, so CO reachability verdicts past it can flip back toward unreachable.

  • assumption — returns the assumption to active status; controls whose assumption_groups referenced it keep their group structure intact. Re-attestation is required before it mitigates COs again.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
entity_idYesID of the entity to restore.
entity_typeYesWhich entity to restore — one of ``asset``, ``attacker``, ``component``, ``trust_boundary``, ``assumption``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations, the description carries the full burden and succeeds impressively. It discloses mutation ('creates a new model version'), ID preservation, tombstone resurrection mechanics, un-orphaning of controls, reachability verdict flips for trust_boundary, and the re-attestation requirement for assumptions — exactly the non-obvious side effects an agent needs to anticipate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the first sentence, and the per-type effects are organized into scannable bullets. Though long, the length is justified by genuine complexity — five dispatch branches each with distinct semantics — and no sentence is redundant or restates schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is unusually complete for a polymorphic mutation tool: it covers preconditions, versioning side effects, per-type outcomes, and downstream consequences like re-attestation and verdict flips. The only gaps are error behavior (what happens if the entity is not soft-deleted, or if entity_type/entity_id is invalid) and server_version semantics — minor omissions given the output schema covers return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, so the schema does most of the work. The description adds substantial meaning beyond the schema by explaining what each entity_type value actually does behaviorally (distinct effects for asset, attacker, component, trust_boundary, assumption) and clarifying that entity_id must reference a soft-deleted entity. However, server_version remains undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb ('Un-soft-delete'), a precise resource ('a single entity of any core type'), and ties it to its inverse operation ('reversing a prior remove_entity'). It further enumerates the five supported entity types. This fully differentiates it from the large sibling set, especially remove_entity and the various add/edit tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear precondition ('Only affects an entity that is currently soft-deleted') and positions the tool as the reversal of remove_entity, which tells the agent when it applies. It does not, however, explicitly name alternatives or state when-not-to-use cases (e.g., that active entities should go through edit_* tools instead), so it falls just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

retry_verdictsRetry VerdictsA

Re-trigger a model's parked verdict re-evals after a transient failure.

When a verdict re-evaluation fails transiently — a provider outage, exhausted credits, or a timeout — it is parked and reads as "unavailable / treated as unverified", recovering only after a delay. This forces an immediate, non-destructive re-run of ONLY the parked/failed re-eval slots, across every verdict kind (coverage, group-sufficiency, per-control sufficiency, coherence). It changes no assertions, controls, or verdict content, so no IDs churn. Evaluation runs in the background — re-read the sufficiency or verification report shortly after to see updated verdicts.

Prefer this over recompute_verdicts when verdicts are stuck due to an outage: recompute_verdicts force-enqueues coverage + group-sufficiency for the whole model (metered per its estimate) and cannot un-park a job whose inputs are unchanged, whereas this re-arms exactly the failed slots and covers per-control sufficiency + coherence too.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose parked verdicts to retry.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and succeeds: it states the operation is non-destructive, changes no assertions/controls/verdict content, causes no ID churn, runs in the background, and tells the agent to re-read the sufficiency or verification report afterward. This is unusually complete behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: summary, failure scenario, exact scope, side-effect guarantees, async behavior, and sibling comparison. It is front-loaded with the core purpose and then deepens with necessary details, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description thoroughly covers the triggering conditions, operation scope, side effects, async execution, and how to observe results. However, the required server_version parameter is never explained, which is a real gap given that the schema also omits its description. The sibling-comparison and output-schema presence mitigate most other completeness concerns.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%: model_id has a schema description, but server_version has none. The tool description does not mention server_version at all, so the agent is left guessing what value to supply. The description adds no parameter-level 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.

Purpose5/5

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: 'Re-trigger a model's parked verdict re-evals after a transient failure.' It further clarifies the exact scope — only parked/failed re-eval slots across all verdict kinds — and differentiates itself from the sibling recompute_verdicts by naming the alternative and explaining the difference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-to-use rule: 'Prefer this over recompute_verdicts when verdicts are stuck due to an outage.' It also lists the triggering conditions (provider outage, exhausted credits, timeout) and explains what recompute_verdicts cannot do, making the choice between siblings unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revalidate_entity_qualityRevalidate Entity QualityA

Re-run quality validation on a threat model's existing assets and attackers, as if they were freshly generated. A fast first-pass check judges every entity; only the ones it flags get a deeper review that confirms them, sharpens their wording, or flags them for you.

Use this to apply validation improvements to an already-generated model, or to clear stale quality warnings — without regenerating the whole model (which would destroy controls, assertions, and components). It is non-destructive: an entity that should be removed is left in place with a quality warning rather than deleted, so no control objective loses its asset or attacker anchor. The result is saved as a new model version; controls and control objectives carry forward.

May consume credits for the entities that need the deeper review; a model already in good shape costs nothing. Returns the updated model envelope: {"accepted": true, "model": {...}}.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose assets and attackers to re-validate.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the operation is non-destructive, explains what happens to flagged entities ('left in place with a quality warning'), notes the result is saved as a new model version, mentions controls carry forward, and discloses credit consumption. This is strong behavioral transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but well structured: it front-loads the core re-validation behavior, then covers usage intent, non-destructive behavior, side effects, costs, and return format. Each sentence provides useful information, though it could be tightened slightly without losing key context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with two required parameters, no annotations, and several behavioral nuances, the description is complete. It explains the two-phase validation, what happens to flagged entities, persistence behavior, credit implications, and the output envelope. The presence of an output schema further reduces the burden of documenting return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50% because 'server_version' has no schema description and the tool description does not clarify it either. While 'model_id' is self-explanatory in the schema, the description adds no parameter-level meaning beyond the operation-level context, leaving a required parameter ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Re-run quality validation on a threat model's existing assets and attackers'. It also distinguishes this from regenerating the whole model by emphasizing it works on existing entities without regeneration, making its unique role clear even among many sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'to apply validation improvements to an already-generated model, or to clear stale quality warnings'. It also names the avoided alternative — regenerating the whole model — and explains why that is worse, stating it would destroy controls, assertions, and components.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_compliance_frameworksSelect Compliance FrameworksA

Select (activate) compliance frameworks at a chosen scope. Requires PRO tier. Mutating.

Discover valid ids with list_compliance_frameworks (or add a custom one via import_compliance_framework); view the resulting gap analysis with get_compliance_report at the same scope. Re-calling replaces the scope's framework selection.

scope selects the target and how scope_id is read:

  • "model" — a single threat model (scope_id = model id). Activating a framework also kicks off background auto-remediation: it auto-maps existing controls to requirements, excludes non-applicable requirements by taxonomy, and suggests/applies new entities for the remaining gaps. The response includes auto_remediate_jobs, which run and complete on their own; re-trigger later with auto_remediate_compliance if the model changes.

  • "system" — a System, i.e. a group of related threat models (scope_id = system id). Sets the system's active frameworks for portfolio-level compliance reporting.

  • "tag" — a tag cohort (scope_id = tag id). Records the frameworks against the tag AND propagates them to every member model, making the tag a compliance scope (e.g. an audit boundary) spanning several models.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYestarget boundary — "model", "system", or "tag".
scope_idYesid of the model, system, or tag selected by ``scope``.
framework_idsYescomma-separated framework ids (e.g. "asvs-4.0,nist-csf").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that the operation is mutating, requires PRO tier, replaces the existing selection, kicks off background auto-remediation for model scope, and propagates frameworks to member models for tag scope. It even mentions that the response includes auto_remediate_jobs and that these jobs run on their own.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-sentence summary, then groups discovery and follow-up steps, and then uses a bulleted list for the three scope behaviors. Every sentence contributes useful information and the length is justified by the genuinely different model/system/tag semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a complete definition for a mutating multi-scope tool. It covers prerequisites, id discovery, replacement behavior, per-scope side effects, follow-up tools, and a key response field. Since an output schema exists, the description does not need to enumerate return values in detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers scope, scope_id, and framework_ids at 75% coverage. The description adds substantial meaning by explaining each scope enum value and how scope_id is interpreted for model, system, and tag. It also clarifies that framework_ids are comma-separated and should come from list_compliance_frameworks. However, server_version remains undocumented in both schema and description, so a minor gap remains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Select (activate) compliance frameworks at a chosen scope.' It also distinguishes itself from sibling tools by naming related tools like list_compliance_frameworks, import_compliance_framework, and get_compliance_report, so the agent knows exactly 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on how to discover valid framework ids, add custom frameworks, and view the resulting gap analysis with get_compliance_report at the same scope. It also clarifies that re-calling replaces the scope's framework selection and that auto_remediate_compliance can be used to re-trigger later, covering both when and how to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_control_assumption_groupsSet Control Assumption GroupsA

Declaratively set the assumption group structure for a control.

Replaces all assumption group assignments for this control. Each group is a set of assumption IDs that together externally handle the control; any one group being fully active+attested is sufficient.

  • Within a group: AND — all referenced assumptions must be active and attested for the group to count as complete

  • Across groups: OR — any one complete group marks the control as externally handled for mitigation purposes

To clear all assumption groups (revert to "not externally handled"), pass an empty JSON object: {}.

AI relevance gate (per group, no override): Each non-empty proposed group is evaluated independently. The behavior depends on how many groups pass:

  • All groups accepted → 200 success, structure persisted as submitted.

  • Some groups accepted (partial): the accepted groups ARE persisted (runtime OR-semantics activate immediately), the rejected groups are NOT saved, the call raises with HTTP 422 detailing both persisted_groups and rejected_groups (with per-group reasoning). Resubmit only the rejected groups with assumptions that cover the control, or sharpen those assumptions' descriptions.

  • All groups rejected: existing groups on this control are re-evaluated through the same gate. Relevant existing groups are preserved; irrelevant existing groups are dropped (assumptions themselves remain in the model — only this control's linkage is removed). The call raises with HTTP 422 detailing what was persisted, what was rejected, and what existing was dropped.

  • Empty submission ({}): clears all groups, no evaluation.

There is no force-override. To get a group accepted, choose assumptions whose descriptions actually cover the control or refine an assumption's description so coverage is explicit.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupsYesJSON object mapping group numbers to assumption ID lists. Example: '{"1": ["AS1", "AS2"], "2": ["AS3"]}' Empty object `{}` clears all groups.
model_idYesID of the threat model.
control_idYesID of the control (e.g., "CTRL-03").
justificationNoWhy this group structure is appropriate (min 10 chars when groups is non-empty; optional when clearing).
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses replacement semantics, OR/AND group logic, partial-persistence behavior, HTTP 422 outcomes, re-evaluation of existing groups on total rejection, empty-object clearing, and the absence of any force-override.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but the tool has genuinely complex behavior. It is well-structured into behavioral rules, the AI relevance gate, and failure mode details. A small amount of redundancy exists around persistence and rejection, but overall every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a high-complexity mutation tool with no annotations, yet the description covers success, partial success, full rejection, clearing, the relevance gate, and follow-up actions. The presence of an output schema covers the return values, so nothing critical is left for the agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the input schema already covers 80% of parameters, the description adds substantial meaning beyond it: it explains the AND/OR group semantics, how the groups string is interpreted, what empty {} means, and why the justification field matters. This goes well beyond the schema's terse parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('set') and resource ('assumption group structure for a control'), and immediately clarifies that it declaratively replaces all existing assignments. This clearly distinguishes it from the sibling getter get_control_assumption_groups and from set_mitigation_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool, including how to clear groups, how the AI relevance gate behaves, and what to do after a partial rejection. It does not explicitly name alternative tools or state when not to use this tool, but the context is strong enough for an agent to act correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_control_objective_calSet Control Objective CalA

Set the per-CO ISO/SAE 21434 Cybersecurity Assurance Level (CAL).

CAL is a 1-4 grade on each individual control objective that expresses how much assurance the control program owes for that specific objective. It lives on the control_objectives identity side-table — writes do NOT create a new threat-model version, and the value survives soft-delete + revival of the CO.

Pass cal=None (or omit it) to clear the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
calNoISO/SAE 21434 CAL grade (1-4), or ``None`` to clear.
co_idYesControl-objective ID (e.g. ``CO3``).
model_idYesID of the threat model.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral disclosure burden. It does this exceptionally well by revealing that writes do NOT create a new threat-model version, that the value persists across soft-delete and revival, and that omitting or passing cal=None clears the value. These are non-obvious side effects an agent must know before invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly structured and front-loaded with the core purpose, then adds only high-value behavioral and clearing details. The use of line breaks and code formatting for cal=None makes the critical instruction easy to parse. No sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the most important operational semantics: what CAL is, where it lives, how versioning behaves, and how to clear it. Since an output schema exists, return values need not be described. The main gap is server_version, whose purpose and allowed values are left entirely undefined, and there is no guidance on what happens if an out-of-range CAL is supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75%, and the description adds meaningful semantics beyond the schema for the cal parameter: it defines the 1–4 assurance grading, ties it to per-CO obligations, and clarifies the clearing behavior. co_id also gains an example ('CO3') through the schema. However, server_version remains entirely undocumented in both schema and description, preventing a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Set the per-CO ISO/SAE 21434 Cybersecurity Assurance Level (CAL).' It clarifies the resource is each individual control objective and adds a distinguishing behavioral fact — writes do not create a new threat-model version and live on the control_objectives identity side-table. This differentiates it from sibling control-update tools without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool — when you need to set or clear a CAL value on a control objective — and explicitly explains the clearing behavior with cal=None. However, it does not name alternative tools or state conditions for choosing this over related siblings like update_control_status or refine_control. Usage context is present but exclusion/alternative guidance is absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_functional_satisfaction_groupsSet Functional Satisfaction GroupsA

Declaratively set (replace) a functional objective's satisfaction groups. Mutating.

Replaces the objective's group structure wholesale. Each group is a set of functional tests that together satisfy the objective (AND within a group); the objective counts as satisfied when any one complete group has all its tests verified (OR across groups). Tests you want to keep associated with the objective but outside any group go in ungrouped. Unlike set_control_assumption_groups, there is no AI relevance gate — the structure you submit is applied as-is. Read the current state first with get_functional_satisfaction_groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
ungroupedNoComma-separated functional-test ids to keep associated with the objective but unassigned to any group (optional).
groups_jsonYesJSON object mapping group label to a list of functional test ids, e.g. ``{"1": ["FT-1", "FT-2"], "2": ["FT-3"]}``. Pass ``{}`` to clear all groups.
server_versionYes
functional_objective_idYesThe objective whose groups to set.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: 'Mutating' and 'Replaces the objective's group structure wholesale' clearly disclose the destructive behavior. It also explains the AND-within-group/OR-across-groups semantics and that the submitted structure is applied as-is, giving an agent a complete behavioral profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences with zero redundancy: mutation flag, wholesale replacement, group semantics, ungrouped explanation, sibling contrast, and a read-first tip. The verb and resource are front-loaded, and each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool's behavioral complexity is fully covered: semantics, destructive replace behavior, ungrouped handling, and the distinction from set_control_assumption_groups. An output schema exists, so return-value details are unnecessary. Nothing critical is missing for an agent to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so the baseline is 3. The description adds value beyond the schema by explaining the purpose of the ungrouped parameter ('keep associated with the objective but outside any group') and clarifying the group semantics: a group is a set of tests that together satisfy the objective, and any complete group suffices. This goes beyond the schema's JSON shape and examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair, 'Declaratively set (replace) a functional objective's satisfaction groups,' and signals 'Mutating.' It also explicitly distinguishes itself from set_control_assumption_groups by noting the absence of an AI relevance gate, which differentiates it from its closest sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance to read the current state first with get_functional_satisfaction_groups, and contrasts this tool with set_control_assumption_groups ('no AI relevance gate — the structure you submit is applied as-is'). This establishes when to choose this tool over the sibling without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_mitigation_groupsSet Mitigation GroupsA

Declaratively set the mitigation-group structure for a control objective. Mutating; runs as a polled background job (an LLM sufficiency check evaluates whether the new structure satisfies the CO) and returns once complete.

Replaces ALL mitigation-group assignments for this CO. Call get_mitigation_groups first to see the current structure and the unmapped controls available for assignment.

Mitigation groups define alternative paths to satisfy a CO:

  • Within a group: AND — all controls must be implemented.

  • Across groups: OR — any one complete group mitigates the CO.

  • Defense-in-depth: tracked but not required for mitigation.

ParametersJSON Schema
NameRequiredDescriptionDefault
co_idYesID of the control objective (e.g., "CO5").
groupsYesJSON object mapping group numbers to control-ID lists. Example: '{"1": ["CTRL-01", "CTRL-02"], "2": ["CTRL-03"]}'.
model_idYesID of the threat model.
justificationNoWhy this group structure is appropriate (min 10 chars).
server_versionYes
defense_in_depthNoComma-separated control IDs tracked as defense-in-depth (not required for mitigation). Example: "CTRL-04,CTRL-05".

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses that the tool is mutating, replaces ALL existing assignments, runs as a polled background job with an LLM sufficiency check, and returns once complete. It also explains the AND/OR/defense-in-depth semantics, which is essential 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured and front-loaded with the core action first, followed by the critical destructive warning and prerequisite, then the semantic rules. Every sentence earns its place; the marker list makes the AND/OR semantics scannable without bloating the description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with six parameters and no annotations, the description covers the operation type, async behavior, destructive scope, prerequisites, and group semantics. An output schema exists, so returning values need not be explained. No significant gap remains for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high at 83%, so the baseline is 3. The description adds real value beyond the schema by explaining the meaning of groups (AND within, OR across), defense-in-depth being non-required, and the destructive replacement semantics that clarify the purpose of the groups and defense_in_depth parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('set') and resource ('mitigation-group structure for a control objective'), and clarifies it is a declarative replacement operation. The sibling get_mitigation_groups is clearly the read counterpart, and the description's 'Replaces ALL mitigation-group assignments' differentiates it from other grouping setters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs the agent to call get_mitigation_groups first to see the current structure and available unmapped controls. It does not explicitly name alternative grouping tools like set_control_assumption_groups or state when not to use this tool, but the context is clear enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_model_provenanceSet Model ProvenanceA

Record where a model's description came from. Call this right after generating a model from a repository (or pass the provenance_* params to generate_threat_model), and again whenever the source changes. Mutating: bumps the model version.

kind="code" with a commit_sha means the code is authoritative and the model follows it: reconcile_model measures the model against the code, and component changes observed in the code are applied and queued for review. Any other kind (ticket, document, manual, mixed) means the description is intent and the code is measured against it.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch or tag at that commit (optional).
kindYesOne of ``code``, ``ticket``, ``document``, ``manual``, ``mixed``.
model_idYesID of the threat model.
repo_urlNoRepository URL (``code``).
commit_shaNoCommit the description was gathered at (``code``).
source_refNoTicket key or document identifier (``ticket`` / ``document``).
source_urlNoURL of the ticket or document.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly states 'Mutating: bumps the model version' and explains the authority semantics for kind='code' versus other kinds, including that component changes are applied and queued for review. It does not cover permissions or reversibility, but covers the core behavioral traits well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states purpose, the second gives timing, and the final paragraph explains the critical kind semantics. Every sentence earns its place, though the inline-code notation adds some density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's semantic complexity, the description covers when to call it, what side effects it has, and the authoritative-source distinction between code and other kinds. The presence of an output schema reduces the need to describe return values, and the remaining parameters are covered by the input schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 88%, so the baseline is 3, but the description adds meaningful semantics for kind and commit_sha, explaining that code with commit_sha makes the code authoritative and how reconcile_model measures the model against it. The remaining parameters are already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Record where a model's description came from.' It clearly distinguishes the tool from generate_threat_model by noting that provenance_* params can be passed there instead, and it names reconcile_model as the related measurement tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to call this tool: 'right after generating a model from a repository' and 'again whenever the source changes.' It also names the alternative approach of passing provenance_* params to generate_threat_model, giving the agent a clear decision point.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_threat_model_parentSet Threat Model ParentA

Set (or clear) a model's parent on the recursive composition tree.

The composition substrate (Layer 0) builds an ancestor chain from each model's parent_id so child models inherit topology, control objectives, and other entities from their ancestors. Use this tool when wiring a child model under a platform / system / shared-services ancestor, or when re-rooting a model after a re-org.

Pass parent_id=None to clear the parent (the model becomes a tree root). The server rejects cycles (you cannot make a descendant your parent) and over-deep chains (depth bounded by the platform's configured maximum tree depth) with HTTP 400. Bumps the model version on success.

Returns the updated threat model.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model whose parent is being set.
parent_idYesID of the new parent model, or ``None`` to clear.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It reveals that children inherit topology/control objectives/entities, that None makes the model a tree root, that cycles and over-deep chains yield HTTP 400, and that the model version bumps. That is strong behavioral transparency for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, the description is structured and economical: action first, then background, usage, edge behavior, failure modes, and return. Every sentence carries information, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficiently complete for an agent to understand the operation's effect, failure cases, and side effects, especially with an output schema present. The main gap is the unexplained server_version parameter, which keeps it from being fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

parent_id is explained beyond the schema by tying None to tree-root behavior and by describing cycle/depth rejection; model_id's role is clear. However, server_version is required yet gets no schema or prose explanation, so the parameter semantics are not fully complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair, 'Set (or clear) a model's parent on the recursive composition tree,' and distinguishes the tool from sibling composition operations by focusing on ancestor wiring and re-rooting. This makes the tool's identity unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit scenarios: wiring a child under a platform/system/shared-services ancestor, or re-rooting after a re-org. It does not name specific sibling alternatives or state when not to use this tool, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

split_composition_entitySplit Composition EntityA

Push an ancestor-owned entity down to one or more descendants and soft-delete the ancestor's copy. Mutates state across the ancestor + every target descendant.

Inverse of lift_composition_entity. Use when an entity that currently lives on an ancestor is in fact descendant-specific and should be modeled separately per descendant — the operator chooses which descendants take a copy. A new local id is minted on each target; attached state on the ancestor's entity (assertions, jira mappings, risk acceptances, etc.) is duplicated to every target.

The route's model_id IS the ancestor (the entity being split lives on it). Each affected model (ancestor + every target descendant) bumps version and emits a model_refined activity event; a structured split_applied event with the full split_event payload lands on the ancestor. The audit pack surfaces this under split_history.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesEntity kind — one of ``"assets"``, ``"attackers"``, ``"components"``.
model_idYesAncestor model id — the entity to split lives here.
server_versionYes
ancestor_local_idYesLocal id of the entity on the ancestor.
target_descendantsYesNon-empty list of descendant model ids that should each take a copy.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and does so thoroughly. It discloses mutation, soft-deletion, state duplication across targets, new local id minting, version bumps, activity events, structured split_applied events, and audit history visibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and side-effect summary, then expands into usage context and event behavior. Every sentence adds operational value, and the length is justified by the complexity of the mutation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, side effects, parameter routing, event emissions, and audit behavior. Since an output schema exists, return-value documentation is not the description's job, and nothing essential is missing for an agent to invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, so baseline is 3, but the description adds meaningful semantics: model_id is the ancestor, the entity being split lives on it, target_descendants are the models that each receive a copy, and ancestor_local_id identifies the entity to split. This goes beyond the raw parameter names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it pushes an ancestor-owned entity down to descendants and soft-deletes the ancestor's copy. It also explicitly names itself as the inverse of lift_composition_entity, making its unique role clear among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames when to use it: when an entity on an ancestor is actually descendant-specific and should be modeled separately per descendant. It also names the inverse operation, giving the agent a clear decision boundary against the closest alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_assertionsSubmit AssertionsA

Typed claims about a control or an assumption; CI checks them later, not now. get_assertion_types returns it all as data.

By class, strongest first, as name(required) [opt: optional]: [by_construction]

  • typed_boundary(scope, sinks, boundary_type, constructors, property) [opt: allowlist, wrappers] [sound_over_approximation]

  • sink_default_deny(scope, sinks, safe_forms, property) [opt: allowlist, wrappers] [existential_witness]

  • test_attested(test) [opt: env, mechanism] [under_approximating_scan]

  • pattern_matches(file, pattern) [opt: scope_start, scope_end, multiline, dotall, target]

  • pattern_absent(file, pattern) [opt: scope_start, scope_end, multiline, dotall, target]

  • no_plaintext_secret(file, patterns) [presence]

  • function_exists(file, name)

  • class_exists(file, name)

  • decorator_present(file, function, decorator)

  • function_calls(file, caller, callee)

  • import_present(file, module)

  • file_exists(file)

  • file_hash(file, algorithm, expected_hash, scope_file) [opt: scope_start, scope_end]

  • config_key_exists(file, key)

  • config_value_matches(file, key, pattern)

  • env_var_referenced(file, variable)

  • dependency_exists(manifest, package)

  • dependency_version(manifest, package, constraint)

  • parameter_validated(file, function, parameter)

  • error_handled(file, function)

  • middleware_registered(file, middleware)

  • http_header_set(file, header)

  • test_exists(pattern)

  • module_exists(file, name)

  • module_instantiated(file, parent, child)

  • port_exists(file, module, port) [opt: direction]

  • parameter_defined(file, parameter) [opt: module, pattern]

  • signal_exists(file, name) [opt: module, kind]

  • sva_assertion_present(file, name)

  • register_reset(file, signal) [opt: reset]

Each: type, params, description, repo ("/" or "no_repo"), covers beside them, never in params: the CO-NN or cls_ ids proved. A for-all clause takes only typed_boundary (sinks accept one boundary type) or, when they do not, sink_default_deny, bound with covers.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYes
control_idNo
assumption_idNo
server_versionYes
assertions_jsonYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does disclose a key behavior: CI checks assertions later rather than immediately. It also reveals structural constraints such as covers being separate from params and for-all clauses being restricted to specific assertion types. It does not cover auth or rate limits, but the async behavior is the most important disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then provides a well-organized catalog of assertion types grouped by class. The length is justified by the number of supported assertion types, and each section adds operational information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The assertion vocabulary and encoding constraints are covered very thoroughly, but the top-level parameters are undocumented and no example JSON is provided. It is also unclear whether control_id or assumption_id is required or how they relate to each other, which is a notable gap given the 0% schema description coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds substantial meaning for assertions_json by enumerating the accepted assertion types and their parameters, but it leaves server_version, model_id, and the relationship between control_id and assumption_id unexplained. The compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool submits typed claims about a control or an assumption and that CI checks them later. It also points to get_assertion_types as the source for the full data, which distinguishes this submission tool from a read-oriented sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives context ('CI checks them later, not now') and references get_assertion_types, but it does not explicitly say when to choose this over submit_findings, submit_attestation, or submit_functional_test_assertions. Usage conditions are implied rather than clearly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_attestationSubmit AttestationA

Record that a responsible party affirmed an assumption holds.

Only for external assumptions. Non-applicability assumptions require CI verification (submit assertions + run mipiti-verify) — manual attestation is rejected for them.

An assumption with a current attestation can mitigate linked COs. When the attestation expires, those COs become at-risk until re-attested or covered by controls.

An attestation is a responsible party's claim, never a proof over every site: it can cover an existential clause of a control (its tier reads claimed) and never a for-all one, where only a sound witness counts. An attestation the platform mints from CI results is no stronger than the weakest assertion behind it. The exits for a universal objective that cannot be proven are a risk acceptance or a not-applicable disposition.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
statementNoWhat was attested.
expires_atNoISO 8601 expiry date (e.g., "2026-06-30T00:00:00Z").
attested_byNoWho is attesting (name, role, organization).
evidence_urlNoOptional link to supporting documentation.
assumption_idYesID of the assumption (e.g., "AS1").
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explains that attestations are claims rather than proofs, cannot cover for-all clauses, are limited to existential clauses, lose strength when minted from weak CI assertions, and cause COs to become at-risk upon expiry. This is rich, non-obvious 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then layers constraints and consequences without redundancy. It is somewhat long and dense, but each sentence contributes meaningful domain context, so the length is justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no annotations, the description covers intended use, explicit exclusions, downstream effects, expiration behavior, and epistemic limitations. The presence of an output schema reduces the need to describe return values. Minor gaps remain around whether an existing current attestation is replaced and the meaning of server_version.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (86%), so the baseline is 3. The description nevertheless adds meaning beyond the schema by explaining why expires_at matters (COs become at-risk) and by framing statement and evidence as a responsible party's claim rather than proof, which clarifies how those fields should be interpreted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource—'Record that a responsible party affirmed an assumption holds'—and immediately scopes it with 'Only for external assumptions.' This makes the tool's purpose immediately clear and distinguishes it from related assertion or disposition tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when the tool applies (external assumptions) and when it does not (non-applicability assumptions), and names the required alternative workflow: 'submit assertions + run mipiti-verify.' It also explains the downstream effect on linked COs, giving an agent enough context to decide whether 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.

submit_findingsSubmit FindingsA

Record negative findings (gaps discovered while scanning a codebase against a model's controls). Mutating: persists new finding records against the model.

Use after a gap-discovery scan (see get_scan_prompt) to log where expected control evidence was NOT found. Findings are the negative counterpart to assertions (positive proof via submit_assertions): a finding says "I looked here for this and it was missing." Once submitted, drive a finding through its lifecycle with update_finding and review them with list_findings.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
findings_jsonYesJSON string of an **array** of finding objects. Each object should carry: - ``control_id`` (str): the control the gap relates to. - ``title`` (str): short summary of the gap. - ``description`` (str): what is missing and why it matters. - ``severity`` (str): finding severity (e.g., "low"/"medium"/"high"/"critical"). - ``checked_locations`` (list): files/paths inspected. - ``checked_patterns`` (list): patterns/signals searched for. - ``expected_evidence`` (str): what implemented evidence would have looked like. Must parse as a JSON array; a single object or malformed JSON is rejected.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden of disclosing side effects. It clearly says 'Mutating: persists new finding records against the model' and notes the lifecycle with update_finding/list_findings. However, it does not mention idempotency, duplicate behavior, whether submissions can be overwritten, or any permission requirements—common gaps for a mutating tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no wasted words. The first sentence front-loads the core purpose and mutating nature; the second gives concrete usage context; the third adds the assertion counterpart and subsequent lifecycle tools. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a detailed input schema and an existing output schema, the description is largely complete: it explains why and when to use it, what findings mean, and how to manage them afterward. The main residual gap is the under-documented server_version parameter and the lack of idempotency/duplicate caveats, but these are minor given the overall context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents model_id and findings_json in detail, including the JSON array format and rejection of malformed input. The description adds useful intent behind model_id and findings_json, but it does not clarify server_version, one of three required parameters that has no schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Record') and resource ('negative findings... gaps discovered while scanning a codebase against a model's controls'), and explicitly distinguishes findings from assertions via submit_assertions. An agent can clearly tell this tool apart from related siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it: 'Use after a gap-discovery scan (see get_scan_prompt)' and clarifies it is for logging where expected evidence was NOT found. It also contrasts with submit_assertions and points to update_finding/list_findings for lifecycle and review, giving clear alternatives and next steps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_functional_test_assertionsSubmit Functional Test AssertionsA

Attach machine-verifiable evidence assertions to one already-existing functional test so CI can verify it. Mutating.

This submits EVIDENCE for a test that already exists (identified by functional_test_id) — it does not create or register the test. It is the functional-conformance analog of submit_assertions (which covers security controls): it binds assertions such as "the test exists" and "the test passes" to the functional test, and an independent CI run against the named repo is what turns an operator's "verified" claim into verified state.

To bulk-register test DEFINITIONS from your codebase instead, use import_functional_tests; to hand-author a single test use add_functional_test. Call this after the test is implemented (e.g. following get_scan_prompt (kind="functional")), then read the resulting state via get_functional_coverage or get_functional_test_sufficiency.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
server_versionYes
assertions_jsonYesJSON array of assertion objects, each {"type": "test_attested" | "test_exists" | ..., "params": {...}, "description": "...", "repo": "<owner>/<repo>"}. Every assertion must carry an explicit repo, or the "no_repo" sentinel when the check is not tied to a repository. These assertions count toward functional conformance; a ``covers`` declaration is refused here, because a binding to a control clause is declared on ``submit_assertions``.
functional_test_idYesThe already-existing functional test the assertions prove.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to lean on, the description carries the full burden. It clearly labels the tool as 'Mutating' and explains the effect: assertions are bound to the functional test and an independent CI run converts an operator's claim into verified state. It also clarifies the distinction from submit_assertions. However, it does not disclose edge behaviors like idempotency, whether existing assertions are replaced, or error conditions, leaving minor gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is more than a single sentence but each part earns its place: the opening one-liner states purpose, the middle clarifies the workflow and CI verification, and the closing routes to alternatives. It is logically ordered (purpose → distinction → usage) and front-loaded with the core verb and resource. While it is a bit longer than necessary, the detail is justified given the complexity and the need to differentiate among many siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the presence of an output schema (covering return values), and the large sibling set, the description is remarkably complete. It explains prerequisites (test must already exist), the relationship to CI, the distinction from security-control assertions, and the correct sequencing with other tools. It even references specific functional-test follow-ups. An agent can decide when and how to call this tool without recourse to external documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes three of four parameters with meaningful detail (model_id, functional_test_id, assertions_json), and server_version is left undescribed. The description adds conceptual context (e.g., that assertions_json is evidence and mentions the 'covers' refusal via the parameter description) but does not compensate for the missing server_version or provide additional parameter semantics beyond the schema. With 75% schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb-resource pairing: 'Attach machine-verifiable evidence assertions to one already-existing functional test.' It further clarifies the negative scope ('does not create or register the test') and differentiates from siblings by naming specific alternatives (import_functional_tests, add_functional_test, submit_assertions). This leaves no ambiguity about what the tool does and how it is distinct.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage timing ('Call this after the test is implemented'), pairs it with a concrete preceding step (get_scan_prompt), and names follow-up read tools (get_functional_coverage, get_functional_test_sufficiency). It also gives explicit alternatives with conditions ('To bulk-register test DEFINITIONS... use import_functional_tests; to hand-author a single test use add_functional_test'). This is textbook guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_functional_test_mappingsSuggest Functional Test MappingsA

Suggest which functional objectives each imported test likely covers.

For unmapped tests (imported without an association, or added without objective ids), this proposes objective mappings so you can review and apply them with associate_functional_test. It only suggests — nothing is associated until you confirm.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the threat model.
test_idsNoComma-separated functional-test ids to map. Empty means every currently-unmapped test.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It explicitly discloses the key side-effect boundary: 'It only suggests — nothing is associated until you confirm.' This directly tells the agent the tool is non-destructive and does not alter associations, which is critical for a proposal-style tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded. The first sentence states the core purpose, and the second provides exactly the necessary usage and safety context. No redundant phrasing or filler exists; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what the tool does, when to use it, what makes a test eligible, and the fact that no association happens until confirmation. An output schema exists, so the return shape is covered elsewhere. Nothing essential is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so model_id and test_ids already have meaning in the schema. The description reinforces the test_ids semantics ('unmapped tests', 'every currently-unmapped test') but adds little beyond that. The required server_version parameter remains undocumented in both the schema and the description, though coverage is high enough to keep the score at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Suggest which functional objectives each imported test likely covers.' It clearly scopes the tool to unmapped tests and explicitly distinguishes it from the sibling apply tool, associate_functional_test, so an agent can tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use this tool: for unmapped tests (imported without an association or added without objective ids). It also names the follow-up tool, associate_functional_test, and clarifies that this tool only proposes mappings—so the agent knows this is not the action for applying them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

undo_composition_eventUndo Composition EventA

Apply the inverse of a previous composition event. Mutating — persists inverse state across multiple models.

Re-runs the divergence detector immediately before applying and refuses with 409 + the structured refusal block when state has materially evolved since the forward event (assertions submitted on the affected entity, downstream COs added that reference it, the entity edited, etc.). On success, persists the inverse state operations across every affected model and emits a structured lift_undone / split_undone activity event citing original_event_id so the audit pack can chain undo to its forward.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEither the surrogate id of the forward ``lift_applied`` / ``split_applied`` activity event, or the structured ``lift_id`` / ``split_id`` carried in the event payload.
model_idYesThe model whose composition view originated the event. Must match the cited event's ``threat_model_id`` — the server rejects cross-model citations with 404.
event_typeYesWhich forward composition event to undo. One of: - ``"lift"``: undo a ``lift_applied`` event. On success, persists the inverse across the LCA + every affected source descendant and emits a ``lift_undone`` event. The returned ``models`` block carries ``lca_model`` and ``source_descendant_models``. - ``"split"``: undo a ``split_applied`` event. On success, restores the ancestor's entity, tombstones the duplicated copies on every target descendant, persists across all affected models, and emits a ``split_undone`` event. The returned ``models`` block carries ``ancestor_model`` and ``descendant_models``.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and meets it: it declares mutation, multi-model persistence, the divergence detector re-run, the 409 structured refusal, and the emitted lift_undone/split_undone audit event. This is much richer than generic 'undo' language.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and mutation flag are front-loaded, and the dense third sentence earns its place by explaining refusal and audit behavior. It is not a 5 because of slight redundancy between 'persists inverse state across multiple models' and the later 'persists the inverse state operations across every affected model.'

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 does not need to explain return shape; it covers side effects, failure mode, and audit trail well. The only notable gaps are the undocumented server_version parameter and the absence of explicit guidance toward preview_undo_composition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents event_id, model_id, and event_type with strong detail, covering 75% of parameters. The description reinforces those semantics but adds no new parameter-level meaning, while server_version remains unexplained in both the schema and the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Apply the inverse') and names the resource ('previous composition event'), then sharpens scope by naming lift/split and their undone events. It clearly identifies itself as the inverse operation to the composition tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: call this after a forward lift or split event, and expect refusal if state has materially evolved. It does not explicitly compare with preview_undo_composition or state when not to call, so routing among siblings is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unreject_reconciliation_candidateUnreject Reconciliation CandidateA

Remove a persisted reconciliation rejection. Mutates state.

The pair becomes eligible to surface in the active candidate queue again on the next read of list_reconciliation_candidates. Use when the operator changes their mind about a prior rejection — the surrogate rejection_id comes from rejections[*].id on list_reconciliation_candidates (disposition="rejected") (or the return value of reject_reconciliation_candidate).

Does NOT bump model version (rejection is org state, not model state).

ParametersJSON Schema
NameRequiredDescriptionDefault
model_idYesID of the descendant threat model the rejection is on.
rejection_idYesSurrogate id of the persisted rejection.
server_versionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full behavioral burden and meets it well. It explicitly says 'Mutates state,' describes the consequence that the pair becomes eligible again on the next read, and clarifies a potentially surprising non-effect: it does NOT bump the model version. This gives the agent a clear mental model of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized: first the core action, then when/how to use, then a key caveat. Every sentence adds value with no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with an output schema, the description covers the action, usage context, parameter source, and behavioral side effects. No critical information for correctly invoking the tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes model_id and rejection_id, and the description adds important provenance for rejection_id by explaining it comes from rejections[*].id on list_reconciliation_candidates or from reject_reconciliation_candidate's return value. server_version remains undocumented in both schema and description, though the overall parameter guidance is strong.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'Remove a persisted reconciliation rejection,' a specific verb and resource that clearly identifies the action. It further distinguishes itself by referencing the inverse operation reject_reconciliation_candidate, so an agent can tell this tool apart from related siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Use when the operator changes their mind about a prior rejection.' It also tells the agent exactly where to obtain rejection_id, pointing to list_reconciliation_candidates with disposition='rejected' or the return value of reject_reconciliation_candidate. This is strong routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_control_statusUpdate Control StatusA

Update the implementation status of a security control. Mutating.

Sets the control's status to "implemented" or "not_implemented". Marking a control "implemented" REQUIRES at least one assertion on the control — check its assertion_count (via get_controls) first and submit assertions with submit_assertions if it is zero, or the call is rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYesNew status — "implemented" or "not_implemented".
model_idYesID of the threat model the control belongs to.
control_idYesID of the control to update (e.g. "CTRL-01").
server_versionYes
implementation_notesNoOptional free-text notes recorded with the status change.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It openly states that the operation is mutating and documents a non-obvious rejection condition: marking a control implemented requires at least one assertion. It could add more about side effects or permissions, but the critical behavioral trait is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences with no filler. The core action and mutating nature are front-loaded, followed by a clearly formatted precondition block. Every sentence adds value, and the REQUIRES is emphasized without unnecessary prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 explain return values. Combined with the input schema, it gives an agent enough to call the tool correctly: required parameter names, permissible status values, and the critical assertion prerequisite. Minor gaps like error details or authentication are not essential for invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already documents most parameters clearly. The description adds context around the status transition and the assertion requirement, but doesn't elaborate on parameter syntax beyond what the schema provides. server_version still has no meaningful description, but the high schema coverage keeps this at baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb and resource: it 'Sets the control's status to implemented or not_implemented'. It clearly distinguishes this from sibling tools like refine_control or remap_control by focusing solely on implementation status. The 'Mutating' label reinforces the action without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context for when to use this tool: when updating a control's implementation status. It also names prerequisite tools and conditions — check assertion_count via get_controls and use submit_assertions before marking implemented, or the call is rejected. It doesn't explicitly state when not to use this tool versus an alternative, but the guidance is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_findingUpdate FindingA

Advance a finding through its lifecycle. Mutating: updates the finding's status and metadata.

Use to acknowledge, remediate, verify, or dismiss a finding previously recorded by submit_findings / list_findings. This records a MANUAL status transition — the machine-set auto_resolved state is not among the statuses it accepts; for gaps whose kind has an automatic fix, preview_finding_remediation + apply_finding_remediation perform the actual cleanup instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional free-text notes recorded on the finding.
reasonNoOptional rationale; required when dismissing (status="dismissed").
statusYesNew lifecycle status, one of "discovered", "acknowledged", "remediated", "verified", "dismissed". ``auto_resolved`` is NOT settable here: it asserts that a condition is no longer reproduced, which is a claim only the platform can make from its own re-evaluation. Setting it by hand would forge that claim, so this tool refuses it — use ``dismissed`` (with a reason) to record that a gap does not matter, which is the judgment a person is entitled to make.
model_idYesID of the threat model.
finding_idYesID of the finding to update.
server_versionYes
remediation_assertion_idsNoOptional comma-separated assertion IDs that evidence the fix, linking the remediation to the assertions that prove it. Empty by default.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of disclosing mutation and side effects: it says 'Mutating,' records a MANUAL status transition, and explains that auto_resolved is deliberately refused. It does not discuss permissions or reversibility, but its explicit coverage of the tool's most important behavioral constraint is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first line front-loads the essential action, and the rest is organized into clear usage-and-alternative guidance. It is efficient, though the second paragraph partially repeats the status schema's explanation of auto_resolved.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides the needed selection context: what the tool does, that it mutates, which statuses are valid, and which sibling tools handle the cases it refuses. Combined with a rich input schema and an output schema, nothing critical is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 86%, above the high-coverage threshold, so the baseline is 3 even without description-level parameter detail. The description does add context around status (manual transition vs auto_resolved), but much of that is already present in the status parameter's own schema description, and server_version remains undocumented in both the schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair, 'Advance a finding through its lifecycle,' and identifies the concrete mutation ('pdates the finding's status and metadata'). It also names sibling tools (submit_findings/list_findings, preview_finding_remediation/apply_finding_remediation), so an agent can distinguish this from related operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Use to acknowledge, remediate, verify, or dismiss a finding previously recorded by submit_findings/list_findings,' which defines exactly when to call it. It also gives an exclusion: auto_resolved is not accepted, and directs agents with auto-fixable gaps to preview/apply remediation instead. This is strong routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_organizationUpdate OrganizationA

Set per-organization level grades for IEC 62443-4-1 and NIST CSF.

Admin-only: the backend requires the caller to be an admin in the organization (or a superadmin). Non-admins will get a 403; do not invoke this tool unless you've verified admin role for the target org.

target_ml is the IEC 62443-4-1 Maturity Level the organization targets for its secure-development program (1-5). csf_tier is the NIST CSF Tier the organization targets for its cybersecurity risk-management posture (1-4).

Because None on the wire is indistinguishable from "field omitted", pass clear_target_ml=True or clear_csf_tier=True to explicitly reset a value to NULL. Omitting both the value and its clear_* flag leaves the existing server-side value untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
org_idYesOrganization ID.
csf_tierNoNIST CSF Tier (1-4), or ``None`` to leave unchanged.
target_mlNoIEC 62443-4-1 Maturity Level (1-5), or ``None`` to leave unchanged.
clear_csf_tierNoExplicitly reset ``csf_tier`` to NULL.
server_versionYes
clear_target_mlNoExplicitly reset ``target_ml`` to NULL.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral burden. It discloses the auth requirement, the 403 failure mode, the wire-level ambiguity of None, the clear_* flags for resetting values, and the behavior of leaving omitted values untouched. This goes well beyond what the schema alone conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into four purposeful paragraphs: purpose, auth warning, parameter definitions, and None/clear semantics. No filler; each sentence explains a behavior or precondition the agent needs before calling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Very complete for a six-parameter tool: it covers auth, parameter ranges, reset semantics, and mutation behavior. It does not explain the required server_version parameter, which is also undocumented in the schema, so the definition has one minor blind spot.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds ranges for target_ml (1-5) and csf_tier (1-4), explains the meaning of None versus omission, and clarifies the clear_* flags and their relationship to the value parameters. Schema coverage is high, but this description resolves semantics that the schema leaves ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Set per-organization level grades for IEC 62443-4-1 and NIST CSF.' This clearly distinguishes it from the many compliance/control sibling tools and explains what 'update organization' means in this context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states the precondition: admin or superadmin required, and says not to invoke unless admin role is verified. It also implies the use case (updating org-level grades) and the when-not (non-admins will get a 403), so an agent can 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.77.0
    • Changedadd_attacker2 fields changed
      • addedInput schema / properties / change_reason
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Required when ``surface_extent`` is supplied —\ndocuments the declaration for the audit trail."
        +}
      • addedInput schema / properties / surface_extent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "``\"whole\"`` when, from its position, the attacker's\noperations range over ANY entry of the interface it reaches\n(any endpoint, request, row, file, message or frame). Recorded\nas attested by this call and requires ``change_reason``. Omit\nto leave it undeclared, which is the ordinary case."
        +}
    • Changedadd_trust_boundary1 field changed
      • changedInput schema / properties / sealed / description
        Previous value: -"Optional. Set True to declare the boundary has NO lateral\ningress — the only way into its zone is crossing the perimeter\n(an air-gap / network-segmented enclave). A sealed boundary that\nblocks the attacker's vector lets reachability decisively rule the\nasset unreachable instead of indeterminate. Default False (assume a\nlateral pivot is possible). Set it only when the isolation is real\nand attestable."New value: +"Optional. Set True to declare the boundary has NO lateral\ningress — the only way into its zone is crossing the perimeter\n(an air-gap / network-segmented enclave). On its own this is a\nsuggestion: only an ATTESTED seal lets reachability decisively\nrule an asset unreachable instead of indeterminate, and the\nattestation is recorded with ``edit_trust_boundary``\n(``seal_source=\"attested\"`` with a ``change_reason``). Default\nFalse (assume a lateral pivot is possible). Set it only when the\nisolation is real and attestable."
    • Changededit_attacker3 fields changed
      • addedInput schema / properties / attest_surface_extent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Record the extent already on the attacker as\nattested, without changing its value. Pass ``true`` to attest;\nrequires ``change_reason``."
        +}
      • changedInput schema / properties / change_reason / description
        Previous value: -"Required when any factor field is supplied —\ndocuments the operator override of LLM-generated factors."New value: +"Required when any factor field, ``surface_extent``\nor ``attest_surface_extent`` is supplied — documents the\noperator override for the audit trail."
      • addedInput schema / properties / surface_extent
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "``\"whole\"`` (operations range over ANY entry of the\ninterface reached) or ``\"point\"`` (one named entry). Supplying\nit attests it; requires ``change_reason``."
        +}
    • Changedsubmit_functional_test_assertions1 field changed
      • changedInput schema / properties / assertions_json / description
        Previous value: -"JSON array of assertion objects, each {\"type\": \"test_attested\" | \"test_exists\" | ..., \"params\": {...}, \"description\": \"...\", \"repo\": \"<owner>/<repo>\"}. Every assertion must carry an explicit repo, or the \"no_repo\" sentinel when the check is not tied to a repository."New value: +"JSON array of assertion objects, each {\"type\": \"test_attested\" | \"test_exists\" | ..., \"params\": {...}, \"description\": \"...\", \"repo\": \"<owner>/<repo>\"}. Every assertion must carry an explicit repo, or the \"no_repo\" sentinel when the check is not tied to a repository. These assertions count toward functional conformance; a ``covers`` declaration is refused here, because a binding to a control clause is declared on ``submit_assertions``."
  2. 11 tool updatesv0.75.0
    • Addedcreate_proposal
    • Addeddecide_proposal
    • Changedgenerate_threat_model6 fields changed
      • addedInput schema / properties / provenance_commit_sha
        Added value: +{
        +  "default": "",
        +  "description": "Commit SHA the description was gathered\nat (``code`` kind).",
        +  "type": "string"
        +}
      • addedInput schema / properties / provenance_kind
        Added value: +{
        +  "default": "",
        +  "description": "Where the description came from, one of\n``code``, ``ticket``, ``document``, ``manual``, ``mixed``.\nEmpty (default) records nothing. For an existing repository\npass ``provenance_kind=\"code\"`` with ``provenance_repo_url``\nand ``provenance_commit_sha`` (the HEAD you gathered from):\nthe code is then authoritative and the model follows it.\nAny other kind means the description is intent and the code\nis measured against it. The same record can be set later\nwith ``set_model_provenance``.",
        +  "type": "string"
        +}
      • addedInput schema / properties / provenance_ref
        Added value: +{
        +  "default": "",
        +  "description": "Branch or tag name at that commit (optional).",
        +  "type": "string"
        +}
      • addedInput schema / properties / provenance_repo_url
        Added value: +{
        +  "default": "",
        +  "description": "Repository URL the description was\ngathered from (``code`` kind).",
        +  "type": "string"
        +}
      • addedInput schema / properties / provenance_source_ref
        Added value: +{
        +  "default": "",
        +  "description": "Identifier of the ticket or document the\ndescription came from (``ticket`` / ``document`` kinds).",
        +  "type": "string"
        +}
      • addedInput schema / properties / provenance_source_url
        Added value: +{
        +  "default": "",
        +  "description": "URL of that ticket or document.",
        +  "type": "string"
        +}
    • Addedget_control_work_order
    • Addedget_design_leverage
    • Addedlist_decisions
    • Addedlist_proposals
    • Removedlist_workspaces
    • Addedreconcile_model
    • Addedset_model_provenance
    • Changedsubmit_functional_test_assertions1 field changed
      • changedInput schema / properties / assertions_json / description
        Previous value: -"JSON array of assertion objects, each {\"type\": \"test_passes\" | \"test_exists\" | ..., \"params\": {...}, \"description\": \"...\", \"repo\": \"<owner>/<repo>\"}. Every assertion must carry an explicit repo, or the \"no_repo\" sentinel when the check is not tied to a repository."New value: +"JSON array of assertion objects, each {\"type\": \"test_attested\" | \"test_exists\" | ..., \"params\": {...}, \"description\": \"...\", \"repo\": \"<owner>/<repo>\"}. Every assertion must carry an explicit repo, or the \"no_repo\" sentinel when the check is not tied to a repository."
  3. 2 tool updatesv0.71.1
    • Addedget_assertion_types
    • Changedget_controls1 field changed
      • changedInput schema / properties / control_id / description
        Previous value: -"If set, detail mode �� return this one control's full\nrecord directly (e.g. ``CTL-12``). If omitted, list mode."New value: +"If set, detail mode — return this one control's full\nrecord directly (e.g. ``CTL-12``). If omitted, list mode."
  4. 5 tool updatesv0.71.0
    • Addedcreate_co_disposition
    • Changedget_controls1 field changed
      • changedInput schema / properties / control_id / description
        Previous value: -"If set, detail mode — return this one control's full\nrecord directly (e.g. ``CTL-12``). If omitted, list mode."New value: +"If set, detail mode �� return this one control's full\nrecord directly (e.g. ``CTL-12``). If omitted, list mode."
    • Addedlist_co_dispositions
    • Changedlist_findings1 field changed
      • changedInput schema / properties / status / description
        Previous value: -"Optional lifecycle filter, one of \"discovered\", \"acknowledged\", \"remediated\", \"verified\", \"dismissed\". Empty (default) returns all statuses."New value: +"Optional lifecycle filter, one of \"discovered\", \"acknowledged\", \"remediated\", \"verified\", \"dismissed\", \"auto_resolved\". Empty (default) returns all statuses.\n``auto_resolved`` is closed by the platform, not by a person: the\ncondition that produced the finding is no longer reproduced. It is\ndeliberately distinct from ``remediated``/``verified`` (a person\nfixed and confirmed it) and from ``dismissed`` (a person judged it\nnot worth fixing) — \"the gap is gone\" and \"the gap does not matter\"\nare opposite statements about residual risk, so they never share a\nstatus."
    • Changedupdate_finding1 field changed
      • changedInput schema / properties / status / description
        Previous value: -"New lifecycle status, one of \"discovered\", \"acknowledged\", \"remediated\", \"verified\", \"dismissed\"."New value: +"New lifecycle status, one of \"discovered\", \"acknowledged\", \"remediated\", \"verified\", \"dismissed\". ``auto_resolved`` is NOT settable here: it asserts that a condition is no longer reproduced, which is a claim only the platform can make from its own re-evaluation. Setting it by hand would forge that claim, so this tool refuses it — use ``dismissed`` (with a reason) to record that a gap does not matter, which is the judgment a person is entitled to make."
  5. 85 tool updatesv0.68.2
    • Changedadd_functional_test1 field changed
      • changedInput schema / properties / functional_objective_ids / description
        Previous value: -"Comma-separated objective ids the test satisfies (at least one required; get them from list_functional_objectives)."New value: +"Comma-separated objective ids the test satisfies (at least one required; get them from get_functional_objectives)."
    • Addedadd_model_to_group
    • Removedadd_model_to_system
    • Removedadd_model_to_tag
    • Removedassign_asset_to_components
    • Removedassign_control_to_components
    • Addedassign_to_components
    • Removedassume_control
    • Removedauto_remediate
    • Addedauto_remediate_compliance
    • Addedcreate_group
    • Removedcreate_system
    • Removedcreate_tag
    • Addeddelete_group
    • Removeddelete_tag
    • Addedexport_report
    • Removedexport_tag_report
    • Removedexport_threat_model
    • Removedexport_threat_model_archive
    • Removedget_asset
    • Removedget_assumption
    • Removedget_attacker
    • Changedget_compliance_report9 fields changed
      • changedInput schema / properties / framework_id / description
        Previous value: -"ID of the compliance framework (as listed by list_compliance_frameworks)."New value: +"framework to report on (already selected at this scope; see ``list_compliance_frameworks``)."
      • changedInput schema / properties / level / description
        Previous value: -"Optional level filter for level-aware frameworks — returns only requirements at or below this level (e.g. 1 for L1 only). Omit for all levels."New value: +"optional level filter; omit for all levels."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum requirement rows to return. Default 0 = no explicit limit."New value: +"max requirement rows to return, 0 = no explicit limit (model/system scopes only)."
      • removedInput schema / properties / model_id
        Removed value: -{
        -  "description": "ID of the threat model.",
        -  "type": "string"
        -}
      • changedInput schema / properties / offset / description
        Previous value: -"Number of requirement rows to skip, for pagination. Default 0."New value: +"skip the first N requirement rows, pagination (model/system scopes only). Default 0."
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "report boundary — \"model\", \"system\", or \"tag\".",
        +  "enum": [
        +    "model",
        +    "system",
        +    "tag"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / scope_id
        Added value: +{
        +  "description": "id of the model, system, or tag selected by ``scope``.",
        +  "type": "string"
        +}
      • changedInput schema / properties / status / description
        Previous value: -"Optional status filter: \"covered\", \"partial\", \"uncovered\", \"unmapped\", or \"excluded\". Empty = all statuses."New value: +"optional per-requirement status filter (model/system scopes only)."
      • changedInput schema / required
        Previous value: -[
        -  "server_version",
        -  "model_id",
        -  "framework_id"
        -]New value: +[
        +  "server_version",
        +  "scope",
        +  "scope_id",
        +  "framework_id"
        +]
    • Removedget_component
    • Removedget_control
    • Removedget_control_objective
    • Changedget_control_objectives3 fields changed
      • addedInput schema / properties / co_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "If set, single mode — return this one control objective\n(e.g. ``CO3``) with its verdict. If omitted, matrix mode."
        +}
      • changedInput schema / properties / limit / description
        Previous value: -"Max to return (0 = summary only, no per-CO records)."New value: +"Matrix mode — max to return (0 = summary only, no per-CO\nrecords)."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip the first N control objectives."New value: +"Matrix mode — skip the first N control objectives."
    • Changedget_controls10 fields changed
      • changedInput schema / properties / co_id / description
        Previous value: -"Filter by control objective ID."New value: +"List-mode filter — control objective ID."
      • changedInput schema / properties / component_id / description
        Previous value: -"Filter by component ID (e.g., \"CMP1\")."New value: +"List-mode filter — component ID (e.g., \"CMP1\")."
      • changedInput schema / properties / control_id / description
        Previous value: -"Optional specific control id for detail mode."New value: +"If set, detail mode — return this one control's full\nrecord directly (e.g. ``CTL-12``). If omitted, list mode."
      • changedInput schema / properties / include_deleted / description
        Previous value: -"Include soft-deleted controls (default False)."New value: +"List mode — include soft-deleted controls\n(default False)."
      • changedInput schema / properties / include_orphaned / description
        Previous value: -"Include controls mapped only to tombstoned COs\n(default False)."New value: +"List mode — include controls mapped only to\ntombstoned COs (default False)."
      • changedInput schema / properties / limit / description
        Previous value: -"Max controls to return (0 = all)."New value: +"List mode — max controls to return (0 = all)."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip the first N controls (pagination)."New value: +"List mode — skip the first N controls (pagination)."
      • changedInput schema / properties / status / description
        Previous value: -"Filter by \"implemented\", \"not_implemented\", or \"verified\"."New value: +"List-mode filter — \"implemented\", \"not_implemented\", or\n\"verified\"."
      • changedInput schema / properties / summary_only / description
        Previous value: -"If True, returns only id, description, status,\nassertion_count, and assumed_by per control (much smaller\nresponse)."New value: +"List mode — if True, returns only id, description,\nstatus, assertion_count, and assumed_by per control (much\nsmaller response)."
      • addedInput schema / properties / version
        Added value: +{
        +  "default": 0,
        +  "description": "Detail mode only — model version to read the control\nfrom. 0 (default) uses the latest. Ignored in list mode.",
        +  "type": "integer"
        +}
    • Addedget_entity
    • Removedget_functional_objective
    • Addedget_functional_objectives
    • Removedget_functional_scan_prompt
    • Addedget_group
    • Removedget_model_risk_view
    • Removedget_reach_verdicts
    • Changedget_reachability_verdicts5 fields changed
      • changedInput schema / properties / co_id / description
        Previous value: -"Optional CO id. When set, returns a single verdict;\n404 if the CO doesn't exist or is tombstoned."New value: +"FLAT mode only. Optional CO id — when set, returns a single\nverdict; 404 if the CO doesn't exist or is tombstoned. Ignored\nwhen ``composed=True``."
      • addedInput schema / properties / composed
        Added value: +{
        +  "default": false,
        +  "description": "When False (default), derive over this model's own\ntopology (flat). When True, derive over the composed effective\ntree (own ⊕ inherited).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / kind_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "COMPOSED mode only. Restrict verdicts to one kind —\none of ``\"reachable\" | \"unreachable\" | \"indeterminate\"``. Named\n``kind_filter`` (not ``kind``) to disambiguate from the verdict\nobject's own ``kind`` field. When omitted, all verdict kinds are\nreturned. Ignored when ``composed=False``."
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "default": 1,
        +  "description": "COMPOSED mode only. 1-indexed page number (default ``1``).\nIgnored when ``composed=False``.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / page_size
        Added value: +{
        +  "default": 100,
        +  "description": "COMPOSED mode only. Verdicts per page (default ``100``).\nIgnored when ``composed=False``.",
        +  "type": "integer"
        +}
    • Removedget_recompute_quote
    • Addedget_risk_view
    • Changedget_scan_prompt2 fields changed
      • changedInput schema / properties / control_id / description
        Previous value: -"Optional single control to scope the prompt to. Empty (default) returns prompts for all not-yet-implemented controls."New value: +"Security kind only — optional single control to scope\nthe prompt to. Empty (default) returns prompts for all\nnot-yet-implemented controls. Ignored when kind=\"functional\"."
      • addedInput schema / properties / kind
        Added value: +{
        +  "default": "security",
        +  "description": "\"security\" (default) or \"functional\" — which scan brief.",
        +  "type": "string"
        +}
    • Removedget_system
    • Removedget_system_compliance_report
    • Removedget_system_risk_view
    • Removedget_tag_compliance_report
    • Removedget_tag_risk_view
    • Removedget_trust_boundary
    • Changedimport_threat_model_archive1 field changed
      • changedInput schema / properties / envelope / description
        Previous value: -"The full archive dict returned by\n``export_threat_model_archive``."New value: +"The full archive dict returned by\n``export_report (scope=\"model\", format=\"archive\")``."
    • Removedlink_dependency
    • Addedlink_system_dependency
    • Removedlist_functional_objectives
    • Addedlist_groups
    • Addedlist_model_groups
    • Removedlist_model_tags
    • Changedlist_reconciliation_candidates4 fields changed
      • addedInput schema / properties / disposition
        Added value: +{
        +  "default": "active",
        +  "description": "Which side of the queue to read — ``\"active\"``\n(default, open candidates) or ``\"rejected\"`` (persisted\nnot-a-duplicate decisions).",
        +  "type": "string"
        +}
      • changedInput schema / properties / model_id / description
        Previous value: -"ID of the threat model."New value: +"ID of the descendant threat model."
      • changedInput schema / properties / page / description
        Previous value: -"1-indexed page number. Default 1."New value: +"ACTIVE disposition only. 1-indexed page number. Default 1.\nIgnored when ``disposition=\"rejected\"``."
      • changedInput schema / properties / page_size / description
        Previous value: -"Items per page. Default 50."New value: +"ACTIVE disposition only. Items per page. Default 50.\nIgnored when ``disposition=\"rejected\"``."
    • Removedlist_reconciliation_rejections
    • Removedlist_systems
    • Removedlist_tags
    • Addedpreview_undo_composition
    • Removedpreview_undo_lift_composition
    • Removedpreview_undo_split_composition
    • Changedrecompute_verdicts2 fields changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "description": "When True, return only the pre-flight estimate and enqueue\nnothing. When False (default), enqueue the recompute.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / model_id / description
        Previous value: -"ID of the threat model to re-evaluate."New value: +"ID of the threat model to re-evaluate (or estimate for)."
    • Removedremove_asset
    • Removedremove_assumption
    • Removedremove_attacker
    • Removedremove_component
    • Addedremove_entity
    • Addedremove_model_from_group
    • Removedremove_model_from_tag
    • Removedremove_trust_boundary
    • Removedrestore_asset
    • Removedrestore_assumption
    • Removedrestore_attacker
    • Addedrestore_entity
    • Addedrevalidate_entity_quality
    • Removedrevalidate_threat_model_entities
    • Changedselect_compliance_frameworks5 fields changed
      • changedInput schema / properties / framework_ids / description
        Previous value: -"Comma-separated framework IDs (e.g. \"asvs-4.0,nist-csf\")."New value: +"comma-separated framework ids (e.g. \"asvs-4.0,nist-csf\")."
      • removedInput schema / properties / model_id
        Removed value: -{
        -  "description": "ID of the threat model.",
        -  "type": "string"
        -}
      • addedInput schema / properties / scope
        Added value: +{
        +  "description": "target boundary — \"model\", \"system\", or \"tag\".",
        +  "enum": [
        +    "model",
        +    "system",
        +    "tag"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / scope_id
        Added value: +{
        +  "description": "id of the model, system, or tag selected by ``scope``.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "server_version",
        -  "model_id",
        -  "framework_ids"
        -]New value: +[
        +  "server_version",
        +  "scope",
        +  "scope_id",
        +  "framework_ids"
        +]
    • Removedselect_system_compliance_frameworks
    • Removedselect_tag_compliance_frameworks
    • Removedset_co_cal
    • Addedset_control_objective_cal
    • Addedsubmit_functional_test_assertions
    • Removedsubmit_functional_tests
    • Removedunassume_control
    • Addedundo_composition_event
    • Removedundo_lift_composition_event
    • Removedundo_split_composition_event
  6. 1 tool updatev0.67.0
    • Addedcreate_risk_acceptance
  7. 62 tool updatesv0.66.0
    • Addedaccept_coverage_divergences
    • Changedadd_evidence3 fields changed
      • changedInput schema / properties / label / description
        Previous value: -"Description of evidence (required)."New value: +"Human-readable description of the evidence (required)."
      • changedInput schema / properties / type / description
        Previous value: -"Evidence type: \"code\", \"test\", \"config\", \"document\", \"link\"."New value: +"Evidence type — one of \"code\", \"test\", \"config\",\n\"document\", \"link\" (default \"code\")."
      • changedInput schema / properties / url / description
        Previous value: -"Optional file path or URL."New value: +"Optional file path or URL pointing at the artifact."
    • Changedadd_functional_test2 fields changed
      • changedInput schema / properties / functional_objective_ids / description
        Previous value: -"Comma-separated objective ids the test satisfies."New value: +"Comma-separated objective ids the test satisfies (at least one required; get them from list_functional_objectives)."
      • changedInput schema / properties / status / description
        Previous value: -"not_implemented | implemented | verified (an operator claim;\nan independent CI run is what actually verifies it)."New value: +"not_implemented | implemented | verified — an operator claim only; an independent CI run is what actually verifies the test. Defaults to not_implemented."
    • Changedapply_certain_reconciliation_match1 field changed
      • changedInput schema / properties / model_id / description
        Previous value: -"ID of the descendant threat model the duplicate is\non."New value: +"ID of the descendant threat model the duplicate is on."
    • Addedapply_control_changeset
    • Changedassess_model4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max to return (0=all)."New value: +"Max control objectives to return (0 = all)."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N."New value: +"Skip the first N control objectives."
      • changedInput schema / properties / status / description
        Previous value: -"Filter: \"mitigated\", \"at_risk\", \"unassessed\"."New value: +"Optional filter — \"mitigated\", \"at_risk\", or \"unassessed\"."
      • changedInput schema / properties / summary_only / description
        Previous value: -"If True, returns only summary counts (no per-CO details)."New value: +"If True, return only summary counts (no per-CO details)."
    • Addedattach_foundation
    • Changedauto_map_controls1 field changed
      • changedInput schema / properties / control_id / description
        Previous value: -"Optional specific control to map."New value: +"Optional single control ID to map; omit to map all of the model's controls."
    • Changedcheck_functional_gaps1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model to analyse for functional gaps."
    • Changedcomplete_setup_step1 field changed
      • changedInput schema / properties / step_id / description
        Previous value: -"One of: mcp_configured, mipiti_verify_installed,\nci_secret_added, ci_pipeline_added."New value: +"The step to mark complete, one of \"mcp_configured\", \"mipiti_verify_installed\", \"ci_secret_added\", \"ci_pipeline_added\"."
    • Addedconfirm_reliance
    • Changedcreate_system1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"System name (e.g., \"Mobile Banking Platform\")."New value: +"System name (e.g. \"Mobile Banking Platform\")."
    • Changeddeclare_foundation2 fields changed
      • changedInput schema / properties / provides / description
        Previous value: -"List of advertised-control dicts (control_id required)."New value: +"List of advertised-control dicts. ``control_id`` is required per entry; ``capability_label`` and ``description`` describe what the control provides to consumers."
      • changedInput schema / properties / visibility / description
        Previous value: -"\"workspace\" or \"explicit\"."New value: +"Who may delegate to this foundation. \"workspace\" (default) makes it discoverable to every model in the workspace; \"explicit\" limits it to models explicitly attached."
    • Changeddelete_assertion2 fields changed
      • changedInput schema / properties / assumption_id / description
        Previous value: -"ID of the assumption (omit if using control_id)."New value: +"ID of the assumption the assertion belongs to (omit if it belongs to a control)."
      • changedInput schema / properties / control_id / description
        Previous value: -"ID of the control (omit if using assumption_id)."New value: +"ID of the control the assertion belongs to (omit if it belongs to an assumption)."
    • Changeddelete_control1 field changed
      • changedInput schema / properties / reason / description
        Previous value: -"Justification for deletion."New value: +"Optional justification recorded in the audit trail\n(recommended)."
    • Addeddelete_reliance
    • Addeddismiss_verdict_divergences
    • Changededit_assumption10 fields changed
      • changedInput schema / properties / assumption_id / description
        Previous value: -"ID of the assumption (e.g., \"AS1\")."New value: +"ID of the assumption to edit (e.g., \"AS1\")."
      • changedInput schema / properties / clear_exclusion / description
        Previous value: -"When True, clears the predicate. Mutually\nexclusive with the exclusion_* params (those win if both\nare sent)."New value: +"When True, removes the predicate entirely (the\nassumption becomes prose-only). Mutually exclusive with the\nexclusion_* params — if both are sent, the exclusion_* params win."
      • changedInput schema / properties / description / description
        Previous value: -"New description."New value: +"New description (omit to leave unchanged)."
      • addedInput schema / properties / exclusion_asset_component_id / description
        Added value: +"\"*\" or a concrete component ID."
      • addedInput schema / properties / exclusion_asset_id / description
        Added value: +"\"*\" or a concrete asset ID."
      • addedInput schema / properties / exclusion_attacker_id / description
        Added value: +"Predicate match — \"*\" wildcard or a concrete\nattacker ID."
      • addedInput schema / properties / exclusion_attacker_vector / description
        Added value: +"One of \"Network\" | \"Adjacent\" | \"Local\" |\n\"Physical\" | \"*\"."
      • addedInput schema / properties / exclusion_co_ids / description
        Added value: +"Comma-separated CO IDs the predicate matches\nexplicitly; when non-empty, overrides the match fields. Supplying\nany exclusion_* param rewrites the whole predicate (unspecified\nfields default to \"*\")."
      • addedInput schema / properties / exclusion_property_match / description
        Added value: +"\"C\" | \"I\" | \"A\" | \"U\" | \"*\"."
      • changedInput schema / properties / linked_co_ids / description
        Previous value: -"New comma-separated CO IDs (replaces existing linkage)."New value: +"New comma-separated CO IDs; replaces the existing\nlinkage (omit to leave unchanged)."
    • Changedget_capability2 fields changed
      • addedInput schema / properties / capability_id / description
        Added value: +"ID of the capability to fetch."
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model the capability belongs to."
    • Changedget_compliance_report5 fields changed
      • changedInput schema / properties / framework_id / description
        Previous value: -"ID of the compliance framework."New value: +"ID of the compliance framework (as listed by list_compliance_frameworks)."
      • changedInput schema / properties / level / description
        Previous value: -"Optional level filter (e.g., 1 for L1 only)."New value: +"Optional level filter for level-aware frameworks — returns only requirements at or below this level (e.g. 1 for L1 only). Omit for all levels."
      • changedInput schema / properties / limit / description
        Previous value: -"Max to return."New value: +"Maximum requirement rows to return. Default 0 = no explicit limit."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N."New value: +"Number of requirement rows to skip, for pagination. Default 0."
      • changedInput schema / properties / status / description
        Previous value: -"Filter: \"covered\", \"partial\", \"uncovered\", \"unmapped\", \"excluded\"."New value: +"Optional status filter: \"covered\", \"partial\", \"uncovered\", \"unmapped\", or \"excluded\". Empty = all statuses."
    • Changedget_control_generation_status1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model whose control-generation status to poll."
    • Changedget_control_objectives2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max to return (0=summary only)."New value: +"Max to return (0 = summary only, no per-CO records)."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N."New value: +"Skip the first N control objectives."
    • Changedget_controls7 fields changed
      • changedInput schema / properties / control_id / description
        Previous value: -"Optional specific control for detail mode."New value: +"Optional specific control id for detail mode."
      • changedInput schema / properties / include_deleted / description
        Previous value: -"Include soft-deleted controls."New value: +"Include soft-deleted controls (default False)."
      • changedInput schema / properties / include_orphaned / description
        Previous value: -"Include controls mapped only to tombstoned\nCOs (default False)."New value: +"Include controls mapped only to tombstoned COs\n(default False)."
      • changedInput schema / properties / limit / description
        Previous value: -"Max to return (0=all)."New value: +"Max controls to return (0 = all)."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N (for pagination)."New value: +"Skip the first N controls (pagination)."
      • changedInput schema / properties / status / description
        Previous value: -"Filter by \"implemented\", \"not_implemented\", \"verified\"."New value: +"Filter by \"implemented\", \"not_implemented\", or \"verified\"."
      • changedInput schema / properties / summary_only / description
        Previous value: -"If True, returns only id, description, status,\nassertion_count, and assumed_by per control (much smaller response)."New value: +"If True, returns only id, description, status,\nassertion_count, and assumed_by per control (much smaller\nresponse)."
    • Changedget_effective_coverage1 field changed
      • changedInput schema / properties / origin / description
        Previous value: -"filter coverage rows by contributing-control origin —\none of ``\"own\" | \"cross\" | \"inherited\"``. When omitted,\nrows with any origin mix are returned."New value: +"filter coverage rows by contributing-control origin — one\nof ``\"own\" | \"cross\" | \"inherited\"``. When omitted, rows with\nany origin mix are returned."
    • Changedget_functional_coverage1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model whose functional coverage to report."
    • Changedget_functional_objective2 fields changed
      • addedInput schema / properties / functional_objective_id / description
        Added value: +"ID of the functional objective to fetch."
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model the objective belongs to."
    • Changedget_functional_scan_prompt1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model to build the functional brief for."
    • Changedget_scan_prompt1 field changed
      • changedInput schema / properties / control_id / description
        Previous value: -"Optional specific control ID."New value: +"Optional single control to scope the prompt to. Empty (default) returns prompts for all not-yet-implemented controls."
    • Changedget_system_compliance_report6 fields changed
      • changedInput schema / properties / framework_id / description
        Previous value: -"ID of the compliance framework."New value: +"ID of a framework already selected for this system."
      • changedInput schema / properties / level / description
        Previous value: -"Optional level filter."New value: +"Optional framework level/tier filter (e.g., baseline level number). Omit for all levels."
      • changedInput schema / properties / limit / description
        Previous value: -"Max to return."New value: +"Max requirement rows to return; 0 (default) returns all."
      • changedInput schema / properties / offset / description
        Previous value: -"Skip first N."New value: +"Skip the first N requirement rows (pagination). Default 0."
      • changedInput schema / properties / status / description
        Previous value: -"Filter: \"covered\", \"partial\", \"uncovered\", \"unmapped\", \"excluded\"."New value: +"Optional per-requirement filter, one of \"covered\", \"partial\", \"uncovered\", \"unmapped\", \"excluded\". Empty (default) returns all."
      • changedInput schema / properties / system_id / description
        Previous value: -"ID of the system."New value: +"ID of the system to report on."
    • Changedget_tag_compliance_report1 field changed
      • changedInput schema / properties / level / description
        Previous value: -"optional framework level filter (0 = all)."New value: +"optional framework level filter; 0 (default) reports all levels."
    • Addedget_verdict_divergence
    • Changedimport_functional_tests1 field changed
      • changedInput schema / properties / tests_json / description
        Previous value: -"A JSON array of test objects. Each object supports\n``test_name``, ``file_path``, ``framework``, ``description``,\n``status`` (not_implemented | implemented | verified — an operator\nclaim; an independent CI run is what verifies it), and\n``functional_objective_ids`` (list of objective ids the test covers).\nAt least ``test_name`` or ``description`` is required per test; the\nrest are optional."New value: +"A JSON array of test objects. Each object supports ``test_name``, ``file_path``, ``framework``, ``description``, ``status`` (not_implemented | implemented | verified — an operator claim; an independent CI run is what verifies it), and ``functional_objective_ids`` (list of objective ids the test covers). At least ``test_name`` or ``description`` is required per test; the rest are optional."
    • Changedimport_threat_model_archive1 field changed
      • changedInput schema / properties / envelope / description
        Previous value: -"The full archive dict returned by\n`export_threat_model_archive`."New value: +"The full archive dict returned by\n``export_threat_model_archive``."
    • Changedlift_composition_entity4 fields changed
      • changedInput schema / properties / acknowledged_third_party_subtrees / description
        Previous value: -"Optional list of subtree\nroots the operator has acknowledged as in-scope for the\nlift."New value: +"Optional list of subtree roots\nthe operator has acknowledged as in-scope for the lift."
      • changedInput schema / properties / attached_state_resolutions / description
        Previous value: -"Optional per-state-key resolution\nmap (e.g. ``{\"state:assertions/AS3\": \"keep_b\"}``)."New value: +"Optional per-state-key resolution map\n(e.g. ``{\"state:assertions/AS3\": \"keep_b\"}``)."
      • changedInput schema / properties / lca_descendant_ids / description
        Previous value: -"Optional snapshot of the LCA's descendant\nset used by the over-application gate. Omit to let the\nserver compute it via BFS."New value: +"Optional snapshot of the LCA's descendant set\nused by the over-application gate. Omit to let the server\ncompute it via BFS."
      • changedInput schema / properties / lca_model_id / description
        Previous value: -"Target ancestor model id (the LCA, or any\nancestor higher up the chain)."New value: +"Target ancestor model id (the LCA, or any ancestor\nhigher up the chain)."
    • Changedlist_attestations1 field changed
      • changedInput schema / properties / assumption_id / description
        Previous value: -"ID of the assumption."New value: +"ID of the assumption whose attestation history to list."
    • Changedlist_capabilities1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model whose capabilities to list."
    • Changedlist_findings2 fields changed
      • changedInput schema / properties / control_id / description
        Previous value: -"Optional filter by control ID."New value: +"Optional filter to findings on one control. Empty (default) returns findings for all controls."
      • changedInput schema / properties / status / description
        Previous value: -"Optional filter: \"discovered\", \"acknowledged\", \"remediated\",\n\"verified\", \"dismissed\"."New value: +"Optional lifecycle filter, one of \"discovered\", \"acknowledged\", \"remediated\", \"verified\", \"dismissed\". Empty (default) returns all statuses."
    • Changedlist_functional_objectives1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model whose functional objectives to list."
    • Addedlist_reliance
    • Addedlist_tags
    • Changedlist_threat_models2 fields changed
      • changedInput schema / properties / include_assessment_summary / description
        Previous value: -"If True, include an `assessment_summary`\nobject with each model (counts of mitigated / at_risk /\nunassessed COs plus a human-readable `message`). Useful for\naggregate posture queries across the workspace in a single\ncall — e.g. \"which of my models are at risk?\" — instead of\ncalling `assess_model` once per model (N+1 at the agent layer).\nAdds ~100 bytes per model to the response."New value: +"If True, include an `assessment_summary` object per model (counts of mitigated / at_risk / unassessed control objectives plus a human-readable `message`). Use for aggregate posture queries across the workspace in a single call (e.g. \"which of my models are at risk?\") instead of calling `assess_model` once per model. Adds roughly 100 bytes per model. Default False."
      • changedInput schema / properties / source / description
        Previous value: -"Filter by source system. One of \"web\", \"mcp\", \"jira\", \"api\".\nOmit to list all models regardless of source."New value: +"Filter by the system that created each model. One of \"web\", \"mcp\", \"jira\", \"api\". Omit (default \"\") to list all models regardless of source."
    • Changedmap_control_to_requirement4 fields changed
      • changedInput schema / properties / confidence / description
        Previous value: -"Mapping confidence: \"llm\", \"manual\", \"verified\"."New value: +"Provenance label recorded on the mapping: \"manual\" (default, operator-asserted), \"llm\" (machine-suggested), or \"verified\" (human-confirmed)."
      • changedInput schema / properties / control_id / description
        Previous value: -"ID of the control (e.g., \"CTRL-01\")."New value: +"ID of the control to map (e.g. \"CTRL-01\")."
      • changedInput schema / properties / notes / description
        Previous value: -"Optional notes about mapping."New value: +"Optional free-text note explaining the mapping rationale."
      • changedInput schema / properties / requirement_id / description
        Previous value: -"ID of the requirement (e.g., \"V2.1.1\")."New value: +"ID of the requirement to map to (e.g. \"V2.1.1\")."
    • Changedpreview_undo_lift_composition2 fields changed
      • changedInput schema / properties / lift_id / description
        Previous value: -"Either the surrogate id of the ``lift_applied``\nactivity event, or the structured ``lift_id`` carried in\nthe event's payload — both lookups are supported."New value: +"Either the surrogate id of the ``lift_applied`` activity\nevent, or the structured ``lift_id`` carried in the event's\npayload — both lookups are supported."
      • changedInput schema / properties / model_id / description
        Previous value: -"The model whose composition view originated the\nlift. Must match the ``threat_model_id`` carried by the\ncited activity event; the server rejects with 404 when a\ncaller tries to undo a sibling model's lift through a\ndifferent model's URL."New value: +"The model whose composition view originated the lift.\nMust match the ``threat_model_id`` carried by the cited\nactivity event; the server rejects with 404 when a caller\ntries to undo a sibling model's lift through a different\nmodel's URL."
    • Changedquery_threat_model1 field changed
      • changedInput schema / properties / question / description
        Previous value: -"The question to ask."New value: +"The natural-language question to ask."
    • Addedrefine_threat_model
    • Changedregenerate_controls3 fields changed
      • changedInput schema / properties / batch_size / description
        Previous value: -"COs per batch in batch mode (default: 15). Smaller\n= more accurate + granular progress, more LLM calls."New value: +"COs per batch in batch mode (default 15). Smaller =\nmore accurate and more granular progress, but more LLM calls."
      • changedInput schema / properties / co_ids / description
        Previous value: -"Optional comma-separated CO IDs to regenerate (e.g.\n\"CO1,CO5\"). When omitted, regenerates all controls."New value: +"Optional comma-separated CO IDs to regenerate (e.g.\n\"CO1,CO5\"). Omit to regenerate all controls."
      • changedInput schema / properties / mode / description
        Previous value: -"\"batch\" (default) or \"per_co\" (most thorough, one LLM\ncall per CO)."New value: +"\"batch\" (default) or \"per_co\" (most thorough — one LLM call\nper CO)."
    • Changedremove_attacker1 field changed
      • changedInput schema / properties / attacker_id / description
        Previous value: -"ID of the attacker to soft-delete."New value: +"ID of the attacker to soft-delete (e.g. \"T1\")."
    • Changedremove_component1 field changed
      • changedInput schema / properties / component_id / description
        Previous value: -"ID of the component to remove."New value: +"ID of the component to remove (e.g. \"CMP1\")."
    • Changedremove_evidence1 field changed
      • changedInput schema / properties / evidence_index / description
        Previous value: -"Zero-based index to remove."New value: +"Zero-based position of the item to remove within\nthe control's ``evidence`` array (default 0 = first item)."
    • Addedremove_model_from_tag
    • Changedremove_trust_boundary1 field changed
      • changedInput schema / properties / tb_id / description
        Previous value: -"ID of the trust boundary to remove."New value: +"ID of the trust boundary to remove (e.g., \"TB1\")."
    • Addedretry_verdicts
    • Changedrevalidate_threat_model_entities1 field changed
      • addedInput schema / properties / model_id / description
        Added value: +"ID of the threat model whose assets and attackers to\nre-validate."
    • Addedselect_tag_compliance_frameworks
    • Changedset_functional_satisfaction_groups2 fields changed
      • changedInput schema / properties / groups_json / description
        Previous value: -"A JSON object mapping group label to a list of functional\ntest ids, e.g. ``{\"1\": [\"FT-1\", \"FT-2\"], \"2\": [\"FT-3\"]}``."New value: +"JSON object mapping group label to a list of functional test ids, e.g. ``{\"1\": [\"FT-1\", \"FT-2\"], \"2\": [\"FT-3\"]}``. Pass ``{}`` to clear all groups."
      • changedInput schema / properties / ungrouped / description
        Previous value: -"Comma-separated functional-test ids to keep unassigned to any\ngroup (optional)."New value: +"Comma-separated functional-test ids to keep associated with the objective but unassigned to any group (optional)."
    • Changedset_mitigation_groups2 fields changed
      • changedInput schema / properties / defense_in_depth / description
        Previous value: -"Comma-separated control IDs for defense-in-depth.\nExample: \"CTRL-04,CTRL-05\""New value: +"Comma-separated control IDs tracked as\ndefense-in-depth (not required for mitigation). Example:\n\"CTRL-04,CTRL-05\"."
      • changedInput schema / properties / groups / description
        Previous value: -"JSON object mapping group numbers to control ID lists.\nExample: '{\"1\": [\"CTRL-01\", \"CTRL-02\"], \"2\": [\"CTRL-03\"]}'"New value: +"JSON object mapping group numbers to control-ID lists.\nExample: '{\"1\": [\"CTRL-01\", \"CTRL-02\"], \"2\": [\"CTRL-03\"]}'."
    • Changedsubmit_findings1 field changed
      • changedInput schema / properties / findings_json / description
        Previous value: -"JSON array of finding objects with control_id, title,\ndescription, severity, checked_locations, checked_patterns,\nexpected_evidence."New value: +"JSON string of an **array** of finding objects. Each object should carry:\n- ``control_id`` (str): the control the gap relates to.\n- ``title`` (str): short summary of the gap.\n- ``description`` (str): what is missing and why it matters.\n- ``severity`` (str): finding severity (e.g., \"low\"/\"medium\"/\"high\"/\"critical\").\n- ``checked_locations`` (list): files/paths inspected.\n- ``checked_patterns`` (list): patterns/signals searched for.\n- ``expected_evidence`` (str): what implemented evidence would have looked like.\nMust parse as a JSON array; a single object or malformed JSON is rejected."
    • Changedsubmit_functional_tests1 field changed
      • changedInput schema / properties / assertions_json / description
        Previous value: -"JSON array of assertions, each\n{\"type\": \"test_passes\"|..., \"params\": {...}, \"description\": \"...\",\n \"repo\": \"<owner>/<repo>\"}. Each assertion must carry an explicit\nrepo (or the \"no_repo\" sentinel)."New value: +"JSON array of assertion objects, each {\"type\": \"test_passes\" | \"test_exists\" | ..., \"params\": {...}, \"description\": \"...\", \"repo\": \"<owner>/<repo>\"}. Every assertion must carry an explicit repo, or the \"no_repo\" sentinel when the check is not tied to a repository."
    • Changedunassume_control1 field changed
      • changedInput schema / properties / control_id / description
        Previous value: -"ID of the control."New value: +"ID of the control (e.g., \"CTRL-03\")."
    • Changedunreject_reconciliation_candidate1 field changed
      • changedInput schema / properties / model_id / description
        Previous value: -"ID of the descendant threat model the rejection is\non."New value: +"ID of the descendant threat model the rejection is on."
    • Addedupdate_control_status
    • Changedupdate_finding5 fields changed
      • changedInput schema / properties / finding_id / description
        Previous value: -"ID of the finding."New value: +"ID of the finding to update."
      • changedInput schema / properties / notes / description
        Previous value: -"Optional notes."New value: +"Optional free-text notes recorded on the finding."
      • changedInput schema / properties / reason / description
        Previous value: -"Optional reason (required for dismissal)."New value: +"Optional rationale; required when dismissing (status=\"dismissed\")."
      • changedInput schema / properties / remediation_assertion_ids / description
        Previous value: -"Comma-separated assertion IDs linking fix."New value: +"Optional comma-separated assertion IDs that evidence the fix, linking the remediation to the assertions that prove it. Empty by default."
      • changedInput schema / properties / status / description
        Previous value: -"New status."New value: +"New lifecycle status, one of \"discovered\", \"acknowledged\", \"remediated\", \"verified\", \"dismissed\"."
  8. 36 tool updatesv0.62.2
    • Addedadd_attacker
    • Addedapply_certain_reconciliation_match
    • Removedconfirm_reliance
    • Addedcreate_reliance
    • Addeddeclare_foundation
    • Addedexport_threat_model
    • Addedgenerate_threat_model
    • Addedget_assumption
    • Addedget_attacker
    • Addedget_component
    • Addedget_composition_overview
    • Addedget_control_generation_status
    • Addedget_control_objective
    • Addedget_controls
    • Addedget_effective_coverage
    • Addedget_tag_compliance_report
    • Addedget_tag_risk_view
    • Addedget_trust_boundary
    • Addedimport_threat_model_archive
    • Addedlist_model_tags
    • Addedlist_reconciliation_candidates
    • Addedlist_reconciliation_rejections
    • Removedlist_reliance
    • Removedlist_tags
    • Addedlist_workspaces
    • Addedmodel_coherence_report
    • Addedpreview_undo_lift_composition
    • Addedquery_threat_model
    • Addedremap_control
    • Addedremove_asset
    • Removedremove_model_from_tag
    • Addedrename_threat_model
    • Removedselect_tag_compliance_frameworks
    • Addedsplit_composition_entity
    • Addedundo_split_composition_event
    • Removedupdate_control_status
  9. 114 tool updatesv0.62.2
    • Addedadd_asset
    • Addedadd_assumption
    • Addedadd_component
    • Addedadd_evidence
    • Addedadd_functional_test
    • Addedadd_model_to_system
    • Addedadd_model_to_tag
    • Addedapply_finding_remediation
    • Addedassess_model
    • Addedassociate_functional_test
    • Addedassume_control
    • Removedattach_foundation
    • Addedauto_map_controls
    • Addedauto_remediate
    • Addedcheck_control_gaps
    • Addedcheck_functional_gaps
    • Addedclassify_model_cwe
    • Addedcomplete_setup_step
    • Addedconvert_assumption_to_controls
    • Addedcreate_system
    • Addedcreate_tag
    • Removeddeclare_foundation
    • Addeddelete_assertion
    • Addeddelete_control
    • Removeddelete_reliance
    • Addeddelete_tag
    • Addededit_asset
    • Addededit_assumption
    • Addededit_attacker
    • Addededit_component
    • Addededit_trust_boundary
    • Addedexport_threat_model_archive
    • Addedgenerate_functional_objectives
    • Removedgenerate_threat_model
    • Addedget_asset
    • Addedget_capability
    • Addedget_compliance_report
    • Removedget_composition_overview
    • Addedget_control
    • Addedget_control_objectives
    • Addedget_cwe_catalog
    • Addedget_findings_risks
    • Addedget_functional_coverage
    • Addedget_functional_objective
    • Addedget_functional_satisfaction_groups
    • Addedget_functional_scan_prompt
    • Addedget_functional_test_sufficiency
    • Addedget_mitigation_groups
    • Addedget_model_cwe_tags
    • Addedget_model_risk_view
    • Addedget_reach_verdicts
    • Addedget_recompute_quote
    • Addedget_remediation_leverage
    • Addedget_review_queue
    • Addedget_scan_prompt
    • Addedget_setup_status
    • Addedget_sufficiency
    • Addedget_system_compliance_report
    • Addedget_system_dependencies
    • Addedget_system_risk_view
    • Removedget_tag_compliance_report
    • Removedget_tag_risk_view
    • Addedget_verification_report
    • Addedimport_compliance_framework
    • Addedimport_controls
    • Addedimport_functional_tests
    • Addedlink_dependency
    • Addedlist_assertions
    • Addedlist_attestations
    • Addedlist_capabilities
    • Addedlist_compliance_frameworks
    • Addedlist_effective_attack_paths
    • Addedlist_effective_control_objectives
    • Addedlist_findings
    • Addedlist_functional_objectives
    • Removedlist_model_tags
    • Addedlist_reliance
    • Addedlist_risk_acceptances
    • Addedlist_systems
    • Addedlist_tags
    • Removedmodel_coherence_report
    • Addedpreview_finding_remediation
    • Addedpreview_undo_split_composition
    • Removedquery_threat_model
    • Addedrecompute_verdicts
    • Addedreevaluate_threat_model_factors
    • Removedrefine_threat_model
    • Addedreject_reconciliation_candidate
    • Removedremap_control
    • Addedremove_assumption
    • Addedremove_evidence
    • Addedremove_trust_boundary
    • Removedrename_threat_model
    • Addedrestore_asset
    • Addedrestore_assumption
    • Addedrestore_attacker
    • Addedrevalidate_threat_model_entities
    • Addedselect_compliance_frameworks
    • Addedselect_system_compliance_frameworks
    • Addedset_co_cal
    • Addedset_control_assumption_groups
    • Addedset_functional_satisfaction_groups
    • Addedset_mitigation_groups
    • Removedsplit_composition_entity
    • Addedsubmit_assertions
    • Addedsubmit_attestation
    • Addedsubmit_findings
    • Addedsubmit_functional_tests
    • Addedsuggest_functional_test_mappings
    • Addedunassume_control
    • Addedundo_lift_composition_event
    • Addedunreject_reconciliation_candidate
    • Addedupdate_finding
    • Addedupdate_organization
  10. 59 tool updatesv0.62.1
    • Removedadd_asset
    • Removedadd_component
    • Removedadd_model_to_system
    • Removedadd_model_to_tag
    • Addedadd_trust_boundary
    • Removedapply_certain_reconciliation_match
    • Removedassess_model
    • Removedcheck_control_gaps
    • Removedcreate_reliance
    • Removedcreate_system
    • Removedcreate_tag
    • Removeddelete_control
    • Removeddelete_tag
    • Removededit_asset
    • Removededit_component
    • Removedexport_threat_model
    • Removedexport_threat_model_archive
    • Removedget_asset
    • Removedget_assumption
    • Removedget_attacker
    • Removedget_compliance_report
    • Removedget_component
    • Removedget_control
    • Addedget_control_assumption_groups
    • Removedget_control_generation_status
    • Removedget_control_objective
    • Removedget_control_objectives
    • Removedget_controls
    • Removedget_effective_coverage
    • Removedget_mitigation_groups
    • Removedget_reach_verdicts
    • Removedget_recompute_quote
    • Removedget_system_dependencies
    • Removedget_trust_boundary
    • Removedimport_compliance_framework
    • Removedimport_controls
    • Removedimport_threat_model_archive
    • Removedlink_dependency
    • Removedlist_compliance_frameworks
    • Removedlist_effective_attack_paths
    • Removedlist_effective_control_objectives
    • Removedlist_reconciliation_candidates
    • Removedlist_reconciliation_rejections
    • Removedlist_reliance
    • Removedlist_tags
    • Removedpreview_undo_lift_composition
    • Removedpreview_undo_split_composition
    • Removedrecompute_verdicts
    • Removedreevaluate_threat_model_factors
    • Removedreject_reconciliation_candidate
    • Removedremove_evidence
    • Removedrestore_attacker
    • Removedrevalidate_threat_model_entities
    • Removedselect_compliance_frameworks
    • Removedset_co_cal
    • Removedset_mitigation_groups
    • Removedundo_lift_composition_event
    • Removedundo_split_composition_event
    • Removedunreject_reconciliation_candidate
  11. 65 tool updatesv0.62.0
    • Removedadd_assumption
    • Removedadd_attacker
    • Removedadd_evidence
    • Removedadd_functional_test
    • Removedadd_trust_boundary
    • Removedapply_finding_remediation
    • Removedassociate_functional_test
    • Removedassume_control
    • Removedauto_map_controls
    • Removedauto_remediate
    • Removedcheck_functional_gaps
    • Removedclassify_model_cwe
    • Removedcomplete_setup_step
    • Removedconvert_assumption_to_controls
    • Removeddelete_assertion
    • Removededit_assumption
    • Removededit_attacker
    • Removededit_trust_boundary
    • Removedgenerate_functional_objectives
    • Removedget_capability
    • Removedget_control_assumption_groups
    • Addedget_control_generation_status
    • Removedget_cwe_catalog
    • Removedget_findings_risks
    • Removedget_functional_coverage
    • Removedget_functional_objective
    • Removedget_functional_satisfaction_groups
    • Removedget_functional_scan_prompt
    • Removedget_functional_test_sufficiency
    • Removedget_model_cwe_tags
    • Removedget_model_risk_view
    • Removedget_remediation_leverage
    • Removedget_review_queue
    • Removedget_scan_prompt
    • Removedget_setup_status
    • Removedget_sufficiency
    • Removedget_system_compliance_report
    • Removedget_system_risk_view
    • Removedget_verification_report
    • Removedimport_functional_tests
    • Removedlist_assertions
    • Removedlist_attestations
    • Removedlist_capabilities
    • Removedlist_findings
    • Removedlist_functional_objectives
    • Removedlist_risk_acceptances
    • Removedlist_systems
    • Removedlist_workspaces
    • Removedpreview_finding_remediation
    • Removedremove_asset
    • Removedremove_assumption
    • Removedremove_trust_boundary
    • Removedrestore_asset
    • Removedrestore_assumption
    • Removedselect_system_compliance_frameworks
    • Removedset_control_assumption_groups
    • Removedset_functional_satisfaction_groups
    • Removedsubmit_assertions
    • Removedsubmit_attestation
    • Removedsubmit_findings
    • Removedsubmit_functional_tests
    • Removedsuggest_functional_test_mappings
    • Removedunassume_control
    • Removedupdate_finding
    • Removedupdate_organization
  12. 7 tool updatesv0.60.1
    • Addedclassify_model_cwe
    • Changededit_attacker2 fields changed
      • addedInput schema / properties / attest_position
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Operator-attest the attacker's current position without\nchanging it — e.g. to confirm a fully external attacker's empty\ncrossed set so an objective blocked on an unpositioned attacker can\nbe resolved. Pass ``true`` to attest."
        +}
      • changedInput schema / properties / trust_boundary_ids / description
        Previous value: -"Comma-separated trust boundary IDs (replaces existing)."New value: +"Comma-separated trust boundary IDs — the boundaries\nthis attacker has crossed (its position). Replaces the existing set.\nChanging it operator-attests the position, which lets reachability\ntrust it for a decisive verdict."
    • Changededit_trust_boundary3 fields changed
      • changedInput schema / properties / change_reason / description
        Previous value: -"Required when ``passes`` or ``sealed`` actually changes.\nCaptured in the audit trail; documents why the boundary's vector\nfilter was tightened/widened or its isolation claim changed."New value: +"Required when ``passes``, ``sealed``, or the seal\nattestation actually changes. Captured in the audit trail; documents\nwhy the boundary's vector filter, isolation claim, or attestation\nchanged."
      • addedInput schema / properties / seal_source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "\"attested\" | \"unattested\". Only an operator-attested seal\nlets reachability decisively rule an objective unreachable past the\nboundary; an unattested (default/model-suggested) seal is treated as\npivotable. Use \"attested\" to attest a boundary already marked sealed\nwithout re-toggling it; \"unattested\" retracts. An attested seal\nimplies ``sealed``. Requires ``change_reason``."
        +}
      • changedInput schema / properties / sealed / description
        Previous value: -"New isolation flag. True declares NO lateral ingress (the only\nway in is crossing the perimeter — an air-gap / segmented enclave),\nwhich lets reachability decisively rule the boundary unreachable;\nFalse assumes a lateral pivot is possible. Reach-relevant — changing\nit can flip CO verdicts. Omit to leave unchanged."New value: +"New isolation flag. True declares NO lateral ingress (the only\nway in is crossing the perimeter — an air-gap / segmented enclave),\nwhich lets reachability decisively rule the boundary unreachable;\nFalse assumes a lateral pivot is possible. Reach-relevant — changing\nit can flip CO verdicts. Setting it records an operator attestation\nof the seal. Omit to leave unchanged."
    • Addedget_cwe_catalog
    • Addedget_model_cwe_tags
    • Addedget_recompute_quote
    • Addedrecompute_verdicts
  13. 150 tool updatesv0.57.0
    • First observedadd_asset
    • First observedadd_assumption
    • First observedadd_attacker
    • First observedadd_component
    • First observedadd_evidence
    • First observedadd_functional_test
    • First observedadd_model_to_system
    • First observedadd_model_to_tag
    • First observedadd_trust_boundary
    • First observedapply_certain_reconciliation_match
    • First observedapply_finding_remediation
    • First observedassess_model
    • First observedassign_asset_to_components
    • First observedassign_control_to_components
    • First observedassociate_functional_test
    • First observedassume_control
    • First observedattach_foundation
    • First observedauto_map_controls
    • First observedauto_remediate
    • First observedcheck_control_gaps
    • First observedcheck_functional_gaps
    • First observedcomplete_setup_step
    • First observedconfirm_reliance
    • First observedconvert_assumption_to_controls
    • First observedcreate_reliance
    • First observedcreate_system
    • First observedcreate_tag
    • First observeddeclare_foundation
    • First observeddelete_assertion
    • First observeddelete_control
    • First observeddelete_reliance
    • First observeddelete_tag
    • First observeddelete_threat_model
    • First observededit_asset
    • First observededit_assumption
    • First observededit_attacker
    • First observededit_component
    • First observededit_trust_boundary
    • First observedexport_tag_report
    • First observedexport_threat_model
    • First observedexport_threat_model_archive
    • First observedgenerate_functional_objectives
    • First observedgenerate_threat_model
    • First observedget_asset
    • First observedget_assumption
    • First observedget_attacker
    • First observedget_capability
    • First observedget_compliance_report
    • First observedget_component
    • First observedget_composition_overview
    • First observedget_control
    • First observedget_control_assumption_groups
    • First observedget_control_objective
    • First observedget_control_objectives
    • First observedget_controls
    • First observedget_effective_coverage
    • First observedget_findings_risks
    • First observedget_functional_coverage
    • First observedget_functional_objective
    • First observedget_functional_satisfaction_groups
    • First observedget_functional_scan_prompt
    • First observedget_functional_test_sufficiency
    • First observedget_mitigation_groups
    • First observedget_model_risk_view
    • First observedget_reach_verdicts
    • First observedget_reachability_verdicts
    • First observedget_remediation_leverage
    • First observedget_review_queue
    • First observedget_scan_prompt
    • First observedget_setup_status
    • First observedget_sufficiency
    • First observedget_system
    • First observedget_system_compliance_report
    • First observedget_system_dependencies
    • First observedget_system_risk_view
    • First observedget_tag_compliance_report
    • First observedget_tag_risk_view
    • First observedget_threat_model
    • First observedget_trust_boundary
    • First observedget_verification_report
    • First observedimport_compliance_framework
    • First observedimport_controls
    • First observedimport_functional_tests
    • First observedimport_threat_model_archive
    • First observedlift_composition_entity
    • First observedlink_dependency
    • First observedlist_assertions
    • First observedlist_attestations
    • First observedlist_capabilities
    • First observedlist_compliance_frameworks
    • First observedlist_effective_attack_paths
    • First observedlist_effective_control_objectives
    • First observedlist_effective_entities
    • First observedlist_findings
    • First observedlist_functional_objectives
    • First observedlist_model_tags
    • First observedlist_reconciliation_candidates
    • First observedlist_reconciliation_rejections
    • First observedlist_reliance
    • First observedlist_risk_acceptances
    • First observedlist_systems
    • First observedlist_tags
    • First observedlist_threat_models
    • First observedlist_workspaces
    • First observedmap_control_to_requirement
    • First observedmodel_coherence_report
    • First observedpreview_finding_remediation
    • First observedpreview_undo_lift_composition
    • First observedpreview_undo_split_composition
    • First observedpropose_attach_foundation
    • First observedquery_threat_model
    • First observedreevaluate_threat_model_factors
    • First observedrefine_control
    • First observedrefine_threat_model
    • First observedregenerate_controls
    • First observedreject_reconciliation_candidate
    • First observedremap_control
    • First observedremove_asset
    • First observedremove_assumption
    • First observedremove_attacker
    • First observedremove_component
    • First observedremove_evidence
    • First observedremove_model_from_tag
    • First observedremove_trust_boundary
    • First observedrename_threat_model
    • First observedrestore_asset
    • First observedrestore_assumption
    • First observedrestore_attacker
    • First observedrevalidate_threat_model_entities
    • First observedselect_compliance_frameworks
    • First observedselect_system_compliance_frameworks
    • First observedselect_tag_compliance_frameworks
    • First observedset_co_cal
    • First observedset_control_assumption_groups
    • First observedset_functional_satisfaction_groups
    • First observedset_mitigation_groups
    • First observedset_threat_model_parent
    • First observedsplit_composition_entity
    • First observedsubmit_assertions
    • First observedsubmit_attestation
    • First observedsubmit_findings
    • First observedsubmit_functional_tests
    • First observedsuggest_functional_test_mappings
    • First observedunassume_control
    • First observedundo_lift_composition_event
    • First observedundo_split_composition_event
    • First observedunreject_reconciliation_candidate
    • First observedupdate_control_status
    • First observedupdate_finding
    • First observedupdate_organization

TDQS

B3.4/5.0

Scored across 139 tools

Disambiguation2/5

The tool set has many overlapping concepts: multiple tools manage controls (get_controls, refine_control, remap_control, regenerate_controls, update_control_status, set_mitigation_groups, set_control_assumption_groups, delete_control, import_controls, apply_control_changeset), multiple tools handle verdicts (get_verdict_divergence, accept_coverage_divergences, dismiss_verdict_divergences, recompute_verdicts, retry_verdicts), and several tools cover compliance mapping (map_control_to_requirement, auto_map_controls, auto_remediate_compliance). While descriptions are detailed, an agent would struggle to pick the right tool without reading long prose.

Naming Consistency3/5

Most tools follow a verb_noun pattern (list_threat_models, get_threat_model, add_asset, edit_asset, delete_control), but there are inconsistencies: some use get_* for lists (get_controls, get_control_objectives), some use list_* (list_assertions, list_findings), and some use bare verbs (assess_model, refine_threat_model, remap_control). The pattern is readable but not uniform.

Tool Count1/5

139 tools is an extreme count for a single server. Even for a comprehensive threat-modeling platform, this is far beyond what an agent can effectively navigate. The count suggests the server exposes every API endpoint directly rather than curating a coherent tool surface.

Completeness4/5

The domain (threat modeling, controls, assertions, compliance, composition, functional testing) is covered extensively with CRUD and lifecycle operations for nearly every entity type. There are minor gaps (e.g., no direct tool to list all models' versions, no explicit tool to update a threat model's description beyond refine/rename), but overall the surface is remarkably complete.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI-powered threat modeling with tools for creating threat models, analyzing security threats, generating security controls, and validating architecture against best practices.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to interact with the SCF Controls Platform for security compliance, including browsing controls, tracking implementation, managing evidence, assessing risks, and monitoring vendors via natural language.
    187
    283 npm
    2
    MIT