@kryptosai/mcp-observatory 1.28.1 → 1.28.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.
Files changed (134) hide show
  1. package/CONTRIBUTORS.md +4 -1
  2. package/README.md +109 -14
  3. package/README.zh-CN.md +654 -0
  4. package/dist/src/adapters/http.js +13 -4
  5. package/dist/src/adapters/http.js.map +1 -1
  6. package/dist/src/checks/runtime-profile.d.ts +5 -0
  7. package/dist/src/checks/runtime-profile.js +214 -0
  8. package/dist/src/checks/runtime-profile.js.map +1 -0
  9. package/dist/src/checks/security-rules.js +18 -0
  10. package/dist/src/checks/security-rules.js.map +1 -1
  11. package/dist/src/checks/security.js +33 -65
  12. package/dist/src/checks/security.js.map +1 -1
  13. package/dist/src/checks/skill-scan.d.ts +46 -0
  14. package/dist/src/checks/skill-scan.js +665 -0
  15. package/dist/src/checks/skill-scan.js.map +1 -0
  16. package/dist/src/cli.js +15 -2
  17. package/dist/src/cli.js.map +1 -1
  18. package/dist/src/commands/enforce.d.ts +12 -0
  19. package/dist/src/commands/enforce.js +187 -0
  20. package/dist/src/commands/enforce.js.map +1 -0
  21. package/dist/src/commands/helpers.d.ts +2 -1
  22. package/dist/src/commands/helpers.js +9 -1
  23. package/dist/src/commands/helpers.js.map +1 -1
  24. package/dist/src/commands/legacy.js +3 -0
  25. package/dist/src/commands/legacy.js.map +1 -1
  26. package/dist/src/commands/risk-graph.d.ts +2 -0
  27. package/dist/src/commands/risk-graph.js +64 -0
  28. package/dist/src/commands/risk-graph.js.map +1 -0
  29. package/dist/src/commands/scan.js +36 -9
  30. package/dist/src/commands/scan.js.map +1 -1
  31. package/dist/src/commands/score.js.map +1 -1
  32. package/dist/src/commands/skill-scan.d.ts +6 -0
  33. package/dist/src/commands/skill-scan.js +62 -0
  34. package/dist/src/commands/skill-scan.js.map +1 -0
  35. package/dist/src/commands/test.js +13 -0
  36. package/dist/src/commands/test.js.map +1 -1
  37. package/dist/src/commands/watch.js +13 -8
  38. package/dist/src/commands/watch.js.map +1 -1
  39. package/dist/src/discovery.d.ts +15 -1
  40. package/dist/src/discovery.js +251 -35
  41. package/dist/src/discovery.js.map +1 -1
  42. package/dist/src/index.d.ts +3 -1
  43. package/dist/src/index.js +3 -1
  44. package/dist/src/index.js.map +1 -1
  45. package/dist/src/receipt.d.ts +4 -1
  46. package/dist/src/receipt.js +85 -0
  47. package/dist/src/receipt.js.map +1 -1
  48. package/dist/src/reporters/markdown.js +39 -0
  49. package/dist/src/reporters/markdown.js.map +1 -1
  50. package/dist/src/reporters/terminal.d.ts +2 -0
  51. package/dist/src/reporters/terminal.js +55 -2
  52. package/dist/src/reporters/terminal.js.map +1 -1
  53. package/dist/src/risk-graph.d.ts +64 -0
  54. package/dist/src/risk-graph.js +452 -0
  55. package/dist/src/risk-graph.js.map +1 -0
  56. package/dist/src/runner.js +6 -0
  57. package/dist/src/runner.js.map +1 -1
  58. package/dist/src/server.d.ts +1 -3
  59. package/dist/src/server.js +29 -645
  60. package/dist/src/server.js.map +1 -1
  61. package/dist/src/storage.js +13 -9
  62. package/dist/src/storage.js.map +1 -1
  63. package/dist/src/telemetry.d.ts +7 -0
  64. package/dist/src/telemetry.js.map +1 -1
  65. package/dist/src/tools/check-server.d.ts +27 -0
  66. package/dist/src/tools/check-server.js +46 -0
  67. package/dist/src/tools/check-server.js.map +1 -0
  68. package/dist/src/tools/ci-report.d.ts +21 -0
  69. package/dist/src/tools/ci-report.js +38 -0
  70. package/dist/src/tools/ci-report.js.map +1 -0
  71. package/dist/src/tools/diff-runs.d.ts +28 -0
  72. package/dist/src/tools/diff-runs.js +39 -0
  73. package/dist/src/tools/diff-runs.js.map +1 -0
  74. package/dist/src/tools/get-history.d.ts +21 -0
  75. package/dist/src/tools/get-history.js +37 -0
  76. package/dist/src/tools/get-history.js.map +1 -0
  77. package/dist/src/tools/get-last-run.d.ts +21 -0
  78. package/dist/src/tools/get-last-run.js +47 -0
  79. package/dist/src/tools/get-last-run.js.map +1 -0
  80. package/dist/src/tools/helpers.d.ts +8 -0
  81. package/dist/src/tools/helpers.js +32 -0
  82. package/dist/src/tools/helpers.js.map +1 -0
  83. package/dist/src/tools/lock-verify.d.ts +21 -0
  84. package/dist/src/tools/lock-verify.js +47 -0
  85. package/dist/src/tools/lock-verify.js.map +1 -0
  86. package/dist/src/tools/record.d.ts +23 -0
  87. package/dist/src/tools/record.js +48 -0
  88. package/dist/src/tools/record.js.map +1 -0
  89. package/dist/src/tools/replay.d.ts +21 -0
  90. package/dist/src/tools/replay.js +54 -0
  91. package/dist/src/tools/replay.js.map +1 -0
  92. package/dist/src/tools/scan.d.ts +18 -0
  93. package/dist/src/tools/scan.js +43 -0
  94. package/dist/src/tools/scan.js.map +1 -0
  95. package/dist/src/tools/score-server.d.ts +23 -0
  96. package/dist/src/tools/score-server.js +53 -0
  97. package/dist/src/tools/score-server.js.map +1 -0
  98. package/dist/src/tools/suggest-servers.d.ts +21 -0
  99. package/dist/src/tools/suggest-servers.js +114 -0
  100. package/dist/src/tools/suggest-servers.js.map +1 -0
  101. package/dist/src/tools/verify-tool.d.ts +25 -0
  102. package/dist/src/tools/verify-tool.js +48 -0
  103. package/dist/src/tools/verify-tool.js.map +1 -0
  104. package/dist/src/tools/watch.d.ts +23 -0
  105. package/dist/src/tools/watch.js +67 -0
  106. package/dist/src/tools/watch.js.map +1 -0
  107. package/dist/src/types.d.ts +26 -1
  108. package/dist/src/utils/security.d.ts +3 -0
  109. package/dist/src/utils/security.js +37 -0
  110. package/dist/src/utils/security.js.map +1 -0
  111. package/dist/src/validate.d.ts +1 -0
  112. package/dist/src/validate.js +119 -35
  113. package/dist/src/validate.js.map +1 -1
  114. package/docs/agent-tasks.md +1 -1
  115. package/docs/commercial-boundary.md +9 -1
  116. package/docs/contributor-recognition.md +2 -0
  117. package/docs/demo.svg +1 -59
  118. package/docs/mcp-receipts.md +9 -0
  119. package/docs/mcp-server-safety-index.md +21 -16
  120. package/docs/metrics-dashboard.md +17 -1
  121. package/docs/private-mcp-fleet-risk-graph.md +69 -0
  122. package/docs/receipt-graph.md +118 -31
  123. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.json +1745 -0
  124. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.md +169 -0
  125. package/docs/safety-index/artifacts/filesystem-mcp-server.json +786 -0
  126. package/docs/safety-index/artifacts/filesystem-mcp-server.md +169 -0
  127. package/docs/safety-index/artifacts/github-mcp-server.json +1707 -0
  128. package/docs/safety-index/artifacts/github-mcp-server.md +169 -0
  129. package/docs/safety-index/mcp-risk-graph.html +167 -0
  130. package/docs/safety-index/mcp-risk-graph.json +669 -0
  131. package/docs/safety-index/mcp-risk-graph.md +47 -0
  132. package/docs/safety-index/targets.json +57 -0
  133. package/docs/sample-private-fleet-risk-graph.md +90 -0
  134. package/package.json +21 -11
