@mneme-ai/core 2.23.2 → 2.25.0

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 (61) hide show
  1. package/dist/codegraph/builder.d.ts +27 -0
  2. package/dist/codegraph/builder.d.ts.map +1 -0
  3. package/dist/codegraph/builder.js +309 -0
  4. package/dist/codegraph/builder.js.map +1 -0
  5. package/dist/codegraph/codegraph.test.d.ts +2 -0
  6. package/dist/codegraph/codegraph.test.d.ts.map +1 -0
  7. package/dist/codegraph/codegraph.test.js +179 -0
  8. package/dist/codegraph/codegraph.test.js.map +1 -0
  9. package/dist/codegraph/drift.d.ts +27 -0
  10. package/dist/codegraph/drift.d.ts.map +1 -0
  11. package/dist/codegraph/drift.js +126 -0
  12. package/dist/codegraph/drift.js.map +1 -0
  13. package/dist/codegraph/index.d.ts +10 -0
  14. package/dist/codegraph/index.d.ts.map +1 -0
  15. package/dist/codegraph/index.js +10 -0
  16. package/dist/codegraph/index.js.map +1 -0
  17. package/dist/codegraph/merkle.d.ts +40 -0
  18. package/dist/codegraph/merkle.d.ts.map +1 -0
  19. package/dist/codegraph/merkle.js +68 -0
  20. package/dist/codegraph/merkle.js.map +1 -0
  21. package/dist/codegraph/query.d.ts +14 -0
  22. package/dist/codegraph/query.d.ts.map +1 -0
  23. package/dist/codegraph/query.js +56 -0
  24. package/dist/codegraph/query.js.map +1 -0
  25. package/dist/codegraph/store.d.ts +37 -0
  26. package/dist/codegraph/store.d.ts.map +1 -0
  27. package/dist/codegraph/store.js +133 -0
  28. package/dist/codegraph/store.js.map +1 -0
  29. package/dist/codegraph/types.d.ts +140 -0
  30. package/dist/codegraph/types.d.ts.map +1 -0
  31. package/dist/codegraph/types.js +39 -0
  32. package/dist/codegraph/types.js.map +1 -0
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +17 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/mcp_fuzzer/engine.d.ts +48 -0
  38. package/dist/mcp_fuzzer/engine.d.ts.map +1 -0
  39. package/dist/mcp_fuzzer/engine.js +376 -0
  40. package/dist/mcp_fuzzer/engine.js.map +1 -0
  41. package/dist/mcp_fuzzer/index.d.ts +9 -0
  42. package/dist/mcp_fuzzer/index.d.ts.map +1 -0
  43. package/dist/mcp_fuzzer/index.js +8 -0
  44. package/dist/mcp_fuzzer/index.js.map +1 -0
  45. package/dist/mcp_fuzzer/mcp_fuzzer.test.d.ts +2 -0
  46. package/dist/mcp_fuzzer/mcp_fuzzer.test.d.ts.map +1 -0
  47. package/dist/mcp_fuzzer/mcp_fuzzer.test.js +128 -0
  48. package/dist/mcp_fuzzer/mcp_fuzzer.test.js.map +1 -0
  49. package/dist/mcp_fuzzer/storage.d.ts +27 -0
  50. package/dist/mcp_fuzzer/storage.d.ts.map +1 -0
  51. package/dist/mcp_fuzzer/storage.js +65 -0
  52. package/dist/mcp_fuzzer/storage.js.map +1 -0
  53. package/dist/mcp_fuzzer/types.d.ts +147 -0
  54. package/dist/mcp_fuzzer/types.d.ts.map +1 -0
  55. package/dist/mcp_fuzzer/types.js +15 -0
  56. package/dist/mcp_fuzzer/types.js.map +1 -0
  57. package/dist/mcp_fuzzer/vectors.d.ts +25 -0
  58. package/dist/mcp_fuzzer/vectors.d.ts.map +1 -0
  59. package/dist/mcp_fuzzer/vectors.js +1072 -0
  60. package/dist/mcp_fuzzer/vectors.js.map +1 -0
  61. package/package.json +1 -1
