Skip to main content
Glama
MRFrazer25

vulnerability-exposure-mcp

Vulnerability Exposure MCP

Tests License: MIT Add to Cursor

An MCP server that checks public IPs, domains, CVEs and software versions for confirmed vulnerabilities and exposure. A CVE only counts as affecting a version when NVD's version ranges confirm it; everything else is listed for review, so related or vendor-wide CVEs are never reported as yours.

It's the MCP version of Vulnerability Exposure Analyzer. The app needs a Cohere key to run its own agent; this one doesn't need any LLM key, because the model in your MCP client calls the tools and writes the report.

It runs locally over stdio, so it works with clients that launch local MCP servers: Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, LM Studio and similar. Web-only clients such as ChatGPT and claude.ai connectors only accept remote (HTTPS) servers; this server is not hosted, because a public deployment would need its own authentication to keep your API keys from being used by anyone.

Give it a public IP, a domain, a CVE ID (CVE-2026-111497) or a product and version (PHP 8.3.10, OpenSSH 8.9p1 Ubuntu-3ubuntu0.6), and it pulls evidence from NVD, CISA KEV, FIRST EPSS, Exploit-DB, OSV.dev, Shodan, VirusTotal, AbuseIPDB, Spamhaus, GreyNoise, SANS ISC, the internet registries and certificate transparency logs.

Claude running "Run a security assessment of PHP 8.3.10" with this server: 7 tool calls, a report that passed check_report, an executive summary and a key findings table

The same report's confirmed CVEs for PHP 8.3.10, highest EPSS first, with severity, CISA KEV status and fix versions

It keeps everything that makes the original app's reports reliable:

  • The same analyst rules as the app's system prompt. The server's instructions are a short summary, since clients cut long ones short; investigate_target returns the full rules and report format as analyst_guide.

  • Baseline lookups run in code, so reputation and exposure checks never depend on the model remembering them.

  • Analysis depth (Quick Scan, Standard, Comprehensive, Expert) sets the tool-call budget, per-service caps and how much detail each result keeps. The model can't override these limits.

  • Key facts computed from the data, not the model, including the CISA KEV split into confirmed for this target and related, so the numbers are the same whichever model runs it.

  • Fresher and more accurate than NVD alone: Ubuntu and Debian packages are checked against the distro's own fix data, so backported fixes count; recent CVEs NVD hasn't analysed are listed for review; and for packages such as Next.js, React and Django, GitHub advisories fill gaps before NVD has them. Each CVE carries its patch status and whether exploit code is published.

  • One investigation per investigation_id: a random handle returned by investigate_target, so several chats sharing one server process never mix evidence.

How this differs

Most CVE servers search NVD by keyword or product and hand back every match, so a report on nginx 1.30.0 can list CVEs that were fixed years earlier. This one:

  • Checks the exact version. A CVE is confirmed only when NVD's version ranges include that version, and for an Ubuntu or Debian package, CVEs the distro fixed by backport are ruled out. Keyword and product-level matches are listed separately as related.

  • Combines the context a fix decision needs. One call returns CISA KEV status, EPSS, the minimum safe version, published exploits and patch status, instead of the model stitching together separate lookups.

  • Checks the report, not just the data. check_report flags a draft that cites a CVE no tool returned, calls a related CVE confirmed, or gets a fix version or exploit claim wrong, before you see it.

  • Says what it didn't check. Every report lists the sources that weren't checked (a missing key, a failed lookup), so a missing result is never presented as a clean one.

What it doesn't do

  • No scanning. It never connects to the target. Everything comes from public databases and the target's DNS records, so it can't find services that Shodan hasn't seen or vulnerabilities in software it isn't told about.

  • Public targets only. Private, local and reserved IPs and local hostnames are refused.

  • No authenticated or internal checks. It can't see installed packages, configuration or anything behind a login. For that, use a scanner on the host.

  • No exploitation or remediation. It reports what's published about a target and what to upgrade to. It doesn't test exploits or change anything.

  • It's only as current as its sources. CVEs that NVD hasn't analysed yet can't be version-confirmed; they're listed for review instead.

Tools

Tool

What it does

Key needed

investigate_target

Start here. Classifies the target, sets the depth, runs the baseline lookups, returns an investigation_id and next steps

depends on target

version_specific_vulnerability_check

CVEs NVD confirms affect this exact version, ranked by KEV, EPSS and CVSS, with each one's patch status, any published exploit (Exploit-DB) and the minimum safe version. For packages such as Next.js, React, Express and Django it also adds GitHub advisories NVD doesn't have yet

none (NVD key optional)

distro_patch_check

Whether an Ubuntu or Debian package (e.g. openssh 8.9p1-3ubuntu0.6 from an SSH banner) already has each CVE fixed by a backport, from the distro's own data

none

nvd_lookup

Full NVD record for one CVE, with KEV and EPSS

none

cisa_kev_check

CVE IDs or product names against CISA's Known Exploited Vulnerabilities

none

cve_search

Keyword search of recent NVD CVEs

none

resolve_domain

DNS A/AAAA lookup

none

shodan_search

Open ports, services, versions, hosting. Without a key: Shodan's free InternetDB (ports, software and CVEs, no banners)

SHODAN_API_KEY for full results

ip_owner

Who an IP's network is registered to, from the regional internet registry (RDAP)

none

threat_lists_check

Spamhaus DROP (hijacked or criminal networks) and GreyNoise (internet scanners), with SANS ISC as the fallback when GreyNoise can't answer

none (GREYNOISE_API_KEY optional)

subdomains

Hostnames under a domain from certificate transparency logs (crt.sh, or Cert Spotter as a fallback)

none

virustotal_check

Reputation from VirusTotal engines

VIRUSTOTAL_API_KEY

abuseipdb_check

Abuse reports and confidence score

ABUSEIPDB_API_KEY

