Skip to main content
Glama

Audit CPE for Vulnerabilities

nvd_audit_cpe
Read-onlyIdempotent

Find all CVEs affecting a specific product and version using CPE (Common Platform Enumeration). Requires either an exact CPE name (cpeName) or a partial match string (virtualMatchString) with optional version range bounds. With cpeName, NVD scopes results to configurations where the product is directly vulnerable, not merely referenced as a dependency. Use nvd_search_cpes first to resolve the correct CPE string for a product. Returns full CVE records including current SSVC assessments.

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum number of CVEs to return (default 20; values above 2000 are clamped unless NVD_CLAMP_LIMITS is false).
offsetNoZero-based page offset for pagination. Page through totalCount with a modest limit rather than raising limit — this tool returns full CVE records, so a large limit is a large response.
cpeNameNoFull CPEv2.3 name (e.g., "cpe:2.3:a:apache:http_server:2.4.51:*:*:*:*:*:*:*"). NVD adds isVulnerable automatically. Mutually exclusive with virtualMatchString.
versionEndNoUpper version bound. Requires virtualMatchString.
severityMinNoKeep CVEs whose highest severity band across all CVSS versions meets this threshold, which can exceed the row headline severity. Applied after NVD returns the page, so only CVEs within limit are evaluated.
allLanguagesNoWhen true, keeps every localized description NVD supplies on each record. Default keeps English only.
versionStartNoLower version bound. Requires virtualMatchString.
versionEndTypeNoWhether the upper version bound is inclusive or exclusive.including
versionStartTypeNoWhether the lower version bound is inclusive or exclusive.including
includeReferencesNoWhen false, omits references from each record and its rendered text.
virtualMatchStringNoPartial CPE match pattern (e.g., "cpe:2.3:a:apache:http_server:*"). Use with versionStart/versionEnd for version range audits. Mutually exclusive with cpeName.
includeConfigurationsNoWhen false, omits configurationNodes from each record and its rendered text.

Output Schema

