@cyanheads/nist-nvd-mcp-server 0.1.3
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.
- package/AGENTS.md +410 -0
- package/CLAUDE.md +410 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +306 -0
- package/changelog/0.1.x/0.1.0.md +19 -0
- package/changelog/0.1.x/0.1.1.md +29 -0
- package/changelog/0.1.x/0.1.2.md +12 -0
- package/changelog/0.1.x/0.1.3.md +22 -0
- package/changelog/template.md +119 -0
- package/dist/config/server-config.d.ts +15 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +27 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +6 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +6 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/nvd-cve.resource.d.ts +9 -0
- package/dist/mcp-server/resources/definitions/nvd-cve.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/nvd-cve.resource.js +36 -0
- package/dist/mcp-server/resources/definitions/nvd-cve.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +10 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +10 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.d.ts +116 -0
- package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.js +329 -0
- package/dist/mcp-server/tools/definitions/nvd-audit-cpe.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve-history.tool.d.ts +45 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve-history.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve-history.tool.js +132 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve-history.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.d.ts +36 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.js +183 -0
- package/dist/mcp-server/tools/definitions/nvd-get-cve.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.d.ts +40 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.js +140 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cpes.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.d.ts +90 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.js +342 -0
- package/dist/mcp-server/tools/definitions/nvd-search-cves.tool.js.map +1 -0
- package/dist/services/nvd-cpe/nvd-cpe-service.d.ts +27 -0
- package/dist/services/nvd-cpe/nvd-cpe-service.d.ts.map +1 -0
- package/dist/services/nvd-cpe/nvd-cpe-service.js +58 -0
- package/dist/services/nvd-cpe/nvd-cpe-service.js.map +1 -0
- package/dist/services/nvd-cpe/types.d.ts +41 -0
- package/dist/services/nvd-cpe/types.d.ts.map +1 -0
- package/dist/services/nvd-cpe/types.js +6 -0
- package/dist/services/nvd-cpe/types.js.map +1 -0
- package/dist/services/nvd-cve/nvd-cve-service.d.ts +79 -0
- package/dist/services/nvd-cve/nvd-cve-service.d.ts.map +1 -0
- package/dist/services/nvd-cve/nvd-cve-service.js +345 -0
- package/dist/services/nvd-cve/nvd-cve-service.js.map +1 -0
- package/dist/services/nvd-cve/types.d.ts +185 -0
- package/dist/services/nvd-cve/types.d.ts.map +1 -0
- package/dist/services/nvd-cve/types.js +6 -0
- package/dist/services/nvd-cve/types.js.map +1 -0
- package/dist/services/nvd-http/nvd-http-client.d.ts +26 -0
- package/dist/services/nvd-http/nvd-http-client.d.ts.map +1 -0
- package/dist/services/nvd-http/nvd-http-client.js +175 -0
- package/dist/services/nvd-http/nvd-http-client.js.map +1 -0
- package/package.json +91 -0
- package/server.json +125 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Service for the NIST NVD CVE API 2.0 and CVE History API.
|
|
3
|
+
* Provides normalized CVE records, search, audit-by-CPE, and change history.
|
|
4
|
+
* @module services/nvd-cve/nvd-cve-service
|
|
5
|
+
*/
|
|
6
|
+
import { JsonRpcErrorCode, McpError, validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { getNvdHttpClient } from '../nvd-http/nvd-http-client.js';
|
|
8
|
+
const CVE_ID_REGEX = /^CVE-\d{4}-\d{4,}$/i;
|
|
9
|
+
/**
|
|
10
|
+
* Derive a CVSS v2.0 severity label from the numeric base score.
|
|
11
|
+
* NVD omits `baseSeverity` from v2.0 responses; v3.x and v4.0 always include it.
|
|
12
|
+
* CVSS v2 ranges: 0.0 → NONE, 0.1–3.9 → LOW, 4.0–6.9 → MEDIUM, 7.0–10.0 → HIGH.
|
|
13
|
+
* CVSS v2 has no CRITICAL tier.
|
|
14
|
+
*/
|
|
15
|
+
function deriveV2Severity(score) {
|
|
16
|
+
if (score === undefined || score === null)
|
|
17
|
+
return 'UNKNOWN';
|
|
18
|
+
if (score === 0)
|
|
19
|
+
return 'NONE';
|
|
20
|
+
if (score < 4.0)
|
|
21
|
+
return 'LOW';
|
|
22
|
+
if (score < 7.0)
|
|
23
|
+
return 'MEDIUM';
|
|
24
|
+
return 'HIGH';
|
|
25
|
+
}
|
|
26
|
+
/** Validate CVE ID format. Returns the uppercase form or throws. */
|
|
27
|
+
function validateCveId(id) {
|
|
28
|
+
const trimmed = id.trim();
|
|
29
|
+
if (!CVE_ID_REGEX.test(trimmed)) {
|
|
30
|
+
throw validationError(`Invalid CVE ID format: "${trimmed}". Expected format: CVE-YYYY-NNNNN.`, {
|
|
31
|
+
reason: 'invalid_cve_id_format',
|
|
32
|
+
cveId: trimmed,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return trimmed.toUpperCase();
|
|
36
|
+
}
|
|
37
|
+
/** Extract and normalize all CVSS scores from a raw CVE item. */
|
|
38
|
+
function extractCvssScores(metrics) {
|
|
39
|
+
if (!metrics)
|
|
40
|
+
return [];
|
|
41
|
+
const scores = [];
|
|
42
|
+
const addMetrics = (list, version, isV2) => {
|
|
43
|
+
for (const m of list ?? []) {
|
|
44
|
+
if (!m.cvssData?.baseScore)
|
|
45
|
+
continue;
|
|
46
|
+
// NVD omits baseSeverity for CVSS v2.0 — derive it from the numeric score range.
|
|
47
|
+
const severity = m.cvssData.baseSeverity ?? (isV2 ? deriveV2Severity(m.cvssData.baseScore) : 'UNKNOWN');
|
|
48
|
+
const entry = {
|
|
49
|
+
version,
|
|
50
|
+
sourceType: m.type ?? 'Primary',
|
|
51
|
+
baseScore: m.cvssData.baseScore,
|
|
52
|
+
severity,
|
|
53
|
+
};
|
|
54
|
+
if (m.cvssData.vectorString)
|
|
55
|
+
entry.vectorString = m.cvssData.vectorString;
|
|
56
|
+
scores.push(entry);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
addMetrics(metrics.cvssMetricV2, '2.0', true);
|
|
60
|
+
addMetrics(metrics.cvssMetricV30, '3.0', false);
|
|
61
|
+
addMetrics(metrics.cvssMetricV31, '3.1', false);
|
|
62
|
+
addMetrics(metrics.cvssMetricV40, '4.0', false);
|
|
63
|
+
return scores;
|
|
64
|
+
}
|
|
65
|
+
/** Derive top severity from all available CVSS scores. */
|
|
66
|
+
function deriveTopSeverity(scores) {
|
|
67
|
+
if (scores.length === 0)
|
|
68
|
+
return;
|
|
69
|
+
const sorted = [...scores].sort((a, b) => b.baseScore - a.baseScore);
|
|
70
|
+
const top = sorted[0];
|
|
71
|
+
if (!top)
|
|
72
|
+
return;
|
|
73
|
+
return {
|
|
74
|
+
label: top.severity,
|
|
75
|
+
score: top.baseScore,
|
|
76
|
+
fromVersion: top.version,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Normalize a raw CVE item to a full CveRecord. */
|
|
80
|
+
function normalizeCve(raw, includeReferences) {
|
|
81
|
+
const cvssScores = extractCvssScores(raw.metrics);
|
|
82
|
+
const severity = deriveTopSeverity(cvssScores);
|
|
83
|
+
const weaknesses = (raw.weaknesses ?? []).map((w) => ({
|
|
84
|
+
source: w.source ?? '',
|
|
85
|
+
cweIds: (w.description ?? [])
|
|
86
|
+
.filter((d) => d.lang === 'en' && d.value)
|
|
87
|
+
.map((d) => d.value),
|
|
88
|
+
}));
|
|
89
|
+
const configurations = (raw.configurations ?? []).map((cfg) => ({
|
|
90
|
+
nodes: (cfg.nodes ?? []).map((node) => ({
|
|
91
|
+
...(node.operator && { operator: node.operator }),
|
|
92
|
+
cpeMatch: (node.cpeMatch ?? []).map((m) => ({
|
|
93
|
+
vulnerable: m.vulnerable ?? false,
|
|
94
|
+
criteria: m.criteria ?? '',
|
|
95
|
+
...(m.versionStartIncluding && { versionStartIncluding: m.versionStartIncluding }),
|
|
96
|
+
...(m.versionStartExcluding && { versionStartExcluding: m.versionStartExcluding }),
|
|
97
|
+
...(m.versionEndIncluding && { versionEndIncluding: m.versionEndIncluding }),
|
|
98
|
+
...(m.versionEndExcluding && { versionEndExcluding: m.versionEndExcluding }),
|
|
99
|
+
})),
|
|
100
|
+
})),
|
|
101
|
+
}));
|
|
102
|
+
let cisaKev;
|
|
103
|
+
if (raw.cisaExploitAdd &&
|
|
104
|
+
raw.cisaActionDue &&
|
|
105
|
+
raw.cisaRequiredAction &&
|
|
106
|
+
raw.cisaVulnerabilityName) {
|
|
107
|
+
cisaKev = {
|
|
108
|
+
exploitAddDate: raw.cisaExploitAdd,
|
|
109
|
+
actionDueDate: raw.cisaActionDue,
|
|
110
|
+
requiredAction: raw.cisaRequiredAction,
|
|
111
|
+
vulnerabilityName: raw.cisaVulnerabilityName,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
cveId: raw.id ?? '',
|
|
116
|
+
vulnStatus: raw.vulnStatus ?? '',
|
|
117
|
+
published: raw.published ?? '',
|
|
118
|
+
lastModified: raw.lastModified ?? '',
|
|
119
|
+
descriptions: (raw.descriptions ?? [])
|
|
120
|
+
.filter((d) => d.lang && d.value)
|
|
121
|
+
.map((d) => ({ lang: d.lang, value: d.value })),
|
|
122
|
+
cvssScores,
|
|
123
|
+
...(severity && { severity }),
|
|
124
|
+
weaknesses,
|
|
125
|
+
configurations,
|
|
126
|
+
...(includeReferences && {
|
|
127
|
+
references: (raw.references ?? []).map((r) => ({
|
|
128
|
+
url: r.url ?? '',
|
|
129
|
+
...(r.source && { source: r.source }),
|
|
130
|
+
...(r.tags?.length && { tags: r.tags }),
|
|
131
|
+
})),
|
|
132
|
+
}),
|
|
133
|
+
...(cisaKev && { cisaKev }),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/** Trim a full CVE to a BriefCveRecord. */
|
|
137
|
+
function toBriefCve(record) {
|
|
138
|
+
return {
|
|
139
|
+
cveId: record.cveId,
|
|
140
|
+
vulnStatus: record.vulnStatus,
|
|
141
|
+
published: record.published,
|
|
142
|
+
...(record.severity && { severity: record.severity }),
|
|
143
|
+
...(record.cisaKev && { cisaVulnerabilityName: record.cisaKev.vulnerabilityName }),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Severity order for filtering. */
|
|
147
|
+
const SEVERITY_ORDER = {
|
|
148
|
+
LOW: 0,
|
|
149
|
+
MEDIUM: 1,
|
|
150
|
+
HIGH: 2,
|
|
151
|
+
CRITICAL: 3,
|
|
152
|
+
};
|
|
153
|
+
export class NvdCveService {
|
|
154
|
+
// biome-ignore lint/complexity/noUselessConstructor: preserves framework init-pattern signature
|
|
155
|
+
constructor(_config, _storage) { }
|
|
156
|
+
/**
|
|
157
|
+
* Fetch one or more CVEs by ID (up to 100).
|
|
158
|
+
* Returns full records. Throws `invalid_cve_id_format` for malformed IDs (HTTP 404 from NVD)
|
|
159
|
+
* and `cve_not_found` when NVD returns empty results for a valid-format ID.
|
|
160
|
+
*/
|
|
161
|
+
async fetchById(rawIds, includeReferences, ctx) {
|
|
162
|
+
// Validate all IDs before making the request
|
|
163
|
+
const cveIds = rawIds.map(validateCveId);
|
|
164
|
+
const client = getNvdHttpClient();
|
|
165
|
+
let response;
|
|
166
|
+
try {
|
|
167
|
+
response = await client.get('cves/2.0', { cveIds: cveIds.join(',') }, ctx);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
// NVD 404 for malformed IDs: re-throw as invalid_cve_id_format
|
|
171
|
+
if (err.message?.includes('HTTP 404')) {
|
|
172
|
+
throw validationError(`One or more CVE IDs may be malformed (NVD returned HTTP 404). Verify the IDs: ${cveIds.join(', ')}.`, { reason: 'invalid_cve_id_format', cveIds });
|
|
173
|
+
}
|
|
174
|
+
throw err;
|
|
175
|
+
}
|
|
176
|
+
const items = (response.vulnerabilities ?? [])
|
|
177
|
+
.map((v) => v.cve)
|
|
178
|
+
.filter((c) => !!c);
|
|
179
|
+
if (items.length === 0 && cveIds.length === 1) {
|
|
180
|
+
throw new McpError(JsonRpcErrorCode.NotFound, `CVE ${cveIds[0]} not found in NVD.`, {
|
|
181
|
+
reason: 'cve_not_found',
|
|
182
|
+
cveId: cveIds[0],
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const cves = items.map((item) => normalizeCve(item, includeReferences));
|
|
186
|
+
// Identify any requested IDs not returned by NVD.
|
|
187
|
+
const returnedIds = new Set(cves.map((c) => c.cveId.toUpperCase()));
|
|
188
|
+
const missingIds = cveIds.filter((id) => !returnedIds.has(id.toUpperCase()));
|
|
189
|
+
ctx.log.info('Fetched CVEs by ID', {
|
|
190
|
+
requested: cveIds.length,
|
|
191
|
+
returned: cves.length,
|
|
192
|
+
...(missingIds.length > 0 ? { missingIds } : {}),
|
|
193
|
+
});
|
|
194
|
+
return { cves, returned: cves.length, requested: cveIds.length, missingIds };
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Search CVEs using various filters. Always returns brief records.
|
|
198
|
+
*/
|
|
199
|
+
async searchCves(params, ctx) {
|
|
200
|
+
const client = getNvdHttpClient();
|
|
201
|
+
const apiParams = {
|
|
202
|
+
resultsPerPage: Math.min(params.limit ?? 20, 2000),
|
|
203
|
+
startIndex: params.offset ?? 0,
|
|
204
|
+
};
|
|
205
|
+
if (params.keyword)
|
|
206
|
+
apiParams.keywordSearch = params.keyword;
|
|
207
|
+
if (params.cweId)
|
|
208
|
+
apiParams.cweId = params.cweId;
|
|
209
|
+
if (params.pubStartDate)
|
|
210
|
+
apiParams.pubStartDate = params.pubStartDate;
|
|
211
|
+
if (params.pubEndDate)
|
|
212
|
+
apiParams.pubEndDate = params.pubEndDate;
|
|
213
|
+
if (params.lastModStartDate)
|
|
214
|
+
apiParams.lastModStartDate = params.lastModStartDate;
|
|
215
|
+
if (params.lastModEndDate)
|
|
216
|
+
apiParams.lastModEndDate = params.lastModEndDate;
|
|
217
|
+
if (params.kevOnly)
|
|
218
|
+
apiParams.hasKev = true;
|
|
219
|
+
if (params.noRejected)
|
|
220
|
+
apiParams.noRejected = true;
|
|
221
|
+
if (params.severityParam) {
|
|
222
|
+
const ver = params.severityVersion ?? 'v3';
|
|
223
|
+
if (ver === 'v2') {
|
|
224
|
+
apiParams.cvssV2Severity = params.severityParam;
|
|
225
|
+
}
|
|
226
|
+
else if (ver === 'v4') {
|
|
227
|
+
apiParams.cvssV4Severity = params.severityParam;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
apiParams.cvssV3Severity = params.severityParam;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
const response = await client.get('cves/2.0', apiParams, ctx);
|
|
234
|
+
const items = (response.vulnerabilities ?? [])
|
|
235
|
+
.map((v) => v.cve)
|
|
236
|
+
.filter((c) => !!c);
|
|
237
|
+
const cves = items.map((item) => normalizeCve(item, false)).map(toBriefCve);
|
|
238
|
+
const totalResults = response.totalResults ?? 0;
|
|
239
|
+
ctx.log.info('CVE search completed', { totalResults, returned: cves.length });
|
|
240
|
+
return {
|
|
241
|
+
cves,
|
|
242
|
+
totalResults,
|
|
243
|
+
returned: cves.length,
|
|
244
|
+
offset: params.offset ?? 0,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Find CVEs affecting a specific CPE (by name or virtual match string with version range).
|
|
249
|
+
*/
|
|
250
|
+
async auditCpe(params, ctx) {
|
|
251
|
+
const client = getNvdHttpClient();
|
|
252
|
+
const apiParams = {
|
|
253
|
+
resultsPerPage: Math.min(params.limit ?? 20, 2000),
|
|
254
|
+
startIndex: 0,
|
|
255
|
+
};
|
|
256
|
+
if (params.cpeName) {
|
|
257
|
+
apiParams.cpeName = params.cpeName;
|
|
258
|
+
apiParams.isVulnerable = true;
|
|
259
|
+
}
|
|
260
|
+
else if (params.virtualMatchString) {
|
|
261
|
+
apiParams.virtualMatchString = params.virtualMatchString;
|
|
262
|
+
if (params.versionStart) {
|
|
263
|
+
apiParams.versionStart = params.versionStart;
|
|
264
|
+
apiParams.versionStartType = params.versionStartType ?? 'including';
|
|
265
|
+
}
|
|
266
|
+
if (params.versionEnd) {
|
|
267
|
+
apiParams.versionEnd = params.versionEnd;
|
|
268
|
+
apiParams.versionEndType = params.versionEndType ?? 'including';
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const response = await client.get('cves/2.0', apiParams, ctx);
|
|
272
|
+
let items = (response.vulnerabilities ?? [])
|
|
273
|
+
.map((v) => v.cve)
|
|
274
|
+
.filter((c) => !!c);
|
|
275
|
+
// Client-side severity filter
|
|
276
|
+
if (params.severityMin) {
|
|
277
|
+
const minLevel = SEVERITY_ORDER[params.severityMin.toUpperCase()] ?? 0;
|
|
278
|
+
items = items.filter((item) => {
|
|
279
|
+
const scores = extractCvssScores(item.metrics);
|
|
280
|
+
const top = deriveTopSeverity(scores);
|
|
281
|
+
if (!top)
|
|
282
|
+
return false;
|
|
283
|
+
return (SEVERITY_ORDER[top.label.toUpperCase()] ?? -1) >= minLevel;
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
const cves = items.map((item) => normalizeCve(item, true));
|
|
287
|
+
const totalResults = response.totalResults ?? 0;
|
|
288
|
+
if (cves.length === 0 && params.cpeName) {
|
|
289
|
+
throw new McpError(JsonRpcErrorCode.NotFound, `No CVEs found for CPE "${params.cpeName}". The CPE may be misspelled or not in NVD.`, { reason: 'cpe_not_found', cpeName: params.cpeName });
|
|
290
|
+
}
|
|
291
|
+
ctx.log.info('CPE audit completed', { totalResults, returned: cves.length });
|
|
292
|
+
return {
|
|
293
|
+
cves,
|
|
294
|
+
totalResults,
|
|
295
|
+
returned: cves.length,
|
|
296
|
+
...(params.cpeName && { cpeName: params.cpeName }),
|
|
297
|
+
...(params.virtualMatchString && { virtualMatchString: params.virtualMatchString }),
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Retrieve the change history for a CVE.
|
|
302
|
+
*/
|
|
303
|
+
async getCveHistory(rawId, limit, offset, ctx) {
|
|
304
|
+
const cveId = validateCveId(rawId);
|
|
305
|
+
const client = getNvdHttpClient();
|
|
306
|
+
let response;
|
|
307
|
+
try {
|
|
308
|
+
response = await client.get('cvehistory/2.0', { cveId, resultsPerPage: Math.min(limit, 2000), startIndex: offset }, ctx);
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
if (err.message?.includes('HTTP 404')) {
|
|
312
|
+
throw validationError(`CVE ID "${cveId}" appears to be malformed (NVD returned HTTP 404).`, { reason: 'invalid_cve_id_format', cveId });
|
|
313
|
+
}
|
|
314
|
+
throw err;
|
|
315
|
+
}
|
|
316
|
+
const changes = (response.cveChanges ?? [])
|
|
317
|
+
.map((c) => c.change)
|
|
318
|
+
.filter((c) => !!c)
|
|
319
|
+
.map((c) => ({
|
|
320
|
+
changeDate: c.created ?? '',
|
|
321
|
+
...(c.eventName ? { eventName: c.eventName } : {}),
|
|
322
|
+
details: (c.details ?? []).map((d) => ({
|
|
323
|
+
...(d.action ? { action: d.action } : {}),
|
|
324
|
+
...(d.type ? { type: d.type } : {}),
|
|
325
|
+
...(d.oldValue ? { oldValue: d.oldValue } : {}),
|
|
326
|
+
...(d.newValue ? { newValue: d.newValue } : {}),
|
|
327
|
+
})),
|
|
328
|
+
}));
|
|
329
|
+
const totalResults = response.totalResults ?? 0;
|
|
330
|
+
ctx.log.info('CVE history fetched', { cveId, totalResults, returned: changes.length });
|
|
331
|
+
return { cveId, changes, totalResults, returned: changes.length, offset };
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// --- Init/accessor pattern ---
|
|
335
|
+
let _service;
|
|
336
|
+
export function initNvdCveService(config, storage) {
|
|
337
|
+
_service = new NvdCveService(config, storage);
|
|
338
|
+
}
|
|
339
|
+
export function getNvdCveService() {
|
|
340
|
+
if (!_service) {
|
|
341
|
+
throw new Error('NvdCveService not initialized — call initNvdCveService() in setup()');
|
|
342
|
+
}
|
|
343
|
+
return _service;
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=nvd-cve-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nvd-cve-service.js","sourceRoot":"","sources":["../../../src/services/nvd-cve/nvd-cve-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Domain types for the NVD CVE API 2.0 response shapes and normalized domain objects.
|
|
3
|
+
* @module services/nvd-cve/types
|
|
4
|
+
*/
|
|
5
|
+
/** Raw CVSS metric from the NVD API response. */
|
|
6
|
+
export interface RawCvssMetric {
|
|
7
|
+
cvssData?: {
|
|
8
|
+
version?: string;
|
|
9
|
+
vectorString?: string;
|
|
10
|
+
baseScore?: number;
|
|
11
|
+
baseSeverity?: string;
|
|
12
|
+
};
|
|
13
|
+
exploitabilityScore?: number;
|
|
14
|
+
impactScore?: number;
|
|
15
|
+
source?: string;
|
|
16
|
+
type?: string;
|
|
17
|
+
}
|
|
18
|
+
/** Raw CVE item from the NVD API response. */
|
|
19
|
+
export interface RawCveItem {
|
|
20
|
+
cisaActionDue?: string;
|
|
21
|
+
cisaExploitAdd?: string;
|
|
22
|
+
cisaRequiredAction?: string;
|
|
23
|
+
cisaVulnerabilityName?: string;
|
|
24
|
+
configurations?: Array<{
|
|
25
|
+
nodes?: Array<{
|
|
26
|
+
operator?: string;
|
|
27
|
+
negate?: boolean;
|
|
28
|
+
cpeMatch?: Array<{
|
|
29
|
+
vulnerable?: boolean;
|
|
30
|
+
criteria?: string;
|
|
31
|
+
versionStartIncluding?: string;
|
|
32
|
+
versionStartExcluding?: string;
|
|
33
|
+
versionEndIncluding?: string;
|
|
34
|
+
versionEndExcluding?: string;
|
|
35
|
+
matchCriteriaId?: string;
|
|
36
|
+
}>;
|
|
37
|
+
}>;
|
|
38
|
+
}>;
|
|
39
|
+
descriptions?: Array<{
|
|
40
|
+
lang?: string;
|
|
41
|
+
value?: string;
|
|
42
|
+
}>;
|
|
43
|
+
id?: string;
|
|
44
|
+
lastModified?: string;
|
|
45
|
+
metrics?: {
|
|
46
|
+
cvssMetricV2?: RawCvssMetric[];
|
|
47
|
+
cvssMetricV30?: RawCvssMetric[];
|
|
48
|
+
cvssMetricV31?: RawCvssMetric[];
|
|
49
|
+
cvssMetricV40?: RawCvssMetric[];
|
|
50
|
+
};
|
|
51
|
+
published?: string;
|
|
52
|
+
references?: Array<{
|
|
53
|
+
url?: string;
|
|
54
|
+
source?: string;
|
|
55
|
+
tags?: string[];
|
|
56
|
+
}>;
|
|
57
|
+
sourceIdentifier?: string;
|
|
58
|
+
vulnStatus?: string;
|
|
59
|
+
weaknesses?: Array<{
|
|
60
|
+
source?: string;
|
|
61
|
+
type?: string;
|
|
62
|
+
description?: Array<{
|
|
63
|
+
lang?: string;
|
|
64
|
+
value?: string;
|
|
65
|
+
}>;
|
|
66
|
+
}>;
|
|
67
|
+
}
|
|
68
|
+
/** Raw NVD CVE search response. */
|
|
69
|
+
export interface RawCveResponse {
|
|
70
|
+
format?: string;
|
|
71
|
+
resultsPerPage?: number;
|
|
72
|
+
startIndex?: number;
|
|
73
|
+
timestamp?: string;
|
|
74
|
+
totalResults?: number;
|
|
75
|
+
version?: string;
|
|
76
|
+
vulnerabilities?: Array<{
|
|
77
|
+
cve?: RawCveItem;
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
/** Raw NVD CVE History response. */
|
|
81
|
+
export interface RawCveHistoryResponse {
|
|
82
|
+
cveChanges?: Array<{
|
|
83
|
+
change?: {
|
|
84
|
+
cveId?: string;
|
|
85
|
+
eventName?: string;
|
|
86
|
+
cveChangeId?: string;
|
|
87
|
+
sourceIdentifier?: string;
|
|
88
|
+
created?: string;
|
|
89
|
+
details?: Array<{
|
|
90
|
+
action?: string;
|
|
91
|
+
type?: string;
|
|
92
|
+
oldValue?: string;
|
|
93
|
+
newValue?: string;
|
|
94
|
+
}>;
|
|
95
|
+
};
|
|
96
|
+
}>;
|
|
97
|
+
resultsPerPage?: number;
|
|
98
|
+
startIndex?: number;
|
|
99
|
+
totalResults?: number;
|
|
100
|
+
}
|
|
101
|
+
/** Normalized CVSS score entry. */
|
|
102
|
+
export interface CvssScore {
|
|
103
|
+
/** Base score (0.0–10.0). */
|
|
104
|
+
baseScore: number;
|
|
105
|
+
/** Severity label (e.g., "CRITICAL", "HIGH", "MEDIUM", "LOW"). */
|
|
106
|
+
severity: string;
|
|
107
|
+
/** Score source type ("Primary" = NVD, "Secondary" = CNA). */
|
|
108
|
+
sourceType: string;
|
|
109
|
+
/** CVSS vector string. */
|
|
110
|
+
vectorString?: string;
|
|
111
|
+
/** CVSS version (e.g., "2.0", "3.1", "4.0"). */
|
|
112
|
+
version: string;
|
|
113
|
+
}
|
|
114
|
+
/** Normalized top severity derived from all available CVSS scores. */
|
|
115
|
+
export interface TopSeverity {
|
|
116
|
+
/** Which CVSS version this came from. */
|
|
117
|
+
fromVersion: string;
|
|
118
|
+
/** Severity label. */
|
|
119
|
+
label: string;
|
|
120
|
+
/** Base score. */
|
|
121
|
+
score: number;
|
|
122
|
+
}
|
|
123
|
+
/** Normalized CISA KEV fields — only present when CVE is in the KEV catalog. */
|
|
124
|
+
export interface CisaKev {
|
|
125
|
+
actionDueDate: string;
|
|
126
|
+
exploitAddDate: string;
|
|
127
|
+
requiredAction: string;
|
|
128
|
+
vulnerabilityName: string;
|
|
129
|
+
}
|
|
130
|
+
/** Full CVE record (normalized from raw API response). */
|
|
131
|
+
export interface CveRecord {
|
|
132
|
+
cisaKev?: CisaKev;
|
|
133
|
+
configurations: Array<{
|
|
134
|
+
nodes: Array<{
|
|
135
|
+
operator?: string;
|
|
136
|
+
cpeMatch: Array<{
|
|
137
|
+
vulnerable: boolean;
|
|
138
|
+
criteria: string;
|
|
139
|
+
versionStartIncluding?: string;
|
|
140
|
+
versionStartExcluding?: string;
|
|
141
|
+
versionEndIncluding?: string;
|
|
142
|
+
versionEndExcluding?: string;
|
|
143
|
+
}>;
|
|
144
|
+
}>;
|
|
145
|
+
}>;
|
|
146
|
+
cveId: string;
|
|
147
|
+
cvssScores: CvssScore[];
|
|
148
|
+
descriptions: Array<{
|
|
149
|
+
lang: string;
|
|
150
|
+
value: string;
|
|
151
|
+
}>;
|
|
152
|
+
lastModified: string;
|
|
153
|
+
published: string;
|
|
154
|
+
references?: Array<{
|
|
155
|
+
url: string;
|
|
156
|
+
source?: string;
|
|
157
|
+
tags?: string[];
|
|
158
|
+
}>;
|
|
159
|
+
severity?: TopSeverity;
|
|
160
|
+
vulnStatus: string;
|
|
161
|
+
weaknesses: Array<{
|
|
162
|
+
source: string;
|
|
163
|
+
cweIds: string[];
|
|
164
|
+
}>;
|
|
165
|
+
}
|
|
166
|
+
/** Brief CVE record for search results and bulk lookups. */
|
|
167
|
+
export interface BriefCveRecord {
|
|
168
|
+
cisaVulnerabilityName?: string;
|
|
169
|
+
cveId: string;
|
|
170
|
+
published: string;
|
|
171
|
+
severity?: TopSeverity;
|
|
172
|
+
vulnStatus: string;
|
|
173
|
+
}
|
|
174
|
+
/** CVE change event from the history API. */
|
|
175
|
+
export interface CveChangeEvent {
|
|
176
|
+
changeDate: string;
|
|
177
|
+
details: Array<{
|
|
178
|
+
action?: string;
|
|
179
|
+
type?: string;
|
|
180
|
+
oldValue?: string;
|
|
181
|
+
newValue?: string;
|
|
182
|
+
}>;
|
|
183
|
+
eventName?: string;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/nvd-cve/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/nvd-cve/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview HTTP client for the NIST NVD API 2.0 with token-bucket rate limiting.
|
|
3
|
+
* Manages API key injection, queue-based rate limiting, retry with backoff, and Retry-After header parsing.
|
|
4
|
+
* @module services/nvd-http/nvd-http-client
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
export declare class NvdHttpClient {
|
|
8
|
+
private readonly apiKey;
|
|
9
|
+
private readonly timeoutMs;
|
|
10
|
+
private lastRequestAt;
|
|
11
|
+
private queue;
|
|
12
|
+
private draining;
|
|
13
|
+
constructor(apiKey: string | undefined, timeoutMs: number);
|
|
14
|
+
/**
|
|
15
|
+
* Enqueue and execute a request to the NVD API.
|
|
16
|
+
* Enforces minimum inter-request gap to stay within NVD rate limits.
|
|
17
|
+
*/
|
|
18
|
+
get<T>(endpoint: string, params: Record<string, string | number | boolean | undefined>, ctx: Context): Promise<T>;
|
|
19
|
+
private drainNext;
|
|
20
|
+
private executeRequest;
|
|
21
|
+
private buildUrl;
|
|
22
|
+
private buildHeaders;
|
|
23
|
+
}
|
|
24
|
+
export declare function initNvdHttpClient(apiKey: string | undefined, timeoutMs: number): void;
|
|
25
|
+
export declare function getNvdHttpClient(): NvdHttpClient;
|
|
26
|
+
//# sourceMappingURL=nvd-http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nvd-http-client.d.ts","sourceRoot":"","sources":["../../../src/services/nvd-http/nvd-http-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAqBtD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM;IAKzD;;;OAGG;IAEG,GAAG,CAAC,CAAC,EACT,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,EAC7D,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,CAAC,CAAC;IAab,OAAO,CAAC,SAAS;YAyBH,cAAc;IAyF5B,OAAO,CAAC,QAAQ;IAiBhB,OAAO,CAAC,YAAY;CASrB;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAErF;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAKhD"}
|