get_key_facts

Facts and the CISA KEV confirmed/related split, computed from this investigation's results

none

check_report

Checks a draft report against the investigation's data, with no model involved, and lists CVE IDs, versions, EPSS figures and claims (end-of-life, no patch, internet-facing) that no lookup supports

none

check_api_keys

Which keys are set (never their values) and where to get the rest

none

There's also a security_assessment prompt (target + depth) that loads the analyst rules and the workflow: investigate_target → pass its investigation_id to each lookup → get_key_facts → draft the report → check_report → fix what it flags. Lookups also work on their own without an id: they get Standard result sizes and the hourly cap below, but no tool-call budget, and they aren't counted in any investigation's key facts.

Depth

Tool calls

Calls per Shodan/VirusTotal/AbuseIPDB

Quick Scan

8

1

Standard Analysis (default)

15

2

Comprehensive Investigation

25

4

Expert Deep Dive

40

6

All tools are read-only. Private, reserved and cloud-metadata IPs are refused.

What each tool sends, and where

No tool ever contacts the target. Every lookup asks a public data source about the target, so the target's own servers never see a request from you. Those services do see what you looked up and your IP address (and your key, if you use one).

Tool

What it sends

Sent to

resolve_domain

The domain

Your normal DNS resolver

shodan_search

The IP

Shodan with a key, or Shodan InternetDB without one

virustotal_check

The IP or domain

VirusTotal

abuseipdb_check

The IP

AbuseIPDB

ip_owner

The IP

IANA, then the regional internet registry (RDAP)

threat_lists_check

The IP

GreyNoise, or SANS ISC when GreyNoise can't answer. Spamhaus DROP is downloaded whole, so the IP isn't sent to Spamhaus

subdomains

The domain

crt.sh, or Cert Spotter when crt.sh is down

version_specific_vulnerability_check

The software name and version

NVD, plus OSV.dev for framework packages such as Next.js or Django

distro_patch_check

The package name and version

OSV.dev

nvd_lookup, cve_search

A CVE ID or search term

NVD (Shodan CVEDB if NVD is down)

CVE enrichment inside the tools above

CVE IDs only

FIRST (EPSS). The CISA KEV catalog and the Exploit-DB index are downloaded whole, so nothing is sent to them

investigate_target

Runs the lookups that fit the target, as above

get_key_facts, check_report, check_api_keys

Nothing

Run on your machine

Related MCP server: Cybersecurity Threat Intelligence MCP

Install

Requires Python 3.11+. Setup is three steps: install, optionally store your keys, connect your AI client.

The simplest way is uv, which runs the server straight from PyPI with nothing to set up:

uvx vulnerability-exposure-mcp keys status

Or install it with pip (pip install vulnerability-exposure-mcp) and use the vulnerability-exposure-mcp command the same way. To run from source instead, see From source below.

Free keys: Shodan, VirusTotal, AbuseIPDB, NVD (optional, raises the rate limit), GreyNoise (optional; GreyNoise only gives keys to accounts made with a work email, not Gmail or similar. Without one it allows 10 lookups a day, and SANS ISC covers the rest). CVE and software checks work with no keys at all. IP and domain checks also run without keys, using Shodan's free InternetDB, the internet registries, Spamhaus DROP and GreyNoise; the report then lists VirusTotal and AbuseIPDB as not checked.

Store your keys securely

Keys can live in your operating system's credential store (Windows Credential Manager, macOS Keychain, or the Secret Service on Linux) instead of a config file. Run this in your own terminal; the key is typed into a hidden prompt and goes straight to the store:

uvx vulnerability-exposure-mcp keys set shodan

Do the same for virustotal, abuseipdb, nvd and greynoise as needed. keys status shows which are stored (never their values) and keys delete NAME removes one. With keys stored this way, leave the env block below empty. An environment variable, if set, takes precedence over a stored key.

Servers, Docker containers and other headless Linux systems usually have no credential store. There keys set says so, and keys go in the env block instead.

Connect a client

Pass keys through the client's env block, not the command line.

Claude Desktop

Download vulnerability-exposure-mcp-<version>.mcpb from the latest release and open it: Claude Desktop installs it and asks for your (optional) keys in a form. Or add the JSON config below.

Claude Code

Store your keys first (see above), so none go on the command line, then run:

claude mcp add vulnerability-exposure -- uvx vulnerability-exposure-mcp

Start a new Claude Code session afterwards: MCP servers load when a session starts.

Or install it as a plugin, which asks for each (optional) key in a masked prompt and keeps it in your credential store:

/plugin marketplace add MRFrazer25/Vulnerability-Exposure-MCP
/plugin install vulnerability-exposure@vulnerability-exposure

Cursor, Windsurf, VS Code, Claude Desktop and other JSON-configured clients

Add this to the client's MCP config (in Claude Desktop: Settings → Developer → Edit Config), then restart the client. With keys stored in the credential store, leave the env values empty or remove the block.

{
  "mcpServers": {
    "vulnerability-exposure": {
      "command": "uvx",
      "args": ["vulnerability-exposure-mcp"],
      "env": {
        "SHODAN_API_KEY": "",
        "VIRUSTOTAL_API_KEY": "",
        "ABUSEIPDB_API_KEY": "",
        "NVD_API_KEY": "",
        "GREYNOISE_API_KEY": ""
      }
    }
  }
}

(VS Code uses "servers" instead of "mcpServers" in .vscode/mcp.json.)

Docker

Build the image once with docker build -t vulnerability-exposure-mcp ., then point the client at it. Containers have no credential store, so keys go in env; listing them as bare -e names passes their values through without putting them on the command line:

