Skip to main content
Glama
echelongraph

EchelonGraph MCP Server

Official

CVE feed summary

cve_summary
Read-onlyIdempotent

Summarizes active CVEs by severity band (critical, high, medium, low, none) and total count, with last update time, to assess vulnerability exposure.

Instructions

Summary of EchelonGraph's CVE Pulse feed: summary.total active CVEs, their counts by severity band (summary.critical, summary.high, summary.medium, summary.low), the count with no band (summary.none), and summary.last_updated, the newest modification time among those records. summary.none is not a severity rating of None: it counts the active CVEs with no severity band from any source, that is, CVEs not yet scored, and the answer may carry the same count again as summary.unscored. Whenever summary.none is above zero the note says so, and names those CVEs not yet scored, not CVEs rated None. summary.nvd_critical, summary.nvd_high, summary.nvd_medium, summary.nvd_low and summary.nvd_none count the same active CVEs as summary.total by NVD's CVSS severity label: provenance, never EchelonGraph's severity band. summary.nvd_none is neither a count of CVEs rated None nor the count of CVEs with no severity, which is summary.none. summary.rejected counts the CVE records rejected (withdrawn) by their numbering authority, which summary.total and the other counts above leave out: they are withdrawn records, none of them a vulnerability. poller holds the in-memory counters of the NVD poller of the one API instance that answered, counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so. The feed is polled from its sources on a schedule; this is the state as of that update. Its structured result's state is measured, with freshness null (the feed serves no poll-completion time) and data equal to the API's JSON less each poller field (or the whole poller) the note names as left out. Past 30,000 characters of JSON, the first text block holds data cut to fit, and the note says what the cut leaves out and where to read it (TEXT CUT); so is structured data (DATA CUT), unless full: true.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fullNotrue: data in the structured result is the answer whole, however long. Without it, a structured result past 30,000 characters of JSON has its data cut (DATA CUT): in an order the note states, the entries of its longest lists keep only some of their fields, and then the lists only some of their entries; data_truncated is true, and truncated gives each list cut with its total, the number returned and whether its entries are thinned. Whole data is for a program; a client that sizes structured results, as Claude Code does against MAX_MCP_OUTPUT_TOKENS, can refuse an answer past its cap.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changedv3.0.2
    • addedInput schema / $schema
      Added value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / properties / full
      Added value: +{
      +  "description": "true: data in the structured result is the answer whole, however long. Without it, a structured result past 30,000 characters of JSON has its data cut (DATA CUT): in an order the note states, the entries of its longest lists keep only some of their fields, and then the lists only some of their entries; data_truncated is true, and truncated gives each list cut with its total, the number returned and whether its entries are thinned. Whole data is for a program; a client that sizes structured results, as Claude Code does against MAX_MCP_OUTPUT_TOKENS, can refuse an answer past its cap.",
      +  "type": "boolean"
      +}
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "coverage": {
      -        "description": "What the answer covers; null where the answer says nothing about it.",
      -        "type": "null"
      -      },
      -      "data": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "poller": {
      -            "anyOf": [
      -              {
      -                "additionalProperties": {},
      -                "properties": {
      -                  "cves_ingested": {
      -                    "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "cves_skipped": {
      -                    "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "http_retries": {
      -                    "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "interval": {
      -                    "description": "How often this instance's NVD poller polls.",
      -                    "type": [
      -                      "string",
      -                      "null"
      -                    ]
      -                  },
      -                  "last_poll_at": {
      -                    "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      -                    "type": [
      -                      "string",
      -                      "null"
      -                    ]
      -                  },
      -                  "last_poll_dur_ms": {
      -                    "description": "How long that poll took, in milliseconds.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "poll_count": {
      -                    "description": "Polls this instance's NVD poller made since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "poll_errors": {
      -                    "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so. A poller field the answer sends in a JSON type other than the one described here is left out of data and named in the note, and a poller that is neither a JSON object nor null is left out whole: summary is relayed either way."
      -          },
      -          "summary": {
      -            "additionalProperties": {},
      -            "description": "summary.nvd_critical, summary.nvd_high, summary.nvd_medium, summary.nvd_low and summary.nvd_none count the same active CVEs as summary.total by NVD's CVSS severity label (v3.x, else v4.0; before NVD's record arrives, or where it gives none, a pre-NVD label from the CVE.org record or a GitHub advisory can stand in): provenance, never EchelonGraph's severity band. summary.nvd_none counts the active CVEs with no Critical, High, Medium or Low label there, CVEs NVD never labelled under CVSS v3 among them, and many of those carry an NVD CVSS v2 score instead: it is neither a count of CVEs rated None nor the count of CVEs with no severity, which is summary.none. Whenever summary.nvd_none is above zero the note says what it counts, with its count.",
      -            "properties": {
      -              "critical": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "high": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "last_updated": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "low": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "medium": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "none": {
      -                "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_critical": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_high": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_low": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_medium": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_none": {
      -                "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "rejected": {
      -                "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "total": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "unscored": {
      -                "description": "The same count as none, under its own name.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "freshness": {
      -        "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      -        "type": "null"
      -      },
      -      "measured_at": {
      -        "anyOf": [
      -          {
      -            "description": "An RFC 3339 instant.",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      -      },
      -      "method": {
      -        "description": "How the numbers were produced.",
      -        "type": "string"
      -      },
      -      "notes": {
      -        "description": "Caveats, one sentence each.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "state": {
      -        "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      -        "enum": [
      -          "measured",
      -          "not_assessed"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "measured_at",
      -      "method",
      -      "coverage",
      -      "freshness",
      -      "notes",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "coverage": {
      -        "type": "null"
      -      },
      -      "error": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "kind": {
      -            "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      -            "enum": [
      -              "network",
      -              "timeout",
      -              "http",
      -              "not_json",
      -              "not_object",
      -              "invalid_input",
      -              "internal",
      -              "unexpected_shape",
      -              "radars"
      -            ],
      -            "type": "string"
      -          },
      -          "message": {
      -            "description": "The cause: the API's own message, or what went wrong.",
      -            "type": "string"
      -          },
      -          "path": {
      -            "description": "The API path requested, when a request was made.",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "status": {
      -            "anyOf": [
      -              {
      -                "maximum": 9007199254740991,
      -                "minimum": -9007199254740991,
      -                "type": "integer"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "The HTTP status, when the API answered one."
      -          }
      -        },
      -        "required": [
      -          "kind",
      -          "path",
      -          "status",
      -          "message"
      -        ],
      -        "type": "object"
      -      },
      -      "freshness": {
      -        "type": "null"
      -      },
      -      "measured_at": {
      -        "type": "null"
      -      },
      -      "method": {
      -        "type": "null"
      -      },
      -      "notes": {
      -        "description": "Caveats, one sentence each.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "state": {
      -        "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      -        "enum": [
      -          "failed",
      -          "invalid_input"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "measured_at",
      -      "method",
      -      "coverage",
      -      "freshness",
      -      "notes",
      -      "error"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "coverage": {
      +        "description": "What the answer covers; null where the answer says nothing about it.",
      +        "type": "null"
      +      },
      +      "data": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "poller": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "cves_ingested": {
      +                    "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "cves_skipped": {
      +                    "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "http_retries": {
      +                    "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "interval": {
      +                    "description": "How often this instance's NVD poller polls.",
      +                    "type": [
      +                      "string",
      +                      "null"
      +                    ]
      +                  },
      +                  "last_poll_at": {
      +                    "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      +                    "type": [
      +                      "string",
      +                      "null"
      +                    ]
      +                  },
      +                  "last_poll_dur_ms": {
      +                    "description": "How long that poll took, in milliseconds.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "poll_count": {
      +                    "description": "Polls this instance's NVD poller made since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "poll_errors": {
      +                    "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so. A poller field the answer sends in a JSON type other than the one described here is left out of data and named in the note, and a poller that is neither a JSON object nor null is left out whole: summary is relayed either way."
      +          },
      +          "summary": {
      +            "additionalProperties": {},
      +            "description": "summary.nvd_critical, summary.nvd_high, summary.nvd_medium, summary.nvd_low and summary.nvd_none count the same active CVEs as summary.total by NVD's CVSS severity label (v3.x, else v4.0; before NVD's record arrives, or where it gives none, a pre-NVD label from the CVE.org record or a GitHub advisory can stand in): provenance, never EchelonGraph's severity band. summary.nvd_none counts the active CVEs with no Critical, High, Medium or Low label there, CVEs NVD never labelled under CVSS v3 among them, and many of those carry an NVD CVSS v2 score instead: it is neither a count of CVEs rated None nor the count of CVEs with no severity, which is summary.none. Whenever summary.nvd_none is above zero the note says what it counts, with its count.",
      +            "properties": {
      +              "critical": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "high": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "last_updated": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "low": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "medium": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "none": {
      +                "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_critical": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_high": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_low": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_medium": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_none": {
      +                "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "rejected": {
      +                "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "total": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "unscored": {
      +                "description": "The same count as none, under its own name.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "data_truncated": {
      +        "description": "false: data is the answer whole. true: the structured result would pass 30,000 characters of JSON with data whole, so data is cut (DATA CUT): the entries of some of its lists keep only some of their fields, or the lists only some of their entries, truncated gives each, and no string is shortened. The same call with full: true returns data whole.",
      +        "type": "boolean"
      +      },
      +      "freshness": {
      +        "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      +        "type": "null"
      +      },
      +      "measured_at": {
      +        "anyOf": [
      +          {
      +            "description": "An RFC 3339 instant.",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      +      },
      +      "method": {
      +        "description": "How the numbers were produced.",
      +        "type": "string"
      +      },
      +      "notes": {
      +        "description": "Caveats, one sentence each.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "state": {
      +        "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      +        "enum": [
      +          "measured",
      +          "not_assessed"
      +        ],
      +        "type": "string"
      +      },
      +      "truncated": {
      +        "additionalProperties": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "returned": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "thinned": {
      +              "const": true,
      +              "type": "boolean"
      +            },
      +            "total": {
      +              "maximum": 9007199254740991,
      +              "minimum": 0,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "total",
      +            "returned"
      +          ],
      +          "type": "object"
      +        },
      +        "description": "Present when data_truncated is true: each list of data that was cut, by its path in data (a dot between the names of an object and a list inside it), with total, its entries in the answer, returned, the entries data holds, and thinned, true when each of them keeps only some of its fields.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "measured_at",
      +      "method",
      +      "coverage",
      +      "freshness",
      +      "notes",
      +      "data_truncated",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "coverage": {
      +        "type": "null"
      +      },
      +      "error": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "kind": {
      +            "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      +            "enum": [
      +              "network",
      +              "timeout",
      +              "http",
      +              "not_json",
      +              "not_object",
      +              "invalid_input",
      +              "internal",
      +              "unexpected_shape",
      +              "radars"
      +            ],
      +            "type": "string"
      +          },
      +          "message": {
      +            "description": "The cause: the API's own message, or what went wrong.",
      +            "type": "string"
      +          },
      +          "path": {
      +            "description": "The API path requested, when a request was made.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "status": {
      +            "anyOf": [
      +              {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "The HTTP status, when the API answered one."
      +          }
      +        },
      +        "required": [
      +          "kind",
      +          "path",
      +          "status",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "freshness": {
      +        "type": "null"
      +      },
      +      "measured_at": {
      +        "type": "null"
      +      },
      +      "method": {
      +        "type": "null"
      +      },
      +      "notes": {
      +        "description": "Caveats, one sentence each.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "state": {
      +        "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      +        "enum": [
      +          "failed",
      +          "invalid_input"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "measured_at",
      +      "method",
      +      "coverage",
      +      "freshness",
      +      "notes",
      +      "error"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changedv2.7.0
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "coverage": {
      -        "description": "What the answer covers; null where the answer says nothing about it.",
      -        "type": "null"
      -      },
      -      "data": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "poller": {
      -            "anyOf": [
      -              {
      -                "additionalProperties": {},
      -                "properties": {
      -                  "cves_ingested": {
      -                    "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "cves_skipped": {
      -                    "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "http_retries": {
      -                    "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "interval": {
      -                    "description": "How often this instance's NVD poller polls.",
      -                    "type": [
      -                      "string",
      -                      "null"
      -                    ]
      -                  },
      -                  "last_poll_at": {
      -                    "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      -                    "type": [
      -                      "string",
      -                      "null"
      -                    ]
      -                  },
      -                  "last_poll_dur_ms": {
      -                    "description": "How long that poll took, in milliseconds.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "poll_count": {
      -                    "description": "Polls this instance's NVD poller made since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "poll_errors": {
      -                    "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so. A poller field the answer sends in a JSON type other than the one described here is left out of data and named in the note, and a poller that is neither a JSON object nor null is left out whole: summary is relayed either way."
      -          },
      -          "summary": {
      -            "additionalProperties": {},
      -            "properties": {
      -              "critical": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "high": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "last_updated": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "low": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "medium": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "none": {
      -                "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_critical": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_high": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_low": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_medium": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_none": {
      -                "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "rejected": {
      -                "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "total": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "unscored": {
      -                "description": "The same count as none, under its own name.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "freshness": {
      -        "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      -        "type": "null"
      -      },
      -      "measured_at": {
      -        "anyOf": [
      -          {
      -            "description": "An RFC 3339 instant.",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      -      },
      -      "method": {
      -        "description": "How the numbers were produced.",
      -        "type": "string"
      -      },
      -      "notes": {
      -        "description": "Caveats, one sentence each.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "state": {
      -        "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      -        "enum": [
      -          "measured",
      -          "not_assessed"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "measured_at",
      -      "method",
      -      "coverage",
      -      "freshness",
      -      "notes",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "coverage": {
      -        "type": "null"
      -      },
      -      "error": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "kind": {
      -            "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      -            "enum": [
      -              "network",
      -              "timeout",
      -              "http",
      -              "not_json",
      -              "not_object",
      -              "invalid_input",
      -              "internal",
      -              "unexpected_shape",
      -              "radars"
      -            ],
      -            "type": "string"
      -          },
      -          "message": {
      -            "description": "The cause: the API's own message, or what went wrong.",
      -            "type": "string"
      -          },
      -          "path": {
      -            "description": "The API path requested, when a request was made.",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "status": {
      -            "anyOf": [
      -              {
      -                "maximum": 9007199254740991,
      -                "minimum": -9007199254740991,
      -                "type": "integer"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "The HTTP status, when the API answered one."
      -          }
      -        },
      -        "required": [
      -          "kind",
      -          "path",
      -          "status",
      -          "message"
      -        ],
      -        "type": "object"
      -      },
      -      "freshness": {
      -        "type": "null"
      -      },
      -      "measured_at": {
      -        "type": "null"
      -      },
      -      "method": {
      -        "type": "null"
      -      },
      -      "notes": {
      -        "description": "Caveats, one sentence each.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "state": {
      -        "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      -        "enum": [
      -          "failed",
      -          "invalid_input"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "measured_at",
      -      "method",
      -      "coverage",
      -      "freshness",
      -      "notes",
      -      "error"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "coverage": {
      +        "description": "What the answer covers; null where the answer says nothing about it.",
      +        "type": "null"
      +      },
      +      "data": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "poller": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "cves_ingested": {
      +                    "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "cves_skipped": {
      +                    "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "http_retries": {
      +                    "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "interval": {
      +                    "description": "How often this instance's NVD poller polls.",
      +                    "type": [
      +                      "string",
      +                      "null"
      +                    ]
      +                  },
      +                  "last_poll_at": {
      +                    "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      +                    "type": [
      +                      "string",
      +                      "null"
      +                    ]
      +                  },
      +                  "last_poll_dur_ms": {
      +                    "description": "How long that poll took, in milliseconds.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "poll_count": {
      +                    "description": "Polls this instance's NVD poller made since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "poll_errors": {
      +                    "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so. A poller field the answer sends in a JSON type other than the one described here is left out of data and named in the note, and a poller that is neither a JSON object nor null is left out whole: summary is relayed either way."
      +          },
      +          "summary": {
      +            "additionalProperties": {},
      +            "description": "summary.nvd_critical, summary.nvd_high, summary.nvd_medium, summary.nvd_low and summary.nvd_none count the same active CVEs as summary.total by NVD's CVSS severity label (v3.x, else v4.0; before NVD's record arrives, or where it gives none, a pre-NVD label from the CVE.org record or a GitHub advisory can stand in): provenance, never EchelonGraph's severity band. summary.nvd_none counts the active CVEs with no Critical, High, Medium or Low label there, CVEs NVD never labelled under CVSS v3 among them, and many of those carry an NVD CVSS v2 score instead: it is neither a count of CVEs rated None nor the count of CVEs with no severity, which is summary.none. Whenever summary.nvd_none is above zero the note says what it counts, with its count.",
      +            "properties": {
      +              "critical": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "high": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "last_updated": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "low": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "medium": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "none": {
      +                "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_critical": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_high": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_low": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_medium": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_none": {
      +                "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "rejected": {
      +                "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "total": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "unscored": {
      +                "description": "The same count as none, under its own name.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "freshness": {
      +        "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      +        "type": "null"
      +      },
      +      "measured_at": {
      +        "anyOf": [
      +          {
      +            "description": "An RFC 3339 instant.",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      +      },
      +      "method": {
      +        "description": "How the numbers were produced.",
      +        "type": "string"
      +      },
      +      "notes": {
      +        "description": "Caveats, one sentence each.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "state": {
      +        "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      +        "enum": [
      +          "measured",
      +          "not_assessed"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "measured_at",
      +      "method",
      +      "coverage",
      +      "freshness",
      +      "notes",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "coverage": {
      +        "type": "null"
      +      },
      +      "error": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "kind": {
      +            "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      +            "enum": [
      +              "network",
      +              "timeout",
      +              "http",
      +              "not_json",
      +              "not_object",
      +              "invalid_input",
      +              "internal",
      +              "unexpected_shape",
      +              "radars"
      +            ],
      +            "type": "string"
      +          },
      +          "message": {
      +            "description": "The cause: the API's own message, or what went wrong.",
      +            "type": "string"
      +          },
      +          "path": {
      +            "description": "The API path requested, when a request was made.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "status": {
      +            "anyOf": [
      +              {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "The HTTP status, when the API answered one."
      +          }
      +        },
      +        "required": [
      +          "kind",
      +          "path",
      +          "status",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "freshness": {
      +        "type": "null"
      +      },
      +      "measured_at": {
      +        "type": "null"
      +      },
      +      "method": {
      +        "type": "null"
      +      },
      +      "notes": {
      +        "description": "Caveats, one sentence each.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "state": {
      +        "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      +        "enum": [
      +          "failed",
      +          "invalid_input"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "measured_at",
      +      "method",
      +      "coverage",
      +      "freshness",
      +      "notes",
      +      "error"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changedv2.6.5
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "coverage": {
      -        "description": "What the answer covers; null where the answer says nothing about it.",
      -        "type": "null"
      -      },
      -      "data": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "poller": {
      -            "anyOf": [
      -              {
      -                "additionalProperties": {},
      -                "properties": {
      -                  "cves_ingested": {
      -                    "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "cves_skipped": {
      -                    "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "http_retries": {
      -                    "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "interval": {
      -                    "description": "How often this instance's NVD poller polls.",
      -                    "type": [
      -                      "string",
      -                      "null"
      -                    ]
      -                  },
      -                  "last_poll_at": {
      -                    "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      -                    "type": [
      -                      "string",
      -                      "null"
      -                    ]
      -                  },
      -                  "last_poll_dur_ms": {
      -                    "description": "How long that poll took, in milliseconds.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "poll_count": {
      -                    "description": "Polls this instance's NVD poller made since the instance last started.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  },
      -                  "poll_errors": {
      -                    "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      -                    "type": [
      -                      "number",
      -                      "null"
      -                    ]
      -                  }
      -                },
      -                "type": "object"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so."
      -          },
      -          "summary": {
      -            "additionalProperties": {},
      -            "properties": {
      -              "critical": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "high": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "last_updated": {
      -                "type": [
      -                  "string",
      -                  "null"
      -                ]
      -              },
      -              "low": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "medium": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "none": {
      -                "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_critical": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_high": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_low": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_medium": {
      -                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "nvd_none": {
      -                "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "rejected": {
      -                "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "total": {
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              },
      -              "unscored": {
      -                "description": "The same count as none, under its own name.",
      -                "type": [
      -                  "number",
      -                  "null"
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "freshness": {
      -        "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      -        "type": "null"
      -      },
      -      "measured_at": {
      -        "anyOf": [
      -          {
      -            "description": "An RFC 3339 instant.",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      -      },
      -      "method": {
      -        "description": "How the numbers were produced.",
      -        "type": "string"
      -      },
      -      "notes": {
      -        "description": "Caveats, one sentence each.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "state": {
      -        "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      -        "enum": [
      -          "measured",
      -          "not_assessed"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "measured_at",
      -      "method",
      -      "coverage",
      -      "freshness",
      -      "notes",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "coverage": {
      -        "type": "null"
      -      },
      -      "error": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "kind": {
      -            "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      -            "enum": [
      -              "network",
      -              "timeout",
      -              "http",
      -              "not_json",
      -              "not_object",
      -              "invalid_input",
      -              "internal",
      -              "unexpected_shape",
      -              "radars"
      -            ],
      -            "type": "string"
      -          },
      -          "message": {
      -            "description": "The cause: the API's own message, or what went wrong.",
      -            "type": "string"
      -          },
      -          "path": {
      -            "description": "The API path requested, when a request was made.",
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "status": {
      -            "anyOf": [
      -              {
      -                "maximum": 9007199254740991,
      -                "minimum": -9007199254740991,
      -                "type": "integer"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "The HTTP status, when the API answered one."
      -          }
      -        },
      -        "required": [
      -          "kind",
      -          "path",
      -          "status",
      -          "message"
      -        ],
      -        "type": "object"
      -      },
      -      "freshness": {
      -        "type": "null"
      -      },
      -      "measured_at": {
      -        "type": "null"
      -      },
      -      "method": {
      -        "type": "null"
      -      },
      -      "notes": {
      -        "description": "Caveats, one sentence each.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "state": {
      -        "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      -        "enum": [
      -          "failed",
      -          "invalid_input"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "measured_at",
      -      "method",
      -      "coverage",
      -      "freshness",
      -      "notes",
      -      "error"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "coverage": {
      +        "description": "What the answer covers; null where the answer says nothing about it.",
      +        "type": "null"
      +      },
      +      "data": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "poller": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "cves_ingested": {
      +                    "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "cves_skipped": {
      +                    "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "http_retries": {
      +                    "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "interval": {
      +                    "description": "How often this instance's NVD poller polls.",
      +                    "type": [
      +                      "string",
      +                      "null"
      +                    ]
      +                  },
      +                  "last_poll_at": {
      +                    "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      +                    "type": [
      +                      "string",
      +                      "null"
      +                    ]
      +                  },
      +                  "last_poll_dur_ms": {
      +                    "description": "How long that poll took, in milliseconds.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "poll_count": {
      +                    "description": "Polls this instance's NVD poller made since the instance last started.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "poll_errors": {
      +                    "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so. A poller field the answer sends in a JSON type other than the one described here is left out of data and named in the note, and a poller that is neither a JSON object nor null is left out whole: summary is relayed either way."
      +          },
      +          "summary": {
      +            "additionalProperties": {},
      +            "properties": {
      +              "critical": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "high": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "last_updated": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "low": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "medium": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "none": {
      +                "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_critical": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_high": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_low": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_medium": {
      +                "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "nvd_none": {
      +                "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "rejected": {
      +                "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "total": {
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "unscored": {
      +                "description": "The same count as none, under its own name.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "freshness": {
      +        "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      +        "type": "null"
      +      },
      +      "measured_at": {
      +        "anyOf": [
      +          {
      +            "description": "An RFC 3339 instant.",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      +      },
      +      "method": {
      +        "description": "How the numbers were produced.",
      +        "type": "string"
      +      },
      +      "notes": {
      +        "description": "Caveats, one sentence each.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "state": {
      +        "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      +        "enum": [
      +          "measured",
      +          "not_assessed"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "measured_at",
      +      "method",
      +      "coverage",
      +      "freshness",
      +      "notes",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "coverage": {
      +        "type": "null"
      +      },
      +      "error": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "kind": {
      +            "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      +            "enum": [
      +              "network",
      +              "timeout",
      +              "http",
      +              "not_json",
      +              "not_object",
      +              "invalid_input",
      +              "internal",
      +              "unexpected_shape",
      +              "radars"
      +            ],
      +            "type": "string"
      +          },
      +          "message": {
      +            "description": "The cause: the API's own message, or what went wrong.",
      +            "type": "string"
      +          },
      +          "path": {
      +            "description": "The API path requested, when a request was made.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "status": {
      +            "anyOf": [
      +              {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "The HTTP status, when the API answered one."
      +          }
      +        },
      +        "required": [
      +          "kind",
      +          "path",
      +          "status",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "freshness": {
      +        "type": "null"
      +      },
      +      "measured_at": {
      +        "type": "null"
      +      },
      +      "method": {
      +        "type": "null"
      +      },
      +      "notes": {
      +        "description": "Caveats, one sentence each.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "state": {
      +        "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      +        "enum": [
      +          "failed",
      +          "invalid_input"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "measured_at",
      +      "method",
      +      "coverage",
      +      "freshness",
      +      "notes",
      +      "error"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed2 schema fields changedv2.6.3
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "oneOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coverage": {
      +          "description": "What the answer covers; null where the answer says nothing about it.",
      +          "type": "null"
      +        },
      +        "data": {
      +          "additionalProperties": {},
      +          "properties": {
      +            "poller": {
      +              "anyOf": [
      +                {
      +                  "additionalProperties": {},
      +                  "properties": {
      +                    "cves_ingested": {
      +                      "description": "CVE records this instance's NVD poller wrote since the instance last started: never the feed's size or intake.",
      +                      "type": [
      +                        "number",
      +                        "null"
      +                      ]
      +                    },
      +                    "cves_skipped": {
      +                      "description": "CVE records this instance's NVD poller skipped since the instance last started.",
      +                      "type": [
      +                        "number",
      +                        "null"
      +                      ]
      +                    },
      +                    "http_retries": {
      +                      "description": "HTTP retries this instance's NVD poller made since the instance last started.",
      +                      "type": [
      +                        "number",
      +                        "null"
      +                      ]
      +                    },
      +                    "interval": {
      +                      "description": "How often this instance's NVD poller polls.",
      +                      "type": [
      +                        "string",
      +                        "null"
      +                      ]
      +                    },
      +                    "last_poll_at": {
      +                      "description": "When this instance's NVD poller last polled: never the feed's freshness.",
      +                      "type": [
      +                        "string",
      +                        "null"
      +                      ]
      +                    },
      +                    "last_poll_dur_ms": {
      +                      "description": "How long that poll took, in milliseconds.",
      +                      "type": [
      +                        "number",
      +                        "null"
      +                      ]
      +                    },
      +                    "poll_count": {
      +                      "description": "Polls this instance's NVD poller made since the instance last started.",
      +                      "type": [
      +                        "number",
      +                        "null"
      +                      ]
      +                    },
      +                    "poll_errors": {
      +                      "description": "Polls of this instance's NVD poller that failed since the instance last started: never the feed's reliability.",
      +                      "type": [
      +                        "number",
      +                        "null"
      +                      ]
      +                    }
      +                  },
      +                  "type": "object"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "poller holds the in-memory counters of the NVD poller of the one API instance that answered (cves_ingested, cves_skipped, http_retries, poll_count, poll_errors, last_poll_at, last_poll_dur_ms, interval), counted since that instance last started and zeroed on every restart: they describe that instance, never the feed's size, intake, reliability or freshness. Whenever the answer carries poller the note says so."
      +            },
      +            "summary": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "critical": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "high": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "last_updated": {
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "low": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "medium": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "none": {
      +                  "description": "The active CVEs with no severity band from any source: CVEs not yet scored, not a severity rating of None.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "nvd_critical": {
      +                  "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Critical: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "nvd_high": {
      +                  "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is High: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "nvd_low": {
      +                  "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Low: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "nvd_medium": {
      +                  "description": "Of the active CVEs total counts, those whose NVD CVSS severity label is Medium: NVD's label, as provenance, never EchelonGraph's severity band.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "nvd_none": {
      +                  "description": "Of the active CVEs total counts, those with no Critical, High, Medium or Low NVD CVSS severity label, many of them with an NVD CVSS v2 score instead: neither a count of CVEs rated None nor the count of CVEs with no severity, which is none.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "rejected": {
      +                  "description": "The CVE records rejected (withdrawn) by their numbering authority, which total and every other count here leave out: withdrawn records, never vulnerabilities.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "total": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "unscored": {
      +                  "description": "The same count as none, under its own name.",
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                }
      +              },
      +              "type": "object"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "freshness": {
      +          "description": "The producing radar's last completed check (last_run_at), where the API serves one.",
      +          "type": "null"
      +        },
      +        "measured_at": {
      +          "anyOf": [
      +            {
      +              "description": "An RFC 3339 instant.",
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "description": "When the underlying observation was made, as the API states it; null when the answer does not say or holds no observation."
      +        },
      +        "method": {
      +          "description": "How the numbers were produced.",
      +          "type": "string"
      +        },
      +        "notes": {
      +          "description": "Caveats, one sentence each.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "state": {
      +          "description": "measured: a measurement of what was asked; an exposure count is measured only with measured_at and method. not_assessed: the answer holds no dated measurement of what was asked, so no count in it is presented as one; it can still relay a count, as what the source holds on record, undated, and its notes (and exposure_state, where the result carries it) say what each count is.",
      +          "enum": [
      +            "measured",
      +            "not_assessed"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "measured_at",
      +        "method",
      +        "coverage",
      +        "freshness",
      +        "notes",
      +        "data"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "coverage": {
      +          "type": "null"
      +        },
      +        "error": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "kind": {
      +              "description": "What failed: the request (network, timeout), the answer (http, not_json, not_object, unexpected_shape), the input, or this server.",
      +              "enum": [
      +                "network",
      +                "timeout",
      +                "http",
      +                "not_json",
      +                "not_object",
      +                "invalid_input",
      +                "internal",
      +                "unexpected_shape",
      +                "radars"
      +              ],
      +              "type": "string"
      +            },
      +            "message": {
      +              "description": "The cause: the API's own message, or what went wrong.",
      +              "type": "string"
      +            },
      +            "path": {
      +              "description": "The API path requested, when a request was made.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "status": {
      +              "anyOf": [
      +                {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "description": "The HTTP status, when the API answered one."
      +            }
      +          },
      +          "required": [
      +            "kind",
      +            "path",
      +            "status",
      +            "message"
      +          ],
      +          "type": "object"
      +        },
      +        "freshness": {
      +          "type": "null"
      +        },
      +        "measured_at": {
      +          "type": "null"
      +        },
      +        "method": {
      +          "type": "null"
      +        },
      +        "notes": {
      +          "description": "Caveats, one sentence each.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "state": {
      +          "description": "failed: the lookup did not complete. invalid_input: the input was refused, so nothing was looked up. Neither is a finding.",
      +          "enum": [
      +            "failed",
      +            "invalid_input"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "measured_at",
      +        "method",
      +        "coverage",
      +        "freshness",
      +        "notes",
      +        "error"
      +      ],
      +      "type": "object"
      +    }
      +  ],
      +  "type": "object"
      +}
  5. First observedv1.0.3

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already cover readOnly/idempotent/non-destructive/open-world, and the description adds a great deal beyond them: semantics of the easily conflated summary.none vs nvd_none vs unscored, the fact that rejected records are excluded from total, the instance-scoped, restart-zeroed nature of poller, the note's behavior around unnamed/omitted fields, the structured-result shape (state=measured, freshness=null, data equals JSON minus dropped poller fields), the 30,000-character cut with TEXT CUT/DATA CUT markers, and the full:true override. This is the kind of context 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.

Conciseness3/5

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

Front-loading is good (purpose first, parameter behavior last), but the disambiguation prose around none/unscored/nvd_none is repetitive and runs long, and the poller paragraph is a tangent in the main description. Dense but not disorganized; several sentences could be tightened.

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

Completeness5/5

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

Given one optional parameter, no nested objects, an output schema present, and a fairly involved return payload with truncation and poller-scoping quirks, the description covers everything an agent needs: field semantics, exclusion rules, note conventions, truncation and the full escape hatch. Nothing material is left ambiguous.

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% and the single parameter full is already documented in the schema; the description nonetheless explains the consequence of omitting it (DATA CUT behavior, data_truncated/truncated fields) and why whole data is for a program, adding operational meaning beyond the schema text. Slightly redundant with the schema, so not a 5.

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 opens with a specific framing: 'Summary of EchelonGraph's CVE Pulse feed,' then enumerates exactly which counters the response carries (total, severity bands, none, last_updated, the nvd_* provenance counts, rejected, poller). It is clearly a single aggregate-summary tool, distinguishable from per-CVE siblings like get_cve or search_cves. It never explicitly contrasts against those siblings, which keeps it 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 Guidelines4/5

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

Usage is clear by implication: this is the place to get aggregate feed counts rather than per-CVE records, and the 'Whenever summary.none is above zero the note says so' and 'Whenever the answer carries poller the note says so' lines tell the agent what conditions produce which content. There is no explicit 'use this instead of X' routing, so it falls short of a 5.

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