@cyanheads/nist-nvd-mcp-server 0.1.15 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/AGENTS.md +11 -6
  2. package/CLAUDE.md +11 -6
  3. package/README.md +11 -7
  4. package/changelog/0.1.x/0.1.16.md +21 -0
  5. package/dist/mcp-server/resources/definitions/nvd-cve.resource.d.ts +5 -0
  6. package/dist/mcp-server/resources/definitions/nvd-cve.resource.d.ts.map +1 -1
  7. package/dist/mcp-server/resources/definitions/nvd-cve.resource.js +6 -6
  8. package/dist/mcp-server/resources/definitions/nvd-cve.resource.js.map +1 -1
  9. package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.d.ts +2 -0
  10. package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.d.ts.map +1 -1
  11. package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.js +28 -31
  12. package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.js.map +1 -1
  13. package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.d.ts +7 -0
  14. package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.d.ts.map +1 -1
  15. package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.js +46 -23
  16. package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.d.ts +2 -0
  18. package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.d.ts.map +1 -1
  19. package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.js +26 -7
  20. package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.js.map +1 -1
  21. package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.d.ts +1 -0
  22. package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.js +9 -0
  24. package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/formatting/cpe-match.d.ts +46 -0
  26. package/dist/mcp-server/tools/formatting/cpe-match.d.ts.map +1 -0
  27. package/dist/mcp-server/tools/formatting/cpe-match.js +43 -0
  28. package/dist/mcp-server/tools/formatting/cpe-match.js.map +1 -0
  29. package/dist/services/nvd-cpe/nvd-cpe-service.d.ts +3 -0
  30. package/dist/services/nvd-cpe/nvd-cpe-service.d.ts.map +1 -1
  31. package/dist/services/nvd-cpe/nvd-cpe-service.js +3 -2
  32. package/dist/services/nvd-cpe/nvd-cpe-service.js.map +1 -1
  33. package/dist/services/nvd-cve/nvd-cve-service.d.ts +18 -0
  34. package/dist/services/nvd-cve/nvd-cve-service.d.ts.map +1 -1
  35. package/dist/services/nvd-cve/nvd-cve-service.js +31 -1
  36. package/dist/services/nvd-cve/nvd-cve-service.js.map +1 -1
  37. package/dist/services/nvd-cve/types.d.ts +5 -0
  38. package/dist/services/nvd-cve/types.d.ts.map +1 -1
  39. package/manifest.json +1 -1
  40. package/package.json +1 -1
  41. package/server.json +3 -3
package/AGENTS.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** nist-nvd-mcp-server
4
- **Version:** 0.1.15
4
+ **Version:** 0.1.16
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.11.0`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
@@ -67,12 +67,15 @@ export const nvdSearchCpes = tool('nvd_search_cpes', {
67
67
  title: z.string().optional().describe('Human-readable title.'),
68
68
  deprecated: z.boolean().describe('Whether this CPE is deprecated.'),
69
69
  })).describe('Matching CPE dictionary entries.'),
70
- queryMeta: z.object({
71
- totalResults: z.number().describe('Total matches before limit.'),
72
- returned: z.number().describe('Entries returned.'),
73
- }).describe('Pagination metadata.'),
74
70
  }),
75
71
 
72
+ // Pagination totals are agent-facing context, not domain payload — declare them as
73
+ // `enrichment` and populate via ctx.enrich so they reach structuredContent AND content[].
74
+ enrichment: {
75
+ totalCount: z.number().describe('Total matches before the limit was applied.'),
76
+ returned: z.number().describe('Entries returned.'),
77
+ },
78
+
76
79
  errors: [
77
80
  {
78
81
  reason: 'missing_search_input',
@@ -91,7 +94,9 @@ export const nvdSearchCpes = tool('nvd_search_cpes', {
91
94
  ctx.log.info('Searching CPE dictionary', { keyword: input.keyword, limit: input.limit });
92
95
  const service = getNvdCpeService();
93
96
  const result = await service.searchCpes({ keyword: input.keyword, cpeMatchString: input.cpeMatchString, limit: input.limit }, ctx);
94
- return { cpes: result.cpes, queryMeta: { totalResults: result.totalResults, returned: result.returned } };
97
+ ctx.enrich({ returned: result.returned });
98
+ ctx.enrich.total(result.totalResults);
99
+ return { cpes: result.cpes };
95
100
  },
96
101
 
97
102
  format: (result) => [{ type: 'text', text: result.cpes.map(c => `**${c.title ?? c.cpeName}**: \`${c.cpeName}\``).join('\n') }],