{
  "mcpServers": {
    "vulnerability-exposure": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "SHODAN_API_KEY", "-e", "VIRUSTOTAL_API_KEY", "-e", "ABUSEIPDB_API_KEY",
               "-e", "NVD_API_KEY", "-e", "GREYNOISE_API_KEY", "vulnerability-exposure-mcp"],
      "env": {
        "SHODAN_API_KEY": "",
        "VIRUSTOTAL_API_KEY": "",
        "ABUSEIPDB_API_KEY": "",
        "NVD_API_KEY": "",
        "GREYNOISE_API_KEY": ""
      }
    }
  }
}

From source

git clone https://github.com/MRFrazer25/Vulnerability-Exposure-MCP.git
cd Vulnerability-Exposure-MCP
python -m venv .venv
.venv/Scripts/python -m pip install -e .   # macOS/Linux: .venv/bin/python

Then use .venv/Scripts/python -m vulnerability_exposure_mcp (on macOS or Linux, .venv/bin/python) wherever the steps above say uvx vulnerability-exposure-mcp, with the full path to that Python in client configs, for example "command": "C:/path/to/Vulnerability-Exposure-MCP/.venv/Scripts/python.exe", "args": ["-m", "vulnerability_exposure_mcp"].

Then ask: "Run a security assessment of PHP 8.3.10" or use the security_assessment prompt.

Settings

Variable

Default

Meaning

VULN_EXPOSURE_QUOTA_PER_HOUR

20

Max calls per hour to each of Shodan, VirusTotal and AbuseIPDB across all investigations, on top of the per-depth caps

VULN_EXPOSURE_LOG_LEVEL

WARNING

Log level (logs go to stderr)

Repeating an identical call in the same investigation returns the earlier result without spending quota. Large results are trimmed to about 15,000 characters.

Security notes

  • Tool results contain third-party text (banners, hostnames, CVE descriptions). They're returned as data, the server's instructions tell the model never to follow instructions found in them, and instruction-like text in banners, hostnames and registry records is replaced with [instruction-like text removed] before the model sees it. Still, use a client that shows you tool calls.

  • check_report checks a draft report against the investigation's data in code, and lists IDs, versions, EPSS figures and claims no lookup supports.

  • To be alerted if any MCP server's tool descriptions change after you approve them (tool poisoning), you can run it behind Trail of Bits' mcp-context-protector.

  • Keys are read from the environment or the OS credential store on each call, never logged, and redacted from error messages. Targets are not logged either, and failures are logged without tracebacks.

  • Failed lookups are returned as tool errors (isError), and every tool is marked read-only.

  • The server speaks stdio only, so it runs on your machine and only your client can reach it.

  • Nothing is stored on disk and there's no telemetry. Targets are sent only to the data provider each lookup uses; see PRIVACY.md for what each one receives.

  • Every push and pull request runs the tests and pip-audit against known-vulnerable dependencies. Dependencies are pinned and updated by Dependabot. See SECURITY.md to report a problem.

Responsible use

For legitimate security research, defensive security and education only. Only investigate systems you own or are authorized to assess, and follow each data provider's terms of service. Automated findings can be wrong; verify before acting.

Data sources and terms

Lookups use your own accounts and keys, so each provider's terms apply to you directly.

Source

Used for

Terms to know

Shodan

Open ports, services, versions

Uses your own Shodan account and key. Without one, InternetDB is free for non-commercial use

Regional internet registries (RDAP)

Who an IP's network is registered to

Public registry data, found through IANA's RDAP bootstrap

Spamhaus DROP

Hijacked or criminal networks

Free; credit Spamhaus when you use it. Downloaded at most once a day, as Spamhaus asks

GreyNoise

Internet scanners and known business services

Community API: 10 lookups a day without a key; keys need a work-email account

crt.sh, Cert Spotter

Subdomains from certificate transparency logs

Free public search; Cert Spotter allows a few keyless lookups an hour for personal use

Shodan CVEDB

CVE details when NVD can't be reached

Free for non-commercial use

SANS ISC (DShield)

Attack reports for an IP when GreyNoise can't answer

Free and keyless; data is CC BY-NC-SA 4.0 (non-commercial), and SANS asks for contact details in the user agent

Exploit-DB

Whether exploit code is published for a CVE

Its index is downloaded at most once a day; GPL-2.0-or-later

GitHub Advisory Database and the PyPA Advisory Database via OSV.dev

Advisories for npm, PyPI, Maven and RubyGems packages before NVD has them

Free, no key; data is CC BY 4.0

VirusTotal

Reputation from security engines

The free public API allows 4 lookups a minute and 500 a day, and must not be used in commercial products or services

AbuseIPDB

Abuse reports for IPs

Free plans are for non-commercial personal projects; don't republish its data

NVD (NIST)

CVE details and affected versions

Public data; free API key optional

CISA KEV

Known exploited vulnerabilities

Public US government data

FIRST EPSS

Exploitation probability

Published freely by FIRST's EPSS SIG

OSV.dev

Ubuntu and Debian fixes for installed packages

Free, no key; the data comes from each distro's security team (Ubuntu's is CC BY-SA 4.0)

Several free tiers are for non-commercial use only: VirusTotal, AbuseIPDB, and Shodan's InternetDB and CVEDB. If you use this at work or in a paid product, get plans that allow commercial use.

This product uses data from the NVD API but is not endorsed or certified by the NVD.

Spamhaus DROP data is (c) The Spamhaus Project. Package advisories are from the GitHub Advisory Database (CC BY 4.0), the PyPA Advisory Database (CC BY 4.0) and Ubuntu's security notices (CC BY-SA 4.0, (c) Canonical), all via OSV.dev; SANS ISC data is CC BY-NC-SA 4.0. CVE® is a registered trademark of The MITRE Corporation.

Vulnerability Exposure MCP is an independent project. It is not affiliated with, endorsed by or sponsored by Shodan, VirusTotal (Google), AbuseIPDB, NIST, CISA, FIRST, MITRE, Spamhaus, GreyNoise, SANS, OffSec (Exploit-DB), GitHub, Google (OSV.dev), Sectigo (crt.sh), SSLMate (Cert Spotter) or the internet registries. Their names are used only to say which services it works with.

