Skip to main content
Glama

D3FEND Defense Search

d3fend_defense_search
Read-onlyIdempotent

Search the MITRE D3FEND catalog of defensive techniques by keyword, tactic, or targeted artifact. Default response is SLIM (drops uri from each row — saves ~60 chars/row, ~30% on popular drills); pass include='full' for the verbose record. Pass exclude_id when chaining from d3fend_defense_lookup to skip self in sibling-artifact searches. Use to discover defenses applicable to a given threat model — e.g. 'what defenses harden access tokens?' (tactic=Harden + artifact='Access Token'). Drill into d3fend_defense_lookup with any returned defense_id for the ATT&CK technique mappings. Free: 30/hr, Pro: 500/hr. Returns {query, total, results [{defense_id, label, uri (only when include=full), parent_label, tactic, artifact}], next_calls}.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return. Range: 1-200.
tacticNoFilter by D3FEND tactic. One of: Model, Harden, Detect, Isolate, Deceive, Evict, Restore. Omit for all tactics.
includeNoDetail level. Default (omit/empty) returns slim rows (drops the deterministic ontology `uri` field, ~60 chars/row saved). Pass 'full' to get `uri` back on every row. The slug `defense_id` is always returned and uniquely identifies the defense.
keywordNoSubstring match against defense label, description, or parent_label (case-insensitive). Min 2 chars. Example: 'token', 'hashing', 'sandbox'. Omit to list all.
artifactNoFilter by exact targeted digital artifact (case-insensitive), e.g. 'Access Token', 'File', 'Process'. Omit for any artifact.
exclude_idNoOptional D3FEND defense slug (CamelCase, e.g. 'TokenBinding') to omit from results. Useful when chaining from d3fend_defense_lookup so the originating defense is not echoed back in its own siblings list. Omit when not needed.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / result / properties / next_calls / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / verdict / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
  2. Changed1 schema field changed
    • changedOutput schema / properties / result / properties / next_calls / type
      Previous value: -"object"New value: +"array"
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "result": {
      +      "properties": {
      +        "next_calls": {
      +          "type": "object"
      +        },
      +        "query": {
      +          "type": "object"
      +        },
      +        "results": {
      +          "type": "array"
      +        },
      +        "total": {
      +          "type": "integer"
      +        },
      +        "verdict": {
      +          "type": "object"
      +        }
      +      },
      +      "required": [],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "result"
      +  ],
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -{
      -  "$defs": {
      -    "D3fendDefenseListItem": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "artifact": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "defense_id": {
      -          "type": "string"
      -        },
      -        "label": {
      -          "type": "string"
      -        },
      -        "parent_label": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "tactic": {
      -          "type": "string"
      -        },
      -        "uri": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "required": [
      -        "defense_id",
      -        "label",
      -        "tactic"
      -      ],
      -      "type": "object"
      -    },
      -    "D3fendDefenseSearchResponse": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "next_calls": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "$ref": "#/$defs/PivotHint"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "query": {
      -          "additionalProperties": true,
      -          "type": "object"
      -        },
      -        "results": {
      -          "items": {
      -            "$ref": "#/$defs/D3fendDefenseListItem"
      -          },
      -          "type": "array"
      -        },
      -        "total": {
      -          "type": "integer"
      -        },
      -        "verdict": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Verdict"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "ErrorDetail": {
      -      "properties": {
      -        "code": {
      -          "enum": [
      -            "invalid_argument",
      -            "not_found",
      -            "rate_limit_exceeded",
      -            "auth_required",
      -            "tier_limit",
      -            "upstream_timeout",
      -            "upstream_error",
      -            "internal_error"
      -          ],
      -          "type": "string"
      -        },
      -        "docs_url": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "message": {
      -          "maxLength": 500,
      -          "type": "string"
      -        },
      -        "retry_after_seconds": {
      -          "anyOf": [
      -            {
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "upgrade_url": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "required": [
      -        "code",
      -        "message"
      -      ],
      -      "type": "object"
      -    },
      -    "ErrorResponse": {
      -      "properties": {
      -        "error": {
      -          "$ref": "#/$defs/ErrorDetail"
      -        }
      -      },
      -      "required": [
      -        "error"
      -      ],
      -      "type": "object"
      -    },
      -    "PivotHint": {
      -      "additionalProperties": true,
      -      "properties": {
      -        "input": {
      -          "type": "string"
      -        },
      -        "params": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": {
      -                "type": "string"
      -              },
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "reason": {
      -          "type": "string"
      -        },
      -        "tool": {
      -          "enum": [
      -            "cve_lookup",
      -            "cve_search",
      -            "cve_leading",
      -            "bulk_cve_lookup",
      -            "calculate_risk_score",
      -            "get_cvss_details",
      -            "exploit_lookup",
      -            "kev_detail",
      -            "cwe_lookup",
      -            "subdomain_enum",
      -            "ssl_check",
      -            "tech_fingerprint",
      -            "asn_lookup",
      -            "ip_lookup",
      -            "ioc_lookup",
      -            "bulk_ioc_lookup",
      -            "hash_lookup",
      -            "threat_intel",
      -            "threat_report",
      -            "audit_domain",
      -            "domain_report",
      -            "dns_lookup",
      -            "whois_lookup",
      -            "wayback_lookup",
      -            "scan_headers",
      -            "check_headers",
      -            "check_secrets",
      -            "check_injection",
      -            "check_dependencies",
      -            "email_mx",
      -            "email_security_posture",
      -            "email_disposable",
      -            "email_verify",
      -            "robots_txt",
      -            "redirect_chain",
      -            "brand_assets",
      -            "seo_audit",
      -            "phone_lookup",
      -            "username_lookup",
      -            "password_check",
      -            "phishing_check",
      -            "atlas_technique_lookup",
      -            "atlas_technique_search",
      -            "bulk_atlas_technique_lookup",
      -            "atlas_case_study_lookup",
      -            "atlas_case_study_search",
      -            "d3fend_defense_lookup",
      -            "d3fend_defense_search",
      -            "d3fend_defense_for_attack",
      -            "d3fend_attack_coverage",
      -            "sigma_rule_lookup",
      -            "bulk_sigma_rule_lookup",
      -            "tech_stack_cve_audit"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "tool",
      -        "input",
      -        "reason"
      -      ],
      -      "type": "object"
      -    },
      -    "Verdict": {
      -      "properties": {
      -        "completeness": {
      -          "enum": [
      -            "complete",
      -            "partial",
      -            "minimal"
      -          ],
      -          "type": "string"
      -        },
      -        "data_age_seconds": {
      -          "anyOf": [
      -            {
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "deterministic": {
      -          "type": "boolean"
      -        },
      -        "falsifiable_fields": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "sources_queried": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "sources_unavailable": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "required": [
      -        "deterministic"
      -      ],
      -      "type": "object"
      -    }
      -  },
      -  "properties": {
      -    "result": {
      -      "anyOf": [
      -        {
      -          "$ref": "#/$defs/D3fendDefenseSearchResponse"
      -        },
      -        {
      -          "$ref": "#/$defs/ErrorResponse"
      -        }
      -      ]
      -    }
      -  },
      -  "required": [
      -    "result"
      -  ],
      -  "type": "object"
      -}New value: +null
  5. Changed76 schema fields changed
    • removedOutput schema / $defs / D3fendDefenseListItem / description
      Removed value: -"Slim D3FEND defense row for search results (no attack_techniques list)."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / artifact / default
      Removed value: -null
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / artifact / description
      Removed value: -"Targeted digital artifact."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / artifact / title
      Removed value: -"Artifact"
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / defense_id / description
      Removed value: -"D3FEND defense slug."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / defense_id / title
      Removed value: -"Defense Id"
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / label / description
      Removed value: -"Human-readable defense name."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / label / title
      Removed value: -"Label"
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / parent_label / default
      Removed value: -null
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / parent_label / description
      Removed value: -"Parent defense category."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / parent_label / title
      Removed value: -"Parent Label"
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / tactic / description
      Removed value: -"D3FEND tactic."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / tactic / title
      Removed value: -"Tactic"
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / uri / default
      Removed value: -null
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / uri / description
      Removed value: -"Full D3FEND ontology URI. Omitted in slim default; pass include=full to get it back."
    • removedOutput schema / $defs / D3fendDefenseListItem / properties / uri / title
      Removed value: -"Uri"
    • removedOutput schema / $defs / D3fendDefenseListItem / title
      Removed value: -"D3fendDefenseListItem"
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / description
      Removed value: -"List response for d3fend_defense_search."
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / next_calls / default
      Removed value: -null
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / next_calls / description
      Removed value: -"Suggested follow-up MCP tool calls. Ordered by relevance; agents should chain these without re-prompting the user."
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / next_calls / title
      Removed value: -"Next Calls"
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / query / description
      Removed value: -"Echo of input filters (keyword/tactic/artifact)."
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / query / title
      Removed value: -"Query"
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / results / description
      Removed value: -"Matching D3FEND defenses."
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / results / title
      Removed value: -"Results"
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / total / default
      Removed value: -0
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / total / description
      Removed value: -"Number of defenses returned (capped at 200)."
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / total / title
      Removed value: -"Total"
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / verdict / default
      Removed value: -null
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / properties / verdict / description
      Removed value: -"Falsifiability metadata: sources_queried, sources_unavailable, completeness, deterministic flag. Lets agents distinguish 'no data' from 'source failed' without re-running the call."
    • removedOutput schema / $defs / D3fendDefenseSearchResponse / title
      Removed value: -"D3fendDefenseSearchResponse"
    • removedOutput schema / $defs / ErrorDetail / description
      Removed value: -"Structured failure body. Codes mirror app/exceptions.AppException\nsubclasses; agent retry / upgrade decisions key off `code`, not `message`."
    • removedOutput schema / $defs / ErrorDetail / properties / code / description
      Removed value: -"Stable machine-readable failure category. Agents key retry/upgrade decisions off this."
    • removedOutput schema / $defs / ErrorDetail / properties / code / title
      Removed value: -"Code"
    • removedOutput schema / $defs / ErrorDetail / properties / docs_url / default
      Removed value: -null
    • removedOutput schema / $defs / ErrorDetail / properties / docs_url / description
      Removed value: -"Documentation pointer (e.g. tool input contract) when code='invalid_argument'."
    • removedOutput schema / $defs / ErrorDetail / properties / docs_url / title
      Removed value: -"Docs Url"
    • removedOutput schema / $defs / ErrorDetail / properties / message / description
      Removed value: -"Human-readable detail. Free text — never parse. Capped at 500 chars to prevent oversized upstream errors from bloating responses."
    • removedOutput schema / $defs / ErrorDetail / properties / message / title
      Removed value: -"Message"
    • removedOutput schema / $defs / ErrorDetail / properties / retry_after_seconds / default
      Removed value: -null
    • removedOutput schema / $defs / ErrorDetail / properties / retry_after_seconds / description
      Removed value: -"When code='rate_limit_exceeded', the minimum seconds to wait before retrying."
    • removedOutput schema / $defs / ErrorDetail / properties / retry_after_seconds / title
      Removed value: -"Retry After Seconds"
    • removedOutput schema / $defs / ErrorDetail / properties / upgrade_url / default
      Removed value: -null
    • removedOutput schema / $defs / ErrorDetail / properties / upgrade_url / description
      Removed value: -"Pricing/upgrade URL when code='tier_limit' or 'rate_limit_exceeded' on the Free tier."
    • removedOutput schema / $defs / ErrorDetail / properties / upgrade_url / title
      Removed value: -"Upgrade Url"
    • removedOutput schema / $defs / ErrorDetail / title
      Removed value: -"ErrorDetail"
    • removedOutput schema / $defs / ErrorResponse / description
      Removed value: -"MCP error envelope. Tool return type is always\n`SpecificResponse | ErrorResponse` — Union flag tells the agent which arm\narrived without parsing the inner body."
    • removedOutput schema / $defs / ErrorResponse / title
      Removed value: -"ErrorResponse"
    • removedOutput schema / $defs / PivotHint / description
      Removed value: -"A suggested follow-up MCP tool call. Surfaced inside response.next_calls so\nLLM agents can chain related lookups without manual prompting. Each hint names\nthe tool, the input value to pass, and a short reason explaining why this\npivot adds value in the current context."
    • removedOutput schema / $defs / PivotHint / properties / input / description
      Removed value: -"Suggested input value to pass to the tool — typically a CVE ID, CWE ID, domain, or IP. Pre-populated from the current response so the agent can call the next tool without re-deriving the argument."
    • removedOutput schema / $defs / PivotHint / properties / input / title
      Removed value: -"Input"
    • removedOutput schema / $defs / PivotHint / properties / params / default
      Removed value: -null
    • removedOutput schema / $defs / PivotHint / properties / params / description
      Removed value: -"Optional extra kwargs to pass alongside `input`. Used by pivot generators when the next call benefits from a secondary parameter, e.g. {'exclude_id': 'AML.T0051'} to skip the originating technique from a sibling-tactic search. Omitted when no extra args are needed."
    • removedOutput schema / $defs / PivotHint / properties / params / title
      Removed value: -"Params"
    • removedOutput schema / $defs / PivotHint / properties / reason / description
      Removed value: -"Short rationale (one sentence) for why this follow-up call adds value, e.g. 'Federal patch deadline + ransomware association', 'Public exploits / PoC availability'."
    • removedOutput schema / $defs / PivotHint / properties / reason / title
      Removed value: -"Reason"
    • removedOutput schema / $defs / PivotHint / properties / tool / description
      Removed value: -"Canonical MCP tool name to call next. Constrained to known operation_ids in tools/list — adding a new tool here requires expanding the Literal."
    • removedOutput schema / $defs / PivotHint / properties / tool / title
      Removed value: -"Tool"
    • removedOutput schema / $defs / PivotHint / title
      Removed value: -"PivotHint"
    • removedOutput schema / $defs / Verdict / properties / completeness / default
      Removed value: -"complete"
    • removedOutput schema / $defs / Verdict / properties / completeness / description
      Removed value: -"'complete' = every planned source returned data; 'partial' = at least one source in sources_unavailable failed or was skipped; 'minimal' = only the primary/required source returned, optional enrichment missing."
    • removedOutput schema / $defs / Verdict / properties / completeness / title
      Removed value: -"Completeness"
    • removedOutput schema / $defs / Verdict / properties / data_age_seconds / default
      Removed value: -null
    • removedOutput schema / $defs / Verdict / properties / data_age_seconds / description
      Removed value: -"Seconds elapsed since the oldest cached source was fetched, or null when every source was queried live for this request. Use to judge freshness."
    • removedOutput schema / $defs / Verdict / properties / data_age_seconds / title
      Removed value: -"Data Age Seconds"
    • removedOutput schema / $defs / Verdict / properties / deterministic / description
      Removed value: -"True when the response is fully reproducible from the listed sources for the same input at the same moment (no randomness, no model inference). False for endpoints that include probabilistic scoring or LLM output."
    • removedOutput schema / $defs / Verdict / properties / deterministic / title
      Removed value: -"Deterministic"
    • removedOutput schema / $defs / Verdict / properties / falsifiable_fields / description
      Removed value: -"Top-level response fields whose values a caller can independently re-derive from the named upstream sources (e.g. 'dns', 'ssl', 'whois'). Fields not in this list are derived/computed and cannot be directly re-verified."
    • removedOutput schema / $defs / Verdict / properties / falsifiable_fields / title
      Removed value: -"Falsifiable Fields"
    • removedOutput schema / $defs / Verdict / properties / sources_queried / description
      Removed value: -"Canonical source identifiers successfully consulted for this response (e.g. 'ripe_stat', 'shodan_internetdb', 'firehol'). Agent-readable list, order not significant."
    • removedOutput schema / $defs / Verdict / properties / sources_queried / title
      Removed value: -"Sources Queried"
    • removedOutput schema / $defs / Verdict / properties / sources_unavailable / description
      Removed value: -"Sources that were expected but not returned — either intentionally skipped (lite mode, tier gating) or failed (quota, timeout, upstream down). Empty list means every planned source produced data."
    • removedOutput schema / $defs / Verdict / properties / sources_unavailable / title
      Removed value: -"Sources Unavailable"
    • removedOutput schema / $defs / Verdict / title
      Removed value: -"Verdict"
    • removedOutput schema / properties / result / title
      Removed value: -"Result"
    • removedOutput schema / title
      Removed value: -"d3fend_defense_searchOutput"
  6. Changed1 schema field changed
    • changedOutput schema / $defs / PivotHint / properties / tool / enum
      Previous value: -[
      -  "cve_lookup",
      -  "cve_search",
      -  "cve_leading",
      -  "bulk_cve_lookup",
      -  "calculate_risk_score",
      -  "get_cvss_details",
      -  "exploit_lookup",
      -  "kev_detail",
      -  "cwe_lookup",
      -  "subdomain_enum",
      -  "ssl_check",
      -  "tech_fingerprint",
      -  "asn_lookup",
      -  "ip_lookup",
      -  "ioc_lookup",
      -  "bulk_ioc_lookup",
      -  "hash_lookup",
      -  "threat_intel",
      -  "threat_report",
      -  "audit_domain",
      -  "domain_report",
      -  "dns_lookup",
      -  "whois_lookup",
      -  "wayback_lookup",
      -  "scan_headers",
      -  "check_headers",
      -  "check_secrets",
      -  "check_injection",
      -  "check_dependencies",
      -  "email_mx",
      -  "email_security_posture",
      -  "email_disposable",
      -  "email_verify",
      -  "robots_txt",
      -  "redirect_chain",
      -  "brand_assets",
      -  "seo_audit",
      -  "phone_lookup",
      -  "username_lookup",
      -  "password_check",
      -  "phishing_check",
      -  "atlas_technique_lookup",
      -  "atlas_technique_search",
      -  "bulk_atlas_technique_lookup",
      -  "atlas_case_study_lookup",
      -  "atlas_case_study_search",
      -  "d3fend_defense_lookup",
      -  "d3fend_defense_search",
      -  "d3fend_defense_for_attack",
      -  "d3fend_attack_coverage",
      -  "sigma_rule_lookup",
      -  "bulk_sigma_rule_lookup"
      -]New value: +[
      +  "cve_lookup",
      +  "cve_search",
      +  "cve_leading",
      +  "bulk_cve_lookup",
      +  "calculate_risk_score",
      +  "get_cvss_details",
      +  "exploit_lookup",
      +  "kev_detail",
      +  "cwe_lookup",
      +  "subdomain_enum",
      +  "ssl_check",
      +  "tech_fingerprint",
      +  "asn_lookup",
      +  "ip_lookup",
      +  "ioc_lookup",
      +  "bulk_ioc_lookup",
      +  "hash_lookup",
      +  "threat_intel",
      +  "threat_report",
      +  "audit_domain",
      +  "domain_report",
      +  "dns_lookup",
      +  "whois_lookup",
      +  "wayback_lookup",
      +  "scan_headers",
      +  "check_headers",
      +  "check_secrets",
      +  "check_injection",
      +  "check_dependencies",
      +  "email_mx",
      +  "email_security_posture",
      +  "email_disposable",
      +  "email_verify",
      +  "robots_txt",
      +  "redirect_chain",
      +  "brand_assets",
      +  "seo_audit",
      +  "phone_lookup",
      +  "username_lookup",
      +  "password_check",
      +  "phishing_check",
      +  "atlas_technique_lookup",
      +  "atlas_technique_search",
      +  "bulk_atlas_technique_lookup",
      +  "atlas_case_study_lookup",
      +  "atlas_case_study_search",
      +  "d3fend_defense_lookup",
      +  "d3fend_defense_search",
      +  "d3fend_defense_for_attack",
      +  "d3fend_attack_coverage",
      +  "sigma_rule_lookup",
      +  "bulk_sigma_rule_lookup",
      +  "tech_stack_cve_audit"
      +]
  7. Changed1 schema field changed
    • changedOutput schema / $defs / PivotHint / properties / tool / enum
      Previous value: -[
      -  "cve_lookup",
      -  "cve_search",
      -  "cve_leading",
      -  "bulk_cve_lookup",
      -  "calculate_risk_score",
      -  "get_cvss_details",
      -  "exploit_lookup",
      -  "kev_detail",
      -  "cwe_lookup",
      -  "subdomain_enum",
      -  "ssl_check",
      -  "tech_fingerprint",
      -  "asn_lookup",
      -  "ip_lookup",
      -  "ioc_lookup",
      -  "bulk_ioc_lookup",
      -  "hash_lookup",
      -  "threat_intel",
      -  "threat_report",
      -  "audit_domain",
      -  "domain_report",
      -  "dns_lookup",
      -  "whois_lookup",
      -  "wayback_lookup",
      -  "scan_headers",
      -  "check_headers",
      -  "check_secrets",
      -  "check_injection",
      -  "check_dependencies",
      -  "email_mx",
      -  "email_security_posture",
      -  "email_disposable",
      -  "email_verify",
      -  "robots_txt",
      -  "redirect_chain",
      -  "brand_assets",
      -  "seo_audit",
      -  "phone_lookup",
      -  "username_lookup",
      -  "password_check",
      -  "phishing_check",
      -  "atlas_technique_lookup",
      -  "atlas_technique_search",
      -  "bulk_atlas_technique_lookup",
      -  "atlas_case_study_lookup",
      -  "atlas_case_study_search",
      -  "d3fend_defense_lookup",
      -  "d3fend_defense_search",
      -  "d3fend_defense_for_attack",
      -  "d3fend_attack_coverage"
      -]New value: +[
      +  "cve_lookup",
      +  "cve_search",
      +  "cve_leading",
      +  "bulk_cve_lookup",
      +  "calculate_risk_score",
      +  "get_cvss_details",
      +  "exploit_lookup",
      +  "kev_detail",
      +  "cwe_lookup",
      +  "subdomain_enum",
      +  "ssl_check",
      +  "tech_fingerprint",
      +  "asn_lookup",
      +  "ip_lookup",
      +  "ioc_lookup",
      +  "bulk_ioc_lookup",
      +  "hash_lookup",
      +  "threat_intel",
      +  "threat_report",
      +  "audit_domain",
      +  "domain_report",
      +  "dns_lookup",
      +  "whois_lookup",
      +  "wayback_lookup",
      +  "scan_headers",
      +  "check_headers",
      +  "check_secrets",
      +  "check_injection",
      +  "check_dependencies",
      +  "email_mx",
      +  "email_security_posture",
      +  "email_disposable",
      +  "email_verify",
      +  "robots_txt",
      +  "redirect_chain",
      +  "brand_assets",
      +  "seo_audit",
      +  "phone_lookup",
      +  "username_lookup",
      +  "password_check",
      +  "phishing_check",
      +  "atlas_technique_lookup",
      +  "atlas_technique_search",
      +  "bulk_atlas_technique_lookup",
      +  "atlas_case_study_lookup",
      +  "atlas_case_study_search",
      +  "d3fend_defense_lookup",
      +  "d3fend_defense_search",
      +  "d3fend_defense_for_attack",
      +  "d3fend_attack_coverage",
      +  "sigma_rule_lookup",
      +  "bulk_sigma_rule_lookup"
      +]
  8. Changed1 schema field changed
    • changedOutput schema / $defs / PivotHint / properties / tool / enum
      Previous value: -[
      -  "cve_lookup",
      -  "cve_search",
      -  "cve_leading",
      -  "bulk_cve_lookup",
      -  "calculate_risk_score",
      -  "get_cvss_details",
      -  "exploit_lookup",
      -  "kev_detail",
      -  "cwe_lookup",
      -  "subdomain_enum",
      -  "ssl_check",
      -  "tech_fingerprint",
      -  "asn_lookup",
      -  "ip_lookup",
      -  "ioc_lookup",
      -  "bulk_ioc_lookup",
      -  "hash_lookup",
      -  "threat_intel",
      -  "threat_report",
      -  "audit_domain",
      -  "domain_report",
      -  "dns_lookup",
      -  "whois_lookup",
      -  "wayback_lookup",
      -  "scan_headers",
      -  "check_headers",
      -  "check_secrets",
      -  "check_injection",
      -  "check_dependencies",
      -  "email_mx",
      -  "email_disposable",
      -  "email_verify",
      -  "robots_txt",
      -  "redirect_chain",
      -  "brand_assets",
      -  "seo_audit",
      -  "phone_lookup",
      -  "username_lookup",
      -  "password_check",
      -  "phishing_check",
      -  "atlas_technique_lookup",
      -  "atlas_technique_search",
      -  "bulk_atlas_technique_lookup",
      -  "atlas_case_study_lookup",
      -  "atlas_case_study_search",
      -  "d3fend_defense_lookup",
      -  "d3fend_defense_search",
      -  "d3fend_defense_for_attack",
      -  "d3fend_attack_coverage"
      -]New value: +[
      +  "cve_lookup",
      +  "cve_search",
      +  "cve_leading",
      +  "bulk_cve_lookup",
      +  "calculate_risk_score",
      +  "get_cvss_details",
      +  "exploit_lookup",
      +  "kev_detail",
      +  "cwe_lookup",
      +  "subdomain_enum",
      +  "ssl_check",
      +  "tech_fingerprint",
      +  "asn_lookup",
      +  "ip_lookup",
      +  "ioc_lookup",
      +  "bulk_ioc_lookup",
      +  "hash_lookup",
      +  "threat_intel",
      +  "threat_report",
      +  "audit_domain",
      +  "domain_report",
      +  "dns_lookup",
      +  "whois_lookup",
      +  "wayback_lookup",
      +  "scan_headers",
      +  "check_headers",
      +  "check_secrets",
      +  "check_injection",
      +  "check_dependencies",
      +  "email_mx",
      +  "email_security_posture",
      +  "email_disposable",
      +  "email_verify",
      +  "robots_txt",
      +  "redirect_chain",
      +  "brand_assets",
      +  "seo_audit",
      +  "phone_lookup",
      +  "username_lookup",
      +  "password_check",
      +  "phishing_check",
      +  "atlas_technique_lookup",
      +  "atlas_technique_search",
      +  "bulk_atlas_technique_lookup",
      +  "atlas_case_study_lookup",
      +  "atlas_case_study_search",
      +  "d3fend_defense_lookup",
      +  "d3fend_defense_search",
      +  "d3fend_defense_for_attack",
      +  "d3fend_attack_coverage"
      +]
  9. Changed1 schema field changed
    • changedOutput schema / $defs / PivotHint / properties / tool / enum
      Previous value: -[
      -  "cve_lookup",
      -  "cve_search",
      -  "cve_leading",
      -  "bulk_cve_lookup",
      -  "exploit_lookup",
      -  "kev_detail",
      -  "cwe_lookup",
      -  "subdomain_enum",
      -  "ssl_check",
      -  "tech_fingerprint",
      -  "asn_lookup",
      -  "ip_lookup",
      -  "ioc_lookup",
      -  "bulk_ioc_lookup",
      -  "hash_lookup",
      -  "threat_intel",
      -  "threat_report",
      -  "audit_domain",
      -  "domain_report",
      -  "dns_lookup",
      -  "whois_lookup",
      -  "wayback_lookup",
      -  "scan_headers",
      -  "check_headers",
      -  "check_secrets",
      -  "check_injection",
      -  "check_dependencies",
      -  "email_mx",
      -  "email_disposable",
      -  "email_verify",
      -  "robots_txt",
      -  "redirect_chain",
      -  "brand_assets",
      -  "seo_audit",
      -  "phone_lookup",
      -  "username_lookup",
      -  "password_check",
      -  "phishing_check",
      -  "atlas_technique_lookup",
      -  "atlas_technique_search",
      -  "bulk_atlas_technique_lookup",
      -  "atlas_case_study_lookup",
      -  "atlas_case_study_search",
      -  "d3fend_defense_lookup",
      -  "d3fend_defense_search",
      -  "d3fend_defense_for_attack",
      -  "d3fend_attack_coverage"
      -]New value: +[
      +  "cve_lookup",
      +  "cve_search",
      +  "cve_leading",
      +  "bulk_cve_lookup",
      +  "calculate_risk_score",
      +  "get_cvss_details",
      +  "exploit_lookup",
      +  "kev_detail",
      +  "cwe_lookup",
      +  "subdomain_enum",
      +  "ssl_check",
      +  "tech_fingerprint",
      +  "asn_lookup",
      +  "ip_lookup",
      +  "ioc_lookup",
      +  "bulk_ioc_lookup",
      +  "hash_lookup",
      +  "threat_intel",
      +  "threat_report",
      +  "audit_domain",
      +  "domain_report",
      +  "dns_lookup",
      +  "whois_lookup",
      +  "wayback_lookup",
      +  "scan_headers",
      +  "check_headers",
      +  "check_secrets",
      +  "check_injection",
      +  "check_dependencies",
      +  "email_mx",
      +  "email_disposable",
      +  "email_verify",
      +  "robots_txt",
      +  "redirect_chain",
      +  "brand_assets",
      +  "seo_audit",
      +  "phone_lookup",
      +  "username_lookup",
      +  "password_check",
      +  "phishing_check",
      +  "atlas_technique_lookup",
      +  "atlas_technique_search",
      +  "bulk_atlas_technique_lookup",
      +  "atlas_case_study_lookup",
      +  "atlas_case_study_search",
      +  "d3fend_defense_lookup",
      +  "d3fend_defense_search",
      +  "d3fend_defense_for_attack",
      +  "d3fend_attack_coverage"
      +]
  10. Changed1 schema field changed
    • changedOutput schema / $defs / PivotHint / properties / tool / enum
      Previous value: -[
      -  "cve_lookup",
      -  "cve_search",
      -  "cve_leading",
      -  "bulk_cve_lookup",
      -  "exploit_lookup",
      -  "kev_detail",
      -  "cwe_lookup",
      -  "subdomain_enum",
      -  "ssl_check",
      -  "tech_fingerprint",
      -  "asn_lookup",
      -  "ip_lookup",
      -  "ioc_lookup",
      -  "bulk_ioc_lookup",
      -  "hash_lookup",
      -  "threat_intel",
      -  "threat_report",
      -  "audit_domain",
      -  "domain_report",
      -  "dns_lookup",
      -  "whois_lookup",
      -  "wayback_lookup",
      -  "scan_headers",
      -  "check_headers",
      -  "check_secrets",
      -  "check_injection",
      -  "check_dependencies",
      -  "email_mx",
      -  "email_disposable",
      -  "phone_lookup",
      -  "username_lookup",
      -  "password_check",
      -  "phishing_check",
      -  "atlas_technique_lookup",
      -  "atlas_technique_search",
      -  "bulk_atlas_technique_lookup",
      -  "atlas_case_study_lookup",
      -  "atlas_case_study_search",
      -  "d3fend_defense_lookup",
      -  "d3fend_defense_search",
      -  "d3fend_defense_for_attack",
      -  "d3fend_attack_coverage"
      -]New value: +[
      +  "cve_lookup",
      +  "cve_search",
      +  "cve_leading",
      +  "bulk_cve_lookup",
      +  "exploit_lookup",
      +  "kev_detail",
      +  "cwe_lookup",
      +  "subdomain_enum",
      +  "ssl_check",
      +  "tech_fingerprint",
      +  "asn_lookup",
      +  "ip_lookup",
      +  "ioc_lookup",
      +  "bulk_ioc_lookup",
      +  "hash_lookup",
      +  "threat_intel",
      +  "threat_report",
      +  "audit_domain",
      +  "domain_report",
      +  "dns_lookup",
      +  "whois_lookup",
      +  "wayback_lookup",
      +  "scan_headers",
      +  "check_headers",
      +  "check_secrets",
      +  "check_injection",
      +  "check_dependencies",
      +  "email_mx",
      +  "email_disposable",
      +  "email_verify",
      +  "robots_txt",
      +  "redirect_chain",
      +  "brand_assets",
      +  "seo_audit",
      +  "phone_lookup",
      +  "username_lookup",
      +  "password_check",
      +  "phishing_check",
      +  "atlas_technique_lookup",
      +  "atlas_technique_search",
      +  "bulk_atlas_technique_lookup",
      +  "atlas_case_study_lookup",
      +  "atlas_case_study_search",
      +  "d3fend_defense_lookup",
      +  "d3fend_defense_search",
      +  "d3fend_defense_for_attack",
      +  "d3fend_attack_coverage"
      +]
  11. Changed3 schema fields changed
    • addedOutput schema / $defs
      Added value: +{
      +  "D3fendDefenseListItem": {
      +    "additionalProperties": true,
      +    "description": "Slim D3FEND defense row for search results (no attack_techniques list).",
      +    "properties": {
      +      "artifact": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Targeted digital artifact.",
      +        "title": "Artifact"
      +      },
      +      "defense_id": {
      +        "description": "D3FEND defense slug.",
      +        "title": "Defense Id",
      +        "type": "string"
      +      },
      +      "label": {
      +        "description": "Human-readable defense name.",
      +        "title": "Label",
      +        "type": "string"
      +      },
      +      "parent_label": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Parent defense category.",
      +        "title": "Parent Label"
      +      },
      +      "tactic": {
      +        "description": "D3FEND tactic.",
      +        "title": "Tactic",
      +        "type": "string"
      +      },
      +      "uri": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Full D3FEND ontology URI. Omitted in slim default; pass include=full to get it back.",
      +        "title": "Uri"
      +      }
      +    },
      +    "required": [
      +      "defense_id",
      +      "label",
      +      "tactic"
      +    ],
      +    "title": "D3fendDefenseListItem",
      +    "type": "object"
      +  },
      +  "D3fendDefenseSearchResponse": {
      +    "additionalProperties": true,
      +    "description": "List response for d3fend_defense_search.",
      +    "properties": {
      +      "next_calls": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "$ref": "#/$defs/PivotHint"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Suggested follow-up MCP tool calls. Ordered by relevance; agents should chain these without re-prompting the user.",
      +        "title": "Next Calls"
      +      },
      +      "query": {
      +        "additionalProperties": true,
      +        "description": "Echo of input filters (keyword/tactic/artifact).",
      +        "title": "Query",
      +        "type": "object"
      +      },
      +      "results": {
      +        "description": "Matching D3FEND defenses.",
      +        "items": {
      +          "$ref": "#/$defs/D3fendDefenseListItem"
      +        },
      +        "title": "Results",
      +        "type": "array"
      +      },
      +      "total": {
      +        "default": 0,
      +        "description": "Number of defenses returned (capped at 200).",
      +        "title": "Total",
      +        "type": "integer"
      +      },
      +      "verdict": {
      +        "anyOf": [
      +          {
      +            "$ref": "#/$defs/Verdict"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Falsifiability metadata: sources_queried, sources_unavailable, completeness, deterministic flag. Lets agents distinguish 'no data' from 'source failed' without re-running the call."
      +      }
      +    },
      +    "title": "D3fendDefenseSearchResponse",
      +    "type": "object"
      +  },
      +  "ErrorDetail": {
      +    "description": "Structured failure body. Codes mirror app/exceptions.AppException\nsubclasses; agent retry / upgrade decisions key off `code`, not `message`.",
      +    "properties": {
      +      "code": {
      +        "description": "Stable machine-readable failure category. Agents key retry/upgrade decisions off this.",
      +        "enum": [
      +          "invalid_argument",
      +          "not_found",
      +          "rate_limit_exceeded",
      +          "auth_required",
      +          "tier_limit",
      +          "upstream_timeout",
      +          "upstream_error",
      +          "internal_error"
      +        ],
      +        "title": "Code",
      +        "type": "string"
      +      },
      +      "docs_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Documentation pointer (e.g. tool input contract) when code='invalid_argument'.",
      +        "title": "Docs Url"
      +      },
      +      "message": {
      +        "description": "Human-readable detail. Free text — never parse. Capped at 500 chars to prevent oversized upstream errors from bloating responses.",
      +        "maxLength": 500,
      +        "title": "Message",
      +        "type": "string"
      +      },
      +      "retry_after_seconds": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "When code='rate_limit_exceeded', the minimum seconds to wait before retrying.",
      +        "title": "Retry After Seconds"
      +      },
      +      "upgrade_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Pricing/upgrade URL when code='tier_limit' or 'rate_limit_exceeded' on the Free tier.",
      +        "title": "Upgrade Url"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "message"
      +    ],
      +    "title": "ErrorDetail",
      +    "type": "object"
      +  },
      +  "ErrorResponse": {
      +    "description": "MCP error envelope. Tool return type is always\n`SpecificResponse | ErrorResponse` — Union flag tells the agent which arm\narrived without parsing the inner body.",
      +    "properties": {
      +      "error": {
      +        "$ref": "#/$defs/ErrorDetail"
      +      }
      +    },
      +    "required": [
      +      "error"
      +    ],
      +    "title": "ErrorResponse",
      +    "type": "object"
      +  },
      +  "PivotHint": {
      +    "additionalProperties": true,
      +    "description": "A suggested follow-up MCP tool call. Surfaced inside response.next_calls so\nLLM agents can chain related lookups without manual prompting. Each hint names\nthe tool, the input value to pass, and a short reason explaining why this\npivot adds value in the current context.",
      +    "properties": {
      +      "input": {
      +        "description": "Suggested input value to pass to the tool — typically a CVE ID, CWE ID, domain, or IP. Pre-populated from the current response so the agent can call the next tool without re-deriving the argument.",
      +        "title": "Input",
      +        "type": "string"
      +      },
      +      "params": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Optional extra kwargs to pass alongside `input`. Used by pivot generators when the next call benefits from a secondary parameter, e.g. {'exclude_id': 'AML.T0051'} to skip the originating technique from a sibling-tactic search. Omitted when no extra args are needed.",
      +        "title": "Params"
      +      },
      +      "reason": {
      +        "description": "Short rationale (one sentence) for why this follow-up call adds value, e.g. 'Federal patch deadline + ransomware association', 'Public exploits / PoC availability'.",
      +        "title": "Reason",
      +        "type": "string"
      +      },
      +      "tool": {
      +        "description": "Canonical MCP tool name to call next. Constrained to known operation_ids in tools/list — adding a new tool here requires expanding the Literal.",
      +        "enum": [
      +          "cve_lookup",
      +          "cve_search",
      +          "cve_leading",
      +          "bulk_cve_lookup",
      +          "exploit_lookup",
      +          "kev_detail",
      +          "cwe_lookup",
      +          "subdomain_enum",
      +          "ssl_check",
      +          "tech_fingerprint",
      +          "asn_lookup",
      +          "ip_lookup",
      +          "ioc_lookup",
      +          "bulk_ioc_lookup",
      +          "hash_lookup",
      +          "threat_intel",
      +          "threat_report",
      +          "audit_domain",
      +          "domain_report",
      +          "dns_lookup",
      +          "whois_lookup",
      +          "wayback_lookup",
      +          "scan_headers",
      +          "check_headers",
      +          "check_secrets",
      +          "check_injection",
      +          "check_dependencies",
      +          "email_mx",
      +          "email_disposable",
      +          "phone_lookup",
      +          "username_lookup",
      +          "password_check",
      +          "phishing_check",
      +          "atlas_technique_lookup",
      +          "atlas_technique_search",
      +          "bulk_atlas_technique_lookup",
      +          "atlas_case_study_lookup",
      +          "atlas_case_study_search",
      +          "d3fend_defense_lookup",
      +          "d3fend_defense_search",
      +          "d3fend_defense_for_attack",
      +          "d3fend_attack_coverage"
      +        ],
      +        "title": "Tool",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "tool",
      +      "input",
      +      "reason"
      +    ],
      +    "title": "PivotHint",
      +    "type": "object"
      +  },
      +  "Verdict": {
      +    "properties": {
      +      "completeness": {
      +        "default": "complete",
      +        "description": "'complete' = every planned source returned data; 'partial' = at least one source in sources_unavailable failed or was skipped; 'minimal' = only the primary/required source returned, optional enrichment missing.",
      +        "enum": [
      +          "complete",
      +          "partial",
      +          "minimal"
      +        ],
      +        "title": "Completeness",
      +        "type": "string"
      +      },
      +      "data_age_seconds": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Seconds elapsed since the oldest cached source was fetched, or null when every source was queried live for this request. Use to judge freshness.",
      +        "title": "Data Age Seconds"
      +      },
      +      "deterministic": {
      +        "description": "True when the response is fully reproducible from the listed sources for the same input at the same moment (no randomness, no model inference). False for endpoints that include probabilistic scoring or LLM output.",
      +        "title": "Deterministic",
      +        "type": "boolean"
      +      },
      +      "falsifiable_fields": {
      +        "description": "Top-level response fields whose values a caller can independently re-derive from the named upstream sources (e.g. 'dns', 'ssl', 'whois'). Fields not in this list are derived/computed and cannot be directly re-verified.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Falsifiable Fields",
      +        "type": "array"
      +      },
      +      "sources_queried": {
      +        "description": "Canonical source identifiers successfully consulted for this response (e.g. 'ripe_stat', 'shodan_internetdb', 'firehol'). Agent-readable list, order not significant.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Sources Queried",
      +        "type": "array"
      +      },
      +      "sources_unavailable": {
      +        "description": "Sources that were expected but not returned — either intentionally skipped (lite mode, tier gating) or failed (quota, timeout, upstream down). Empty list means every planned source produced data.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Sources Unavailable",
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "deterministic"
      +    ],
      +    "title": "Verdict",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / properties / result / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/$defs/D3fendDefenseSearchResponse"
      +  },
      +  {
      +    "$ref": "#/$defs/ErrorResponse"
      +  }
      +]
    • removedOutput schema / properties / result / type
      Removed value: -"string"
  12. Changed2 schema fields changed
    • addedInput schema / properties / exclude_id
      Added value: +{
      +  "default": "",
      +  "description": "Optional D3FEND defense slug (CamelCase, e.g. 'TokenBinding') to omit from results. Useful when chaining from d3fend_defense_lookup so the originating defense is not echoed back in its own siblings list. Omit when not needed.",
      +  "title": "Exclude Id",
      +  "type": "string"
      +}
    • addedInput schema / properties / include
      Added value: +{
      +  "default": "",
      +  "description": "Detail level. Default (omit/empty) returns slim rows (drops the deterministic ontology `uri` field, ~60 chars/row saved). Pass 'full' to get `uri` back on every row. The slug `defense_id` is always returned and uniquely identifies the defense.",
      +  "enum": [
      +    "",
      +    "full"
      +  ],
      +  "title": "Include",
      +  "type": "string"
      +}
  13. Added

TDQS

A5/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, etc.), the description reveals important behaviors: default SLIM response dropping uri, rate limits (Free: 30/hr, Pro: 500/hr), the exact return format, and the effect of include='full'. This adds substantial context not available from annotations alone.

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

Conciseness5/5

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

The description is dense but every sentence contributes: search purpose, default output behavior, exclude_id usage, example query, drill-down pointer, rate limits, and return shape. It is front-loaded with the primary action and structured logically, earning its 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?

Given the tool's 6 optional parameters and existing output schema, the description covers all necessary aspects: filtering options, output modes, rate limits, chaining behavior, and a concrete usage example. It even documents the return structure despite the output schema existing, providing complete guidance.

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 already has 100% parameter coverage, but the description boosts understanding by explaining the rationale for include ('saves ~60 chars/row'), the chaining use of exclude_id, and giving a worked example (tactic=Harden + artifact='Access Token'). It clarifies when 'uri' appears in results.

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 searches the MITRE D3FEND catalog by keyword, tactic, or artifact, and provides a concrete example ('what defenses harden access tokens?'). It distinguishes itself from d3fend_defense_lookup by positioning it as the discovery search that returns defense_ids for later lookup.

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 ('Use to discover defenses applicable to a given threat model') and names the alternative for drill-down ('Drill into d3fend_defense_lookup with any returned defense_id'). It also explains the chaining use case for exclude_id, giving clear 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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.