package/CLAUDE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** nist-nvd-mcp-server
4
- **Version:** 0.1.15
4
+ **Version:** 0.1.16
5
5
  **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.11.0`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
@@ -67,12 +67,15 @@ export const nvdSearchCpes = tool('nvd_search_cpes', {
67
67
  title: z.string().optional().describe('Human-readable title.'),
68
68
  deprecated: z.boolean().describe('Whether this CPE is deprecated.'),
69
69
  })).describe('Matching CPE dictionary entries.'),
70
- queryMeta: z.object({
71
- totalResults: z.number().describe('Total matches before limit.'),
72
- returned: z.number().describe('Entries returned.'),
73
- }).describe('Pagination metadata.'),
74
70
  }),
75
71
 
72
+ // Pagination totals are agent-facing context, not domain payload — declare them as
73
+ // `enrichment` and populate via ctx.enrich so they reach structuredContent AND content[].
74
+ enrichment: {
75
+ totalCount: z.number().describe('Total matches before the limit was applied.'),
76
+ returned: z.number().describe('Entries returned.'),
77
+ },
78
+
76
79
  errors: [
77
80
  {
78
81
  reason: 'missing_search_input',
@@ -91,7 +94,9 @@ export const nvdSearchCpes = tool('nvd_search_cpes', {
91
94
  ctx.log.info('Searching CPE dictionary', { keyword: input.keyword, limit: input.limit });
92
95
  const service = getNvdCpeService();
93
96
  const result = await service.searchCpes({ keyword: input.keyword, cpeMatchString: input.cpeMatchString, limit: input.limit }, ctx);
94
- return { cpes: result.cpes, queryMeta: { totalResults: result.totalResults, returned: result.returned } };
97
+ ctx.enrich({ returned: result.returned });
98
+ ctx.enrich.total(result.totalResults);
99
+ return { cpes: result.cpes };
95
100
  },
96
101
 
97
102
  format: (result) => [{ type: 'text', text: result.cpes.map(c => `**${c.title ?? c.cpeName}**: \`${c.cpeName}\``).join('\n') }],
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.1.15-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/nist-nvd-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/nist-nvd-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/nist-nvd-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.14-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.1.16-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/nist-nvd-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/nist-nvd-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/nist-nvd-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.14-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -49,8 +49,9 @@ The primary discovery tool for vulnerability surveillance and triage workflows.
49
49
  - CISA KEV filter — limit results to known-exploited vulnerabilities
50
50
  - Convenience date shorthands: `pubDays` and `lastModDays` for "last N days" queries
51
51
  - Explicit ISO 8601 date range parameters (`pubStartDate`/`pubEndDate`, etc.) with 120-day max span
52
- - Auto-clamps convenience date params that exceed 120 days and reports clamped values in `queryMeta`
52
+ - Auto-clamps convenience date params that exceed 120 days and reports clamped values in the response enrichment
53
53
  - Pagination via `limit` (up to 2000) and `offset`
54
+ - Every row carries a truncated description alongside the ID, so results are distinguishable without a follow-up fetch
54
55
  - Results are always brief; call `nvd_get_cve` for full detail
55
56
 
56
57
  ---
@@ -61,9 +62,10 @@ Fetch one or more CVEs by ID with full detail or brief summaries.
61
62
 
62
63
  - Batch up to 100 CVE IDs per call
63
64
  - Full mode: all CVSS scores across v2.0, v3.0, v3.1, and v4.0; CWE weaknesses; CPE configurations; CISA KEV fields; references
64
- - Brief mode (`brief: true`): ID, status, top severity, KEV name — recommended for batches larger than 10
65
+ - Brief mode (`brief: true`): ID, status, top severity, KEV name, truncated description — recommended for batches larger than 10
65
66
  - `includeReferences: false` to strip the references array and reduce response size
66
- - Per-ID parity check: `queryMeta.missingIds` lists any requested IDs NVD didn't return
67
+ - Per-ID parity check: the `missingIds` enrichment field lists any requested IDs NVD didn't return
68
+ - Rendered text carries the affected-product criteria and references the record holds, capped with a `… N more` trailer; `allLanguages: true` renders every localized description, not just English
67
69
 
68
70
  ---
69
71
 
@@ -73,7 +75,7 @@ Look up product identifiers before auditing.
73
75
 
74
76
  - Keyword search (e.g., `"apache http server"`, `"openssl"`) or partial CPEv2.3 pattern
75
77
  - Returns full CPE name, human-readable title, deprecation status, and superseding CPEs