Tests

.venv/Scripts/python -m pip install -e ".[dev]"
.venv/Scripts/python -m pytest -q

License

MIT

Available Tools

16 tools
abuseipdb_checkAbuseIPDB reportsB
Read-onlyIdempotent

AbuseIPDB abuse reports and confidence score for a public IP address (not domains). Needs ABUSEIPDB_API_KEY.

NameRequiredDescriptionDefault
ip_addressYes
investigation_idNo

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds the genuinely useful ABUSEIPDB_API_KEY prerequisite, but says nothing about rate limits, quota exhaustion, or what happens for private/invalid IPs — gaps that matter for an open-world API call.

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

Conciseness5/5

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

Two short sentences with no waste; the resource and the domain restriction are front-loaded, followed by the key prerequisite.

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

Completeness4/5

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

For a small read-only lookup with no output schema, the description covers the resource, the input constraint and the auth requirement. The one real hole is the undocumented investigation_id parameter, which leaves an agent guessing on a two-parameter tool.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the full burden. It clarifies ip_address (public IPs only, not domains) but leaves investigation_id completely unexplained — an agent has no way to know what that parameter does or when to supply it.

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

Purpose4/5

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

Specific verb-implied resource: abuse reports plus a confidence score for a public IP, with an explicit exclusion ('not domains') that separates it from resolve_domain and subdomains. It does not distinguish itself from the closest reputation siblings like virustotal_check or threat_lists_check, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is implied by the 'public IP address (not domains)' constraint, which tells the agent when not to use it, and the API-key prerequisite is stated. There is no explicit guidance on when to prefer this over virustotal_check or threat_lists_check for the same IP, which is the main ambiguity.

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

check_api_keysCheck API keysA
Read-onlyIdempotent

Shows which data-source API keys are configured (never their values) and where to get missing ones. Most lookups work without keys: NVD (just slower), CISA KEV, EPSS, OSV.dev, DNS, the registries, Spamhaus, GreyNoise, SANS ISC, certificate logs, and Shodan's free InternetDB in place of Shodan.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations, the description adds important behavioral context: it never reveals key values, it reports where missing keys can be obtained, and it clarifies that many security lookups remain usable without keys. Those details directly affect how an agent should interpret and act on the result.

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 definition is two sentences and front-loads the core behavior: configured keys are shown, values are never exposed, and missing-key sources are provided. The second sentence is a compact list that earns its place by clarifying which lookups remain viable without keys.

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

Completeness5/5

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

For a zero-parameter, read-only diagnostic tool with rich annotations and no output schema, the description covers the essential behavior: what is shown, what is deliberately hidden, and how to address missing keys. Nothing critical for correct invocation or interpretation is missing.

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

Parameters4/5

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

The tool takes no parameters, so there is no parameter semantics burden. The baseline for a zero-parameter tool is 4, and the description appropriately does not invent parameter details.

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

Purpose5/5

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

The description uses a specific verb and resource: it shows which data-source API keys are configured, without exposing their values, and indicates where to obtain missing ones. This clearly distinguishes the tool from the sibling lookup tools, which query security data sources rather than report configuration status.

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

Usage Guidelines4/5

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

The description gives clear context for use by explaining that most lookups work without keys and listing which sources fall into that category, including the NVD slowdown caveat and the Shodan InternetDB alternative. It does not explicitly state a 'use this before calling X' workflow, but the practical guidance is strong enough for an agent to know when key configuration matters.

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

check_reportCheck reportA
Read-onlyIdempotent

Run before giving the final report. Compares your draft with this investigation's tool results and key facts, with no model involved, and lists what they don't support: CVE or advisory IDs no lookup returned, version numbers and EPSS-style percentages that appear nowhere in the data, claims such as "end-of-life", "no patch available" or "internet-facing" that no source makes, unconfirmed CVEs filed as confirmed (and the reverse), misquoted fix versions, upgrade versions named when no version was given, and exploit claims the data doesn't back. Fix or remove each one.

NameRequiredDescriptionDefault
report_markdownYes
investigation_idYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so safety is covered. The description then adds genuinely new behavioral context: the comparison is deterministic ("with no model involved") and non-mutating of the report — it only lists problems for the agent to fix. It stops short of specifying the exact return shape, but that is a minor gap given 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.

Conciseness4/5

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

The trigger ("Run before giving the final report") is front-loaded, as is the core action and the remediation instruction. The long middle enumeration of failure modes is dense but each item earns its place by teaching the agent what to double-check; only minor trimming is possible.

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

Completeness4/5

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

For a two-parameter, no-output-schema, read-only tool, the description covers the essential question of when to call it and what it returns conceptually (a list of unsupported claims). Nothing critical is missing, though a note on whether the report is passed verbatim or re-read from the investigation would round it out.

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

Parameters3/5

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

Schema description coverage is 0%, so the description carries the burden here. It only implicitly maps parameters: "your draft" implies report_markdown and "this investigation's tool results" implies investigation_id, with no guidance on markdown format, size limits, or how the investigation_id is obtained. Baseline 3 is appropriate — partial compensation, but not full.

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

Purpose5/5

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