@@ -0,0 +1,376 @@
1
+ /**
2
+ * v2.24.0 — MCP fuzzer engine.
3
+ *
4
+ * Spawns the target MCP server as a child process (default: the local
5
+ * `mneme mcp` bin), sends each vector's payload, awaits responses with a
6
+ * per-vector timeout, runs the detector, and returns a structured report
7
+ * card. The engine is transport-agnostic at the API surface — only stdio
8
+ * is implemented here; SSE/HTTP can be added later by swapping the IO
9
+ * layer.
10
+ *
11
+ * Determinism: vector ids define seed; mutation engine takes a seed
12
+ * parameter; HMAC chain over canonical body makes the report tamper-
13
+ * evident so it can be re-verified offline.
14
+ */
15
+ import { spawn } from "node:child_process";
16
+ import { createHmac } from "node:crypto";
17
+ import { VECTORS_108 } from "./vectors.js";
18
+ const HMAC_KEY = process.env["MNEME_MCP_FUZZ_KEY"] ?? "mneme-mcp-fuzzer-v1";
19
+ function canon(v) {
20
+ if (v === null || typeof v !== "object")
21
+ return JSON.stringify(v);
22
+ if (Array.isArray(v))
23
+ return "[" + v.map(canon).join(",") + "]";
24
+ const keys = Object.keys(v).sort();
25
+ return "{" + keys.map((k) => JSON.stringify(k) + ":" + canon(v[k])).join(",") + "}";
26
+ }
27
+ function sha256Hex(s) {
28
+ return createHmac("sha256", "mneme-mcp-fuzz-digest").update(s).digest("hex");
29
+ }
30
+ function hmacHex(payload, prev) {
31
+ return createHmac("sha256", HMAC_KEY).update(prev + "|" + payload).digest("hex");
32
+ }
33
+ class StdioMcpClient {
34
+ child;
35
+ buf = "";
36
+ pending = new Map();
37
+ allFrames = [];
38
+ // Some frames have null id (notifications); those land in nullIdFrames.
39
+ nullIdFrames = [];
40
+ constructor(target) {
41
+ if (target.kind === "local") {
42
+ // Default: spawn the local mneme CLI in MCP mode.
43
+ const node = process.execPath;
44
+ const bin = process.env["MNEME_CLI_BIN"] ?? "packages/cli/bin/mneme.js";
45
+ this.child = spawn(node, [bin, "mcp"], {
46
+ cwd: target.cwd,
47
+ env: { ...process.env, ...(target.env ?? {}), MNEME_WARMCALL: "0", MNEME_MUSCLE_BYPASS: "0" },
48
+ stdio: ["pipe", "pipe", "pipe"],
49
+ });
50
+ }
51
+ else {
52
+ this.child = spawn(target.cmd.exe, target.cmd.args, {
53
+ cwd: target.cwd,
54
+ env: { ...process.env, ...(target.env ?? {}) },
55
+ stdio: ["pipe", "pipe", "pipe"],
56
+ });
57
+ }
58
+ this.child.stdout.setEncoding("utf8");
59
+ this.child.stdout.on("data", (chunk) => this.onStdout(chunk));
60
+ // Drain stderr to avoid backpressure but don't fail the run.
61
+ this.child.stderr.setEncoding("utf8");
62
+ this.child.stderr.on("data", () => { });
63
+ this.child.on("error", () => { });
64
+ }
65
+ onStdout(chunk) {
66
+ this.buf += chunk;
67
+ let nl;
68
+ while ((nl = this.buf.indexOf("\n")) !== -1) {
69
+ const line = this.buf.slice(0, nl);
70
+ this.buf = this.buf.slice(nl + 1);
71
+ const trimmed = line.trim();
72
+ if (!trimmed)
73
+ continue;
74
+ let parsed = null;
75
+ try {
76
+ parsed = JSON.parse(trimmed);
77
+ }
78
+ catch { /* leave null */ }
79
+ this.allFrames.push({ id: parsed?.id ?? undefined, raw: trimmed, parsed });
80
+ if (parsed && (parsed.id === undefined || parsed.id === null)) {
81
+ this.nullIdFrames.push(parsed);
82
+ continue;
83
+ }
84
+ if (parsed && parsed.id !== undefined) {
85
+ const k = parsed.id;
86
+ const next = this.pending.get(k);
87
+ if (next) {
88
+ this.pending.delete(k);
89
+ next(parsed);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ async sendAndWait(frame, expectedId, timeoutMs) {
95
+ const line = typeof frame === "string" ? frame : JSON.stringify(frame);
96
+ if (expectedId === null) {
97
+ // notification — no response expected; just send + a short idle wait
98
+ this.child.stdin.write(line + "\n");
99
+ await new Promise((r) => setTimeout(r, 50));
100
+ return null;
101
+ }
102
+ return await new Promise((resolve) => {
103
+ const timer = setTimeout(() => {
104
+ this.pending.delete(expectedId);
105
+ resolve(null);
106
+ }, timeoutMs);
107
+ this.pending.set(expectedId, (r) => {
108
+ clearTimeout(timer);
109
+ resolve(r);
110
+ });
111
+ try {
112
+ this.child.stdin.write(line + "\n");
113
+ }
114
+ catch {
115
+ clearTimeout(timer);
116
+ this.pending.delete(expectedId);
117
+ resolve(null);
118
+ }
119
+ });
120
+ }
121
+ alive() {
122
+ return this.child.exitCode === null && !this.child.killed;
123
+ }
124
+ async close() {
125
+ try {
126
+ this.child.stdin.end();
127
+ }
128
+ catch { /* ignore */ }
129
+ try {
130
+ this.child.kill("SIGTERM");
131
+ }
132
+ catch { /* ignore */ }
133
+ await new Promise((r) => setTimeout(r, 80));
134
+ try {
135
+ this.child.kill("SIGKILL");
136
+ }
137
+ catch { /* ignore */ }
138
+ }
139
+ }
140
+ /** Extract the JSON-RPC id from a payload step (object or raw string). */
141
+ function payloadId(p) {
142
+ if (p.noResponse)
143
+ return null;
144
+ if (typeof p.send === "string") {
145
+ try {
146
+ const obj = JSON.parse(p.send);
147
+ return typeof obj.id === "number" || typeof obj.id === "string" ? obj.id : null;
148
+ }
149
+ catch {
150
+ return null;
151
+ }
152
+ }
153
+ const o = p.send;
154
+ return typeof o.id === "number" || typeof o.id === "string" ? o.id : null;
155
+ }
156
+ /** Run a single vector against the live MCP client. */
157
+ async function runVector(client, v) {
158
+ const t0 = Date.now();
159
+ const responses = [];
160
+ const perStepTimeout = v.timeoutMs ?? 5000;
161
+ for (const step of v.payload) {
162
+ const expectedId = payloadId(step);
163
+ const stepTimeout = step.timeoutMs ?? perStepTimeout;
164
+ const r = await client.sendAndWait(step.send, expectedId, stepTimeout);
165
+ responses.push(r);
166
+ }
167
+ let det;
168
+ try {
169
+ det = v.detector(responses);
170
+ }
171
+ catch (e) {
172
+ det = { verdict: "inconclusive", reason: `detector threw: ${e.message}` };
173
+ }
174
+ return {
175
+ vectorId: v.id,
176
+ category: v.category,
177
+ severity: v.severity,
178
+ verdict: det.verdict,
179
+ reason: det.reason,
180
+ detail: det.detail,
181
+ dtMs: Date.now() - t0,
182
+ // Cap raw response size in report card to avoid bloat.
183
+ responses: responses.map((r) => {
184
+ if (!r)
185
+ return r;
186
+ const s = canon(r);
187
+ if (s.length > 2000) {
188
+ return { id: r.id, ...(r.error ? { error: { code: r.error.code, message: r.error.message } } : {}), __truncated: true };
189
+ }
190
+ return r;
191
+ }),
192
+ };
193
+ }
194
+ /** Filter vectors by ids or categories. */
195
+ function selectVectors(filter) {
196
+ if (!filter || filter.length === 0)
197
+ return VECTORS_108;
198
+ const ids = new Set(filter);
199
+ const cats = new Set(filter);
200
+ return VECTORS_108.filter((v) => ids.has(v.id) || cats.has(v.category));
201
+ }
202
+ /** Build the Intelligent Second Brain wisdom verdict over a run. */
203
+ function buildWisdom(results) {
204
+ const failed = results.filter((r) => r.verdict === "fail");
205
+ const warned = results.filter((r) => r.verdict === "warn");
206
+ const critFailed = failed.filter((r) => r.severity === "critical");
207
+ // Headline + traffic light.
208
+ let headline;
209
+ let trafficLight;
210
+ if (critFailed.length > 0) {
211
+ headline = `❌ CRITICAL — ${critFailed.length} critical / ${failed.length} total failures across 108 vectors`;
212
+ trafficLight = "red";
213
+ }
214
+ else if (failed.length > 0) {
215
+ headline = `⚠ DEGRADED — ${failed.length} failures across 108 vectors (no critical)`;
216
+ trafficLight = "yellow";
217
+ }
218
+ else if (warned.length > 0) {
219
+ headline = `🟡 PASS-WITH-WARNINGS — 0 failures, ${warned.length} warnings`;
220
+ trafficLight = "yellow";
221
+ }
222
+ else {
223
+ headline = `✅ CLEAN — 108/108 vectors pass; spec-compliant + hardened`;
224
+ trafficLight = "green";
225
+ }
226
+ // Remediations.
227
+ const remediations = failed.slice(0, 20).map((r) => {
228
+ const v = VECTORS_108.find((vec) => vec.id === r.vectorId);
229
+ return {
230
+ vectorId: r.vectorId,
231
+ cve: v?.cve,
232
+ action: `${v?.title ?? r.vectorId}: ${v?.spec ?? "see vector spec"}`,
233
+ };
234
+ });
235
+ // CVE posture — for every CVE listed on any vector, was it caught by a pass?
236
+ const allCves = new Map();
237
+ for (const v of VECTORS_108) {
238
+ if (!v.cve)
239
+ continue;
240
+ const result = results.find((r) => r.vectorId === v.id);
241
+ for (const cve of v.cve) {
242
+ const cur = allCves.get(cve);
243
+ const mitigatedNow = result?.verdict === "pass";
244
+ if (!cur || (!cur.mitigated && mitigatedNow)) {
245
+ allCves.set(cve, { mitigated: mitigatedNow, via: v.id });
246
+ }
247
+ }
248
+ }
249
+ const cvePosture = [...allCves.entries()].map(([cve, m]) => ({ cve, mitigated: m.mitigated, via: m.via }));
250
+ // Mutation suggestions — for each failure propose a clear variant.
251
+ const mutations = failed.slice(0, 8).map((r) => ({
252
+ vectorId: r.vectorId,
253
+ variant: `mutate-${r.vectorId}-${(r.dtMs % 7) + 1}`,
254
+ rationale: `Failure shape: ${r.reason}. Next run: vary input size / depth / encoding.`,
255
+ }));
256
+ return {
257
+ headline,
258
+ trafficLight,
259
+ remediations,
260
+ cvePosture,
261
+ mutationsForNextRun: mutations,
262
+ };
263
+ }
264
+ /** Aggregate per-category / per-severity counts. */
265
+ function summarize(results) {
266
+ const bySeverity = {};
267
+ const byCategory = {};
268
+ for (const sev of ["info", "low", "medium", "high", "critical"]) {
269
+ bySeverity[sev] = { pass: 0, fail: 0 };
270
+ }
271
+ for (const c of ["handshake", "schema", "method", "tool", "resource", "prompt", "policy", "concurrency", "transport"]) {
272
+ byCategory[c] = { pass: 0, fail: 0 };
273
+ }
274
+ let pass = 0, warn = 0, fail = 0, inconclusive = 0;
275
+ for (const r of results) {
276
+ if (r.verdict === "pass") {
277
+ pass++;
278
+ bySeverity[r.severity].pass++;
279
+ byCategory[r.category].pass++;
280
+ }
281
+ else if (r.verdict === "fail") {
282
+ fail++;
283
+ bySeverity[r.severity].fail++;
284
+ byCategory[r.category].fail++;
285
+ }
286
+ else if (r.verdict === "warn") {
287
+ warn++;
288
+ }
289
+ else {
290
+ inconclusive++;
291
+ }
292
+ }
293
+ return { total: results.length, pass, warn, fail, inconclusive, bySeverity, byCategory };
294
+ }
295
+ // ─── HMAC ledger (single-process) ────────────────────────────────────────
296
+ let lastReportLink = "0".repeat(64);
297
+ /** Reset the in-memory chain link (tests). */
298
+ export function __resetFuzzChainForTest() {
299
+ lastReportLink = "0".repeat(64);
300
+ }
301
+ /**
302
+ * Main entry: spawn target MCP server, fire all (or filtered) vectors,
303
+ * build the report card, HMAC-chain it, return.
304
+ */
305
+ export async function runFuzz(target, opts = {}) {
306
+ const startedAt = new Date().toISOString();
307
+ const t0 = Date.now();
308
+ const vectors = selectVectors(opts.filter);
309
+ const client = new StdioMcpClient(target);
310
+ // Initial wait — give the server a brief moment to start the transport.
311
+ // The boot-fast refactor (v2.24.0) makes this < 100ms in practice.
312
+ await new Promise((r) => setTimeout(r, 200));
313
+ const results = [];
314
+ for (const v of vectors) {
315
+ const r = await runVector(client, v);
316
+ results.push(r);
317
+ if (opts.failFast && r.verdict === "fail" && (r.severity === "critical" || r.severity === "high"))
318
+ break;
319
+ }
320
+ await client.close();
321
+ const finishedAt = new Date().toISOString();
322
+ const totalMs = Date.now() - t0;
323
+ const summary = summarize(results);
324
+ const wisdom = buildWisdom(results);
325
+ // Build canonical body (without hmac field), digest + chain.
326
+ const body = {
327
+ spec: { name: "MCP-FUZZER", version: "1.0" },
328
+ target: target.cwd,
329
+ startedAt,
330
+ finishedAt,
331
+ totalMs,
332
+ results,
333
+ summary,
334
+ wisdom,
335
+ };
336
+ const bodyCanon = canon(body);
337
+ const bodyDigest = sha256Hex(bodyCanon);
338
+ lastReportLink = hmacHex(bodyDigest, lastReportLink);
339
+ const seq = parseInt(lastReportLink.slice(0, 8), 16); // pseudo-sequence (not load-bearing)
340
+ const reportCard = {
341
+ ...body,
342
+ hmac: lastReportLink,
343
+ seq,
344
+ bodyDigest,
345
+ };
346
+ return { reportCard };
347
+ }
348
+ /** Verify a report card's HMAC against a known previous chain head. */
349
+ export function verifyReport(card, expectedPrevChainLink = "0".repeat(64)) {
350
+ const { hmac, seq: _seq, bodyDigest, ...body } = card;
351
+ const bodyCanon = canon(body);
352
+ const recomputedDigest = sha256Hex(bodyCanon);
353
+ if (recomputedDigest !== bodyDigest)
354
+ return { ok: false, reason: "bodyDigest mismatch" };
355
+ const expectedHmac = hmacHex(recomputedDigest, expectedPrevChainLink);
356
+ if (expectedHmac !== hmac)
357
+ return { ok: false, reason: "hmac mismatch (wrong key OR wrong prev chain link)" };
358
+ return { ok: true };
359
+ }
360
+ /** Render a one-line headline + 5-line summary block for human terminal. */
361
+ export function renderShort(card) {
362
+ const s = card.summary;
363
+ return [
364
+ card.wisdom.headline,
365
+ ``,
366
+ `Target: ${card.target}`,
367
+ `Spec: ${card.spec.name} v${card.spec.version}`,
368
+ `Duration: ${(card.totalMs / 1000).toFixed(2)}s · ${card.results.length} vectors`,
369
+ `Verdict: pass=${s.pass} warn=${s.warn} fail=${s.fail} inconclusive=${s.inconclusive}`,
370
+ `HMAC: ${card.hmac.slice(0, 16)}… (seq ${card.seq})`,
371
+ ``,
372
+ `Top failures:`,
373
+ ...card.wisdom.remediations.slice(0, 5).map((r) => ` ✗ ${r.vectorId} — ${r.action}${r.cve?.length ? ` [${r.cve.join(",")}]` : ""}`),
374
+ ];
375
+ }
376
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/mcp_fuzzer/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * v2.24.0 — MCP fuzzer public surface.
3
+ */
4
+ export * from "./types.js";
5
+ export { VECTORS_108, VECTOR_COUNT } from "./vectors.js";
6
+ export { runFuzz, verifyReport, renderShort, __resetFuzzChainForTest } from "./engine.js";
7
+ export type { SpawnTarget, FuzzRunResult } from "./engine.js";
8
+ export { storeReport, readLatestReport, listReports } from "./storage.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp_fuzzer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC1F,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * v2.24.0 — MCP fuzzer public surface.
3
+ */
4
+ export * from "./types.js";
5
+ export { VECTORS_108, VECTOR_COUNT } from "./vectors.js";
6
+ export { runFuzz, verifyReport, renderShort, __resetFuzzChainForTest } from "./engine.js";
7
+ export { storeReport, readLatestReport, listReports } from "./storage.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp_fuzzer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mcp_fuzzer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_fuzzer.test.d.ts","sourceRoot":"","sources":["../../src/mcp_fuzzer/mcp_fuzzer.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,128 @@
1
+ // v2.24.0 — MCP fuzzer unit tests.
2
+ import { describe, it, expect } from "vitest";
3
+ import { VECTORS_108, VECTOR_COUNT } from "./vectors.js";
4
+ import { verifyReport, __resetFuzzChainForTest, renderShort } from "./engine.js";
5
+ describe("MCP fuzzer — vector catalog", () => {
6
+ it("has exactly 108 vectors", () => {
7
+ expect(VECTOR_COUNT).toBe(108);
8
+ expect(VECTORS_108.length).toBe(108);
9
+ });
10
+ it("vector ids are unique", () => {
11
+ const ids = new Set(VECTORS_108.map((v) => v.id));
12
+ expect(ids.size).toBe(108);
13
+ });
14
+ it("each category has exactly 12 vectors", () => {
15
+ const cats = {};
16
+ for (const v of VECTORS_108)
17
+ cats[v.category] = (cats[v.category] ?? 0) + 1;
18
+ for (const c of ["handshake", "schema", "method", "tool", "resource", "prompt", "policy", "concurrency", "transport"]) {
19
+ expect(cats[c]).toBe(12);
20
+ }
21
+ });
22
+ it("each vector has a non-empty title + spec + detector", () => {
23
+ for (const v of VECTORS_108) {
24
+ expect(v.title.length).toBeGreaterThan(0);
25
+ expect(v.spec.length).toBeGreaterThan(0);
26
+ expect(typeof v.detector).toBe("function");
27
+ expect(Array.isArray(v.payload)).toBe(true);
28
+ expect(v.payload.length).toBeGreaterThan(0);
29
+ }
30
+ });
31
+ it("severity ladder is bounded", () => {
32
+ const allowed = new Set(["info", "low", "medium", "high", "critical"]);
33
+ for (const v of VECTORS_108)
34
+ expect(allowed.has(v.severity)).toBe(true);
35
+ });
36
+ it("CVE references are well-formed when present", () => {
37
+ for (const v of VECTORS_108) {
38
+ if (!v.cve)
39
+ continue;
40
+ for (const c of v.cve) {
41
+ expect(c).toMatch(/^CVE-\d{4}-\d+$/);
42
+ }
43
+ }
44
+ });
45
+ it("at least one vector cites each audit-finding class", () => {
46
+ // M1 initialize handshake
47
+ expect(VECTORS_108.find((v) => v.id === "vec-h01")).toBeDefined();
48
+ // M2 unknown-tool isError
49
+ expect(VECTORS_108.find((v) => v.id === "vec-t01")).toBeDefined();
50
+ // M3 honeypot gate
51
+ expect(VECTORS_108.find((v) => v.id === "vec-y01")).toBeDefined();
52
+ // M16 stderr — covered by engine; not a vector
53
+ // transport robustness
54
+ expect(VECTORS_108.find((v) => v.id === "vec-x01")).toBeDefined();
55
+ });
56
+ });
57
+ describe("MCP fuzzer — HMAC chain", () => {
58
+ function fakeCard(seq, hmac, bodyDigest) {
59
+ return {
60
+ spec: { name: "MCP-FUZZER", version: "1.0" },
61
+ target: "tmp",
62
+ startedAt: "2026-05-22T00:00:00.000Z",
63
+ finishedAt: "2026-05-22T00:00:01.000Z",
64
+ totalMs: 1000,
65
+ results: [],
66
+ summary: {
67
+ total: 0, pass: 0, warn: 0, fail: 0, inconclusive: 0,
68
+ bySeverity: {
69
+ info: { pass: 0, fail: 0 }, low: { pass: 0, fail: 0 },
70
+ medium: { pass: 0, fail: 0 }, high: { pass: 0, fail: 0 }, critical: { pass: 0, fail: 0 },
71
+ },
72
+ byCategory: {
73
+ handshake: { pass: 0, fail: 0 }, schema: { pass: 0, fail: 0 }, method: { pass: 0, fail: 0 },
74
+ tool: { pass: 0, fail: 0 }, resource: { pass: 0, fail: 0 }, prompt: { pass: 0, fail: 0 },
75
+ policy: { pass: 0, fail: 0 }, concurrency: { pass: 0, fail: 0 }, transport: { pass: 0, fail: 0 },
76
+ },
77
+ },
78
+ wisdom: { headline: "test", trafficLight: "green", remediations: [], cvePosture: [], mutationsForNextRun: [] },
79
+ hmac,
80
+ seq,
81
+ bodyDigest,
82
+ };
83
+ }
84
+ it("verifyReport detects tampered bodyDigest", () => {
85
+ __resetFuzzChainForTest();
86
+ const card = fakeCard(1, "abcd", "deadbeef");
87
+ // Force a wrong digest
88
+ const v = verifyReport(card, "0".repeat(64));
89
+ expect(v.ok).toBe(false);
90
+ });
91
+ });
92
+ describe("MCP fuzzer — renderShort", () => {
93
+ function blankCard() {
94
+ return {
95
+ spec: { name: "MCP-FUZZER", version: "1.0" },
96
+ target: "tmp",
97
+ startedAt: "2026-05-22T00:00:00.000Z",
98
+ finishedAt: "2026-05-22T00:00:01.000Z",
99
+ totalMs: 1234,
100
+ results: [],
101
+ summary: {
102
+ total: 108, pass: 105, warn: 3, fail: 0, inconclusive: 0,
103
+ bySeverity: {
104
+ info: { pass: 0, fail: 0 }, low: { pass: 0, fail: 0 },
105
+ medium: { pass: 0, fail: 0 }, high: { pass: 0, fail: 0 }, critical: { pass: 0, fail: 0 },
106
+ },
107
+ byCategory: {
108
+ handshake: { pass: 12, fail: 0 }, schema: { pass: 12, fail: 0 }, method: { pass: 12, fail: 0 },
109
+ tool: { pass: 12, fail: 0 }, resource: { pass: 12, fail: 0 }, prompt: { pass: 12, fail: 0 },
110
+ policy: { pass: 12, fail: 0 }, concurrency: { pass: 12, fail: 0 }, transport: { pass: 12, fail: 0 },
111
+ },
112
+ },
113
+ wisdom: { headline: "✅ CLEAN", trafficLight: "green", remediations: [], cvePosture: [], mutationsForNextRun: [] },
114
+ hmac: "feedface".repeat(8),
115
+ seq: 1,
116
+ bodyDigest: "deadbeef".repeat(8),
117
+ };
118
+ }
119
+ it("renders a single-line headline + summary block", () => {
120
+ const lines = renderShort(blankCard());
121
+ expect(lines[0]).toContain("CLEAN");
122
+ const text = lines.join("\n");
123
+ expect(text).toContain("pass=105");
124
+ expect(text).toContain("fail=0");
125
+ expect(text).toContain("MCP-FUZZER");
126
+ });
127
+ });
128
+ //# sourceMappingURL=mcp_fuzzer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_fuzzer.test.js","sourceRoot":"","sources":["../../src/mcp_fuzzer/mcp_fuzzer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * v2.24.0 — Persist HMAC-chained MCP fuzz report cards.
3
+ *
4
+ * Cards land at `.mneme/mcp_fuzzer/<seq>-<utc>.json` AND get appended to
5
+ * an append-only ledger `.mneme/mcp_fuzzer/ledger.jsonl` (one line per
6
+ * card with hmac + bodyDigest only — fast skim).
7
+ */
8
+ import type { ReportCard } from "./types.js";
9
+ export declare function storeReport(repoRoot: string, card: ReportCard): {
10
+ path: string;
11
+ ledger: string;
12
+ };
13
+ export declare function readLatestReport(repoRoot: string): ReportCard | null;
14
+ export interface LedgerEntry {
15
+ seq: number;
16
+ finishedAt: string;
17
+ pass: number;
18
+ fail: number;
19
+ warn: number;
20
+ trafficLight: "green" | "yellow" | "red" | "black";
21
+ headline: string;
22
+ hmac: string;
23
+ bodyDigest: string;
24
+ file: string;
25
+ }
26
+ export declare function listReports(repoRoot: string, limit?: number): LedgerEntry[];
27
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/mcp_fuzzer/storage.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAqBhG;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAWpE;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,WAAW,EAAE,CASvE"}