76
- - Pagination up to 10,000 entries — narrow the keyword when `totalResults > returned`
78
+ - Pagination via `limit` (up to 10,000 per page) and `offset` — a vendor-level keyword can match tens of thousands of entries, so page with `offset` rather than trying to narrow further
77
79
  - Use this before `nvd_audit_cpe` — CPE names are arcane strings; guessing audits the wrong product
78
80
 
79
81
  ---
@@ -86,7 +88,8 @@ Full CVE audit for a specific product version.
86
88
  - Version range via `versionStart`/`versionEnd` with inclusive/exclusive type control
87
89
  - Client-side severity filter (`severityMin`) to strip low-signal entries
88
90
  - Returns full CVE records (ID, CVSS scores, CWE, CPE configurations, KEV fields, references)
89
- - Echoes the CPE identifier used in `queryMeta` so callers can verify the correct product was queried
91
+ - Pagination via `limit` (up to 2000) and `offset` — page at a modest `limit` instead of raising it, since each result is a full record
92
+ - Echoes the CPE identifier used in the response enrichment so callers can verify the correct product was queried
90
93
 
91
94
  ---
92
95
 
@@ -128,9 +131,10 @@ NVD-specific:
128
131
 
129
132
  Agent-friendly output:
130
133
 
131
- - `queryMeta` on every response — total results, returned count, page offset, and any date-clamping events so agents can reason about what was actually queried
134
+ - An `enrichment` block on every response, carried on both `structuredContent` and the rendered text — total results, returned count, page offset, the filters actually applied, and any date-clamping events, so agents can reason about what was really queried
132
135
  - `missingIds` in batch CVE lookups — per-ID parity check instead of a silent partial result
133
136
  - CPE echo in audit responses — `cpeName` or `virtualMatchString` reflected back so callers can verify the correct product was audited
137
+ - Empty-result notices that name the cause — an unmatched query, a severity threshold that emptied the page, and an offset past the end of the result set are told apart rather than all reading as "nothing found"
134
138
 
135
139
  ## Getting started
136
140
 