NameRequiredDescriptionDefault
cvesNoFull CVE records for CVEs affecting the specified product.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance on the shape of this page. When no CVEs came back it distinguishes a target NVD holds no CVEs for from a severityMin filter that dropped everything on the page, from an offset past the result set, from an empty page NVD returned inside a range it says has matches. On a partial page it names the offset that reaches the next one.
offsetNoPage offset used in this query.
returnedNoNumber of CVE records returned.
totalCountNoTotal CVEs matched before pagination.
auditTargetNoThe CPE name or virtual match string used for this audit.
severityMinNoThe client-side minimum severity filter applied. Absent when none was set.
filteredCountNoCVEs below severityMin on every CVSS band, or with no scores, on the page NVD returned. Present whenever severityMin is set; 0 means none were dropped. Bands across all versions are evaluated independently of the row headline; CVEs beyond limit were not evaluated.
effectiveLimitNoPage size or ID count used after clamping.
requestedLimitNoRequested page size or ID count before clamping.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed13 schema fields changed
    • addedInput schema / properties / includeConfigurations
      Added value: +{
      +  "default": true,
      +  "description": "When false, omits configurationNodes from each record and its rendered text.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / includeReferences
      Added value: +{
      +  "default": true,
      +  "description": "When false, omits references from each record and its rendered text.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum number of CVEs to return (default 20, max 2000)."New value: +"Maximum number of CVEs to return (default 20; values above 2000 are clamped unless NVD_CLAMP_LIMITS is false)."
    • changedInput schema / properties / limit / maximum
      Previous value: -2000New value: +9007199254740991
    • changedInput schema / properties / severityMin / description
      Previous value: -"Filter out CVEs below this severity level. Applied after NVD returns the page, so it can only drop CVEs within limit — raise limit to widen what it sees."New value: +"Keep CVEs whose highest severity band across all CVSS versions meets this threshold, which can exceed the row headline severity. Applied after NVD returns the page, so only CVEs within limit are evaluated."
    • changedOutput schema / properties / cves / items / description
      Previous value: -"Full CVE record for one vulnerability affecting the product."New value: +"CVE record for one vulnerability affecting the product; configurations and references can be omitted by caller selectors."
    • addedOutput schema / properties / cves / items / properties / ssvc
      Added value: +{
      +  "description": "Current SSVC assessments in upstream order.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One current SSVC assessment.",
      +    "properties": {
      +      "decisionPoints": {
      +        "description": "Ordered option objects; repeated keys remain separate.",
      +        "items": {
      +          "additionalProperties": {
      +            "anyOf": [
      +              {
      +                "description": "Decision-point value.",
      +                "type": "string"
      +              },
      +              {
      +                "description": "Decision-point values.",
      +                "items": {
      +                  "description": "One decision-point value.",
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              }
      +            ],
      +            "description": "One string or ordered list of strings."
      +          },
      +          "description": "Decision-point names and values.",
      +          "propertyNames": {
      +            "description": "Decision-point name.",
      +            "type": "string"
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "role": {
      +        "description": "Assessment role.",
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Contributor name or original source identifier.",
      +        "type": "string"
      +      },
      +      "timestamp": {
      +        "description": "Assessment timestamp when provided.",
      +        "type": "string"
      +      },
      +      "version": {
      +        "description": "SSVC decision-tree version.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "role",
      +      "version",
      +      "decisionPoints"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / cves / items / required
      Previous value: -[
      -  "cveId",
      -  "vulnStatus",
      -  "published",
      -  "lastModified",
      -  "descriptions",
      -  "cvssScores",
      -  "weaknesses",
      -  "configurationNodes"
      -]New value: +[
      +  "cveId",
      +  "vulnStatus",
      +  "published",
      +  "lastModified",
      +  "descriptions",
      +  "cvssScores",
      +  "weaknesses"
      +]
    • addedOutput schema / properties / effectiveLimit
      Added value: +{
      +  "description": "Page size or ID count used after clamping.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `missing_cpe_input`: Neither cpeName nor virtualMatchString was provided. `conflicting_cpe_inputs`: Both cpeName and virtualMatchString were provided simultaneously. `version_range_without_match_string`: versionStart or versionEnd was provided without virtualMatchString. `invalid_cpe_format`: cpeName or virtualMatchString does not start with \"cpe:2.3:\", or NVD rejected it as a malformed CPE parameter — cpeName rejects anything short of a complete CPEv2.3 name, virtualMatchString only genuinely malformed characters. `rate_limited`: NVD returned HTTP 403 indicating the rate limit was exceeded. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `nvd_invalid_response`: NVD returned an invalid response. `nvd_request_blocked`: NVD blocked the request. `missing_cpe_input`: Neither cpeName nor virtualMatchString was provided. `conflicting_cpe_inputs`: Both cpeName and virtualMatchString were provided simultaneously. `version_range_without_match_string`: versionStart or versionEnd was provided without virtualMatchString. `invalid_cpe_format`: cpeName or virtualMatchString does not start with \"cpe:2.3:\", or NVD rejected it as a malformed CPE parameter — cpeName rejects anything short of a complete CPEv2.3 name, virtualMatchString only genuinely malformed characters. `rate_limited`: NVD explicitly reported that the rate limit was exceeded. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "missing_cpe_input",
      -  "conflicting_cpe_inputs",
      -  "version_range_without_match_string",
      -  "invalid_cpe_format",
      -  "rate_limited"
      -]New value: +[
      +  "nvd_invalid_response",
      +  "nvd_request_blocked",
      +  "missing_cpe_input",
      +  "conflicting_cpe_inputs",
      +  "version_range_without_match_string",
      +  "invalid_cpe_format",
      +  "rate_limited"
      +]
    • changedOutput schema / properties / filteredCount / description
      Previous value: -"CVEs dropped by the severityMin filter from the page NVD returned. Present whenever severityMin is set; 0 means the filter dropped nothing, so a narrow result reflects totalCount and limit instead. This is not totalCount minus returned — CVEs beyond limit were never fetched and so were never evaluated against the filter."New value: +"CVEs below severityMin on every CVSS band, or with no scores, on the page NVD returned. Present whenever severityMin is set; 0 means none were dropped. Bands across all versions are evaluated independently of the row headline; CVEs beyond limit were not evaluated."
    • addedOutput schema / properties / requestedLimit
      Added value: +{
      +  "description": "Requested page size or ID count before clamping.",
      +  "type": "number"
      +}
  2. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/closed-world, so the baseline is lower; the description adds meaningful context beyond them — that cpeName scoping excludes dependency-only references, and that results include SSVC assessments. It doesn't discuss pagination or response size, but the schema covers that.

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

Conciseness5/5

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

Four sentences, front-loaded with the core purpose, then the input constraint, then the scoping nuance, then the prerequisite pointer. No 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?

An output schema exists and the description still notes what comes back (full CVE records with SSVC). Given the rich schema and annotations, nothing essential for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description adds the mutual-exclusivity/either-or requirement that the schema itself doesn't enforce (no oneOf), plus the coupling of versionStart/versionEnd to virtualMatchString. That is genuine meaning beyond the field descriptions.

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

Purpose5/5

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

States a specific verb and resource ('Find all CVEs affecting a specific product and version using CPE') and names the sibling nvd_search_cpes as the prerequisite resolver. An agent can distinguish this from nvd_search_cves or nvd_get_cve by the CPE-scoped audit semantics.

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

Usage Guidelines4/5

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

Gives clear context: 'Use nvd_search_cpes first to resolve the correct CPE string,' and states the cpeName-or-virtualMatchString requirement. It does not explicitly say when to prefer nvd_search_cves over this tool, so it stops short of full alternative routing.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.