@@ -0,0 +1,452 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { readdir, readFile, stat } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import { buildActionReceipt } from "./action-receipt.js";
6
+ import { extractObservatoryFindings } from "./findings.js";
7
+ import { TOOL_VERSION } from "./version.js";
8
+ const ALL_ACTIONS = ["allow", "gate", "rerun", "quarantine", "escalate"];
9
+ const ALL_BOUNDARIES = ["filesystem", "browser", "command-execution", "infra-cloud", "memory", "data-api", "identity-auth", "unknown"];
10
+ function stableId(prefix, value) {
11
+ return `${prefix}:${createHash("sha256").update(value).digest("hex").slice(0, 16)}`;
12
+ }
13
+ function sha256Text(value) {
14
+ return createHash("sha256").update(value).digest("hex");
15
+ }
16
+ async function sha256File(filePath) {
17
+ if (!existsSync(filePath))
18
+ return undefined;
19
+ return sha256Text(await readFile(filePath, "utf8"));
20
+ }
21
+ function isObject(value) {
22
+ return typeof value === "object" && value !== null && !Array.isArray(value);
23
+ }
24
+ function asRunArtifact(value) {
25
+ if (!isObject(value))
26
+ return undefined;
27
+ if (value["artifactType"] === "run" && isObject(value["target"]) && Array.isArray(value["checks"]))
28
+ return value;
29
+ if (isObject(value["artifact"]) && value["artifact"]["artifactType"] === "run")
30
+ return value["artifact"];
31
+ return undefined;
32
+ }
33
+ function asMcpReceipt(value) {
34
+ if (!isObject(value))
35
+ return undefined;
36
+ return value["receipt_type"] === "mcp-observatory-receipt" && isObject(value["subject"]) && isObject(value["verdict"])
37
+ ? value
38
+ : undefined;
39
+ }
40
+ async function collectJsonFiles(inputPath) {
41
+ const info = await stat(inputPath);
42
+ if (info.isFile())
43
+ return [inputPath];
44
+ if (!info.isDirectory())
45
+ return [];
46
+ const entries = await readdir(inputPath, { withFileTypes: true });
47
+ const nested = await Promise.all(entries.map(async (entry) => {
48
+ const fullPath = path.join(inputPath, entry.name);
49
+ if (entry.isDirectory())
50
+ return collectJsonFiles(fullPath);
51
+ return entry.isFile() && entry.name.endsWith(".json") ? [fullPath] : [];
52
+ }));
53
+ return nested.flat();
54
+ }
55
+ export async function loadRiskGraphInputs(inputPaths) {
56
+ const warnings = [];
57
+ const inputs = [];
58
+ for (const inputPath of inputPaths) {
59
+ try {
60
+ const files = await collectJsonFiles(inputPath);
61
+ if (files.length === 0)
62
+ warnings.push(`No JSON artifacts found at ${inputPath}.`);
63
+ for (const filePath of files) {
64
+ try {
65
+ inputs.push({ path: filePath, data: JSON.parse(await readFile(filePath, "utf8")) });
66
+ }
67
+ catch (error) {
68
+ const message = error instanceof Error ? error.message : String(error);
69
+ warnings.push(`Skipped invalid artifact ${filePath}: ${message}`);
70
+ }
71
+ }
72
+ }
73
+ catch (error) {
74
+ const message = error instanceof Error ? error.message : String(error);
75
+ warnings.push(`Skipped missing or unreadable input ${inputPath}: ${message}`);
76
+ }
77
+ }
78
+ return { inputs, warnings };
79
+ }
80
+ function inputKind(input) {
81
+ const receipt = asMcpReceipt(input.data);
82
+ if (receipt)
83
+ return { kind: "receipt", receipt, path: input.path };
84
+ const artifact = asRunArtifact(input.data);
85
+ if (artifact)
86
+ return { kind: "run", artifact, path: input.path };
87
+ return undefined;
88
+ }
89
+ function receiptIdentity(receipt) {
90
+ return [
91
+ receipt.subject.package_or_repo,
92
+ receipt.subject.resolved_identity,
93
+ receipt.subject.mcp_server_name,
94
+ receipt.subject.startup_command,
95
+ receipt.subject.target_path_or_url,
96
+ ].filter(Boolean).join("|");
97
+ }
98
+ function runIdentity(artifact) {
99
+ const metadata = artifact.target.metadata ?? {};
100
+ const strongIdentity = metadata["package"] ?? metadata["repo"] ?? metadata["repository"] ?? metadata["source"];
101
+ if (strongIdentity)
102
+ return strongIdentity;
103
+ const packageArg = packageFromCommandArgs(artifact.target.command, artifact.target.args);
104
+ if (packageArg)
105
+ return packageArg;
106
+ return [
107
+ artifact.target.serverName,
108
+ artifact.target.targetId,
109
+ artifact.target.command ? [artifact.target.command, ...artifact.target.args].join(" ") : artifact.target.url,
110
+ ].filter(Boolean).join("|");
111
+ }
112
+ function packageFromCommandArgs(command, args) {
113
+ if (command !== "npx")
114
+ return undefined;
115
+ return args.find((arg) => !arg.startsWith("-") && arg !== "latest");
116
+ }
117
+ function packageOrRepoFromRun(artifact) {
118
+ const metadata = artifact.target.metadata ?? {};
119
+ return metadata["package"] ?? metadata["repo"] ?? metadata["repository"] ?? metadata["source"] ?? packageFromCommandArgs(artifact.target.command, artifact.target.args) ?? null;
120
+ }
121
+ function ciCommandFromRun(artifact) {
122
+ if (artifact.target.adapter === "local-process" && artifact.target.command) {
123
+ return `mcp-observatory setup-ci --all --command ${JSON.stringify([artifact.target.command, ...artifact.target.args].join(" "))} --sarif --schedule weekly`;
124
+ }
125
+ if (artifact.target.adapter === "http" && artifact.target.url) {
126
+ return `mcp-observatory setup-ci --all --command ${artifact.target.url} --sarif --schedule weekly`;
127
+ }
128
+ return null;
129
+ }
130
+ function riskLevelForAction(action) {
131
+ if (action === "escalate")
132
+ return "critical";
133
+ if (action === "quarantine")
134
+ return "high";
135
+ if (action === "gate")
136
+ return "medium";
137
+ if (action === "rerun")
138
+ return "medium";
139
+ return "low";
140
+ }
141
+ function strongerRisk(a, b) {
142
+ const rank = { unknown: 0, low: 1, medium: 2, high: 3, critical: 4 };
143
+ return rank[a] >= rank[b] ? a : b;
144
+ }
145
+ function strongestAction(a, b) {
146
+ const rank = { allow: 0, rerun: 1, gate: 2, quarantine: 3, escalate: 4 };
147
+ return rank[a] >= rank[b] ? a : b;
148
+ }
149
+ function textForClassification(parts) {
150
+ return parts.filter(Boolean).join(" ").toLowerCase();
151
+ }
152
+ export function classifyCapabilityBoundary(input) {
153
+ const findingText = input.findings?.map((finding) => textForClassification([
154
+ finding.ruleId,
155
+ finding.title,
156
+ finding.message,
157
+ finding.category,
158
+ finding.subject.name,
159
+ finding.recommendation,
160
+ ])).join(" ") ?? "";
161
+ const metadataText = Object.values(input.metadata ?? {}).join(" ");
162
+ const text = textForClassification([...(input.names ?? []), findingText, metadataText, input.fallbackText]);
163
+ if (/\b(browser|browsermcp|playwright|puppeteer|chrome|page|dom|screenshot|navigate)\b/.test(text))
164
+ return "browser";
165
+ if (/\b(kube|kubernetes|kubectl|helm|terraform|opentofu|aws|gcp|azure|cloud|cluster|pod|namespace|deploy|manifest|infra)\b/.test(text))
166
+ return "infra-cloud";
167
+ if (/\b(command|shell|exec|spawn|process|terminal|bash|script|subprocess)\b/.test(text) || text.includes("run_shell"))
168
+ return "command-execution";
169
+ if (/\b(file|filesystem|directory|path|delete|mkdir|cwd|workspace)\b/.test(text) || text.includes("read_file") || text.includes("write_file"))
170
+ return "filesystem";
171
+ if (/\b(memory|vector|embedding|store|recall|remember|knowledge)\b/.test(text) || text.includes("memory_"))
172
+ return "memory";
173
+ if (/\b(api|database|sql|http|graphql|request|fetch|webhook|email|slack|notion|jira|linear|crm)\b/.test(text) || text.includes("_api"))
174
+ return "data-api";
175
+ if (/\b(auth|oauth|token|credential|secret|identity|permission|role|scope|session)\b/.test(text) || text.includes("oauth_"))
176
+ return "identity-auth";
177
+ return "unknown";
178
+ }
179
+ function evidenceRefsForRun(artifact, inputPath) {
180
+ const refs = [{ type: "run-artifact", path: inputPath }];
181
+ if (artifact.checks.some((check) => check.id === "attack-sim"))
182
+ refs.push({ type: "attack-sim", path: inputPath });
183
+ return refs;
184
+ }
185
+ function receiptEvidenceRefs(receipt, inputPath) {
186
+ const refs = [{ type: "receipt", path: inputPath }];
187
+ if (receipt.evidence.json_report_path)
188
+ refs.push({ type: "run-artifact", path: receipt.evidence.json_report_path, sha256: receipt.evidence.json_report_sha256 ?? undefined });
189
+ if (receipt.evidence.markdown_report_path)
190
+ refs.push({ type: "markdown", path: receipt.evidence.markdown_report_path, sha256: receipt.evidence.markdown_report_sha256 ?? undefined });
191
+ if (receipt.evidence.sarif_path)
192
+ refs.push({ type: "sarif", path: receipt.evidence.sarif_path, sha256: receipt.evidence.sarif_sha256 ?? undefined });
193
+ return refs;
194
+ }
195
+ function mergeNode(existing, next) {
196
+ const refs = new Map();
197
+ for (const ref of [...existing.evidenceRefs, ...next.evidenceRefs])
198
+ refs.set(`${ref.type}:${ref.path}`, ref);
199
+ return {
200
+ ...existing,
201
+ name: existing.name || next.name,
202
+ serverPackageOrRepo: existing.serverPackageOrRepo ?? next.serverPackageOrRepo,
203
+ capabilityBoundary: existing.capabilityBoundary === "unknown" ? next.capabilityBoundary : existing.capabilityBoundary,
204
+ receiptState: existing.receiptState === "not_generated" ? next.receiptState : existing.receiptState,
205
+ recommendedAction: strongestAction(existing.recommendedAction, next.recommendedAction),
206
+ riskLevel: strongerRisk(existing.riskLevel, next.riskLevel),
207
+ evidenceRefs: [...refs.values()],
208
+ ciCommand: existing.ciCommand ?? next.ciCommand,
209
+ };
210
+ }
211
+ function actionText(action) {
212
+ if (action === "allow")
213
+ return "Allow with routine monitoring.";
214
+ if (action === "rerun")
215
+ return "Rerun with a corrected startup command or fresh baseline.";
216
+ if (action === "gate")
217
+ return "Gate adoption until maintainers review the finding.";
218
+ if (action === "quarantine")
219
+ return "Quarantine from production agents until the boundary is reduced or accepted.";
220
+ return "Escalate to security before agents depend on this toolchain.";
221
+ }
222
+ function boundaryNode(boundary) {
223
+ return {
224
+ id: `boundary:${boundary}`,
225
+ name: boundary,
226
+ source: "capability-boundary",
227
+ serverPackageOrRepo: null,
228
+ capabilityBoundary: boundary,
229
+ receiptState: "not_generated",
230
+ recommendedAction: boundary === "unknown" ? "allow" : "gate",
231
+ riskLevel: boundary === "unknown" ? "unknown" : "medium",
232
+ evidenceRefs: [],
233
+ ciCommand: null,
234
+ };
235
+ }
236
+ export async function buildRiskGraph(inputs) {
237
+ const warnings = [];
238
+ const serverNodes = new Map();
239
+ const edges = new Map();
240
+ const boundaries = new Set();
241
+ for (const input of inputs) {
242
+ const known = inputKind(input);
243
+ if (!known) {
244
+ warnings.push(`Skipped unsupported artifact ${input.path}.`);
245
+ continue;
246
+ }
247
+ if (known.kind === "receipt") {
248
+ const boundary = classifyCapabilityBoundary({
249
+ fallbackText: `${known.receipt.subject.mcp_server_name} ${known.receipt.subject.package_or_repo ?? ""} ${known.receipt.evidence.tool_surface_summary} ${known.receipt.evidence.attack_simulation_summary}`,
250
+ });
251
+ const node = {
252
+ id: stableId("server", receiptIdentity(known.receipt)),
253
+ name: known.receipt.subject.mcp_server_name,
254
+ source: "receipt",
255
+ serverPackageOrRepo: known.receipt.subject.package_or_repo,
256
+ capabilityBoundary: boundary,
257
+ receiptState: known.receipt.verdict.state,
258
+ recommendedAction: known.receipt.verdict.action,
259
+ riskLevel: riskLevelForAction(known.receipt.verdict.action),
260
+ evidenceRefs: receiptEvidenceRefs(known.receipt, known.path),
261
+ ciCommand: known.receipt.reproduction.ci_command,
262
+ };
263
+ const hash = await sha256File(known.path);
264
+ node.evidenceRefs[0] = { ...node.evidenceRefs[0], sha256: hash };
265
+ serverNodes.set(node.id, serverNodes.has(node.id) ? mergeNode(serverNodes.get(node.id), node) : node);
266
+ boundaries.add(boundary);
267
+ edges.set(`${node.id}->boundary:${boundary}`, { from: node.id, to: `boundary:${boundary}`, type: "has-capability-boundary", reason: `Receipt classifies this server as ${boundary}.` });
268
+ if (node.recommendedAction !== "allow")
269
+ edges.set(`${node.id}->action:${node.recommendedAction}`, { from: node.id, to: `boundary:${boundary}`, type: "requires-action", reason: actionText(node.recommendedAction) });
270
+ continue;
271
+ }
272
+ const findings = extractObservatoryFindings(known.artifact);
273
+ const toolNames = known.artifact.checks.flatMap((check) => check.evidence.flatMap((evidence) => evidence.identifiers ?? []));
274
+ const actionReceipt = buildActionReceipt(known.artifact);
275
+ const boundary = classifyCapabilityBoundary({
276
+ names: toolNames,
277
+ findings,
278
+ metadata: known.artifact.target.metadata,
279
+ fallbackText: known.artifact.target.targetId,
280
+ });
281
+ const node = {
282
+ id: stableId("server", runIdentity(known.artifact)),
283
+ name: known.artifact.target.serverName ?? known.artifact.target.targetId,
284
+ source: "run-artifact",
285
+ serverPackageOrRepo: packageOrRepoFromRun(known.artifact),
286
+ capabilityBoundary: boundary,
287
+ receiptState: "not_generated",
288
+ recommendedAction: actionReceipt.action,
289
+ riskLevel: riskLevelForAction(actionReceipt.action),
290
+ evidenceRefs: evidenceRefsForRun(known.artifact, known.path),
291
+ ciCommand: ciCommandFromRun(known.artifact),
292
+ };
293
+ const hash = await sha256File(known.path);
294
+ node.evidenceRefs[0] = { ...node.evidenceRefs[0], sha256: hash };
295
+ serverNodes.set(node.id, serverNodes.has(node.id) ? mergeNode(serverNodes.get(node.id), node) : node);
296
+ boundaries.add(boundary);
297
+ edges.set(`${node.id}->boundary:${boundary}`, { from: node.id, to: `boundary:${boundary}`, type: "has-capability-boundary", reason: `Observed tools/findings classify this server as ${boundary}.` });
298
+ if (node.evidenceRefs.some((ref) => ref.type === "attack-sim"))
299
+ edges.set(`${node.id}->attack-sim`, { from: node.id, to: `boundary:${boundary}`, type: "has-evidence", reason: "Safe attack-sim evidence is present." });
300
+ if (node.recommendedAction !== "allow")
301
+ edges.set(`${node.id}->action:${node.recommendedAction}`, { from: node.id, to: `boundary:${boundary}`, type: "requires-action", reason: actionText(node.recommendedAction) });
302
+ }
303
+ const boundaryNodes = [...boundaries].sort().map(boundaryNode);
304
+ const nodes = [...boundaryNodes, ...serverNodes.values()].sort((a, b) => a.source.localeCompare(b.source) || a.name.localeCompare(b.name));
305
+ const serverOnlyNodes = nodes.filter((node) => node.source !== "capability-boundary");
306
+ const actionCounts = Object.fromEntries(ALL_ACTIONS.map((action) => [action, 0]));
307
+ const boundaryCounts = Object.fromEntries(ALL_BOUNDARIES.map((boundary) => [boundary, 0]));
308
+ let highestRiskLevel = "unknown";
309
+ for (const node of serverOnlyNodes) {
310
+ actionCounts[node.recommendedAction] += 1;
311
+ boundaryCounts[node.capabilityBoundary] += 1;
312
+ highestRiskLevel = strongerRisk(highestRiskLevel, node.riskLevel);
313
+ }
314
+ const recommendedActions = serverOnlyNodes
315
+ .filter((node) => node.recommendedAction !== "allow")
316
+ .sort((a, b) => b.riskLevel.localeCompare(a.riskLevel) || a.name.localeCompare(b.name))
317
+ .slice(0, 10)
318
+ .map((node) => `${node.name}: ${actionText(node.recommendedAction)}`);
319
+ return {
320
+ schemaVersion: "1.0.0",
321
+ generatedAt: new Date().toISOString(),
322
+ toolVersion: TOOL_VERSION,
323
+ nodes,
324
+ edges: [...edges.values()].sort((a, b) => a.from.localeCompare(b.from) || a.to.localeCompare(b.to)),
325
+ summary: {
326
+ totalServers: serverOnlyNodes.length,
327
+ totalBoundaries: boundaries.size,
328
+ highestRiskLevel,
329
+ actionCounts,
330
+ boundaryCounts,
331
+ },
332
+ recommendedActions,
333
+ warnings,
334
+ };
335
+ }
336
+ function cell(value) {
337
+ const text = value == null ? "" : typeof value === "string" ? value : JSON.stringify(value);
338
+ return text.replaceAll("|", "\\|").replaceAll("\n", " ");
339
+ }
340
+ export function renderRiskGraphMarkdown(graph) {
341
+ const serverNodes = graph.nodes.filter((node) => node.source !== "capability-boundary");
342
+ const lines = [
343
+ "# MCP Risk Graph",
344
+ "",
345
+ "MCP Observatory maps the risk graph of agent toolchains before agents depend on them.",
346
+ "",
347
+ "This graph is evidence-based and safe-mode only. It links MCP servers to receipts, attack-sim output, capability boundaries, recommended actions, and CI/SARIF next steps.",
348
+ "",
349
+ "## Summary",
350
+ "",
351
+ `- Servers: ${graph.summary.totalServers}`,
352
+ `- Capability boundaries: ${graph.summary.totalBoundaries}`,
353
+ `- Highest risk: ${graph.summary.highestRiskLevel}`,
354
+ `- Generated at: ${graph.generatedAt}`,
355
+ "",
356
+ "## Servers",
357
+ "",
358
+ "| Server | Boundary | Risk | Action | Receipt | CI command | Evidence |",
359
+ "| --- | --- | --- | --- | --- | --- | --- |",
360
+ ...serverNodes.map((node) => [
361
+ `| ${cell(node.name)}`,
362
+ cell(node.capabilityBoundary),
363
+ cell(node.riskLevel),
364
+ cell(node.recommendedAction),
365
+ cell(node.receiptState),
366
+ cell(node.ciCommand),
367
+ `${node.evidenceRefs.map((ref) => `${ref.type}:${ref.path}`).join("<br>")} |`,
368
+ ].join(" | ")),
369
+ "",
370
+ "## Recommended Actions",
371
+ "",
372
+ ...(graph.recommendedActions.length > 0 ? graph.recommendedActions.map((action) => `- ${action}`) : ["- No blocking MCP risk-graph actions were detected."]),
373
+ "",
374
+ "## Maintainer Note Template",
375
+ "",
376
+ "We generated a safe MCP Observatory receipt for your MCP server. It includes the exact evidence artifact, recommended action, and CI/SARIF command. If this startup command is not the safest public mode, reply with the preferred no-secret command and we will update the receipt.",
377
+ ];
378
+ if (graph.warnings.length > 0) {
379
+ lines.push("", "## Warnings", "", ...graph.warnings.map((warning) => `- ${warning}`));
380
+ }
381
+ return lines.join("\n");
382
+ }
383
+ function escapeHtml(value) {
384
+ const text = typeof value === "string" || typeof value === "number" || typeof value === "boolean" ? String(value) : "";
385
+ return text
386
+ .replaceAll("&", "&amp;")
387
+ .replaceAll("<", "&lt;")
388
+ .replaceAll(">", "&gt;")
389
+ .replaceAll("\"", "&quot;");
390
+ }
391
+ export function renderRiskGraphHtml(graph) {
392
+ const serverNodes = graph.nodes.filter((node) => node.source !== "capability-boundary");
393
+ return `<!doctype html>
394
+ <html lang="en">
395
+ <head>
396
+ <meta charset="utf-8">
397
+ <meta name="viewport" content="width=device-width, initial-scale=1">
398
+ <title>MCP Risk Graph</title>
399
+ <style>
400
+ body { margin: 0; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: #172033; background: #f7f9fc; }
401
+ header { padding: 28px 32px 18px; background: #ffffff; border-bottom: 1px solid #d8e0ea; }
402
+ h1 { margin: 0 0 8px; font-size: 32px; letter-spacing: 0; }
403
+ main { padding: 24px 32px 40px; }
404
+ .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; margin-bottom: 20px; }
405
+ .card, table { background: #ffffff; border: 1px solid #d8e0ea; border-radius: 8px; }
406
+ .card { padding: 16px; }
407
+ .card span { display: block; color: #667085; font-size: 13px; }
408
+ .card strong { display: block; margin-top: 6px; font-size: 24px; }
409
+ table { width: 100%; border-collapse: collapse; overflow: hidden; }
410
+ th, td { padding: 11px 12px; border-bottom: 1px solid #e5ebf2; text-align: left; vertical-align: top; font-size: 14px; }
411
+ th { color: #475467; background: #f0f4f8; font-size: 12px; text-transform: uppercase; }
412
+ code { font-size: 12px; white-space: normal; }
413
+ .pill { display: inline-block; padding: 3px 8px; border-radius: 999px; background: #e8eef6; font-size: 12px; }
414
+ .critical, .high { background: #fee2e2; color: #991b1b; }
415
+ .medium { background: #fef3c7; color: #92400e; }
416
+ .low { background: #dcfce7; color: #166534; }
417
+ </style>
418
+ </head>
419
+ <body>
420
+ <header>
421
+ <h1>MCP Risk Graph</h1>
422
+ <p>MCP Observatory maps the risk graph of agent toolchains before agents depend on them.</p>
423
+ </header>
424
+ <main>
425
+ <section class="summary">
426
+ <article class="card"><span>Servers</span><strong>${graph.summary.totalServers}</strong></article>
427
+ <article class="card"><span>Capability boundaries</span><strong>${graph.summary.totalBoundaries}</strong></article>
428
+ <article class="card"><span>Highest risk</span><strong>${escapeHtml(graph.summary.highestRiskLevel)}</strong></article>
429
+ <article class="card"><span>Generated</span><strong>${escapeHtml(graph.generatedAt.slice(0, 10))}</strong></article>
430
+ </section>
431
+ <table>
432
+ <thead><tr><th>Server</th><th>Boundary</th><th>Risk</th><th>Action</th><th>Receipt</th><th>CI command</th><th>Evidence</th></tr></thead>
433
+ <tbody>
434
+ ${serverNodes.map((node) => `<tr>
435
+ <td><strong>${escapeHtml(node.name)}</strong><br><small>${escapeHtml(node.serverPackageOrRepo ?? "")}</small></td>
436
+ <td><span class="pill">${escapeHtml(node.capabilityBoundary)}</span></td>
437
+ <td><span class="pill ${escapeHtml(node.riskLevel)}">${escapeHtml(node.riskLevel)}</span></td>
438
+ <td>${escapeHtml(node.recommendedAction)}</td>
439
+ <td>${escapeHtml(node.receiptState)}</td>
440
+ <td><code>${escapeHtml(node.ciCommand ?? "")}</code></td>
441
+ <td>${node.evidenceRefs.map((ref) => `<code>${escapeHtml(`${ref.type}:${ref.path}`)}</code>`).join("<br>")}</td>
442
+ </tr>`).join("")}
443
+ </tbody>
444
+ </table>
445
+ </main>
446
+ </body>
447
+ </html>`;
448
+ }
449
+ export function renderRiskGraphJson(graph) {
450
+ return JSON.stringify(graph, null, 2);
451
+ }
452
+ //# sourceMappingURL=risk-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-graph.js","sourceRoot":"","sources":["../../src/risk-graph.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { runResourcesCheck } from "./checks/resources.js";
9
9
  import { runSchemaQualityCheck } from "./checks/schema-quality.js";
