Skip to main content
Glama

Threat Report

threat_report
Read-onlyIdempotent

Query comprehensive threat profile for an IP: Shodan host data, AbuseIPDB reputation, ASN/geolocation, and open ports. Use for IP investigation and SOC alert triage; for domain data use domain_report. Note: nested asn block always returns at most 50 IPv4/IPv6 prefixes — call asn_lookup with include_full_prefixes=True for the full announced-prefixes list. enrichment.vulns is severity-aware list[VulnInfo] (cve_id + severity + cvss_v3) — Phase 2 v1.16.0 BREAKING; pre-1.16 it was list[str] of CVE IDs. Free: 30/hr (costs 6 tokens), Pro: 500/hr. Returns {ip, enrichment, abuseipdb, shodan, asn, threat_level}.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ipYesPublic IPv4 or IPv6 address to investigate (e.g. '8.8.8.8', '1.1.1.1'). Private/reserved IPs are rejected.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • changedOutput schema / properties / result / properties / asn_name / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / cloud_provider / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / country / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / firehol / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / next_calls / type
      Previous value: -"array"New value: +[
      +  "array",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / ptr / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / result / properties / verdict / type
      Previous value: -"object"New value: +[
      +  "object",
      +  "null"
      +]
  2. Changed5 schema fields changed
    • changedOutput schema / properties / result / properties / asn_name / type
      Previous value: -"object"New value: +"string"
    • changedOutput schema / properties / result / properties / cloud_provider / type
      Previous value: -"object"New value: +"string"
    • changedOutput schema / properties / result / properties / country / type
      Previous value: -"object"New value: +"string"
    • changedOutput schema / properties / result / properties / next_calls / type
      Previous value: -"object"New value: +"array"
    • changedOutput schema / properties / result / properties / ptr / type
      Previous value: -"object"New value: +"string"
  3. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "result": {
      +      "properties": {
      +        "abuseipdb": {
      +          "type": "object"
      +        },
      +        "asn": {
      +          "type": "object"
      +        },
      +        "asn_name": {
      +          "type": "object"
      +        },
      +        "cloud_provider": {
      +          "type": "object"
      +        },
      +        "country": {
      +          "type": "object"
      +        },
      +        "enrichment": {
      +          "type": "object"
      +        },
      +        "firehol": {
      +          "type": "object"
      +        },
      +        "ip": {
      +          "type": "string"
      +        },
      +        "is_datacenter": {
      +          "type": "boolean"
      +        },
      +        "next_calls": {
      +          "type": "object"
      +        },
      +        "ptr": {
      +          "type": "object"
      +        },
      +        "risk_score": {
      +          "type": "integer"
      +        },
      +        "severity_label": {
      +          "type": "string"
      +        },
      +        "shodan": {
      +          "type": "object"
      +        },
      +        "summary": {
      +          "type": "string"
      +        },
      +        "threat_level": {
      +          "type": "string"
      +        },
      +        "tor_exit": {
      +          "type": "boolean"
      +        },
      +        "verdict": {
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "ip"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "result"
      +  ],
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -{
      -  "$defs": {
      -    "AbuseIpdbInfo": {
      -      "properties": {
      -        "abuse_score": {
      -          "anyOf": [
      -            {
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "country": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "is_tor": {
      -          "anyOf": [
      -            {
      -              "type": "boolean"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "isp": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "reason": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "status": {
      -          "enum": [
      -            "ok",
      -            "skipped",
      -            "rate_limited",
      -            "error",
      -            "pro_only"
      -          ],
      -          "type": "string"
      -        },
      -        "total_reports": {
      -          "anyOf": [
      -            {
      -              "type": "integer"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "upgrade_url": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "usage_type": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "required": [
      -        "status"
      -      ],
      -      "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"
      -    },
      -    "IpEnrichmentInfo": {
      -      "properties": {
      -        "cpes": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "hostnames": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "internetdb_status": {
      -          "anyOf": [
      -            {
      -              "enum": [
      -                "ok",
      -                "error"
      -              ],
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "ports": {
      -          "items": {
      -            "type": "integer"
      -          },
      -          "type": "array"
      -        },
      -        "tags": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "vulns": {
      -          "items": {
      -            "$ref": "#/$defs/VulnInfo"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "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"
      -    },
      -    "ShodanRepInfo": {
      -      "properties": {
      -        "asn": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "city": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "country_name": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "hostnames": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "isp": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "last_update": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "org": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "os": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "ports": {
      -          "items": {
      -            "type": "integer"
      -          },
      -          "type": "array"
      -        },
      -        "reason": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "status": {
      -          "enum": [
      -            "ok",
      -            "skipped",
      -            "restricted",
      -            "rate_limited",
      -            "error",
      -            "pro_only"
      -          ],
      -          "type": "string"
      -        },
      -        "upgrade_url": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "vulns": {
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "required": [
      -        "status"
      -      ],
      -      "type": "object"
      -    },
      -    "ThreatReportResponse": {
      -      "properties": {
      -        "abuseipdb": {
      -          "$ref": "#/$defs/AbuseIpdbInfo"
      -        },
      -        "asn": {
      -          "additionalProperties": true,
      -          "type": "object"
      -        },
      -        "asn_name": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "cloud_provider": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "country": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "enrichment": {
      -          "$ref": "#/$defs/IpEnrichmentInfo"
      -        },
      -        "firehol": {
      -          "anyOf": [
      -            {
      -              "additionalProperties": true,
      -              "type": "object"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "ip": {
      -          "type": "string"
      -        },
      -        "is_datacenter": {
      -          "type": "boolean"
      -        },
      -        "next_calls": {
      -          "anyOf": [
      -            {
      -              "items": {
      -                "$ref": "#/$defs/PivotHint"
      -              },
      -              "type": "array"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "ptr": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "risk_score": {
      -          "type": "integer"
      -        },
      -        "severity_label": {
      -          "enum": [
      -            "low",
      -            "medium",
      -            "high",
      -            "critical"
      -          ],
      -          "type": "string"
      -        },
      -        "shodan": {
      -          "$ref": "#/$defs/ShodanRepInfo"
      -        },
      -        "summary": {
      -          "type": "string"
      -        },
      -        "threat_level": {
      -          "enum": [
      -            "none",
      -            "low",
      -            "medium",
      -            "high"
      -          ],
      -          "type": "string"
      -        },
      -        "tor_exit": {
      -          "type": "boolean"
      -        },
      -        "verdict": {
      -          "anyOf": [
      -            {
      -              "$ref": "#/$defs/Verdict"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        }
      -      },
      -      "required": [
      -        "ip"
      -      ],
      -      "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"
      -    },
      -    "VulnInfo": {
      -      "properties": {
      -        "cve_id": {
      -          "type": "string"
      -        },
      -        "cvss_v3": {
      -          "anyOf": [
      -            {
      -              "maximum": 10,
      -              "minimum": 0,
      -              "type": "number"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ]
      -        },
      -        "severity": {
      -          "enum": [
      -            "CRITICAL",
      -            "HIGH",
      -            "MEDIUM",
      -            "LOW",
      -            "UNKNOWN"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "cve_id",
      -        "severity"
      -      ],
      -      "type": "object"
      -    }
      -  },
      -  "properties": {
      -    "result": {
      -      "anyOf": [
      -        {
      -          "$ref": "#/$defs/ThreatReportResponse"
      -        },
      -        {
      -          "$ref": "#/$defs/ErrorResponse"
      -        }
      -      ]
      -    }
      -  },
      -  "required": [
      -    "result"
      -  ],
      -  "type": "object"
      -}New value: +null
  5. Changed180 schema fields changed
    • removedOutput schema / $defs / AbuseIpdbInfo / description
      Removed value: -"AbuseIPDB reputation check (Pro tier only)."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / abuse_score / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / abuse_score / description
      Removed value: -"AbuseIPDB confidence-of-abuse score (0-100). Only present when status='ok'."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / abuse_score / title
      Removed value: -"Abuse Score"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / country / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / country / description
      Removed value: -"ISO 3166-1 alpha-2 country code from AbuseIPDB geolocation (may differ from RIPE)."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / country / title
      Removed value: -"Country"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / is_tor / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / is_tor / description
      Removed value: -"AbuseIPDB's Tor exit flag (cross-reference with top-level tor_exit field)."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / is_tor / title
      Removed value: -"Is Tor"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / isp / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / isp / description
      Removed value: -"ISP name as reported by AbuseIPDB."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / isp / title
      Removed value: -"Isp"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / reason / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / reason / description
      Removed value: -"Human-readable reason string. Present when status is skipped/rate_limited/error/pro_only."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / reason / title
      Removed value: -"Reason"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / status / description
      Removed value: -"'ok' = data fetched; 'skipped' = API key not configured; 'rate_limited' = AbuseIPDB quota exceeded; 'error' = transient HTTP/network failure; 'pro_only' = returned on Free tier as upsell hint (see upgrade_url)."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / status / title
      Removed value: -"Status"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / total_reports / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / total_reports / description
      Removed value: -"Number of reports submitted against this IP in the last 90 days."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / total_reports / title
      Removed value: -"Total Reports"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / upgrade_url / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / upgrade_url / description
      Removed value: -"Upgrade link returned when status='pro_only'."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / upgrade_url / title
      Removed value: -"Upgrade Url"
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / usage_type / default
      Removed value: -null
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / usage_type / description
      Removed value: -"AbuseIPDB usage classification: 'Data Center/Web Hosting/Transit', 'ISP', 'Mobile ISP', etc."
    • removedOutput schema / $defs / AbuseIpdbInfo / properties / usage_type / title
      Removed value: -"Usage Type"
    • removedOutput schema / $defs / AbuseIpdbInfo / title
      Removed value: -"AbuseIpdbInfo"
    • 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 / IpEnrichmentInfo / description
      Removed value: -"Shodan InternetDB enrichment subset (free, no API key) embedded in /v1/threat_report.\n\nMirrors the {ports, hostnames, vulns, cpes, tags} block at the top of ip_lookup,\nplus an internetdb_status field that surfaces the upstream fetch outcome —\nextracted as a sub-model so MCP clients see a typed schema instead of an opaque dict slot."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / cpes / description
      Removed value: -"CPE 2.3 strings for services detected on this IP per Shodan InternetDB."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / cpes / title
      Removed value: -"Cpes"
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / hostnames / description
      Removed value: -"Hostnames Shodan InternetDB has observed pointing to this IP."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / hostnames / title
      Removed value: -"Hostnames"
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / internetdb_status / default
      Removed value: -null
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / internetdb_status / description
      Removed value: -"Outcome of the InternetDB fetch. 'error' indicates upstream failure; absent on cached/legacy paths."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / internetdb_status / title
      Removed value: -"Internetdb Status"
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / ports / description
      Removed value: -"Open ports observed by Shodan InternetDB. Empty on upstream failure (treat as 'no data', not 'closed')."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / ports / title
      Removed value: -"Ports"
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / tags / description
      Removed value: -"Shodan InternetDB classification tags (e.g. 'cdn', 'cloud', 'vpn', 'tor', 'self-signed')."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / tags / title
      Removed value: -"Tags"
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / vulns / description
      Removed value: -"CVEs Shodan InternetDB has associated with banners on this IP, enriched with severity + cvss_v3 from local cve.db (Phase 2 IP enrichment, v1.16.0 BREAKING). Pre-1.16 this was a flat list[str] of CVE IDs. Unknown CVEs emit severity='UNKNOWN'."
    • removedOutput schema / $defs / IpEnrichmentInfo / properties / vulns / title
      Removed value: -"Vulns"
    • removedOutput schema / $defs / IpEnrichmentInfo / title
      Removed value: -"IpEnrichmentInfo"
    • 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 / ShodanRepInfo / description
      Removed value: -"Shodan full API enrichment (Pro tier only). Richer than InternetDB fields at top level."
    • removedOutput schema / $defs / ShodanRepInfo / properties / asn / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / asn / description
      Removed value: -"ASN string per Shodan (e.g. 'AS13335'); may differ from top-level asn int."
    • removedOutput schema / $defs / ShodanRepInfo / properties / asn / title
      Removed value: -"Asn"
    • removedOutput schema / $defs / ShodanRepInfo / properties / city / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / city / description
      Removed value: -"City name per Shodan geolocation."
    • removedOutput schema / $defs / ShodanRepInfo / properties / city / title
      Removed value: -"City"
    • removedOutput schema / $defs / ShodanRepInfo / properties / country_name / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / country_name / description
      Removed value: -"Country name per Shodan geolocation."
    • removedOutput schema / $defs / ShodanRepInfo / properties / country_name / title
      Removed value: -"Country Name"
    • removedOutput schema / $defs / ShodanRepInfo / properties / hostnames / description
      Removed value: -"Hostnames observed pointing to this IP per Shodan."
    • removedOutput schema / $defs / ShodanRepInfo / properties / hostnames / title
      Removed value: -"Hostnames"
    • removedOutput schema / $defs / ShodanRepInfo / properties / isp / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / isp / description
      Removed value: -"ISP per Shodan (may differ from AbuseIPDB/RIPE)."
    • removedOutput schema / $defs / ShodanRepInfo / properties / isp / title
      Removed value: -"Isp"
    • removedOutput schema / $defs / ShodanRepInfo / properties / last_update / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / last_update / description
      Removed value: -"ISO 8601 timestamp of Shodan's most recent data point for this IP."
    • removedOutput schema / $defs / ShodanRepInfo / properties / last_update / title
      Removed value: -"Last Update"
    • removedOutput schema / $defs / ShodanRepInfo / properties / org / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / org / description
      Removed value: -"Organization name owning the IP per Shodan."
    • removedOutput schema / $defs / ShodanRepInfo / properties / org / title
      Removed value: -"Org"
    • removedOutput schema / $defs / ShodanRepInfo / properties / os / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / os / description
      Removed value: -"Shodan-detected operating system (fingerprint-based, best-effort)."
    • removedOutput schema / $defs / ShodanRepInfo / properties / os / title
      Removed value: -"Os"
    • removedOutput schema / $defs / ShodanRepInfo / properties / ports / description
      Removed value: -"Open ports observed by Shodan full scan (superset of top-level InternetDB ports)."
    • removedOutput schema / $defs / ShodanRepInfo / properties / ports / title
      Removed value: -"Ports"
    • removedOutput schema / $defs / ShodanRepInfo / properties / reason / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / reason / description
      Removed value: -"Human-readable reason. Present when status is skipped/restricted/rate_limited/error/pro_only."
    • removedOutput schema / $defs / ShodanRepInfo / properties / reason / title
      Removed value: -"Reason"
    • removedOutput schema / $defs / ShodanRepInfo / properties / status / description
      Removed value: -"'ok' = data fetched; 'skipped' = API key not configured; 'restricted' = 403 (IP not available on free Shodan tier); 'rate_limited' = 429 quota exceeded; 'error' = transient HTTP/network failure; 'pro_only' = returned on Free tier as upsell hint."
    • removedOutput schema / $defs / ShodanRepInfo / properties / status / title
      Removed value: -"Status"
    • removedOutput schema / $defs / ShodanRepInfo / properties / upgrade_url / default
      Removed value: -null
    • removedOutput schema / $defs / ShodanRepInfo / properties / upgrade_url / description
      Removed value: -"Upgrade link returned when status='pro_only'."
    • removedOutput schema / $defs / ShodanRepInfo / properties / upgrade_url / title
      Removed value: -"Upgrade Url"
    • removedOutput schema / $defs / ShodanRepInfo / properties / vulns / description
      Removed value: -"CVE IDs Shodan has associated with banners on this IP."
    • removedOutput schema / $defs / ShodanRepInfo / properties / vulns / title
      Removed value: -"Vulns"
    • removedOutput schema / $defs / ShodanRepInfo / title
      Removed value: -"ShodanRepInfo"
    • removedOutput schema / $defs / ThreatReportResponse / properties / abuseipdb / description
      Removed value: -"AbuseIPDB abuse-confidence enrichment. Pro tier returns live data; Free tier returns a {status:'pro_only', reason, upgrade_url} upsell stub (NOT an error). Pro failure paths emit status='error' / 'rate_limited' / 'skipped'. See AbuseIpdbInfo."
    • removedOutput schema / $defs / ThreatReportResponse / properties / asn / description
      Removed value: -"ASN ownership from RIPE Stat network-info: {asn: int, prefix: str}. Empty dict when RIPE has no allocation; {error:'lookup_failed'} on fetch failure."
    • removedOutput schema / $defs / ThreatReportResponse / properties / asn / title
      Removed value: -"Asn"
    • removedOutput schema / $defs / ThreatReportResponse / properties / asn_name / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / properties / asn_name / description
      Removed value: -"ASN holder name from RIPE Stat as-overview, or null."
    • removedOutput schema / $defs / ThreatReportResponse / properties / asn_name / title
      Removed value: -"Asn Name"
    • removedOutput schema / $defs / ThreatReportResponse / properties / cloud_provider / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / properties / cloud_provider / description
      Removed value: -"Cloud / hosting provider name when the IP sits in a known CIDR or maps to a tier-1 ASN."
    • removedOutput schema / $defs / ThreatReportResponse / properties / cloud_provider / title
      Removed value: -"Cloud Provider"
    • removedOutput schema / $defs / ThreatReportResponse / properties / country / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / properties / country / description
      Removed value: -"Country code from RIPE Stat rir-stats-country, or null."
    • removedOutput schema / $defs / ThreatReportResponse / properties / country / title
      Removed value: -"Country"
    • removedOutput schema / $defs / ThreatReportResponse / properties / enrichment / description
      Removed value: -"Shodan InternetDB free-tier enrichment (ports, hostnames, vulns, cpes, tags). Available on all tiers. See IpEnrichmentInfo for the exact field shape. Returned with all-empty lists on upstream failure — treat as 'no data', not 'clean'."
    • removedOutput schema / $defs / ThreatReportResponse / properties / firehol / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / properties / firehol / description
      Removed value: -"FireHOL Level1 listing status: {status, listed, lists_matched}. Available on all tiers."
    • removedOutput schema / $defs / ThreatReportResponse / properties / firehol / title
      Removed value: -"Firehol"
    • removedOutput schema / $defs / ThreatReportResponse / properties / ip / description
      Removed value: -"Queried IP address (IPv4 or IPv6, echoed back verbatim)."
    • removedOutput schema / $defs / ThreatReportResponse / properties / ip / title
      Removed value: -"Ip"
    • removedOutput schema / $defs / ThreatReportResponse / properties / is_datacenter / default
      Removed value: -false
    • removedOutput schema / $defs / ThreatReportResponse / properties / is_datacenter / description
      Removed value: -"True if IP is hosted on a known datacenter / cloud provider (parity with ip_lookup.is_datacenter). Same two-tier detection — cloud_provider hit OR tier-1 datacenter ASN. Always present — never null."
    • removedOutput schema / $defs / ThreatReportResponse / properties / is_datacenter / title
      Removed value: -"Is Datacenter"
    • removedOutput schema / $defs / ThreatReportResponse / properties / next_calls / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / 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 / ThreatReportResponse / properties / next_calls / title
      Removed value: -"Next Calls"
    • removedOutput schema / $defs / ThreatReportResponse / properties / ptr / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / properties / ptr / description
      Removed value: -"Reverse DNS PTR for the IP, or null when unresolvable."
    • removedOutput schema / $defs / ThreatReportResponse / properties / ptr / title
      Removed value: -"Ptr"
    • removedOutput schema / $defs / ThreatReportResponse / properties / risk_score / default
      Removed value: -0
    • removedOutput schema / $defs / ThreatReportResponse / properties / risk_score / description
      Removed value: -"Composite 0-100 score (parity with ip_lookup.risk_score). v1.17.0 additive components: ports (10 * min(count, 5) = 0-50), tor_exit (+30), firehol.listed (+20), AbuseIPDB confidence (round(15 * score / 100) = 0-15), is_datacenter (+10), known vulns (5 * min(count, 4) = 0-20). Use severity_label for thresholding."
    • removedOutput schema / $defs / ThreatReportResponse / properties / risk_score / title
      Removed value: -"Risk Score"
    • removedOutput schema / $defs / ThreatReportResponse / properties / severity_label / default
      Removed value: -"low"
    • removedOutput schema / $defs / ThreatReportResponse / properties / severity_label / description
      Removed value: -"Coarse risk band derived from risk_score (parity with ip_lookup.severity_label). Pre-1.17 the route emitted this field and advertised it in verdict.falsifiable_fields but the schema didn't declare it, so Pydantic silently dropped it from the wire. Same thresholds: >=75 critical, >=50 high, >=25 medium, else low."
    • removedOutput schema / $defs / ThreatReportResponse / properties / severity_label / title
      Removed value: -"Severity Label"
    • removedOutput schema / $defs / ThreatReportResponse / properties / shodan / description
      Removed value: -"Shodan full-API enrichment (richer than the InternetDB enrichment block). Pro tier returns live data; Free tier returns a {status:'pro_only', reason, upgrade_url} upsell stub. Pro failure paths emit status='error' / 'rate_limited' / 'restricted' / 'skipped'. See ShodanRepInfo."
    • removedOutput schema / $defs / ThreatReportResponse / properties / summary / default
      Removed value: -""
    • removedOutput schema / $defs / ThreatReportResponse / properties / summary / description
      Removed value: -"One-line human summary combining threat_level, port count, vuln count, and abuse signal."
    • removedOutput schema / $defs / ThreatReportResponse / properties / summary / title
      Removed value: -"Summary"
    • removedOutput schema / $defs / ThreatReportResponse / properties / threat_level / default
      Removed value: -"none"
    • removedOutput schema / $defs / ThreatReportResponse / properties / threat_level / description
      Removed value: -"Heuristic threat tier. 'high' when any vulns present OR abuse_score>=50; 'medium' when abuse_score>=25; 'low' when open ports observed; 'none' otherwise. On Free tier threat_level is necessarily conservative — abuse_score is unknown."
    • removedOutput schema / $defs / ThreatReportResponse / properties / threat_level / title
      Removed value: -"Threat Level"
    • removedOutput schema / $defs / ThreatReportResponse / properties / tor_exit / default
      Removed value: -false
    • removedOutput schema / $defs / ThreatReportResponse / properties / tor_exit / description
      Removed value: -"True if IP appears in the Tor Project bulk exit list (verdict.sources_unavailable['tor'] when fetch failed)."
    • removedOutput schema / $defs / ThreatReportResponse / properties / tor_exit / title
      Removed value: -"Tor Exit"
    • removedOutput schema / $defs / ThreatReportResponse / properties / verdict / default
      Removed value: -null
    • removedOutput schema / $defs / ThreatReportResponse / 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 / ThreatReportResponse / title
      Removed value: -"ThreatReportResponse"
    • 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 / $defs / VulnInfo / description
      Removed value: -"Severity-enriched CVE entry attached to /v1/ip and /v1/threat_report.\n\nPhase 2 IP enrichment (v1.16.0 BREAKING): Shodan InternetDB returns a flat\nlist of CVE IDs with no severity context, forcing agents to fan out\ncve_lookup calls for triage. We resolve severity + cvss_v3 against the\nlocal cve.db in a single SQL batch so the agent can prioritise without\nextra round-trips. Unknown CVEs are emitted with severity='UNKNOWN' /\ncvss_v3=null so the ID is preserved (the agent must not infer 'benign'\nfrom the absence of a row)."
    • removedOutput schema / $defs / VulnInfo / properties / cve_id / description
      Removed value: -"CVE identifier (e.g. 'CVE-2021-44228')."
    • removedOutput schema / $defs / VulnInfo / properties / cve_id / title
      Removed value: -"Cve Id"
    • removedOutput schema / $defs / VulnInfo / properties / cvss_v3 / default
      Removed value: -null
    • removedOutput schema / $defs / VulnInfo / properties / cvss_v3 / description
      Removed value: -"CVSS v3 base score (0.0-10.0). Null when severity='UNKNOWN' or NVD has no v3 score."
    • removedOutput schema / $defs / VulnInfo / properties / cvss_v3 / title
      Removed value: -"Cvss V3"
    • removedOutput schema / $defs / VulnInfo / properties / severity / description
      Removed value: -"NVD CVSS v3 severity bucket from local cve.db. 'UNKNOWN' when the CVE is not in our database (NVD may not have classified it yet, or the ID is reserved). Treat UNKNOWN as 'do not assume benign — call cve_lookup for fresh upstream data.'"
    • removedOutput schema / $defs / VulnInfo / properties / severity / title
      Removed value: -"Severity"
    • removedOutput schema / $defs / VulnInfo / title
      Removed value: -"VulnInfo"
    • removedOutput schema / properties / result / title
      Removed value: -"Result"
    • removedOutput schema / title
      Removed value: -"threat_reportOutput"
  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: +{
      +  "AbuseIpdbInfo": {
      +    "description": "AbuseIPDB reputation check (Pro tier only).",
      +    "properties": {
      +      "abuse_score": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "AbuseIPDB confidence-of-abuse score (0-100). Only present when status='ok'.",
      +        "title": "Abuse Score"
      +      },
      +      "country": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "ISO 3166-1 alpha-2 country code from AbuseIPDB geolocation (may differ from RIPE).",
      +        "title": "Country"
      +      },
      +      "is_tor": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "AbuseIPDB's Tor exit flag (cross-reference with top-level tor_exit field).",
      +        "title": "Is Tor"
      +      },
      +      "isp": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "ISP name as reported by AbuseIPDB.",
      +        "title": "Isp"
      +      },
      +      "reason": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Human-readable reason string. Present when status is skipped/rate_limited/error/pro_only.",
      +        "title": "Reason"
      +      },
      +      "status": {
      +        "description": "'ok' = data fetched; 'skipped' = API key not configured; 'rate_limited' = AbuseIPDB quota exceeded; 'error' = transient HTTP/network failure; 'pro_only' = returned on Free tier as upsell hint (see upgrade_url).",
      +        "enum": [
      +          "ok",
      +          "skipped",
      +          "rate_limited",
      +          "error",
      +          "pro_only"
      +        ],
      +        "title": "Status",
      +        "type": "string"
      +      },
      +      "total_reports": {
      +        "anyOf": [
      +          {
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Number of reports submitted against this IP in the last 90 days.",
      +        "title": "Total Reports"
      +      },
      +      "upgrade_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Upgrade link returned when status='pro_only'.",
      +        "title": "Upgrade Url"
      +      },
      +      "usage_type": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "AbuseIPDB usage classification: 'Data Center/Web Hosting/Transit', 'ISP', 'Mobile ISP', etc.",
      +        "title": "Usage Type"
      +      }
      +    },
      +    "required": [
      +      "status"
      +    ],
      +    "title": "AbuseIpdbInfo",
      +    "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"
      +  },
      +  "IpEnrichmentInfo": {
      +    "description": "Shodan InternetDB enrichment subset (free, no API key) embedded in /v1/threat_report.\n\nMirrors the {ports, hostnames, vulns, cpes, tags} block at the top of ip_lookup,\nplus an internetdb_status field that surfaces the upstream fetch outcome —\nextracted as a sub-model so MCP clients see a typed schema instead of an opaque dict slot.",
      +    "properties": {
      +      "cpes": {
      +        "description": "CPE 2.3 strings for services detected on this IP per Shodan InternetDB.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Cpes",
      +        "type": "array"
      +      },
      +      "hostnames": {
      +        "description": "Hostnames Shodan InternetDB has observed pointing to this IP.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Hostnames",
      +        "type": "array"
      +      },
      +      "internetdb_status": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "ok",
      +              "error"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Outcome of the InternetDB fetch. 'error' indicates upstream failure; absent on cached/legacy paths.",
      +        "title": "Internetdb Status"
      +      },
      +      "ports": {
      +        "description": "Open ports observed by Shodan InternetDB. Empty on upstream failure (treat as 'no data', not 'closed').",
      +        "items": {
      +          "type": "integer"
      +        },
      +        "title": "Ports",
      +        "type": "array"
      +      },
      +      "tags": {
      +        "description": "Shodan InternetDB classification tags (e.g. 'cdn', 'cloud', 'vpn', 'tor', 'self-signed').",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Tags",
      +        "type": "array"
      +      },
      +      "vulns": {
      +        "description": "CVEs Shodan InternetDB has associated with banners on this IP, enriched with severity + cvss_v3 from local cve.db (Phase 2 IP enrichment, v1.16.0 BREAKING). Pre-1.16 this was a flat list[str] of CVE IDs. Unknown CVEs emit severity='UNKNOWN'.",
      +        "items": {
      +          "$ref": "#/$defs/VulnInfo"
      +        },
      +        "title": "Vulns",
      +        "type": "array"
      +      }
      +    },
      +    "title": "IpEnrichmentInfo",
      +    "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"
      +  },
      +  "ShodanRepInfo": {
      +    "description": "Shodan full API enrichment (Pro tier only). Richer than InternetDB fields at top level.",
      +    "properties": {
      +      "asn": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "ASN string per Shodan (e.g. 'AS13335'); may differ from top-level asn int.",
      +        "title": "Asn"
      +      },
      +      "city": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "City name per Shodan geolocation.",
      +        "title": "City"
      +      },
      +      "country_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Country name per Shodan geolocation.",
      +        "title": "Country Name"
      +      },
      +      "hostnames": {
      +        "description": "Hostnames observed pointing to this IP per Shodan.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Hostnames",
      +        "type": "array"
      +      },
      +      "isp": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "ISP per Shodan (may differ from AbuseIPDB/RIPE).",
      +        "title": "Isp"
      +      },
      +      "last_update": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "ISO 8601 timestamp of Shodan's most recent data point for this IP.",
      +        "title": "Last Update"
      +      },
      +      "org": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Organization name owning the IP per Shodan.",
      +        "title": "Org"
      +      },
      +      "os": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Shodan-detected operating system (fingerprint-based, best-effort).",
      +        "title": "Os"
      +      },
      +      "ports": {
      +        "description": "Open ports observed by Shodan full scan (superset of top-level InternetDB ports).",
      +        "items": {
      +          "type": "integer"
      +        },
      +        "title": "Ports",
      +        "type": "array"
      +      },
      +      "reason": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Human-readable reason. Present when status is skipped/restricted/rate_limited/error/pro_only.",
      +        "title": "Reason"
      +      },
      +      "status": {
      +        "description": "'ok' = data fetched; 'skipped' = API key not configured; 'restricted' = 403 (IP not available on free Shodan tier); 'rate_limited' = 429 quota exceeded; 'error' = transient HTTP/network failure; 'pro_only' = returned on Free tier as upsell hint.",
      +        "enum": [
      +          "ok",
      +          "skipped",
      +          "restricted",
      +          "rate_limited",
      +          "error",
      +          "pro_only"
      +        ],
      +        "title": "Status",
      +        "type": "string"
      +      },
      +      "upgrade_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Upgrade link returned when status='pro_only'.",
      +        "title": "Upgrade Url"
      +      },
      +      "vulns": {
      +        "description": "CVE IDs Shodan has associated with banners on this IP.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "title": "Vulns",
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "status"
      +    ],
      +    "title": "ShodanRepInfo",
      +    "type": "object"
      +  },
      +  "ThreatReportResponse": {
      +    "properties": {
      +      "abuseipdb": {
      +        "$ref": "#/$defs/AbuseIpdbInfo",
      +        "description": "AbuseIPDB abuse-confidence enrichment. Pro tier returns live data; Free tier returns a {status:'pro_only', reason, upgrade_url} upsell stub (NOT an error). Pro failure paths emit status='error' / 'rate_limited' / 'skipped'. See AbuseIpdbInfo."
      +      },
      +      "asn": {
      +        "additionalProperties": true,
      +        "description": "ASN ownership from RIPE Stat network-info: {asn: int, prefix: str}. Empty dict when RIPE has no allocation; {error:'lookup_failed'} on fetch failure.",
      +        "title": "Asn",
      +        "type": "object"
      +      },
      +      "asn_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "ASN holder name from RIPE Stat as-overview, or null.",
      +        "title": "Asn Name"
      +      },
      +      "cloud_provider": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Cloud / hosting provider name when the IP sits in a known CIDR or maps to a tier-1 ASN.",
      +        "title": "Cloud Provider"
      +      },
      +      "country": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Country code from RIPE Stat rir-stats-country, or null.",
      +        "title": "Country"
      +      },
      +      "enrichment": {
      +        "$ref": "#/$defs/IpEnrichmentInfo",
      +        "description": "Shodan InternetDB free-tier enrichment (ports, hostnames, vulns, cpes, tags). Available on all tiers. See IpEnrichmentInfo for the exact field shape. Returned with all-empty lists on upstream failure — treat as 'no data', not 'clean'."
      +      },
      +      "firehol": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "FireHOL Level1 listing status: {status, listed, lists_matched}. Available on all tiers.",
      +        "title": "Firehol"
      +      },
      +      "ip": {
      +        "description": "Queried IP address (IPv4 or IPv6, echoed back verbatim).",
      +        "title": "Ip",
      +        "type": "string"
      +      },
      +      "is_datacenter": {
      +        "default": false,
      +        "description": "True if IP is hosted on a known datacenter / cloud provider (parity with ip_lookup.is_datacenter). Same two-tier detection — cloud_provider hit OR tier-1 datacenter ASN. Always present — never null.",
      +        "title": "Is Datacenter",
      +        "type": "boolean"
      +      },
      +      "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"
      +      },
      +      "ptr": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Reverse DNS PTR for the IP, or null when unresolvable.",
      +        "title": "Ptr"
      +      },
      +      "risk_score": {
      +        "default": 0,
      +        "description": "Composite 0-100 score (parity with ip_lookup.risk_score). v1.17.0 additive components: ports (10 * min(count, 5) = 0-50), tor_exit (+30), firehol.listed (+20), AbuseIPDB confidence (round(15 * score / 100) = 0-15), is_datacenter (+10), known vulns (5 * min(count, 4) = 0-20). Use severity_label for thresholding.",
      +        "title": "Risk Score",
      +        "type": "integer"
      +      },
      +      "severity_label": {
      +        "default": "low",
      +        "description": "Coarse risk band derived from risk_score (parity with ip_lookup.severity_label). Pre-1.17 the route emitted this field and advertised it in verdict.falsifiable_fields but the schema didn't declare it, so Pydantic silently dropped it from the wire. Same thresholds: >=75 critical, >=50 high, >=25 medium, else low.",
      +        "enum": [
      +          "low",
      +          "medium",
      +          "high",
      +          "critical"
      +        ],
      +        "title": "Severity Label",
      +        "type": "string"
      +      },
      +      "shodan": {
      +        "$ref": "#/$defs/ShodanRepInfo",
      +        "description": "Shodan full-API enrichment (richer than the InternetDB enrichment block). Pro tier returns live data; Free tier returns a {status:'pro_only', reason, upgrade_url} upsell stub. Pro failure paths emit status='error' / 'rate_limited' / 'restricted' / 'skipped'. See ShodanRepInfo."
      +      },
      +      "summary": {
      +        "default": "",
      +        "description": "One-line human summary combining threat_level, port count, vuln count, and abuse signal.",
      +        "title": "Summary",
      +        "type": "string"
      +      },
      +      "threat_level": {
      +        "default": "none",
      +        "description": "Heuristic threat tier. 'high' when any vulns present OR abuse_score>=50; 'medium' when abuse_score>=25; 'low' when open ports observed; 'none' otherwise. On Free tier threat_level is necessarily conservative — abuse_score is unknown.",
      +        "enum": [
      +          "none",
      +          "low",
      +          "medium",
      +          "high"
      +        ],
      +        "title": "Threat Level",
      +        "type": "string"
      +      },
      +      "tor_exit": {
      +        "default": false,
      +        "description": "True if IP appears in the Tor Project bulk exit list (verdict.sources_unavailable['tor'] when fetch failed).",
      +        "title": "Tor Exit",
      +        "type": "boolean"
      +      },
      +      "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."
      +      }
      +    },
      +    "required": [
      +      "ip"
      +    ],
      +    "title": "ThreatReportResponse",
      +    "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"
      +  },
      +  "VulnInfo": {
      +    "description": "Severity-enriched CVE entry attached to /v1/ip and /v1/threat_report.\n\nPhase 2 IP enrichment (v1.16.0 BREAKING): Shodan InternetDB returns a flat\nlist of CVE IDs with no severity context, forcing agents to fan out\ncve_lookup calls for triage. We resolve severity + cvss_v3 against the\nlocal cve.db in a single SQL batch so the agent can prioritise without\nextra round-trips. Unknown CVEs are emitted with severity='UNKNOWN' /\ncvss_v3=null so the ID is preserved (the agent must not infer 'benign'\nfrom the absence of a row).",
      +    "properties": {
      +      "cve_id": {
      +        "description": "CVE identifier (e.g. 'CVE-2021-44228').",
      +        "title": "Cve Id",
      +        "type": "string"
      +      },
      +      "cvss_v3": {
      +        "anyOf": [
      +          {
      +            "maximum": 10,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "CVSS v3 base score (0.0-10.0). Null when severity='UNKNOWN' or NVD has no v3 score.",
      +        "title": "Cvss V3"
      +      },
      +      "severity": {
      +        "description": "NVD CVSS v3 severity bucket from local cve.db. 'UNKNOWN' when the CVE is not in our database (NVD may not have classified it yet, or the ID is reserved). Treat UNKNOWN as 'do not assume benign — call cve_lookup for fresh upstream data.'",
      +        "enum": [
      +          "CRITICAL",
      +          "HIGH",
      +          "MEDIUM",
      +          "LOW",
      +          "UNKNOWN"
      +        ],
      +        "title": "Severity",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "cve_id",
      +      "severity"
      +    ],
      +    "title": "VulnInfo",
      +    "type": "object"
      +  }
      +}
    • addedOutput schema / properties / result / anyOf
      Added value: +[
      +  {
      +    "$ref": "#/$defs/ThreatReportResponse"
      +  },
      +  {
      +    "$ref": "#/$defs/ErrorResponse"
      +  }
      +]
    • removedOutput schema / properties / result / type
      Removed value: -"string"
  12. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, but the description adds substantial behavioral details: rate limits (30/hr free, 500/hr Pro, token cost), a breaking change in enrichment.vulns format (list[VulnInfo] vs list[str]), the asn block's 50-prefix cap, and the top-level return keys. This goes far beyond the annotations.

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

Conciseness5/5

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

The description is long but every sentence carries essential operational info: core purpose, usage context, two critical caveats (asn prefix cap, vulns breaking change), rate limits, and return structure. It is front-loaded with the primary purpose and structured logically, with no wasted words.

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 (multiple data sources, nested structures, version sensitivity, rate limits) and the presence of an output schema, the description covers all key operational aspects: limitations, version change, rate limit, and the shape of the return object. It is fully sufficient 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?

The only parameter 'ip' is fully documented in the schema (data type, examples, rejection of private/reserved IPs). The description does not add any extra semantics for the parameter itself; it only reuses the concept of IP in the context of the tool. With 100% schema coverage, this is a baseline adequate 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 ('Query') and resource ('comprehensive threat profile for an IP'), enumerating the data sources (Shodan, AbuseIPDB, ASN/geolocation, open ports). It clearly distinguishes from siblings by explicitly pointing to domain_report for domain data.

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 ('Use for IP investigation and SOC alert triage') and provides an explicit alternative: 'for domain data use domain_report.' It also cross-references asn_lookup for full prefix lists, giving clear guidance on related tools.

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.