Skip to main content
Glama

Get CVE Change History

nvd_get_cve_history
Read-onlyIdempotent

Retrieve the change history for a single CVE — CVSS score revisions, reference additions, status transitions (e.g., "Received" → "Analyzed"), and CPE configuration updates. Use when tracking a CVE's escalation or investigating when a score changed. Events are returned newest-first by default; pass order="oldest" for the CVE's earliest events. For the current record, call nvd_get_cve instead. The NVD history endpoint is significantly slower than other NVD endpoints, especially without an API key — set NVD_API_KEY for reliable operation.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "cveId": "<cveId>"
    },
    "name": "nvd_get_cve_history"
  }
}

Input Schema

NameRequiredDescriptionDefault
cveIdYesCVE identifier to retrieve history for (e.g., "CVE-2021-44228").
limitNoMaximum number of change events to return (default 20; values above 2000 are clamped unless NVD_CLAMP_LIMITS is false).
orderNoWhich end of the history to page from. Default "newest" returns the most recent events first, which is what escalation and re-score questions need. "oldest" returns NVD's native order (the CVE's first events first) and costs one upstream request, or two when the offset overruns the history; "newest" costs up to two on any history longer than limit.newest
offsetNoZero-based offset for paginating through change events, counted from whichever end order anchors to: offset 0 is the newest event under the default order="newest", and the oldest event under order="oldest".

Output Schema

NameRequiredDescriptionDefault
cveIdNoThe CVE ID for which history was retrieved.
errorNoPresent when the call failed. Absent on success.
orderNoWhich end of the history this page was anchored to.
noticeNoGuidance on the shape of this page. When no events came back it distinguishes an offset past the end of the history, from an empty page NVD returned inside a range it says has events, from a CVE NVD holds no history for — the last of which covers both a record it has never revised and a CVE ID it does not hold. On a partial page it names the offset that reaches the next one, counted from the same end order anchors to.
offsetNoPage offset used in this query.
changesNoCVE change events ordered to match the requested order — newest first by default, oldest first when order="oldest".
returnedNoNumber of change events returned in this response.
totalCountNoTotal change events on record for this CVE.
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. Changed6 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum number of change events to return (default 20, max 2000)."New value: +"Maximum number of change events 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
    • 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: `invalid_cve_id_format`: The CVE ID fails format validation (NVD returns HTTP 404 for malformed IDs). `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 unusable response. `nvd_request_blocked`: The NVD security layer blocked the request. `invalid_cve_id_format`: The CVE ID fails format validation (NVD returns HTTP 404 for malformed IDs). `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: -[
      -  "invalid_cve_id_format",
      -  "rate_limited"
      -]New value: +[
      +  "nvd_invalid_response",
      +  "nvd_request_blocked",
      +  "invalid_cve_id_format",
      +  "rate_limited"
      +]
    • 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 safety profile is covered; the description adds real context on top: the history endpoint is markedly slower than other NVD endpoints and needs NVD_API_KEY for reliable operation, which is operationally actionable. It stops short of describing error or truncation behavior when the history is enormous, keeping it at 4 rather than 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?

Front-loaded with purpose, then usage, ordering, sibling alternative, and the operational caveat. Each sentence carries distinct information; nothing is redundant with the title or with structured fields.

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 so return values need no explanation. Given four documented parameters, the description covers everything an agent needs: what it returns, when to choose it over the sibling, ordering semantics, and the auth/performance caveat.

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 the schema already documents all four parameters thoroughly, setting a baseline of 3. The description reinforces only the order default ("newest-first by default; pass order=\"oldest\" for the CVE's earliest events") and adds no detail on cveId, limit, or offset beyond what the schema states.

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?

Specific verb+resource ("Retrieve the change history for a single CVE") plus an enumeration of what the history contains (CVSS revisions, reference additions, status transitions, CPE config updates). It is clearly distinguished from the sibling nvd_get_cve, which returns the current record rather than the delta trail.

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?

Explicit when-to-use ("tracking a CVE's escalation or investigating when a score changed") and an explicit alternative with its selection condition ("For the current record, call nvd_get_cve instead"). The default-order versus order="oldest" split is also tied to intent.

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.