10
10
  import { runToolsCheck } from "./checks/tools.js";
11
11
  import { runLightweightSecurityCheck, runSecurityCheck } from "./checks/security.js";
12
+ import { analyzeRuntimeProfile, runRuntimeProfileCheck } from "./checks/runtime-profile.js";
12
13
  import { runToolsInvokeCheck } from "./checks/tools-invoke.js";
13
14
  import { computeHealthScore } from "./score.js";
14
15
  import { errorMessage } from "./utils/errors.js";
@@ -71,6 +72,7 @@ async function runTargetWithRecording(target, options) {
71
72
  let serverName;
72
73
  let serverVersion;
73
74
  let performanceMetrics;
75
+ let runtimeProfile;
74
76
  let cassetteEntries;
75
77
  try {
76
78
  const connectStart = performance.now();
@@ -103,6 +105,9 @@ async function runTargetWithRecording(target, options) {
103
105
  const toolsResp = await session.client.listTools(undefined, { timeout: checkContext.timeoutMs });
104
106
  const liteSecCheck = runLightweightSecurityCheck(toolsResp.tools, target);
105
107
  checks.push(liteSecCheck.result);
108
+ const runtimeProfileCheck = runRuntimeProfileCheck(toolsResp.tools);
109
+ checks.push(runtimeProfileCheck.result);
110
+ runtimeProfile = analyzeRuntimeProfile(toolsResp.tools);
106
111
  }
107
112
  catch {
108
113
  // If listing tools fails, skip lightweight security (tools check already reports the error)
@@ -209,6 +214,7 @@ async function runTargetWithRecording(target, options) {
209
214
  checks,
210
215
  healthScore,
211
216
  performanceMetrics,
217
+ runtimeProfile,
212
218
  fatalError
213
219
  };
214
220
  return { artifact, cassetteEntries };
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,3 @@
1
1
  #!/usr/bin/env node
2
- export declare function validateArgs(args: string[]): void;
3
- export declare function validateCommand(command: string): void;
4
- export declare function validatePath(filePath: string, allowedRoot: string): string;
2
+ export { validateArgs, validateCommand, validatePath } from "./utils/security.js";
5
3
  export declare function startServer(): Promise<void>;