@@ -0,0 +1,21 @@
1
+ ---
2
+ summary: "nvd_audit_cpe and nvd_search_cpes gain offset paging; nvd_get_cve's format() renders CPE match criteria and every language a record carries instead of a bare count and English-only text; search results carry a truncated description; docs/design.md and README describe the enrichment block instead of the removed queryMeta envelope."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.1.16 — 2026-07-27
8
+
9
+ ## Added
10
+
11
+ - **`offset` input on `nvd_audit_cpe` and `nvd_search_cpes`** — zero-based, threaded to NVD's `startIndex` and echoed in the `enrichment` block alongside `totalCount` and `returned`, matching the pattern `nvd_search_cves` already used. `nvd_search_cpes`'s truncation notice now names the offset that reaches the remainder instead of telling the caller to narrow an already vendor-level keyword; both tools distinguish an offset past the end of the result set from their other empty-result cases. ([#31](https://github.com/cyanheads/nist-nvd-mcp-server/issues/31))
12
+ - **Truncated description on brief CVE rows** — `BriefCveRecord` gains an optional `description` (first 200 characters of the English text, exported as `BRIEF_DESCRIPTION_CHARS`), populated on both `nvd_search_cves` results and `nvd_get_cve`'s `brief: true` mode. Lets a caller distinguish search hits without a follow-up full-detail fetch. ([#32](https://github.com/cyanheads/nist-nvd-mcp-server/issues/32))
13
+
14
+ ## Changed
15
+
16
+ - **`nvd_get_cve`'s `format()` now matches `structuredContent`** — CPE match criteria render through the shared `formatCpeMatch()`/`flattenCpeMatches()` helpers (moved to `src/mcp-server/tools/formatting/cpe-match.ts`, also used by `nvd_audit_cpe`) instead of a bare node-group count, capped at 5 with a trailer pointing at `nvd_audit_cpe` for the remainder; every language a record carries renders under `allLanguages` instead of only English; references cap raised from 5 to 15. ([#30](https://github.com/cyanheads/nist-nvd-mcp-server/issues/30))
17
+ - **`docs/design.md`, `README.md`, and the tool template in `CLAUDE.md`/`AGENTS.md` describe the `enrichment` block** — all three still described the `queryMeta` output envelope, which stopped being emitted several releases ago. Rewritten against each tool's actual `enrichment` fields, including ones added since the drift started (`filtersApplied`, `severityMin`, `filteredCount`, `offset`). ([#26](https://github.com/cyanheads/nist-nvd-mcp-server/issues/26))
18
+
19
+ ## Fixed
20
+
21
+ - **`nvd://cve/{cveId}` resource carried a dead empty-result branch** — a single-ID miss always throws `cve_not_found` inside `fetchById`, so the resource's own `result.cves.length === 0` check could never execute. Removed; tests retargeted to exercise the real throw path over a mocked HTTP client.
@@ -12,6 +12,11 @@ export declare const nvdCveResource: import("@cyanheads/mcp-ts-core").ResourceDe
12
12
  readonly when: "The cveId segment of the URI fails format validation.";
13
13
  readonly recovery: "Use a URI of the form nvd://cve/CVE-YYYY-NNNNN, for example nvd://cve/CVE-2021-44228.";
14
14
  }, {
15
+ /**
16
+ * Thrown by the service, not this handler: a single-ID fetch that NVD answers with no
17
+ * records raises `cve_not_found` there. The entry stays declared here so the service's
18
+ * `ctx.recoveryFor('cve_not_found')` resolves this recovery text onto the wire.
19
+ */
15
20
  readonly reason: "cve_not_found";
16
21
  readonly code: JsonRpcErrorCode.NotFound;
17
22
  readonly when: "The CVE ID is well-formed but NVD holds no record for it.";
@@ -1 +1 @@
1
- {"version":3,"file":"nvd-cve.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/nvd-cve.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,cAAc;;;;;;;;;;;;GA2DzB,CAAC"}
1
+ {"version":3,"file":"nvd-cve.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/nvd-cve.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE,eAAO,MAAM,cAAc;;;;;;;;IAuBrB;;;;OAIG;;;;;GA+BP,CAAC"}
@@ -25,6 +25,11 @@ export const nvdCveResource = resource('nvd://cve/{cveId}', {
25
25
  recovery: 'Use a URI of the form nvd://cve/CVE-YYYY-NNNNN, for example nvd://cve/CVE-2021-44228.',
26
26
  },
27
27
  {
28
+ /**
29
+ * Thrown by the service, not this handler: a single-ID fetch that NVD answers with no
30
+ * records raises `cve_not_found` there. The entry stays declared here so the service's
31
+ * `ctx.recoveryFor('cve_not_found')` resolves this recovery text onto the wire.
32
+ */
28
33
  reason: 'cve_not_found',
29
34
  code: JsonRpcErrorCode.NotFound,
30
35
  when: 'The CVE ID is well-formed but NVD holds no record for it.',
@@ -38,13 +43,8 @@ export const nvdCveResource = resource('nvd://cve/{cveId}', {
38
43
  }
39
44
  ctx.log.debug('Fetching CVE resource', { cveId });
40
45
  const service = getNvdCveService();
46
+ // A single-ID miss throws `cve_not_found` inside fetchById, so this always has a record.
41
47
  const result = await service.fetchById([cveId.toUpperCase()], { includeReferences: true, allLanguages: false }, ctx);
42
- if (result.cves.length === 0) {
43
- throw ctx.fail('cve_not_found', `CVE ${cveId} not found in the NVD database.`, {
44
- cveId,
45
- ...ctx.recoveryFor('cve_not_found'),
46
- });
47
- }
48
48
  return result.cves[0];
49
49
  },
50
50
  });
@@ -1 +1 @@
1
- {"version":3,"file":"nvd-cve.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/nvd-cve.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,EAAE;IAC1D,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,sEAAsE;QACtE,0FAA0F;QAC1F,sDAAsD;IACxD,QAAQ,EAAE,kBAAkB;IAE5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,gFAAgF,CAAC;KAC9F,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,uBAAuB;YAC/B,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,uDAAuD;YAC7D,QAAQ,EACN,uFAAuF;SAC1F;QACD;YACE,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2DAA2D;YACjE,QAAQ,EACN,2FAA2F;SAC9F;KACF;IAED,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,IAAI,CACZ,uBAAuB,EACvB,2BAA2B,KAAK,qCAAqC,EACrE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,CACvD,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CACpC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EACrB,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAChD,GAAG,CACJ,CAAC;QAEF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,KAAK,iCAAiC,EAAE;gBAC7E,KAAK;gBACL,GAAG,GAAG,CAAC,WAAW,CAAC,eAAe,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"nvd-cve.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/nvd-cve.resource.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,EAAE;IAC1D,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,sEAAsE;QACtE,0FAA0F;QAC1F,sDAAsD;IACxD,QAAQ,EAAE,kBAAkB;IAE5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,CAAC,gFAAgF,CAAC;KAC9F,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,uBAAuB;YAC/B,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,uDAAuD;YAC7D,QAAQ,EACN,uFAAuF;SAC1F;QACD;YACE;;;;eAIG;YACH,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2DAA2D;YACjE,QAAQ,EACN,2FAA2F;SAC9F;KACF;IAED,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,CAAC,IAAI,CACZ,uBAAuB,EACvB,2BAA2B,KAAK,qCAAqC,EACrE,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,CACvD,CAAC;QACJ,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;QAEnC,yFAAyF;QACzF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CACpC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EACrB,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAChD,GAAG,CACJ,CAAC;QAEF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;CACF,CAAC,CAAC"}
@@ -25,6 +25,7 @@ export declare const nvdAuditCpe: import("@cyanheads/mcp-ts-core").ToolDefinitio
25
25
  }>>;
26
26
  allLanguages: z.ZodDefault<z.ZodBoolean>;
27
27
  limit: z.ZodDefault<z.ZodNumber>;
28
+ offset: z.ZodDefault<z.ZodNumber>;
28
29
  }, z.core.$strip>, z.ZodObject<{
29
30
  cves: z.ZodArray<z.ZodObject<{
30
31
  cveId: z.ZodString;
@@ -111,6 +112,7 @@ export declare const nvdAuditCpe: import("@cyanheads/mcp-ts-core").ToolDefinitio
111
112
  }], {
112
113
  readonly totalCount: z.ZodNumber;
113
114
  readonly returned: z.ZodNumber;
115
+ readonly offset: z.ZodNumber;
114
116
  readonly auditTarget: z.ZodString;
115
117
  readonly severityMin: z.ZodOptional<z.ZodString>;
116
118
  readonly filteredCount: z.ZodOptional<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"nvd-audit-cpe.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/nvd-audit-cpe.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAsJjE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyTtB,CAAC"}
1
+ {"version":3,"file":"nvd-audit-cpe.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/nvd-audit-cpe.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA0HjE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2UtB,CAAC"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { tool, z } from '@cyanheads/mcp-ts-core';
6
6
  import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { CPE_MATCH_CAP, flattenCpeMatches } from '../../../mcp-server/tools/formatting/cpe-match.js';
7
8
  import { getNvdCveService } from '../../../services/nvd-cve/nvd-cve-service.js';
8
9
  const CPE_V23_REGEX = /^cpe:2\.3:/i;
9
10
  const CvssScoreSchema = z.object({
@@ -28,30 +29,8 @@ const CpeMatchSchema = z.object({
28
29
  versionEndIncluding: z.string().optional().describe('Inclusive upper version bound.'),
29
30
  versionEndExcluding: z.string().optional().describe('Exclusive upper version bound.'),
30
31
  });
31
- /** Cap on CPE match criteria rendered per CVE — mirrors the references cap in this formatter. */
32
- const CPE_MATCH_CAP = 5;
33
- /**
34
- * Render one CPE match as a single line: the criteria string, its version bounds, and the
35
- * operators that govern it. `nodeOperator` combines the matches inside a node; `groupOperator`
36
- * combines sibling nodes in the group, so an `AND` there marks conditions that hold together
37
- * (e.g. a firmware match and the hardware it runs on) rather than independent alternatives.
38
- */
39
- function formatCpeMatch(match, groupOperator, nodeOperator) {
40
- const bounds = [
41
- match.versionStartIncluding && `>= ${match.versionStartIncluding}`,
42
- match.versionStartExcluding && `> ${match.versionStartExcluding}`,
43
- match.versionEndIncluding && `<= ${match.versionEndIncluding}`,
44
- match.versionEndExcluding && `< ${match.versionEndExcluding}`,
45
- ].filter(Boolean);
46
- const notes = [
47
- nodeOperator,
48
- groupOperator && `${groupOperator} with sibling nodes`,
49
- match.vulnerable ? undefined : 'not the vulnerable component',
50
- ].filter(Boolean);
51
- return (`${match.criteria}` +
52
- (bounds.length > 0 ? ` (${bounds.join(', ')})` : '') +
53
- (notes.length > 0 ? ` [${notes.join('; ')}]` : ''));
54
- }
32
+ /** References rendered per CVE — this tool returns full records for many CVEs at once. */
33
+ const REFERENCE_CAP = 5;
55
34
  const CveRecordSchema = z.object({
56
35
  cveId: z.string().describe('CVE identifier (e.g., "CVE-2021-44228").'),
57
36
  vulnStatus: z.string().describe('NVD analysis status.'),
@@ -172,6 +151,13 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
172
151
  .max(2000)
173
152
  .default(20)
174
153
  .describe('Maximum number of CVEs to return (default 20, max 2000).'),
154
+ offset: z
155
+ .number()
156
+ .int()
157
+ .min(0)
158
+ .default(0)
159
+ .describe('Zero-based page offset for pagination. Page through totalCount with a modest limit ' +
160
+ 'rather than raising limit — this tool returns full CVE records, so a large limit is a large response.'),
175
161
  }),
176
162
  output: z.object({
177
163
  cves: z
@@ -181,6 +167,7 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
181
167
  enrichment: {
182
168
  totalCount: z.number().describe('Total CVEs matched before pagination.'),
183
169
  returned: z.number().describe('Number of CVE records returned.'),
170
+ offset: z.number().describe('Page offset used in this query.'),
184
171
  auditTarget: z.string().describe('The CPE name or virtual match string used for this audit.'),
185
172
  severityMin: z
186
173
  .string()
@@ -197,6 +184,7 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
197
184
  },
198
185
  enrichmentTrailer: {
199
186
  returned: { label: 'Returned' },
187
+ offset: { label: 'Offset' },
200
188
  auditTarget: { label: 'Audit Target' },
201
189
  severityMin: { label: 'Severity Filter' },
202
190
  filteredCount: { label: 'Dropped by Severity Filter' },
@@ -261,6 +249,7 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
261
249
  cpeName: input.cpeName,
262
250
  virtualMatchString: input.virtualMatchString,
263
251
  limit: input.limit,
252
+ offset: input.offset,
264
253
  });
265
254
  const service = getNvdCveService();
266
255
  const result = await service.auditCpe({
@@ -273,10 +262,12 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
273
262
  ...(input.severityMin && { severityMin: input.severityMin }),
274
263
  allLanguages: input.allLanguages,
275
264
  limit: input.limit,
265
+ offset: input.offset,
276
266
  }, ctx);
277
267
  const auditTarget = result.cpeName ?? result.virtualMatchString ?? 'unknown CPE';
278
268
  ctx.enrich({
279
269
  returned: result.returned,
270
+ offset: result.offset,
280
271
  auditTarget,
281
272
  ...(input.severityMin && {
282
273
  severityMin: input.severityMin,
@@ -285,9 +276,14 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
285
276
  });
286
277
  ctx.enrich.total(result.totalResults);
287
278
  if (result.cves.length === 0) {
288
- // Distinguish "the CPE has no CVEs" from "severityMin dropped everything on the page":
289
- // filteredCount > 0 means NVD did return CVEs, they were just below the threshold.
290
- if (input.severityMin && result.filteredCount > 0) {
279
+ // Distinguish "the CPE has no CVEs" from "severityMin dropped everything on the page" from
280
+ // "the offset ran off the end": filteredCount > 0 means NVD did return CVEs, they were just
281
+ // below the threshold; an offset at or past totalCount means the product has CVEs but this
282
+ // page is empty, so telling the caller to re-check the CPE would send them the wrong way.
283
+ if (result.totalResults > 0 && input.offset >= result.totalResults) {
284
+ ctx.enrich.notice(`Offset ${input.offset} is past the end of the result set (${result.totalResults} total). Use a lower offset to page through results.`);
285
+ }
286
+ else if (input.severityMin && result.filteredCount > 0) {
291
287
  ctx.enrich.notice(`All ${result.filteredCount} CVE(s) on the fetched page scored below ${input.severityMin}. ` +
292
288
  'Lower severityMin or raise limit to widen the page NVD returns.');
293
289
  }
@@ -338,7 +334,7 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
338
334
  lines.push(` - Required Action: ${cve.cisaKev.requiredAction}`);
339
335
  }
340
336
  if (cve.configurations && cve.configurations.length > 0) {
341
- const matches = cve.configurations.flatMap((cfg) => cfg.nodes.flatMap((node) => node.cpeMatch.map((m) => formatCpeMatch(m, cfg.operator, node.operator))));
337
+ const matches = flattenCpeMatches(cve.configurations);
342
338
  lines.push(`**Configurations:** ${cve.configurations.length} node group(s), ${matches.length} CPE match(es)`);
343
339
  for (const match of matches.slice(0, CPE_MATCH_CAP))
344
340
  lines.push(` - ${match}`);
@@ -348,13 +344,14 @@ export const nvdAuditCpe = tool('nvd_audit_cpe', {
348
344
  }
349
345
  if (cve.references && cve.references.length > 0) {
350
346
  lines.push(`**References (${cve.references.length}):**`);
351
- for (const ref of cve.references.slice(0, 5)) {
347
+ for (const ref of cve.references.slice(0, REFERENCE_CAP)) {
352
348
  const sourcePart = ref.source ? ` [${ref.source}]` : '';
353
349
  const tagPart = ref.tags?.length ? ` (${ref.tags.join(', ')})` : '';
354
350
  lines.push(` - ${ref.url}${sourcePart}${tagPart}`);
355
351
  }
356
- if (cve.references.length > 5)
357
- lines.push(` - … ${cve.references.length - 5} more`);
352
+ if (cve.references.length > REFERENCE_CAP) {
353
+ lines.push(` - … ${cve.references.length - REFERENCE_CAP} more`);
354
+ }
358
355
  }
359
356
  lines.push('');
360
357
  }
@@ -1 +1 @@
1
- {"version":3,"file":"nvd-audit-cpe.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/nvd-audit-cpe.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nvd-audit-cpe.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/nvd-audit-cpe.tool.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,13 @@
4
4
  */
5
5
  import { z } from '@cyanheads/mcp-ts-core';
6
6
  import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ /**
8
+ * References rendered per CVE. A dense record runs to ~100 references at roughly 116 bytes a line
9
+ * (CVE-2021-44228 carries 103, ~11.6KB rendered in full). 15 covers the advisory/patch/exploit
10
+ * cluster a triage decision turns on for ~2KB per record, and the trailer discloses the remainder
11
+ * that `structuredContent` still carries in full.
12
+ */
13
+ export declare const REFERENCE_CAP = 15;
7
14
  export declare const nvdGetCve: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
15
  cveIds: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
9
16
  brief: z.ZodDefault<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"nvd-get-cve.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/nvd-get-cve.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAIjE,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4NpB,CAAC"}
1
+ {"version":3,"file":"nvd-get-cve.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/nvd-get-cve.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKjE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+OpB,CAAC"}
@@ -4,7 +4,15 @@
4
4
  */
5
5
  import { tool, z } from '@cyanheads/mcp-ts-core';
6
6
  import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
- import { getNvdCveService } from '../../../services/nvd-cve/nvd-cve-service.js';
7
+ import { CPE_MATCH_CAP, flattenCpeMatches } from '../../../mcp-server/tools/formatting/cpe-match.js';
8
+ import { briefDescription, getNvdCveService } from '../../../services/nvd-cve/nvd-cve-service.js';
9
+ /**
10
+ * References rendered per CVE. A dense record runs to ~100 references at roughly 116 bytes a line
11
+ * (CVE-2021-44228 carries 103, ~11.6KB rendered in full). 15 covers the advisory/patch/exploit
12
+ * cluster a triage decision turns on for ~2KB per record, and the trailer discloses the remainder
13
+ * that `structuredContent` still carries in full.
14
+ */
15
+ export const REFERENCE_CAP = 15;
8
16
  export const nvdGetCve = tool('nvd_get_cve', {
9
17
  title: 'Get CVE Details',
10
18
  description: 'Fetch one or more CVEs by ID from the NIST National Vulnerability Database. ' +
@@ -27,8 +35,8 @@ export const nvdGetCve = tool('nvd_get_cve', {
27
35
  brief: z
28
36
  .boolean()
29
37
  .default(false)
30
- .describe('When true, returns trimmed records (ID, status, top CVSS score, KEV name, published date) ' +
31
- 'instead of full detail. Recommended for batches of more than 10 IDs.'),
38
+ .describe('When true, returns trimmed records (ID, status, top CVSS score, KEV name, published date, ' +
39
+ 'and a truncated description) instead of full detail. Recommended for batches of more than 10 IDs.'),
32
40
  includeReferences: z
33
41
  .boolean()
34
42
  .default(true)
@@ -36,9 +44,9 @@ export const nvdGetCve = tool('nvd_get_cve', {
36
44
  allLanguages: z
37
45
  .boolean()
38
46
  .default(false)
39
- .describe('When true, keeps every localized description NVD supplies on each record. ' +
40
- 'Default keeps English only, falling back to whatever exists if a record has no English entry. ' +
41
- 'Applies to full records; brief records carry no descriptions.'),
47
+ .describe('When true, keeps every localized description NVD supplies on each record, and full records ' +
48
+ 'render all of them. Default keeps English only, falling back to whatever exists if a record ' +
49
+ 'has no English entry. Brief records always carry a single truncated description.'),
42
50
  }),
43
51
  // Use passthrough to avoid aspirational over-typing of the upstream CVE schema.
44
52
  // structuredContent will carry the full typed data; format() renders what matters.
@@ -102,13 +110,17 @@ export const nvdGetCve = tool('nvd_get_cve', {
102
110
  if (input.brief) {
103
111
  return {
104
112
  brief: true,
105
- cves: result.cves.map((cve) => ({
106
- cveId: cve.cveId,
107
- vulnStatus: cve.vulnStatus,
108
- published: cve.published,
109
- ...(cve.severity && { severity: cve.severity }),
110
- ...(cve.cisaKev && { cisaVulnerabilityName: cve.cisaKev.vulnerabilityName }),
111
- })),
113
+ cves: result.cves.map((cve) => {
114
+ const description = briefDescription(cve.descriptions);
115
+ return {
116
+ cveId: cve.cveId,
117
+ vulnStatus: cve.vulnStatus,
118
+ published: cve.published,
119
+ ...(description && { description }),
120
+ ...(cve.severity && { severity: cve.severity }),
121
+ ...(cve.cisaKev && { cisaVulnerabilityName: cve.cisaKev.vulnerabilityName }),
122
+ };
123
+ }),
112
124
  };
113
125
  }
114
126
  return {
@@ -133,6 +145,9 @@ export const nvdGetCve = tool('nvd_get_cve', {
133
145
  if (cve.cisaVulnerabilityName) {
134
146
  lines.push(`**CISA KEV:** ${cve.cisaVulnerabilityName}`);
135
147
  }
148
+ if (cve.description) {
149
+ lines.push(cve.description);
150
+ }
136
151
  }
137
152
  else {
138
153
  const cve = rawCve;
@@ -150,12 +165,14 @@ export const nvdGetCve = tool('nvd_get_cve', {
150
165
  lines.push(`- v${s.version} (${s.sourceType}): ${s.baseScore} ${s.severity}${s.vectorString ? ` — ${s.vectorString}` : ''}`);
151
166
  }
152
167
  }
153
- if (cve.descriptions && cve.descriptions.length > 0) {
154
- // English-only is the default, but a record with no English entry falls back to the
155
- // first available language — render that rather than leaving text-only clients blank.
156
- const desc = cve.descriptions.find((d) => d.lang === 'en') ?? cve.descriptions[0];
157
- if (desc)
158
- lines.push(`\n${desc.value}`);
168
+ /**
169
+ * Render every description the record carries. The service already applied the language
170
+ * policy — English-only by default (falling back when a record has no English entry),
171
+ * every language when `allLanguages` is set — so picking one here would make that input
172
+ * inert for clients that read `content[]` instead of `structuredContent`.
173
+ */
174
+ for (const desc of cve.descriptions ?? []) {
175
+ lines.push(`\n[${desc.lang}] ${desc.value}`);
159
176
  }
160
177
  if (cve.weaknesses && cve.weaknesses.length > 0) {
161
178
  const allCwes = cve.weaknesses.flatMap((w) => w.cweIds).filter(Boolean);
@@ -163,7 +180,13 @@ export const nvdGetCve = tool('nvd_get_cve', {
163
180
  lines.push(`**Weaknesses:** ${allCwes.join(', ')}`);
164
181
  }
165
182
  if (cve.configurations && cve.configurations.length > 0) {
166
- lines.push(`**Configurations:** ${cve.configurations.length} node group(s)`);
183
+ const matches = flattenCpeMatches(cve.configurations);
184
+ lines.push(`**Configurations:** ${cve.configurations.length} node group(s), ${matches.length} CPE match(es)`);
185
+ for (const match of matches.slice(0, CPE_MATCH_CAP))
186
+ lines.push(` - ${match}`);
187
+ if (matches.length > CPE_MATCH_CAP) {
188
+ lines.push(` - … ${matches.length - CPE_MATCH_CAP} more — call nvd_audit_cpe with a specific cpeName to test whether a product version is affected.`);
189
+ }
167
190
  }
168
191
  if (cve.cisaKev) {
169
192
  lines.push(`\n**CISA KEV Details:**`);
@@ -174,11 +197,11 @@ export const nvdGetCve = tool('nvd_get_cve', {
174
197
  }
175
198
  if (cve.references && cve.references.length > 0) {
176
199
  lines.push(`\n**References (${cve.references.length}):**`);
177
- for (const ref of cve.references.slice(0, 5)) {
200
+ for (const ref of cve.references.slice(0, REFERENCE_CAP)) {
178
201
  lines.push(`- ${ref.url}${ref.tags?.length ? ` [${ref.tags.join(', ')}]` : ''}`);
179
202
  }
180
- if (cve.references.length > 5) {
181
- lines.push(`- … ${cve.references.length - 5} more references`);
203
+ if (cve.references.length > REFERENCE_CAP) {
204
+ lines.push(`- … ${cve.references.length - REFERENCE_CAP} more references`);
182
205
  }
183
206
  }
184
207
  }