The description names a specific action (compare draft report against this investigation's tool results and key facts) and enumerates the exact classes of unsupported claims it flags. That level of specificity clearly separates it from every sibling (cve_search, nvd_lookup, get_key_facts, etc.), none of which validate a report.

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

Usage Guidelines4/5

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

"Run before giving the final report" gives an unambiguous trigger point, and "Fix or remove each one" tells the agent what to do with the result. There are no explicit exclusions or named alternatives, but the placement in the workflow is clear enough that an agent would not confuse it with the lookup tools.

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

cisa_kev_checkCISA KEV checkA
Read-onlyIdempotent

Check CVE IDs and/or product names against CISA's Known Exploited Vulnerabilities catalog. Product matches only show the product has been exploited before, not that a version is affected. Version checks and CVE lookups already give KEV status for their CVEs: use this once per product for its KEV history, or for CVE IDs from elsewhere.

NameRequiredDescriptionDefault
cve_idsNo
software_listNo
investigation_idNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, non-destructive, so the safety profile needs no restating. The description adds real interpretive value with the caveat that a product match means the product has been exploited historically, not that the queried version is affected. It stops short of describing what a miss/empty result means or how results are shaped.

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

Conciseness5/5

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

Three tight sentences with the core action front-loaded, followed by the interpretive caveat, then the routing advice. No filler and no repetition of the title.

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

Completeness3/5

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

Purpose and usage are complete, but with no output schema the description never indicates what comes back (KEV entry fields? booleans per input? matches only?), and investigation_id is left unexplained for a tool that otherwise demands careful interpretation. Adequate for routing, thin for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the parameter burden, and it only partially does: it names CVE IDs and product names as the accepted inputs but gives no format guidance (e.g. CVE-YYYY-NNNN) or array/optionality behavior. The third parameter, investigation_id, is never mentioned anywhere, leaving it entirely opaque.

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

Purpose5/5

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

States a specific verb ("Check") and resource (CISA's Known Exploited Vulnerabilities catalog) plus accepted inputs (CVE IDs and/or product names). It also differentiates itself from siblings by noting version checks and CVE lookups already return KEV status for their CVEs.

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

Usage Guidelines5/5

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

Gives explicit routing: use version checks / CVE lookups first because they already surface KEV status, then use this "once per product for its KEV history, or for CVE IDs from elsewhere." It also states a when-not-to-over-read rule for product matches, so the agent knows what conclusions the result does and does not support.

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

distro_patch_checkDistro patch checkA
Read-onlyIdempotent

Check an Ubuntu or Debian package version against the distro's own security data (via OSV.dev), which counts fixes the distro backports without changing the upstream version. Use it when Shodan lists distro_packages (e.g. OpenSSH_8.9p1 Ubuntu-3ubuntu0.6 gives package 'openssh', package_version '8.9p1-3ubuntu0.6'), or when the user gives an installed package version. Pass the version check's affected_cve_ids as cve_ids. release (e.g. '22.04', '12') is found automatically when possible. No key needed.

NameRequiredDescriptionDefault
distroYes
cve_idsNo
packageYes
releaseNo
package_versionYes
investigation_idNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive behavior, so the description's additional details are valuable: it names OSV.dev as the backend, says no API key is needed, and notes that release is auto-detected when possible. It does not describe rate limits or the exact result shape.

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

Conciseness5/5

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

The description is front-loaded with what the tool does and is dense with useful examples and usage conditions. Every sentence adds selection or invocation value, with no filler.

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

Completeness4/5

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

For a read-only external security check, the description provides enough context to select and invoke it correctly, including the OSV.dev dependency and input chaining. Because there is no output schema, it could be stronger by briefly describing what the check returns, such as patched/not-patched status or affected CVE details.

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

Parameters4/5

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

With 0% schema description coverage, the description does substantial work: it explains package and package_version with a concrete example, clarifies that cve_ids come from a version check's affected_cve_ids, and says release is auto-detected. It leaves investigation_id undocumented and only implicitly covers distro via the Ubuntu/Debian scope.

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

Purpose5/5

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

The description states a specific verb and resource: checking Ubuntu/Debian package versions against distro security data via OSV.dev. It also distinguishes the tool by explaining that it counts distro-backported fixes without upstream version changes, which differentiates it from generic CVE lookup tools.

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

Usage Guidelines4/5

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

It gives clear usage contexts: when Shodan lists distro_packages or when the user provides an installed package version. It also explains how to chain from a version check by passing affected_cve_ids as cve_ids, though it does not explicitly state when not to use the tool.

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

get_key_factsKey factsA
Read-onlyIdempotent

Facts computed directly from this investigation's tool results, with no model involved, so they are the same on every run: open ports, network, reputation, version check results, upgrade target, and the CISA KEV split into "confirmed for this target" (NVD version match, or the CVE being analysed) and "related" (product family or vendor). Base the report's claims on these. Values contain third-party text.

NameRequiredDescriptionDefault
investigation_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare read-only/idempotent, but the description adds real value beyond them: results are computed without a model so they are stable across runs, and values contain third-party text (an implicit prompt-injection caution). It also explains the KEV 'confirmed' vs 'related' split logic, which the agent could not otherwise know. It doesn't cover error behavior for an unknown or incomplete investigation.

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

Conciseness4/5

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

Front-loaded with the key differentiator (deterministic, model-free) before the enumeration of contents. Dense but every clause carries information; the nested quoted terms make it slightly harder to scan, and the field list could be tightened.

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

Completeness4/5

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

With no output schema, the description does the work of telling the agent what the return payload contains and how to interpret the KEV categories. What's missing is lifecycle context — prerequisites tying it to investigate_target and behavior when the investigation is absent or partial.

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?

There is one required parameter, investigation_id, and schema description coverage is 0%, so the description must compensate — but it never explains what an investigation_id is, where it comes from, or what happens with a stale/unknown id. Baseline is lowered from 4 (zero-param case) only slightly because the single parameter is self-evidently an identifier.

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

Purpose4/5

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

States a specific resource and scope: facts computed deterministically from this investigation's tool results, enumerating what is included (ports, network, reputation, version check, upgrade target, KEV split). This distinguishes it from live-lookup siblings like shodan_search or cisa_kev_check, which it aggregates. The only weakness is that the verb is a generic 'get' and the description doesn't state upfront that it is a post-investigation aggregation step.

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

Usage Guidelines3/5

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

'Base the report's claims on these' implies the tool is for consolidating results before writing a report, but it never says when to call it instead of check_report or re-running individual checks. No prerequisite (e.g., that investigate_target must have run first) or exclusion is stated. Usage is inferable but not explicit.

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

investigate_targetInvestigate targetA
Read-onlyIdempotent

Start here. Classifies the target (public IP, domain or URL, CVE ID, or "software version" such as "nginx 1.20.1") and runs the baseline lookups in code: Shodan, VirusTotal, AbuseIPDB, the registry owner and the keyless threat lists for an IP; DNS, VirusTotal, and the same IP checks for a domain's primary IP. Returns an investigation_id to pass to every other tool, the baseline results and next_steps.

depth sets the tool-call budget and detail: "Quick Scan" (8 calls), "Standard Analysis" (15), "Comprehensive Investigation" (25), "Expert Deep Dive" (40). Private, reserved and cloud-metadata IPs are refused.

NameRequiredDescriptionDefault
depthNoStandard Analysis
targetYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, and the description goes well beyond them: it names the upstream services actually queried per target type, discloses the call budget per depth level (8/15/25/40), and states the refusal rule for private/reserved/metadata IPs. It also previews the return payload (investigation_id, baseline results, next_steps).

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

Conciseness4/5

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

Front-loaded with the imperative and the classification step, then the returns, then the depth semantics — a sensible priority order. The service enumeration is dense and the run-on sentence in the first paragraph could be tightened, but no sentence is filler.

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

Completeness5/5

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

For an orchestration entry point with only two parameters, no output schema, and 15 siblings, the description supplies everything needed: accepted inputs, downstream services, refusal rules, return handles, and the cost model that governs downstream call planning. No meaningful gap remains.

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

Parameters5/5

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

Schema coverage is 0%, so the description carries the full burden and does: the 'target' parameter is defined by enumerated accepted formats (public IP, domain or URL, CVE ID, 'software version' such as 'nginx 1.20.1'), and 'depth' is mapped from each enum value to a concrete tool-call budget and detail level. This is meaning the schema alone does not convey.

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

Purpose5/5

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

States a specific verb and resource ('Classifies the target ... and runs the baseline lookups') and enumerates exactly which target types it accepts. The opening 'Start here' plus the sibling list makes clear this is the entry point rather than one of the per-service checks like abuseipdb_check or virustotal_check.

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

Usage Guidelines5/5

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

Explicitly instructs when to use it ('Start here') and establishes the dependency for all siblings ('Returns an investigation_id to pass to every other tool'). It also names the condition under which the tool refuses work (private, reserved and cloud-metadata IPs), so an agent knows the boundary case.

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

ip_ownerIP network ownerA
Read-onlyIdempotent

Who a public IP's network is registered to (organisation, range, country, abuse contact), from the regional internet registry over RDAP. Already run for an IP target; use it for other IPs you find. No key.

NameRequiredDescriptionDefault
ip_addressYes
investigation_idNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered structurally. The description adds genuinely new context: the upstream data source is the RIR via RDAP and no API key is required, which tells the agent the call is free of credential prerequisites. It does not mention behaviour for private/invalid IPs or rate limits, keeping it below a 5.

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

Conciseness5/5

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

Two dense sentences with the payload contents front-loaded and no filler; the source and key requirement are packed into trailing clauses. Nothing needs trimming.

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

Completeness3/5

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

With no output schema, the description usefully enumerates the returned fields (organisation, range, country, abuse contact), which covers the return-value burden. But it leaves the second parameter unexplained and says nothing about response shape for private IPs or lookup failures, so it is only minimally sufficient.

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

Parameters2/5

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

Schema description coverage is 0% for both parameters. The description does constrain ip_address indirectly by saying "public IP" and framing it as an IP found elsewhere. However, investigation_id is completely undocumented in both schema and description, and no format examples (IPv4 vs IPv6) are given, so the description only partially compensates for the coverage gap.

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

Purpose5/5

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

The description states exactly what is retrieved — the network registration record for a public IP (organisation, range, country, abuse contact) — and names the source (regional internet registry over RDAP). That source framing distinguishes it from reputation siblings like abuseipdb_check and virustotal_check, which report maliciousness rather than registration ownership.

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

Usage Guidelines4/5

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

"Already run for an IP target; use it for other IPs you find" tells the agent this is a follow-on enrichment step for newly discovered IPs rather than the primary target. It gives clear context but never names an explicit alternative or exclusion condition, so the agent must infer when a different IP tool is the better choice.

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

nvd_lookupNVD CVE lookupA
Read-onlyIdempotent

Full NVD record for one CVE (e.g. 'CVE-2021-44228'): description, CVSS, CWE, affected product ranges, CISA KEV and EPSS. Not needed for CVEs a version check already returned (they carry severity, EPSS, KEV, exploit and fix): use it for a CVE you have no record of, or to read one's full description and references.

NameRequiredDescriptionDefault
cve_idYes
investigation_idNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, open-world, idempotent, non-destructive behavior. The description adds useful context by listing what the record contains and explaining that version-check results already carry severity, EPSS, KEV, exploit and fix data. It does not mention rate limits or authentication, so it is not fully exhaustive.

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

Conciseness5/5

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

Two tightly written sentences, front-loaded with the primary purpose and followed by the exclusion and alternative use case. No wasted text.

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

Completeness4/5

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

With no output schema, the description usefully summarizes the record fields and the main usage boundary. It is nearly complete for a lookup tool, but the unexplained investigation_id parameter keeps it from being fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It clarifies cve_id via format and example, but investigation_id is not explained anywhere in the description or schema, leaving one of two parameters undocumented.

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

Purpose5/5

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

States a specific verb and resource (full NVD record for one CVE), gives a concrete CVE example, and enumerates the returned fields. It is clearly distinguishable from cve_search and version_specific_vulnerability_check.

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

Usage Guidelines5/5

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

Explicitly says when not to use it: CVEs already returned by a version check. It also says when to use it: a CVE with no existing record, or to read full description and references. The alternative path is named directly.

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

resolve_domainResolve domain (DNS)A
Read-onlyIdempotent

Resolve a domain to its public IPv4/IPv6 addresses. Already run for a domain target; use it for other domains you discover.

NameRequiredDescriptionDefault
domainYes
investigation_idNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds useful non-obvious context: results are public addresses only (external DNS), and the target domain has already been resolved in the investigation flow. No mention of rate limits or resolver behavior, but that is secondary given 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?

Two short sentences, front-loaded with the action and output type, followed by the routing rule. Every clause earns its place with no filler.

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

Completeness3/5

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

With no output schema, the description does at least state the return type (IPv4/IPv6 addresses), which is the key missing piece. However, the unexplained 'investigation_id' parameter leaves a real hole for a tool that is presumably meant to attach results to an existing investigation.

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

Parameters2/5

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

Schema description coverage is 0% for both parameters, and the description mentions neither. 'domain' is inferable from the name, but 'investigation_id' is entirely undocumented — its purpose, whether it is required in practice, and what changes when it is supplied are all left to guesswork.

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

Purpose5/5

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

States a specific verb and resource ('Resolve a domain') plus the exact output shape ('its public IPv4/IPv6 addresses'), which distinguishes it from sibling tools like shodan_search or subdomains. An agent knows immediately what this does.

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

Usage Guidelines4/5

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

Gives real routing guidance: 'Already run for a domain target; use it for other domains you discover' tells the agent not to re-resolve the primary target and to use it on newly surfaced domains. It stops short of naming a sibling alternative for the primary-target case, so not a 5.

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

subdomainsSubdomains from certificate logsA
Read-onlyIdempotent

Hostnames under a domain that have had TLS certificates, from public certificate transparency logs (crt.sh, or Cert Spotter if crt.sh is down). Use it to find other hosts a domain runs; they may no longer exist. No key needed.

NameRequiredDescriptionDefault
domainYes
investigation_idNo

TDQS

A3.5/5.0
Behavior4/5

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

Adds genuine context beyond the annotations: named upstream providers, a fallback path when crt.sh is down, and the important caveat that returned hosts 'may no longer exist' (stale data). 'No key needed' clarifies auth requirements. Return format/pagination is not described, but annotations already cover safety and idempotency.

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

Conciseness5/5

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

Three short sentences, zero filler, front-loaded with what the tool returns and backed by source and caveat. Every clause carries information.

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

Completeness3/5

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

With no output schema the description should convey the return shape and the undisclosed investigation_id. It hints that results are hostname lists but leaves the second parameter entirely unexplained and says nothing about volume or paging of CT-log results.

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

Parameters2/5

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

Schema description coverage is 0% for both parameters, so the description must compensate and does not. The sole required parameter 'domain' is only obliquely referenced ('under a domain'), and 'investigation_id' is never mentioned at all — the agent gets no idea what it does or when to supply it.

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

Purpose4/5

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

States a specific resource (hostnames under a domain that have had TLS certificates) and the exact data source (crt.sh / Cert Spotter), which is far more informative than the title alone. It does not explicitly distinguish itself from siblings like resolve_domain or shodan_search, but the certificate-transparency framing makes its niche reasonably clear.

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

Usage Guidelines3/5

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

'Use it to find other hosts a domain runs' gives an implied when-to-use, but there are no exclusions and no named alternatives among the many sibling tools (resolve_domain, shodan_search, investigate_target). The agent must infer whether this is a discovery step or a validation step.

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

threat_lists_checkThreat lists checkB
Read-onlyIdempotent

Keyless reputation for a public IP: Spamhaus DROP (networks hijacked or run by criminals) and GreyNoise (whether it scans the internet, or is a known business service). Already run for an IP target. GreyNoise allows 10 lookups a day without GREYNOISE_API_KEY.

NameRequiredDescriptionDefault
ip_addressYes
investigation_idNo

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it explains what each source contributes and discloses a hard rate limit plus the no-key fallback, which annotations cannot express.

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

Conciseness4/5

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

The core capability is front-loaded and the parenthetical glosses on Spamhaus DROP and GreyNoise earn their space. The trailing 'Already run for an IP target' sentence is the one piece that is vague rather than informative.

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

Completeness3/5

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

No output schema exists, so the description should describe what a result looks like, and it does not (listing vs. verdict vs. raw payload). Combined with an entirely undocumented investigation_id parameter, an agent knows the gist but not the call contract.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, and it does not. The required ip_address is implied by 'for a public IP', but investigation_id is never mentioned or explained anywhere.

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

Purpose4/5

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

States a specific verb and resource ('keyless reputation for a public IP') and names the two underlying sources (Spamhaus DROP, GreyNoise). It does not explicitly differentiate itself from sibling IP-reputation tools like abuseipdb_check or virustotal_check, so an agent must infer the distinction from the source names alone.

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

Usage Guidelines3/5

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

The phrase 'Already run for an IP target' hints at when it is relevant but is grammatically unclear and never states when to prefer this over abuseipdb_check, virustotal_check, or shodan_search. The rate-limit note ('10 lookups a day without GREYNOISE_API_KEY') is genuinely useful usage context but addresses constraints, not tool selection.

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

version_specific_vulnerability_checkVersion vulnerability checkA
Read-onlyIdempotent

Best tool for software risk. Finds CVEs whose NVD CPE data confirms they affect this exact product version, ranks them by CISA KEV status, EPSS and CVSS, gives each one's patch status and the minimum safe version, and reports CVEs ruled out. Use for every product with a known version (e.g. from Shodan). software_name e.g. 'nginx', 'Apache httpd', 'OpenSSH'; version e.g. '1.20.1' or '8.9p1' (omit only if unknown).

NameRequiredDescriptionDefault
versionNo
software_nameYes
investigation_idNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, open-world, non-destructive, so the safety profile is settled. The description adds real behavioral substance: matching is gated on NVD CPE confirmation (so non-confirmed CVEs are excluded), results are ranked by KEV/EPSS/CVSS, and ruled-out CVEs are reported — useful expectations that annotations cannot convey.

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

Conciseness4/5

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

The lead claim and the returned-content list are front-loaded, and the parameter examples are packed into the close. Dense but almost every clause carries information; only "Best tool for software risk" is slightly promotional padding.

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

Completeness4/5

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

With no output schema, the description does the work of describing returns (ranked findings, patch status, minimum safe version, ruled-out list), which is the key gap it needs to fill. The remaining hole is investigation_id semantics and any limits on the CPE-matching fallback when version is omitted.

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

Parameters3/5

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

Schema description coverage is 0%, so the description has to compensate, and it does for two parameters: software_name ('nginx', 'Apache httpd', 'OpenSSH') and version ('1.20.1', '8.9p1', omit only if unknown). The third parameter, investigation_id, is never mentioned, leaving its purpose and side effects undocumented in both schema and description.

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

Purpose5/5

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

States a specific verb and resource chain: finds CVEs that NVD CPE data confirms affect this exact product version, then ranks, annotates patch status, and reports ruled-out CVEs. This clearly separates it from siblings like cve_search, nvd_lookup, and cisa_kev_check, which do single-source lookups rather than version-confirmed aggregation.

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

Usage Guidelines4/5

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

"Best tool for software risk" plus "Use for every product with a known version (e.g. from Shodan)" gives clear positive guidance and even a source hint for the version input. It does not explicitly name when to prefer cve_search or nvd_lookup instead, so it stops short of full when/when-not coverage.

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

virustotal_checkVirusTotal reputationA
Read-onlyIdempotent

VirusTotal reputation: how many security engines flag the IP/domain as malicious or suspicious. Needs VIRUSTOTAL_API_KEY.

NameRequiredDescriptionDefault
targetYes
target_typeYes
investigation_idNo

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already cover the safety profile: readOnly, idempotent, non-destructive, and open-world. The description adds useful context beyond annotations by stating the API key requirement and clarifying that the result reflects engine flag counts for malicious or suspicious reputation.

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

Conciseness5/5

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

The description is two front-loaded sentences with no filler. The first sentence states the core purpose and return meaning; the second adds the only hard prerequisite.

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

Completeness3/5

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

For a simple three-parameter tool with rich annotations but no output schema and zero schema descriptions, the description is adequate but incomplete. It explains the reputation summary and API key requirement, yet it omits parameter details, especially investigation_id, and does not fully specify the return shape.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the burden. It indirectly explains target_type by saying IP/domain, but it does not explain the target parameter format or the purpose of investigation_id, leaving meaningful required and optional parameter semantics undocumented.

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

Purpose4/5

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

The description names the specific resource (VirusTotal reputation for IP/domain) and states what the result represents: how many security engines flag the target as malicious or suspicious. It is clear enough to distinguish from generic tools, but it does not explicitly differentiate itself from siblings like abuseipdb_check or threat_lists_check.

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

Usage Guidelines3/5

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

The tool's intended use is implied by 'VirusTotal reputation' and the IP/domain scope, and the description notes the VIRUSTOTAL_API_KEY prerequisite. However, it gives no explicit guidance on when to choose this over sibling reputation tools such as abuseipdb_check or threat_lists_check.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv0.1.0
    • First observedabuseipdb_check
    • First observedcheck_api_keys
    • First observedcheck_report
    • First observedcisa_kev_check
    • First observedcve_search
    • First observeddistro_patch_check
    • First observedget_key_facts
    • First observedinvestigate_target
    • First observedip_owner
    • First observednvd_lookup
    • First observedresolve_domain
    • First observedshodan_search
    • First observedsubdomains
    • First observedthreat_lists_check
    • First observedversion_specific_vulnerability_check
    • First observedvirustotal_check

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation4/5

Descriptions actively steer selection: cve_search says it is not version-aware and to prefer version_specific_vulnerability_check, nvd_lookup says it is unnecessary for CVEs a version check already returned, and cisa_kev_check is scoped to 'once per product for its KEV history'. The remaining soft overlap is among the point-reputation tools (abuseipdb_check, virustotal_check, threat_lists_check) and the fact that investigate_target already runs several of them as a baseline, but each is a distinct data source and the overlap is explained.

Naming Consistency4/5

All snake_case, with a dominant <source>_<action> family (abuseipdb_check, shodan_search, virustotal_check, cve_search, nvd_lookup, cisa_kev_check, distro_patch_check, threat_lists_check) and a smaller verb_noun family (investigate_target, resolve_domain, get_key_facts, check_report). The deviations are 'ip_owner' and the bare noun 'subdomains', which are readable but break the pattern slightly.

Tool Count4/5

At 16 tools the surface sits at the upper edge, but each tool maps to a distinct data source or a distinct workflow step (baseline triage, version matching, distro backports, reporting sanity check), so nothing feels duplicative. It is on the heavier side for an agent to hold in context, which is the only reason it is not a 5.

Completeness4/5

Coverage of the vulnerability-exposure lifecycle is strong: target classification and baseline recon, DNS/subdomain discovery, IP ownership, multi-source reputation, version-aware CVE matching, distro backport patches, KEV/EPSS enrichment, and a self-verification step before reporting. Minor gaps: no way to list or resume prior investigations despite investigation-scoped tools, and no direct 'which CVEs affect this vendor/product' structured query beyond keyword cve_search.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers