Skip to main content
Glama
prinzalx

winsecure-mcp

by prinzalx

winsecure-mcp

CI Node License

A Windows CVE-inventory MCP server for agents (Hermes, Claude Code, Codex, …): it reads what software the machine has installed, matches it against the current CVE sources, and turns the findings into a persistent to-do list with an AI effort assessment — the chain the lookup-only CVE servers do not offer:

inventory → CVE hits → to-do list → AI assessment of the replacement effort

The server collects and rates, the human decides. There is no automatic patching in v1 and no writing intervention in the system: every write goes into the server's own JSON files, which is why this server deliberately has no approval gate.

Not in scope for v1: drivers, DLLs, kernel/OS patches (Windows Update), automatic updates.

Quick Start

npm ci
npm run build
node dist/index.js
  version         v0.1.0
  data directory  C:\Users\<user>\AppData\Roaming\winsecure-mcp
  store file      C:\Users\<user>\AppData\Roaming\winsecure-mcp\winsecure.json
  MCP transport   stdio — this terminal stays attached to the agent

Related MCP server: cve-mcp

The Tools

Tool

Purpose

scan_inventory

Refresh the inventory (sources selectable); returns per-source counters + the dedup result

check_cves

Match the inventory against the CVE sources; fill/refresh the to-do list

list_todos

Sorted KEV first, then severity/EPSS; filterable by status

assess_todo

Effort assessment for one entry (sampling client → verdict; else evidence package)

save_assessment

Write the assessment back (the non-sampling path)

get_program

Detail view of one finding (sources, paths, versions, assigned CVEs)

cve_detail

NVD lookup of a single CVE

Every answer is wrapped the same way: a human summary line plus structuredContent, with english status words and ISO-8601 UTC timestamps throughout, so the output is locale-independent. An empty result is an answer, not an error.

Inventory Sources

  1. Registry Uninstall keys — HKLM + HKCU including WOW6432Node.

  2. winget list — for store/winget-managed apps; the package id is carried along because it helps matching. Note: winget 1.29 has no JSON output (--format json errors), so the table text is parsed by locating the separator line and splitting columns on two-or-more spaces.

  3. Portable apps — a bounded walk over the fixed drives for .exe files with FileVersionInfo. Excludes are mandatory and config-extensible (C:\Windows, WinSxS, node_modules, $Recycle.Bin, TEMP); the result is cut at portableMaxResults and the visited paths are reported. Access-denied directories are skipped, not errors.

Deduplication runs over all three sources under a normalised (product, version) key; each finding carries the list of sources that reported it.

CVE Data Sources

Measured live against the running APIs (Phase 0, 10/2026):

Source

Role

Finding

cvelistV5 (GitHub)

primary local CVE source

Full corpus is 602 MB, so the hourly delta (~5 MB) is downloaded and accumulated into a local index (cache/cvelist-index.json); coverage grows over days without the full download. CVE 5.0 schema (containers.cna/adp, affected[].product/versions).

CISA KEV JSON feed

actively-exploited signal

Daily-cached. An exact product-name match hits only ~0.5 % of a real inventory (display name vs CVE product name), so an alias table + match_confidence bridge the gap.

EPSS (FIRST)

prioritisation

Batch of ≤100 CVEs per call; fills max_epss.

OSV.dev batch query

not used as primary

No Windows ecosystem and ~0 % hit-rate on classic desktop software.

NVD API 2.0

cve_detail of a single CVE only

Keyless rate limit is 4 calls / 30 s; live-calls-per-program is not viable.

Everything is cached on disk with a TTL, and a scan run never depends on the network. Without network the server still returns the inventory with cve_status: "unknown". Privacy: only product, version and (when present) package id leave the machine — never paths, usernames or hostnames.

The Assessment Mechanism (§5)

The server owns no LLM. At the handshake it checks whether the client declared the MCP sampling capability:

  • Yes: assess_todo asks the client directly via sampling and stores the verdict itself.

  • No (fallback, always available): assess_todo returns a structured evidence package plus the fixed schema; the client assesses and writes the result back through save_assessment.

Both paths produce byte-for-byte the same stored shape, on exactly these axes:

Axis

Meaning

(a) exe_swap_only

the fix is reached by replacing the .exe/file alone

(b) new_setup_needed

a new setup package from the vendor is required

(c) breaking_change_expected

a breaking change is expected

(d) affected_part

only a part program of a suite is affected → name it

Configuration

Defaults work out of the box; the server writes them out on first save.

Setting

Meaning

Default

dataDir

store, caches and config

%APPDATA%\winsecure-mcp

kevTtlHours / cvelistTtlHours / epssTtlHours

disk-cache TTLs

24

portableExcludes

paths never walked

see above

portableMaxResults

cut-off for the portable walk

40

portableTimeoutMs

portable walk budget

60000

httpTimeoutMs

per outbound request

15000

Environment overrides: WSMD_CONFIG (config file), WSMD_DATA_DIR (data directory), WSMD_OFFLINE=1 (switch the network off — the offline test). CLI --config / --data-dir win.

Development

npm run typecheck   # tsc --noEmit
npm run build       # → dist/
npm test            # build + node --test tests/*.test.mjs
node scripts/e2e.mjs --assess   # full real stdio run on this host
node scripts/sampling-test.mjs  # proves both assessment paths

End-to-end run on DESKTOP-F74SJA6 (real numbers)

scan_inventory → 357 programs after dedup (registry 205, winget 209, portable 40 cut at max)
check_cves     → 10 CVE hits on 6 programs, 10 actively exploited; cvelist index 1991 CVEs / 1169 products
list_todos     → WhatsApp (KEV, EPSS 0.68), Microsoft Edge (×2, KEV, EPSS 0.83), 7-Zip, Git, Notepad++
assess_todo    → evidence package returned (client cannot sample); saved via save_assessment
cve_detail     → CVE-2024-21412: CVSS 8.1 — Internet Shortcut Files Security Feature Bypass

Offline test (WSMD_OFFLINE=1, cold cache): inventory 357 programs, cve_status: "unknown", source_errors: ["offline","offline"], no failures.

Registration in Hermes

Register with manage_connections install, then — after any server restart — manage_connections enable. Note: Hermes is not installed on this host, so the registration and the live sampling path could not be exercised here; the tools were all proven callable over real stdio MCP (scripts/e2e.mjs lists and calls all 7), and the sampling path is proven with a mock-capable client (scripts/sampling-test.mjs). Hermes uses the tool-name prefix mcp__winsecure__; match on the name behind the prefix.

Project Structure

src/
  index.ts            MCP server, stdio transport, sampling handshake
  config.ts           defaults + config file + CLI/env overrides
  model.ts            domain types (english, locale-independent, ISO-8601 UTC)
  store.ts            single JSON file for inventory + to-do list (atomic rename)
  utils/              result wrapper, powershell, net (TTL disk cache), matching, zip
  modules/inventory/  sources (registry/winget/portable) + dedupe
  modules/cves/       feeds (KEV/cvelistV5/EPSS/NVD) + matching engine
  modules/todos/      todo model (schema, evidence, merge) + tools
skills/windows-cve-triage/SKILL.md

Available Tools

7 tools
assess_todoAssess to-doA

Effort assessment for one to-do on axes a-d. With a sampling-capable client the server asks it directly and stores the verdict; otherwise it returns an evidence package for save_assessment.

ParametersJSON Schema
NameRequiredDescriptionDefault
todo_idYesThe id from list_todos

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does disclose non-obvious dual-mode behavior plus the fact that a verdict is stored (a mutation). It omits what the evidence package contains, what happens to a previously stored verdict, and what permissions or preconditions the write requires.

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

Conciseness4/5

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

Two tightly written sentences, with the core function front-loaded and the branching behavior second. No filler, but the undefined 'axes a-d' shorthand costs a little clarity within that compact frame.

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?

There is no output schema, no annotations, and the tool performs a write (stores the verdict), so the description should carry more: what the evidence package looks like, how the assessment is consumed downstream, and what 'axes a-d' means. It covers the branching model well but leaves the payload and result semantics undefined.

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

Parameters3/5

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

Schema coverage is 100% and the single `todo_id` parameter is documented as 'The id from list_todos', so the schema does the work. The description adds no format, provenance, or validity detail beyond what the schema already states; baseline 3 applies.

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?

Names a specific verb+resource ('Effort assessment for one to-do') and hints at sibling differentiation by naming `save_assessment`. However, 'axes a-d' is unexplained jargon that an agent cannot act on without outside knowledge, so it is clear but not fully self-contained.

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?

Explains the two operating contexts: sampling-capable clients get the verdict stored directly, others receive an evidence package destined for `save_assessment`. That routing is genuinely useful, though it never states when an agent should avoid this tool or whether re-assessment is expected.

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

check_cvesCheck CVEsA

Match the stored inventory against the local CVE sources (cvelistV5 delta, CISA KEV, EPSS) and fill the ToDo list. Never requires the network.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoForce re-download of the sources even when the cache is fresh
with_epssNoLook up EPSS scores for the matched CVEs. Defaults to true

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose two useful behaviors: the specific local data sources (cvelistV5 delta, CISA KEV, EPSS) and the guarantee that no network access is needed. It also reveals a write side effect ('fill the ToDo list'). However, it does not say whether existing ToDo entries are overwritten or appended, what permissions are required, or how much work the match entails.

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

Conciseness5/5

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

Two sentences, zero filler, and the core action and its inputs are front-loaded before the network-free guarantee. 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?

There is no output schema, and the description never says what the call returns or how the ToDo list is affected beyond 'fill it'. For a tool that mutates ToDo state with no annotations to cover safety or idempotency, more disclosure would be warranted.

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

Parameters3/5

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

Schema coverage is 100%, so both booleans (refresh, with_epss) are already fully documented in the schema, including the default for with_epss. The description adds no additional meaning about them, which is the expected baseline when the schema does the work.

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?

It names a concrete verb (match) plus the two operands (stored inventory vs. local CVE sources) and the resulting side effect (filling the ToDo list). That is far more specific than the sibling names alone, though it never explicitly contrasts itself with scan_inventory, which an agent could plausibly confuse it with.

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

Usage Guidelines3/5

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

The description implies the situation (post-inventory matching against local CVE data) but never states when to call this versus scan_inventory, assess_todo or cve_detail, nor any prerequisite or ordering. Usage is inferable from context rather than stated.

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

cve_detailCVE detailA

Look up a single CVE at NVD API 2.0: description, CVSS, references. Cached for a day.

ParametersJSON Schema
NameRequiredDescriptionDefault
cve_idYesA CVE id, e.g. CVE-2024-21413

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full behavioral burden. It does disclose the useful trait that results are 'cached for a day,' but it is silent on NVD rate limits, behavior for unknown/invalid CVE ids, and whether auth or a key is required.

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

Conciseness5/5

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

A single sentence that front-loads the verb, resource, source, and return fields, then appends the caching caveat. Nothing is wasted.

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

Completeness4/5

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

For a one-parameter lookup with no output schema, the description tells the agent what data comes back (description, CVSS, references) and notes caching. Only edge-case behavior (invalid ids, rate limiting, auth) is left uncovered.

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?

With schema description coverage at 100% and only one parameter, the schema already documents cve_id, its pattern, and an example. The description adds no format or semantics beyond that, so the baseline 3 applies.

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?

It gives a specific verb (look up), a scoped resource (a single CVE), the upstream source (NVD API 2.0), and the returned fields (description, CVSS, references). The word 'single' implicitly separates it from the bulk-checking sibling check_cves, though no sibling is named explicitly.

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 only implied: 'a single CVE' suggests this is for one-off lookups rather than batch checks like check_cves, but there is no explicit when-to-use/when-not-to-use statement or prerequisite detail.

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

get_programGet programC

Detail view of one inventory entry: every source that reported it, its paths, versions and the CVEs assigned to it.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum matches to return. Defaults to 10
programYesName substring or the exact inventory id
with_cvesNoInclude the CVE hits of each match. Defaults to true

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden. It describes the returned fields but omits whether the call is read-only, what happens when nothing matches, and how the 'one inventory entry' framing squares with the schema's multi-match 'limit' parameter (default 10, max 50) and the with_cves toggle — a real ambiguity for a lookup tool.

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

Conciseness4/5

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

A single front-loaded sentence that names the subject first and then lists the returned content. It is efficient and contains no filler, though it spends its words on return values rather than the invocation guidance an agent also needs.

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?

There is no output schema and no annotations, so the description is the only source of behavioral context, and it only partially covers this. The return composition is sketched, but match/multiple-match behavior, defaults, and failure modes are left to the schema or entirely unstated.

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 100%, so limit, program, and with_cves are already fully documented in the schema with defaults and constraints. The description adds no parameter-level detail beyond implying CVE inclusion, so the baseline 3 applies.

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 ('Detail view of one inventory entry') and enumerates the payload (sources, paths, versions, CVEs), which is far more informative than the bare title 'Get program'. It does not name or differentiate itself from siblings like scan_inventory or cve_detail, though, so an agent must infer the boundary itself.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance or mention of alternatives such as scan_inventory or cve_detail. The phrase 'Detail view' weakly implies this is the drill-down counterpart to a scan, but nothing states when to prefer this tool or what input form (name substring vs exact id) is appropriate.

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

list_todosList to-dosB

The CVE to-do list, sorted KEV first, then severity, then EPSS. Filterable by status.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum entries. Defaults to 40
statusNoFilter by status. Defaults to all non-dismissed
kev_onlyNoOnly entries with at least one actively exploited CVE

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden; it does disclose a non-obvious behavioral trait (KEV-first, then severity, then EPSS ordering) that an agent could not infer from the schema. However, it omits the read-only nature, that dismissed entries are excluded by default, and anything about result size or pagination.

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

Conciseness5/5

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

Two terse sentences with zero filler, and the most decision-relevant fact (sort order) is front-loaded before the filtering note.

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 three-optional-parameter read tool with no output schema, the description covers the sort contract and filtering adequately. It could still say the list is read-only and that dismissed items are hidden by default, but nothing critical to a correct call is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so limit, status, and kev_only are already documented in the schema. The description's 'filterable by status' merely echoes the status parameter and adds nothing for limit or kev_only, so baseline 3 applies.

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

Purpose4/5

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

The description names a specific resource (the CVE to-do list) and adds the sort order, which lets an agent tell it apart from cve_detail and assess_todo. The listing verb is only implied via the name/title rather than stated in the description, so it falls just 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 Guidelines2/5

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

'Filterable by status' describes a capability, not when to pick this tool over siblings like cve_detail or check_cves. No prerequisites, no when-not-to-use guidance, and no mention of how it relates to assess_todo.

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

save_assessmentSave assessmentC

Write an effort assessment back to a to-do (the non-sampling path). Sets the status to assessed.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYesShort justification
dismissNoSet the status to dismissed instead of assessed
todo_idYesThe id from list_todos
confidenceNoHow sure the assessment is. Defaults to medium
affected_partNo(d) name the part program when only part of a suite is affected
exe_swap_onlyYes(a) only the .exe/file has to be replaced
new_setup_neededYes(b) a new setup from the vendor is needed
breaking_change_expectedYes(c) a breaking change is expected

TDQS

C2.8/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose one real side effect: it sets the status to 'assessed' (or 'dismissed' per the dismiss param). It says nothing about permissions, idempotency, whether an existing assessment is overwritten, or what a successful write returns.

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

Conciseness4/5

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

Two short sentences, no filler, and the action is front-loaded before the status side effect. The only dead weight is the unexplained parenthetical about the non-sampling path.

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

Completeness2/5

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

This is a mutation tool with eight parameters (five required), no annotations, and no output schema, so the description needs to do more work. It never explains the relationship to assess_todo, the sampling distinction, or any failure/authorization behavior, leaving significant gaps for a write operation.

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

Parameters3/5

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

Schema description coverage is 100%, so the eight parameters and their meanings are already fully documented in the schema. The description adds no syntax, format, or defaulting detail beyond the schema, so the baseline 3 applies.

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

Purpose3/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 ('Write an effort assessment back to a to-do'), which is concrete enough to act on. However, '(the non-sampling path)' is internal jargon that does not help distinguish this tool from the sibling assess_todo, leaving the core purpose only partially differentiated.

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

Usage Guidelines2/5

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

There is no explicit when-to-use guidance and no mention of the obvious alternative assess_todo. The parenthetical '(the non-sampling path)' is an implicit hint about differing execution modes, but it is not explained, so an agent cannot reliably choose between the two.

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

scan_inventoryScan inventoryA

Refresh the installed-software inventory from the registry, winget list and a portable .exe scan. Returns per-source counters and the deduplicated result.

ParametersJSON Schema
NameRequiredDescriptionDefault
rootsNoDrive roots for the portable scan. Defaults to the fixed disks
sourcesNoWhich sources to read. Defaults to all three

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the mechanics (three sources read) and the return shape (per-source counters plus deduplicated result), but says nothing about whether the stored inventory is overwritten, how long the scan takes, whether winget/portable scanning needs network or elevated permissions, or what happens on partial failure.

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

Conciseness5/5

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

Two tight sentences, front-loaded with the action and scope, followed by the return summary. Every clause earns its place; no filler or restatement of the tool name.

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

Completeness4/5

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

With no output schema, the description does the right thing by summarizing return values, and it covers both optional parameters' domains. The remaining gap is side-effect/permission context for a refresh operation that mutates stored inventory state, which matters more given the absence of annotations.

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 100%, so both parameters are already documented in the schema and the baseline is 3. The description usefully connects the 'portable .exe scan' wording to the `roots` parameter and enumerates the three source names matching the `sources` enum, but adds no default or format detail beyond the schema.

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

Purpose4/5

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

Specific verb+resource: 'Refresh the installed-software inventory', with the three data sources named concretely (registry, winget list, portable .exe scan). That is far clearer than a bare 'scan', though it never names a sibling to distinguish itself from get_program or check_cves, which also touch installed software.

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?

'Refresh' implies the use case (re-sync a stale inventory), but there is no explicit when-to-use statement, no exclusion of alternatives, and no note on how this differs from get_program (single lookup) or check_cves. Usage is only inferable.

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. 7 tool updatesv0.1.0
    • First observedassess_todo
    • First observedcheck_cves
    • First observedcve_detail
    • First observedget_program
    • First observedlist_todos
    • First observedsave_assessment
    • First observedscan_inventory

TDQS

A3.5/5.0

Scored across 7 tools

Disambiguation4/5

Each tool targets a distinct step in the vulnerability workflow (inventory, per-program detail, CVE matching, CVE lookup, to-do listing, assessment, saving). The only soft overlap is assess_todo vs save_assessment, since assess_todo can either store a verdict itself or return an evidence package for save_assessment, but the descriptions explicitly clarify this two-path relationship.

Naming Consistency4/5

Six of seven tools follow a clean verb_noun pattern (scan_inventory, get_program, check_cves, list_todos, assess_todo, save_assessment). Only cve_detail breaks the pattern with a noun_noun form, a minor deviation in an otherwise predictable scheme.

Tool Count5/5

Seven tools is well-scoped for an inventory/CVE assessment server. Each tool maps to a clear pipeline stage and none appears redundant or filler.

Completeness4/5

The core lifecycle is covered: scan inventory, match CVEs, populate and list to-dos, assess them, and persist assessments. Minor gaps exist around to-do state management (e.g. dismissing/closing items or explicit status transitions beyond the assessment write-back), but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables CVE lookups and risk assessment by integrating CISA Known Exploited Vulnerabilities (KEV) data and CVSS metrics. It helps users prioritize patching efforts by ranking vulnerabilities based on exploitation status and calculated risk scores.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Unifies NVD, EPSS, CISA KEV, GitHub Advisory, and OSV into a single MCP server, enabling AI agents to query vulnerability intelligence conversationally with 23 tools for incident response, prioritization, dependency audits, and threat monitoring.
    41
    292 npm
    30
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for querying live CISA KEV, EPSS, and enriched vulnerability feeds with full provenance. Enables natural-language access to auditable security-intelligence data from Claude Desktop and other MCP clients.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to search, correlate, and monitor real-time vulnerability intelligence from NVD, CISA KEV, EPSS, and MITRE ATT&CK, including CVE details, critical CVE tracking, known exploited vulnerabilities, and exploitation probability scores.
    5
    2
    MIT