@guardbee/mcp-owasp-scan 0.0.0-stage → 0.1.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 (44) hide show
  1. package/README.md +38 -2
  2. package/TR.md +9 -0
  3. package/ZH.md +9 -0
  4. package/dist/__tests__/orchestrator.test.d.ts +2 -0
  5. package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
  6. package/dist/__tests__/orchestrator.test.js +71 -0
  7. package/dist/__tests__/orchestrator.test.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +166 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/grade.d.ts +6 -0
  13. package/dist/grade.d.ts.map +1 -0
  14. package/dist/grade.js +15 -0
  15. package/dist/grade.js.map +1 -0
  16. package/dist/index.d.ts +7 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +5 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/mcpClient.d.ts +17 -0
  21. package/dist/mcpClient.d.ts.map +1 -0
  22. package/dist/mcpClient.js +34 -0
  23. package/dist/mcpClient.js.map +1 -0
  24. package/dist/orchestrator.d.ts +14 -0
  25. package/dist/orchestrator.d.ts.map +1 -0
  26. package/dist/orchestrator.js +328 -0
  27. package/dist/orchestrator.js.map +1 -0
  28. package/dist/owaspMap.d.ts +5 -0
  29. package/dist/owaspMap.d.ts.map +1 -0
  30. package/dist/owaspMap.js +42 -0
  31. package/dist/owaspMap.js.map +1 -0
  32. package/dist/sarif.d.ts +8 -0
  33. package/dist/sarif.d.ts.map +1 -0
  34. package/dist/sarif.js +67 -0
  35. package/dist/sarif.js.map +1 -0
  36. package/dist/server.d.ts +2 -0
  37. package/dist/server.d.ts.map +1 -0
  38. package/dist/server.js +80 -0
  39. package/dist/server.js.map +1 -0
  40. package/dist/types.d.ts +45 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +59 -3
package/README.md CHANGED
@@ -1,3 +1,39 @@
1
- # Temporary Holding Version
1
+ # @guardbee/mcp-owasp-scan
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **🇬🇧 English** | [🇹🇷 Türkçe](TR.md) | [🇨🇳 中文](ZH.md)
4
+
5
+ One CLI/MCP for a **unified [OWASP MCP Top 10](https://owasp.org/www-project-mcp-top-10/) gut-check** — GuardBee’s answer to one-shot scanners that only connect live.
6
+
7
+ | Mode | What it does |
8
+ |---|---|
9
+ | `scan <path>` | Orchestrates secret, server, oauth, audit-gap, context-oversharing, toxic-flow, tool-poisoning |
10
+ | `live` | Connects (stdio/HTTP), `tools/list`, then toxic-flow + tool-poisoning |
11
+ | `catalog` | Same as live, from a JSON dump |
12
+
13
+ Optional `--discover-shadow` adds **MCP09** host discovery via `mcp-config-auditor`.
14
+
15
+ > Telemetry defaults on (tool name + short params; scanned code never sent). Disable with `GUARDBEE_TELEMETRY=0`.
16
+
17
+ ## Quick start
18
+
19
+ ```bash
20
+ npx @guardbee/mcp-owasp-scan scan ./src --format=sarif --fail-on=high
21
+ npx @guardbee/mcp-owasp-scan live --url=https://mcp.example.com/mcp
22
+ npx @guardbee/mcp-owasp-scan catalog ./tools.json --format=json
23
+ ```
24
+
25
+ ```json
26
+ {
27
+ "mcpServers": {
28
+ "guardbee-owasp-scan": {
29
+ "command": "npx",
30
+ "args": ["-y", "@guardbee/mcp-owasp-scan"]
31
+ }
32
+ }
33
+ }
34
+ ```
35
+
36
+ ## Coverage notes
37
+
38
+ - **MCP04** (supply chain) and **MCP06** (RAG prompt injection) stay in their dedicated packages (`dependency-auditor` / `slopsquat-scanner`, `prompt-injection-scanner`) — they need network or content corpora this meta-scan does not pull in by default.
39
+ - Grade **A–F** follows toxic-flow semantics (lethal trifecta → F).
package/TR.md ADDED
@@ -0,0 +1,9 @@
1
+ # @guardbee/mcp-owasp-scan
2
+
3
+ **🇬🇧 [English](README.md)** | 🇹🇷 Türkçe | [🇨🇳 中文](ZH.md)
4
+
5
+ Tek CLI/MCP ile **OWASP MCP Top 10** taraması: path üzerinde GuardBee auditor’larını birleştirir; `live` / `catalog` ile `tools/list` üzerinden toxic-flow + tool-poisoning notlar (A–F).
6
+
7
+ ```bash
8
+ npx @guardbee/mcp-owasp-scan scan ./src --format=sarif --fail-on=high
9
+ ```
package/ZH.md ADDED
@@ -0,0 +1,9 @@
1
+ # @guardbee/mcp-owasp-scan
2
+
3
+ **🇬🇧 [English](README.md)** | [🇹🇷 Türkçe](TR.md) | 🇨🇳 中文
4
+
5
+ 统一的 **OWASP MCP Top 10** 扫描:路径模式编排 GuardBee 各审计器;`live` / `catalog` 对 `tools/list` 做 toxic-flow + 工具投毒评分(A–F)。
6
+
7
+ ```bash
8
+ npx @guardbee/mcp-owasp-scan scan ./src --format=sarif --fail-on=high
9
+ ```
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=orchestrator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/orchestrator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mkdtempSync, writeFileSync, rmSync } from "fs";
3
+ import { tmpdir } from "os";
4
+ import { join } from "path";
5
+ import { scanPath, scanCatalogJson } from "../orchestrator.js";
6
+ import { gradeFromFindings } from "../grade.js";
7
+ import { resolveOwasp } from "../owaspMap.js";
8
+ describe("resolveOwasp", () => {
9
+ it("honors explicit tags", () => {
10
+ expect(resolveOwasp("MCP05:2025", "x", "mcp-server-auditor")).toBe("MCP05:2025");
11
+ });
12
+ it("maps secret-scanner to MCP01", () => {
13
+ expect(resolveOwasp(undefined, "aws_access_key", "secret-scanner")).toBe("MCP01:2025");
14
+ });
15
+ });
16
+ describe("gradeFromFindings", () => {
17
+ it("grades lethal trifecta as F", () => {
18
+ expect(gradeFromFindings([
19
+ {
20
+ patternId: "lethal_trifecta",
21
+ patternName: "x",
22
+ severity: "critical",
23
+ owasp: "MCP10:2025",
24
+ source: "toxic-flow",
25
+ recommendation: "",
26
+ match: "",
27
+ },
28
+ ]).grade).toBe("F");
29
+ });
30
+ it("grades clean as A", () => {
31
+ expect(gradeFromFindings([]).grade).toBe("A");
32
+ });
33
+ });
34
+ describe("scanCatalogJson", () => {
35
+ it("detects lethal trifecta in a catalog", () => {
36
+ const report = scanCatalogJson(JSON.stringify({
37
+ tools: [
38
+ { name: "fetch_url", description: "Fetch arbitrary web pages" },
39
+ { name: "read_vault_secret", description: "Read customer vault secrets" },
40
+ { name: "send_email", description: "Send email to any address" },
41
+ ],
42
+ }));
43
+ expect(report.grade).toBe("F");
44
+ expect(report.findings.some((f) => f.patternId === "lethal_trifecta")).toBe(true);
45
+ expect(report.byOwasp.find((b) => b.id === "MCP10:2025")?.findingCount).toBeGreaterThan(0);
46
+ });
47
+ });
48
+ describe("scanPath", () => {
49
+ it("flags MCP05 shell sink and MCP08 audit gap in a sample server", () => {
50
+ const dir = mkdtempSync(join(tmpdir(), "owasp-scan-"));
51
+ try {
52
+ writeFileSync(join(dir, "server.ts"), `
53
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
54
+ import { execSync } from "child_process";
55
+ const server = new McpServer({ name: "demo", version: "1.0.0" });
56
+ server.tool("run", "Run", {}, async (input) => {
57
+ execSync(input.command);
58
+ return { content: [] };
59
+ });
60
+ `);
61
+ const report = scanPath(dir);
62
+ expect(report.findings.some((f) => f.owasp === "MCP05:2025")).toBe(true);
63
+ expect(report.findings.some((f) => f.owasp === "MCP08:2025")).toBe(true);
64
+ expect(report.grade).not.toBe("A");
65
+ }
66
+ finally {
67
+ rmSync(dir, { recursive: true, force: true });
68
+ }
69
+ });
70
+ });
71
+ //# sourceMappingURL=orchestrator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../../src/__tests__/orchestrator.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from "./server.js";
3
+ import { scanPath, scanLive, scanCatalogFile } from "./orchestrator.js";
4
+ import { buildSarif } from "./sarif.js";
5
+ import { readFileSync } from "fs";
6
+ import { resolve, dirname } from "path";
7
+ import { fileURLToPath } from "url";
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+ function getVersion() {
10
+ try {
11
+ return JSON.parse(readFileSync(resolve(__dirname, "../package.json"), "utf8")).version;
12
+ }
13
+ catch {
14
+ return "0.0.0";
15
+ }
16
+ }
17
+ function printHelp() {
18
+ console.log(`@guardbee/mcp-owasp-scan
19
+
20
+ Usage (MCP server):
21
+ guardbee-owasp-scan [serve]
22
+
23
+ Usage (CLI):
24
+ guardbee-owasp-scan scan <path> Static OWASP MCP Top 10 path scan
25
+ guardbee-owasp-scan live --url=<url> Live tools/list + toxic-flow + poisoning
26
+ guardbee-owasp-scan live --stdio=<cmd> [--arg=...]
27
+ guardbee-owasp-scan catalog <tools.json> Audit a tools/list JSON dump
28
+
29
+ Options:
30
+ --format=text|json|sarif
31
+ --fail-on=any|critical|high|medium|none
32
+ --max-files=<n>
33
+ --discover-shadow Also run MCP09 host discover
34
+ --allowlist=<path> Allowlist for Shadow MCP discover
35
+ `);
36
+ }
37
+ function parseArgs(args) {
38
+ const positionals = [];
39
+ const stdioArgs = [];
40
+ let format = "text";
41
+ let failOn = "any";
42
+ let maxFiles = 5000;
43
+ let url;
44
+ let stdio;
45
+ let discoverShadow = false;
46
+ let allowlist;
47
+ for (const arg of args) {
48
+ if (arg.startsWith("--format="))
49
+ format = arg.split("=")[1] ?? "text";
50
+ else if (arg.startsWith("--fail-on="))
51
+ failOn = arg.split("=")[1] ?? "any";
52
+ else if (arg.startsWith("--max-files="))
53
+ maxFiles = parseInt(arg.split("=")[1] ?? "5000", 10);
54
+ else if (arg.startsWith("--url="))
55
+ url = arg.slice("--url=".length);
56
+ else if (arg.startsWith("--stdio="))
57
+ stdio = arg.slice("--stdio=".length);
58
+ else if (arg.startsWith("--arg="))
59
+ stdioArgs.push(arg.slice("--arg=".length));
60
+ else if (arg === "--discover-shadow")
61
+ discoverShadow = true;
62
+ else if (arg.startsWith("--allowlist="))
63
+ allowlist = arg.slice("--allowlist=".length);
64
+ else if (!arg.startsWith("--"))
65
+ positionals.push(arg);
66
+ }
67
+ return { positionals, format, failOn, maxFiles, url, stdio, stdioArgs, discoverShadow, allowlist };
68
+ }
69
+ function shouldFail(findings, failOn) {
70
+ if (failOn === "none")
71
+ return false;
72
+ if (failOn === "any")
73
+ return findings.length > 0;
74
+ const RANK = { critical: 0, high: 1, medium: 2, low: 3 };
75
+ const threshold = RANK[failOn] ?? 1;
76
+ return findings.some((f) => (RANK[f.severity] ?? 3) <= threshold);
77
+ }
78
+ function emit(report, format, failOn, fallbackUri) {
79
+ if (format === "json") {
80
+ console.log(JSON.stringify(report, null, 2));
81
+ }
82
+ else if (format === "sarif") {
83
+ console.log(JSON.stringify(buildSarif(getVersion(), report.findings, fallbackUri), null, 2));
84
+ }
85
+ else {
86
+ console.log(`Grade ${report.grade} (${report.score}/100) — ${report.totalFindings} finding(s), ${report.durationMs}ms`);
87
+ console.log(` mode: ${report.mode} label: ${report.label}`);
88
+ if (report.scannedFiles !== undefined)
89
+ console.log(` scannedFiles: ${report.scannedFiles}`);
90
+ if (report.toolCount !== undefined)
91
+ console.log(` tools: ${report.toolCount}`);
92
+ console.log("");
93
+ for (const bucket of report.byOwasp) {
94
+ if (bucket.findingCount === 0)
95
+ continue;
96
+ console.log(`${bucket.id} ${bucket.title}: ${bucket.findingCount}`);
97
+ for (const f of bucket.findings.slice(0, 20)) {
98
+ const loc = f.file ? `${f.file}:${f.line ?? 0}` : f.tools?.join(", ") ?? f.source;
99
+ console.log(` [${f.severity}] ${f.patternName} — ${loc}`);
100
+ }
101
+ if (bucket.findings.length > 20)
102
+ console.log(` … +${bucket.findings.length - 20} more`);
103
+ console.log("");
104
+ }
105
+ if (report.totalFindings === 0)
106
+ console.log("✅ No OWASP MCP Top 10 findings.");
107
+ }
108
+ process.exit(shouldFail(report.findings, failOn) ? 1 : 0);
109
+ }
110
+ async function main() {
111
+ const [, , firstArg, ...rest] = process.argv;
112
+ if (!firstArg || firstArg === "serve") {
113
+ await startServer();
114
+ return;
115
+ }
116
+ if (firstArg === "--help" || firstArg === "-h") {
117
+ printHelp();
118
+ process.exit(0);
119
+ }
120
+ const opts = parseArgs(rest);
121
+ if (firstArg === "scan") {
122
+ const path = opts.positionals[0];
123
+ if (!path) {
124
+ console.error("Usage: guardbee-owasp-scan scan <path>");
125
+ process.exit(2);
126
+ }
127
+ const report = scanPath(path, {
128
+ maxFiles: opts.maxFiles,
129
+ discoverShadow: opts.discoverShadow,
130
+ allowlistPath: opts.allowlist,
131
+ });
132
+ emit(report, opts.format, opts.failOn, path);
133
+ return;
134
+ }
135
+ if (firstArg === "catalog") {
136
+ const path = opts.positionals[0];
137
+ if (!path) {
138
+ console.error("Usage: guardbee-owasp-scan catalog <tools.json>");
139
+ process.exit(2);
140
+ }
141
+ emit(scanCatalogFile(path), opts.format, opts.failOn, path);
142
+ return;
143
+ }
144
+ if (firstArg === "live") {
145
+ let target;
146
+ if (opts.url)
147
+ target = { type: "http", url: opts.url };
148
+ else if (opts.stdio)
149
+ target = { type: "stdio", command: opts.stdio, args: opts.stdioArgs };
150
+ else {
151
+ console.error("Usage: guardbee-owasp-scan live --url=<url> | --stdio=<cmd> [--arg=...]");
152
+ process.exit(2);
153
+ }
154
+ const report = await scanLive(target);
155
+ emit(report, opts.format, opts.failOn);
156
+ return;
157
+ }
158
+ console.error(`Unknown command: ${firstArg}`);
159
+ printHelp();
160
+ process.exit(2);
161
+ }
162
+ main().catch((err) => {
163
+ console.error("Error:", err instanceof Error ? err.message : String(err));
164
+ process.exit(2);
165
+ });
166
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Grade, NormalizedFinding } from "./types.js";
2
+ export declare function gradeFromFindings(findings: NormalizedFinding[]): {
3
+ grade: Grade;
4
+ score: number;
5
+ };
6
+ //# sourceMappingURL=grade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grade.d.ts","sourceRoot":"","sources":["../src/grade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAShG"}
package/dist/grade.js ADDED
@@ -0,0 +1,15 @@
1
+ export function gradeFromFindings(findings) {
2
+ if (findings.some((f) => f.patternId === "lethal_trifecta" || f.severity === "critical")) {
3
+ if (findings.some((f) => f.patternId === "lethal_trifecta"))
4
+ return { grade: "F", score: 0 };
5
+ return { grade: "D", score: 25 };
6
+ }
7
+ if (findings.some((f) => f.severity === "high"))
8
+ return { grade: "C", score: 50 };
9
+ if (findings.some((f) => f.severity === "medium"))
10
+ return { grade: "B", score: 75 };
11
+ if (findings.some((f) => f.severity === "low"))
12
+ return { grade: "B", score: 85 };
13
+ return { grade: "A", score: 100 };
14
+ }
15
+ //# sourceMappingURL=grade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grade.js","sourceRoot":"","sources":["../src/grade.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,QAA6B;IAC7D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,EAAE,CAAC;QACzF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,iBAAiB,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7F,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IAClF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACpF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACjF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { scanPath, scanLive, scanCatalogJson, scanCatalogFile } from "./orchestrator.js";
2
+ export type { PathScanOptions } from "./orchestrator.js";
3
+ export { gradeFromFindings } from "./grade.js";
4
+ export { OWASP_TITLES, resolveOwasp } from "./owaspMap.js";
5
+ export { connectAndListTools } from "./mcpClient.js";
6
+ export type { OwaspReport, OwaspBucket, OwaspId, NormalizedFinding, Grade, ConnectionTarget, } from "./types.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EACV,WAAW,EACX,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,KAAK,EACL,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { scanPath, scanLive, scanCatalogJson, scanCatalogFile } from "./orchestrator.js";
2
+ export { gradeFromFindings } from "./grade.js";
3
+ export { OWASP_TITLES, resolveOwasp } from "./owaspMap.js";
4
+ export { connectAndListTools } from "./mcpClient.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ConnectionTarget } from "./types.js";
2
+ export interface LiveTool {
3
+ name: string;
4
+ description?: string;
5
+ inputSchema?: unknown;
6
+ annotations?: unknown;
7
+ }
8
+ export interface LiveServerInfo {
9
+ serverInfo?: {
10
+ name: string;
11
+ version: string;
12
+ };
13
+ tools: LiveTool[];
14
+ }
15
+ /** Connect just long enough to call tools/list (same pattern as rug-pull-detector). */
16
+ export declare function connectAndListTools(target: ConnectionTarget, timeoutMs?: number): Promise<LiveServerInfo>;
17
+ //# sourceMappingURL=mcpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpClient.d.ts","sourceRoot":"","sources":["../src/mcpClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,uFAAuF;AACvF,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAwB9G"}
@@ -0,0 +1,34 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
4
+ /** Connect just long enough to call tools/list (same pattern as rug-pull-detector). */
5
+ export async function connectAndListTools(target, timeoutMs = 15000) {
6
+ const client = new Client({ name: "guardbee-owasp-scan", version: "0.1.0" }, { capabilities: {} });
7
+ const transport = target.type === "stdio"
8
+ ? new StdioClientTransport({ command: target.command, args: target.args, env: target.env, cwd: target.cwd })
9
+ : new StreamableHTTPClientTransport(new URL(target.url));
10
+ try {
11
+ await withTimeout(client.connect(transport), timeoutMs, "Connecting to the server");
12
+ const serverVersion = client.getServerVersion();
13
+ const { tools } = await withTimeout(client.listTools(), timeoutMs, "Listing tools");
14
+ return {
15
+ serverInfo: serverVersion ? { name: serverVersion.name, version: serverVersion.version } : undefined,
16
+ tools: tools.map((t) => ({
17
+ name: t.name,
18
+ description: t.description,
19
+ inputSchema: t.inputSchema,
20
+ annotations: t.annotations,
21
+ })),
22
+ };
23
+ }
24
+ finally {
25
+ await client.close().catch(() => { });
26
+ }
27
+ }
28
+ function withTimeout(promise, ms, what) {
29
+ return Promise.race([
30
+ promise,
31
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`${what} timed out after ${ms}ms`)), ms)),
32
+ ]);
33
+ }
34
+ //# sourceMappingURL=mcpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpClient.js","sourceRoot":"","sources":["../src/mcpClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAenG,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAwB,EAAE,SAAS,GAAG,KAAK;IACnF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACnG,MAAM,SAAS,GACb,MAAM,CAAC,IAAI,KAAK,OAAO;QACrB,CAAC,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAC5G,CAAC,CAAC,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAC;QACpF,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAChD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAEpF,OAAO;YACL,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;YACpG,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAI,OAAmB,EAAE,EAAU,EAAE,IAAY;IACnE,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO;QACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,oBAAoB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;KAC1G,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ConnectionTarget, OwaspReport } from "./types.js";
2
+ export interface PathScanOptions {
3
+ maxFiles?: number;
4
+ exclude?: string[];
5
+ /** Path to Shadow MCP allowlist (JSON/YAML). Used when discoverShadow is true. */
6
+ allowlistPath?: string;
7
+ /** Also walk host MCP client configs for Shadow MCP (MCP09). Default false. */
8
+ discoverShadow?: boolean;
9
+ }
10
+ export declare function scanPath(targetPath: string, options?: PathScanOptions): OwaspReport;
11
+ export declare function scanCatalogJson(raw: string, label?: string): OwaspReport;
12
+ export declare function scanLive(target: ConnectionTarget, timeoutMs?: number): Promise<OwaspReport>;
13
+ export declare function scanCatalogFile(path: string): OwaspReport;
14
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,gBAAgB,EAIhB,WAAW,EAEZ,MAAM,YAAY,CAAC;AA+DpB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kFAAkF;IAClF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AASD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,WAAW,CAyJvF;AA2ID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,WAAW,CA0C3E;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAwBhG;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAEzD"}
@@ -0,0 +1,328 @@
1
+ import { scanDirectory as scanSecrets, scanFile as secretScanFile } from "@guardbee/mcp-secret-scanner";
2
+ import { scanDirectory as scanServer, scanFile as serverScanFile } from "@guardbee/mcp-server-auditor";
3
+ import { scanDirectory as scanOAuth, scanFile as oauthScanFile } from "@guardbee/mcp-oauth-auditor";
4
+ import { scanDirectory as scanAuditGap, scanFile as auditScanFile } from "@guardbee/mcp-audit-gap-auditor";
5
+ import { scanDirectory as scanContext, scanFile as contextScanFile } from "@guardbee/mcp-context-oversharing-auditor";
6
+ import { scanDirectory as scanToxicDir, scanSourceFile as toxicScanFile, auditCatalog, parseToolsJson, } from "@guardbee/mcp-toxic-flow-auditor";
7
+ import { scanDirectory as scanPoisonDir, scanFile as poisonScanFile, scanToolCatalog } from "@guardbee/mcp-tool-poisoning-scanner";
8
+ import { discoverShadowMcp, loadAllowlistFile } from "@guardbee/mcp-config-auditor";
9
+ import { statSync, readFileSync } from "fs";
10
+ import { gradeFromFindings } from "./grade.js";
11
+ import { OWASP_TITLES, resolveOwasp } from "./owaspMap.js";
12
+ import { connectAndListTools } from "./mcpClient.js";
13
+ function normalize(partial, source) {
14
+ const owasp = resolveOwasp(partial.owasp, partial.patternId, source);
15
+ if (!owasp)
16
+ return null;
17
+ return {
18
+ patternId: partial.patternId,
19
+ patternName: partial.patternName,
20
+ severity: partial.severity,
21
+ owasp,
22
+ source,
23
+ recommendation: partial.recommendation ?? `See ${source} / ${partial.patternId}`,
24
+ file: partial.file,
25
+ line: partial.line,
26
+ column: partial.column,
27
+ match: partial.match,
28
+ tools: partial.tools,
29
+ };
30
+ }
31
+ function bucketize(findings) {
32
+ const ids = Object.keys(OWASP_TITLES);
33
+ return ids.map((id) => {
34
+ const items = findings.filter((f) => f.owasp === id);
35
+ return { id, title: OWASP_TITLES[id], findingCount: items.length, findings: items };
36
+ });
37
+ }
38
+ function buildReport(mode, label, findings, start, extras = {}) {
39
+ const { grade, score } = gradeFromFindings(findings);
40
+ return {
41
+ mode,
42
+ grade,
43
+ score,
44
+ totalFindings: findings.length,
45
+ byOwasp: bucketize(findings),
46
+ findings,
47
+ durationMs: Date.now() - start,
48
+ label,
49
+ ...extras,
50
+ };
51
+ }
52
+ function pushNormalized(findings, items, source) {
53
+ for (const item of items) {
54
+ const n = normalize(item, source);
55
+ if (n)
56
+ findings.push(n);
57
+ }
58
+ }
59
+ export function scanPath(targetPath, options = {}) {
60
+ const start = Date.now();
61
+ const maxFiles = options.maxFiles ?? 5000;
62
+ const exclude = options.exclude;
63
+ const findings = [];
64
+ let scannedFiles = 0;
65
+ const stat = statSync(targetPath);
66
+ if (!stat.isDirectory() && !stat.isFile()) {
67
+ throw new Error(`Path is neither file nor directory: ${targetPath}`);
68
+ }
69
+ if (stat.isFile()) {
70
+ const report = scanSingleFile(targetPath, start);
71
+ if (options.discoverShadow) {
72
+ report.findings.push(...runDiscover(options.allowlistPath));
73
+ report.totalFindings = report.findings.length;
74
+ report.byOwasp = bucketize(report.findings);
75
+ const graded = gradeFromFindings(report.findings);
76
+ report.grade = graded.grade;
77
+ report.score = graded.score;
78
+ }
79
+ return report;
80
+ }
81
+ const dirOpts = { maxFiles, exclude };
82
+ const secrets = scanSecrets(targetPath, dirOpts);
83
+ scannedFiles = Math.max(scannedFiles, secrets.scannedFiles);
84
+ pushNormalized(findings, secrets.findings.map((f) => ({
85
+ patternId: f.patternId,
86
+ patternName: f.patternName,
87
+ severity: f.severity,
88
+ recommendation: "Remove or rotate the leaked credential; load secrets from a vault/env at runtime.",
89
+ file: f.file,
90
+ line: f.line,
91
+ column: f.column,
92
+ match: f.match,
93
+ })), "secret-scanner");
94
+ const server = scanServer(targetPath, dirOpts);
95
+ scannedFiles = Math.max(scannedFiles, server.scannedFiles);
96
+ pushNormalized(findings, server.findings.map((f) => ({
97
+ patternId: f.patternId,
98
+ patternName: f.patternName,
99
+ severity: f.severity,
100
+ owasp: f.owasp,
101
+ recommendation: f.recommendation,
102
+ file: f.file,
103
+ line: f.line,
104
+ column: f.column,
105
+ match: f.match,
106
+ })), "mcp-server-auditor");
107
+ const oauth = scanOAuth(targetPath, dirOpts);
108
+ scannedFiles = Math.max(scannedFiles, oauth.scannedFiles);
109
+ pushNormalized(findings, oauth.findings.map((f) => ({
110
+ patternId: f.patternId,
111
+ patternName: f.patternName,
112
+ severity: f.severity,
113
+ recommendation: f.recommendation,
114
+ file: f.file,
115
+ line: f.line,
116
+ column: f.column,
117
+ match: f.match,
118
+ })), "oauth-auditor");
119
+ const audit = scanAuditGap(targetPath, dirOpts);
120
+ scannedFiles = Math.max(scannedFiles, audit.scannedFiles);
121
+ pushNormalized(findings, audit.findings.map((f) => ({
122
+ patternId: f.patternId,
123
+ patternName: f.patternName,
124
+ severity: f.severity,
125
+ owasp: f.owasp,
126
+ recommendation: f.recommendation,
127
+ file: f.file,
128
+ line: f.line,
129
+ column: f.column,
130
+ match: f.match,
131
+ })), "audit-gap");
132
+ const ctx = scanContext(targetPath, dirOpts);
133
+ scannedFiles = Math.max(scannedFiles, ctx.scannedFiles);
134
+ pushNormalized(findings, ctx.findings.map((f) => ({
135
+ patternId: f.patternId,
136
+ patternName: f.patternName,
137
+ severity: f.severity,
138
+ owasp: f.owasp,
139
+ recommendation: f.recommendation,
140
+ file: f.file,
141
+ line: f.line,
142
+ column: f.column,
143
+ match: f.match,
144
+ })), "context-oversharing");
145
+ const toxic = scanToxicDir(targetPath, dirOpts);
146
+ pushNormalized(findings, toxic.findings.map((f) => ({
147
+ patternId: f.patternId,
148
+ patternName: f.patternName,
149
+ severity: f.severity,
150
+ owasp: f.owasp,
151
+ recommendation: f.recommendation,
152
+ match: f.match,
153
+ tools: f.tools,
154
+ })), "toxic-flow");
155
+ const poison = scanPoisonDir(targetPath, dirOpts);
156
+ scannedFiles = Math.max(scannedFiles, poison.scannedFiles);
157
+ pushNormalized(findings, poison.findings.map((f) => ({
158
+ patternId: f.patternId,
159
+ patternName: f.patternName,
160
+ severity: f.severity,
161
+ owasp: f.owasp,
162
+ recommendation: f.recommendation,
163
+ file: f.file,
164
+ line: f.line,
165
+ column: f.column,
166
+ match: f.match,
167
+ })), "tool-poisoning");
168
+ if (options.discoverShadow) {
169
+ findings.push(...runDiscover(options.allowlistPath));
170
+ }
171
+ return buildReport("path", targetPath, findings, start, { scannedFiles });
172
+ }
173
+ function scanSingleFile(filePath, start) {
174
+ const findings = [];
175
+ pushNormalized(findings, secretScanFile(filePath).findings.map((f) => ({
176
+ patternId: f.patternId,
177
+ patternName: f.patternName,
178
+ severity: f.severity,
179
+ recommendation: "Remove or rotate the leaked credential; load secrets from a vault/env at runtime.",
180
+ file: f.file,
181
+ line: f.line,
182
+ column: f.column,
183
+ match: f.match,
184
+ })), "secret-scanner");
185
+ pushNormalized(findings, serverScanFile(filePath).findings.map((f) => ({
186
+ patternId: f.patternId,
187
+ patternName: f.patternName,
188
+ severity: f.severity,
189
+ owasp: f.owasp,
190
+ recommendation: f.recommendation,
191
+ file: f.file,
192
+ line: f.line,
193
+ column: f.column,
194
+ match: f.match,
195
+ })), "mcp-server-auditor");
196
+ pushNormalized(findings, oauthScanFile(filePath).findings.map((f) => ({
197
+ patternId: f.patternId,
198
+ patternName: f.patternName,
199
+ severity: f.severity,
200
+ recommendation: f.recommendation,
201
+ file: f.file,
202
+ line: f.line,
203
+ column: f.column,
204
+ match: f.match,
205
+ })), "oauth-auditor");
206
+ pushNormalized(findings, auditScanFile(filePath).findings.map((f) => ({
207
+ patternId: f.patternId,
208
+ patternName: f.patternName,
209
+ severity: f.severity,
210
+ owasp: f.owasp,
211
+ recommendation: f.recommendation,
212
+ file: f.file,
213
+ line: f.line,
214
+ column: f.column,
215
+ match: f.match,
216
+ })), "audit-gap");
217
+ pushNormalized(findings, contextScanFile(filePath).findings.map((f) => ({
218
+ patternId: f.patternId,
219
+ patternName: f.patternName,
220
+ severity: f.severity,
221
+ owasp: f.owasp,
222
+ recommendation: f.recommendation,
223
+ file: f.file,
224
+ line: f.line,
225
+ column: f.column,
226
+ match: f.match,
227
+ })), "context-oversharing");
228
+ pushNormalized(findings, poisonScanFile(filePath).findings.map((f) => ({
229
+ patternId: f.patternId,
230
+ patternName: f.patternName,
231
+ severity: f.severity,
232
+ owasp: f.owasp,
233
+ recommendation: f.recommendation,
234
+ file: f.file,
235
+ line: f.line,
236
+ column: f.column,
237
+ match: f.match,
238
+ })), "tool-poisoning");
239
+ const toxic = toxicScanFile(filePath);
240
+ if (!toxic.skipped) {
241
+ pushNormalized(findings, toxic.result.findings.map((f) => ({
242
+ patternId: f.patternId,
243
+ patternName: f.patternName,
244
+ severity: f.severity,
245
+ owasp: f.owasp,
246
+ recommendation: f.recommendation,
247
+ match: f.match,
248
+ tools: f.tools,
249
+ })), "toxic-flow");
250
+ }
251
+ return buildReport("path", filePath, findings, start, { scannedFiles: 1 });
252
+ }
253
+ function runDiscover(allowlistPath) {
254
+ let allowlist = null;
255
+ if (allowlistPath) {
256
+ allowlist = loadAllowlistFile(allowlistPath);
257
+ }
258
+ const result = discoverShadowMcp({ allowlist });
259
+ const out = [];
260
+ pushNormalized(out, result.findings.map((f) => ({
261
+ patternId: f.patternId,
262
+ patternName: f.patternName,
263
+ severity: f.severity,
264
+ owasp: f.owasp,
265
+ recommendation: f.recommendation,
266
+ file: f.file,
267
+ line: f.line,
268
+ column: f.column,
269
+ match: f.match,
270
+ })), "config-discover");
271
+ return out;
272
+ }
273
+ export function scanCatalogJson(raw, label = "catalog") {
274
+ const start = Date.now();
275
+ const tools = parseToolsJson(raw);
276
+ const findings = [];
277
+ const toxic = auditCatalog(tools, label);
278
+ pushNormalized(findings, toxic.findings.map((f) => ({
279
+ patternId: f.patternId,
280
+ patternName: f.patternName,
281
+ severity: f.severity,
282
+ owasp: f.owasp,
283
+ recommendation: f.recommendation,
284
+ match: f.match,
285
+ tools: f.tools,
286
+ })), "toxic-flow");
287
+ const poison = scanToolCatalog(tools.map((t) => ({
288
+ name: t.name,
289
+ description: t.description,
290
+ inputSchema: t.inputSchema,
291
+ })));
292
+ pushNormalized(findings, poison.map((f) => ({
293
+ patternId: f.patternId,
294
+ patternName: f.patternName,
295
+ severity: f.severity,
296
+ owasp: f.owasp,
297
+ recommendation: f.recommendation,
298
+ match: f.match,
299
+ tools: [f.toolName],
300
+ })), "tool-poisoning");
301
+ return buildReport("catalog", label, findings, start, { toolCount: tools.length });
302
+ }
303
+ export async function scanLive(target, timeoutMs = 15000) {
304
+ const start = Date.now();
305
+ const live = await connectAndListTools(target, timeoutMs);
306
+ const label = target.type === "http"
307
+ ? target.url
308
+ : [target.command, ...(target.args ?? [])].join(" ");
309
+ const toolsJson = JSON.stringify({
310
+ tools: live.tools.map((t) => ({
311
+ name: t.name,
312
+ description: t.description,
313
+ inputSchema: t.inputSchema,
314
+ })),
315
+ });
316
+ const report = scanCatalogJson(toolsJson, label);
317
+ report.mode = "live";
318
+ report.toolCount = live.tools.length;
319
+ report.durationMs = Date.now() - start;
320
+ if (live.serverInfo) {
321
+ report.label = `${live.serverInfo.name}@${live.serverInfo.version} (${label})`;
322
+ }
323
+ return report;
324
+ }
325
+ export function scanCatalogFile(path) {
326
+ return scanCatalogJson(readFileSync(path, "utf8"), path);
327
+ }
328
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { OwaspId } from "./types.js";
2
+ export declare const OWASP_TITLES: Record<OwaspId, string>;
3
+ /** Map a scanner finding to an OWASP MCP Top 10 id. */
4
+ export declare function resolveOwasp(explicit: string | undefined, patternId: string, source: string): OwaspId | null;
5
+ //# sourceMappingURL=owaspMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owaspMap.d.ts","sourceRoot":"","sources":["../src/owaspMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAWhD,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,GAAG,IAAI,CAmBhB"}
@@ -0,0 +1,42 @@
1
+ export const OWASP_TITLES = {
2
+ "MCP01:2025": "Token / credential exposure",
3
+ "MCP02:2025": "Privilege / excessive agency",
4
+ "MCP03:2025": "Tool poisoning / rug pull surface",
5
+ "MCP04:2025": "Supply chain / dependency risk",
6
+ "MCP05:2025": "Command / code injection via tools",
7
+ "MCP06:2025": "Prompt / context injection",
8
+ "MCP07:2025": "Auth / OAuth misconfiguration",
9
+ "MCP08:2025": "Lack of audit and telemetry",
10
+ "MCP09:2025": "Shadow MCP servers",
11
+ "MCP10:2025": "Toxic flows / context oversharing",
12
+ };
13
+ /** Map a scanner finding to an OWASP MCP Top 10 id. */
14
+ export function resolveOwasp(explicit, patternId, source) {
15
+ if (explicit && /^MCP\d{2}:2025$/.test(explicit))
16
+ return explicit;
17
+ if (source === "secret-scanner")
18
+ return "MCP01:2025";
19
+ if (source === "tool-poisoning")
20
+ return "MCP03:2025";
21
+ if (source === "oauth-auditor")
22
+ return "MCP07:2025";
23
+ if (source === "audit-gap")
24
+ return "MCP08:2025";
25
+ if (source === "config-discover")
26
+ return "MCP09:2025";
27
+ if (source === "context-oversharing" || source === "toxic-flow")
28
+ return "MCP10:2025";
29
+ if (source === "mcp-server-auditor") {
30
+ if (/shell|eval|sql_injection/i.test(patternId))
31
+ return "MCP05:2025";
32
+ if (/unrestricted_shell|excessive/i.test(patternId))
33
+ return "MCP02:2025";
34
+ if (/secret|env_exposed|hardcoded/i.test(patternId))
35
+ return "MCP01:2025";
36
+ if (/ssrf|cors/i.test(patternId))
37
+ return "MCP02:2025";
38
+ return "MCP02:2025";
39
+ }
40
+ return null;
41
+ }
42
+ //# sourceMappingURL=owaspMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owaspMap.js","sourceRoot":"","sources":["../src/owaspMap.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAA4B;IACnD,YAAY,EAAE,6BAA6B;IAC3C,YAAY,EAAE,8BAA8B;IAC5C,YAAY,EAAE,mCAAmC;IACjD,YAAY,EAAE,gCAAgC;IAC9C,YAAY,EAAE,oCAAoC;IAClD,YAAY,EAAE,4BAA4B;IAC1C,YAAY,EAAE,+BAA+B;IAC7C,YAAY,EAAE,6BAA6B;IAC3C,YAAY,EAAE,oBAAoB;IAClC,YAAY,EAAE,mCAAmC;CAClD,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAC1B,QAA4B,EAC5B,SAAiB,EACjB,MAAc;IAEd,IAAI,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAmB,CAAC;IAE7E,IAAI,MAAM,KAAK,gBAAgB;QAAE,OAAO,YAAY,CAAC;IACrD,IAAI,MAAM,KAAK,gBAAgB;QAAE,OAAO,YAAY,CAAC;IACrD,IAAI,MAAM,KAAK,eAAe;QAAE,OAAO,YAAY,CAAC;IACpD,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC;IAChD,IAAI,MAAM,KAAK,iBAAiB;QAAE,OAAO,YAAY,CAAC;IACtD,IAAI,MAAM,KAAK,qBAAqB,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAErF,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;QACpC,IAAI,2BAA2B,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,YAAY,CAAC;QACrE,IAAI,+BAA+B,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,YAAY,CAAC;QACzE,IAAI,+BAA+B,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,YAAY,CAAC;QACzE,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,YAAY,CAAC;QACtD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { NormalizedFinding } from "./types.js";
2
+ /**
3
+ * `fallbackUri` anchors findings that have no file of their own (toxic-flow
4
+ * combinations, catalog/live results) — GitHub code scanning rejects results
5
+ * without a location.
6
+ */
7
+ export declare function buildSarif(toolVersion: string, findings: NormalizedFinding[], fallbackUri?: string): object;
8
+ //# sourceMappingURL=sarif.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA6BpD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAwD3G"}
package/dist/sarif.js ADDED
@@ -0,0 +1,67 @@
1
+ function severityToLevel(sev) {
2
+ if (sev === "critical" || sev === "high")
3
+ return "error";
4
+ if (sev === "medium")
5
+ return "warning";
6
+ return "note";
7
+ }
8
+ /**
9
+ * `fallbackUri` anchors findings that have no file of their own (toxic-flow
10
+ * combinations, catalog/live results) — GitHub code scanning rejects results
11
+ * without a location.
12
+ */
13
+ export function buildSarif(toolVersion, findings, fallbackUri) {
14
+ const rulesMap = new Map();
15
+ const results = [];
16
+ for (const f of findings) {
17
+ const ruleId = `${f.source}:${f.patternId}`;
18
+ if (!rulesMap.has(ruleId)) {
19
+ rulesMap.set(ruleId, {
20
+ id: ruleId,
21
+ name: f.patternName.replace(/[^a-zA-Z0-9]/g, ""),
22
+ shortDescription: { text: f.patternName },
23
+ fullDescription: { text: f.recommendation },
24
+ helpUri: "https://guardbee.ai/docs/owasp-scan",
25
+ properties: {
26
+ "problem.severity": f.severity,
27
+ tags: ["security", "ai-security", "mcp-security", f.owasp, f.source],
28
+ },
29
+ });
30
+ }
31
+ const result = {
32
+ ruleId,
33
+ level: severityToLevel(f.severity),
34
+ message: { text: `${f.patternName} [${f.owasp}] — ${f.recommendation}` },
35
+ };
36
+ const uri = f.file ?? fallbackUri;
37
+ if (uri) {
38
+ result.locations = [
39
+ {
40
+ physicalLocation: {
41
+ artifactLocation: { uri, uriBaseId: "%SRCROOT%" },
42
+ region: { startLine: f.line ?? 1, startColumn: f.column ?? 1 },
43
+ },
44
+ },
45
+ ];
46
+ }
47
+ results.push(result);
48
+ }
49
+ return {
50
+ $schema: "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
51
+ version: "2.1.0",
52
+ runs: [
53
+ {
54
+ tool: {
55
+ driver: {
56
+ name: "@guardbee/mcp-owasp-scan",
57
+ version: toolVersion,
58
+ informationUri: "https://guardbee.ai",
59
+ rules: Array.from(rulesMap.values()),
60
+ },
61
+ },
62
+ results,
63
+ },
64
+ ],
65
+ };
66
+ }
67
+ //# sourceMappingURL=sarif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.js","sourceRoot":"","sources":["../src/sarif.ts"],"names":[],"mappings":"AAuBA,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACzD,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,QAA6B,EAAE,WAAoB;IACjG,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;gBACnB,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;gBAChD,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;gBACzC,eAAe,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE;gBAC3C,OAAO,EAAE,qCAAqC;gBAC9C,UAAU,EAAE;oBACV,kBAAkB,EAAE,CAAC,CAAC,QAAQ;oBAC9B,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;iBACrE;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAgB;YAC1B,MAAM;YACN,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;YAClC,OAAO,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;SACzE,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC;QAClC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,SAAS,GAAG;gBACjB;oBACE,gBAAgB,EAAE;wBAChB,gBAAgB,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE;wBACjD,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE;qBAC/D;iBACF;aACF,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,EAAE,gGAAgG;QACzG,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,0BAA0B;wBAChC,OAAO,EAAE,WAAW;wBACpB,cAAc,EAAE,qBAAqB;wBACrC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;qBACrC;iBACF;gBACD,OAAO;aACR;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function startServer(): Promise<void>;
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA4BA,wBAAsB,WAAW,kBA4EhC"}
package/dist/server.js ADDED
@@ -0,0 +1,80 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { instrumentServer } from "@guardbee/mcp-telemetry";
4
+ import { z } from "zod";
5
+ import { scanPath, scanLive, scanCatalogJson } from "./orchestrator.js";
6
+ import { OWASP_TITLES } from "./owaspMap.js";
7
+ function formatReport(report) {
8
+ const lines = [
9
+ `Grade ${report.grade} (${report.score}/100) — ${report.totalFindings} finding(s), ${report.durationMs}ms`,
10
+ `mode=${report.mode} label=${report.label}`,
11
+ "",
12
+ ];
13
+ for (const bucket of report.byOwasp) {
14
+ lines.push(`${bucket.id} ${bucket.title}: ${bucket.findingCount}`);
15
+ }
16
+ lines.push("");
17
+ for (const f of report.findings.slice(0, 40)) {
18
+ const loc = f.file ? `${f.file}:${f.line ?? 0}` : f.tools?.join(", ") ?? f.source;
19
+ lines.push(`[${f.severity}] ${f.owasp} ${f.patternName} (${loc})`);
20
+ lines.push(` ${f.recommendation}`);
21
+ }
22
+ if (report.findings.length > 40)
23
+ lines.push(`… +${report.findings.length - 40} more`);
24
+ if (report.totalFindings === 0)
25
+ lines.push("✅ No OWASP MCP Top 10 findings.");
26
+ return lines.join("\n");
27
+ }
28
+ export async function startServer() {
29
+ const server = new McpServer({
30
+ name: "guardbee-owasp-scan",
31
+ version: "0.1.0",
32
+ });
33
+ instrumentServer(server, "owasp-scan");
34
+ server.tool("owasp_scan_path", "Run a unified OWASP MCP Top 10 scan over a filesystem path — orchestrates secret, server, oauth, audit-gap, context-oversharing, toxic-flow, and tool-poisoning auditors; returns A–F grade.", {
35
+ path: z.string().describe("File or directory to scan"),
36
+ maxFiles: z.number().int().positive().optional(),
37
+ discoverShadow: z.boolean().optional().describe("Also discover Shadow MCP on this host (MCP09)"),
38
+ allowlistPath: z.string().optional().describe("Allowlist file for Shadow MCP discover"),
39
+ }, async ({ path, maxFiles, discoverShadow, allowlistPath }) => {
40
+ const report = scanPath(path, { maxFiles, discoverShadow, allowlistPath });
41
+ return { content: [{ type: "text", text: formatReport(report) }] };
42
+ });
43
+ server.tool("owasp_scan_live", "Connect to a live MCP server (stdio or HTTP), call tools/list, then grade toxic-flow + tool-poisoning (MCP03/MCP10).", {
44
+ url: z.string().url().optional().describe("Streamable HTTP MCP URL"),
45
+ command: z.string().optional().describe("stdio command to spawn"),
46
+ args: z.array(z.string()).optional(),
47
+ }, async ({ url, command, args }) => {
48
+ if (url) {
49
+ const report = await scanLive({ type: "http", url });
50
+ return { content: [{ type: "text", text: formatReport(report) }] };
51
+ }
52
+ if (command) {
53
+ const report = await scanLive({ type: "stdio", command, args });
54
+ return { content: [{ type: "text", text: formatReport(report) }] };
55
+ }
56
+ return { content: [{ type: "text", text: "Provide either url or command." }], isError: true };
57
+ });
58
+ server.tool("owasp_scan_catalog", "Audit a tools/list JSON dump for toxic flows and tool-description poisoning (MCP03/MCP10).", {
59
+ catalog: z.string().describe("JSON string: { tools: [...] } or a bare tools array"),
60
+ label: z.string().optional(),
61
+ }, async ({ catalog, label }) => {
62
+ const report = scanCatalogJson(catalog, label);
63
+ return { content: [{ type: "text", text: formatReport(report) }] };
64
+ });
65
+ server.tool("list_owasp_coverage", "List OWASP MCP Top 10 categories and which GuardBee scanners cover them in this meta-scan", {}, async () => {
66
+ const lines = ["OWASP MCP Top 10 coverage in @guardbee/mcp-owasp-scan:\n"];
67
+ for (const [id, title] of Object.entries(OWASP_TITLES)) {
68
+ lines.push(`${id} — ${title}`);
69
+ }
70
+ lines.push("");
71
+ lines.push("Path scan: MCP01 secrets, MCP02/05 server-auditor, MCP03 poisoning, MCP07 oauth, MCP08 audit-gap, MCP09 discover (opt), MCP10 toxic-flow + context-oversharing.");
72
+ lines.push("Live/catalog: MCP03 poisoning + MCP10 toxic-flow (and related pairs).");
73
+ lines.push("MCP04 supply-chain: use @guardbee/mcp-dependency-auditor / slopsquat-scanner separately (network).");
74
+ lines.push("MCP06 prompt injection in RAG content: use @guardbee/mcp-prompt-injection-scanner separately.");
75
+ return { content: [{ type: "text", text: lines.join("\n") }] };
76
+ });
77
+ const transport = new StdioServerTransport();
78
+ await server.connect(transport);
79
+ }
80
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export type OwaspId = "MCP01:2025" | "MCP02:2025" | "MCP03:2025" | "MCP04:2025" | "MCP05:2025" | "MCP06:2025" | "MCP07:2025" | "MCP08:2025" | "MCP09:2025" | "MCP10:2025";
2
+ export type Grade = "A" | "B" | "C" | "D" | "F";
3
+ export type Severity = "critical" | "high" | "medium" | "low";
4
+ export interface NormalizedFinding {
5
+ patternId: string;
6
+ patternName: string;
7
+ severity: Severity;
8
+ owasp: OwaspId;
9
+ source: string;
10
+ recommendation: string;
11
+ file?: string;
12
+ line?: number;
13
+ column?: number;
14
+ match: string;
15
+ tools?: string[];
16
+ }
17
+ export interface OwaspBucket {
18
+ id: OwaspId;
19
+ title: string;
20
+ findingCount: number;
21
+ findings: NormalizedFinding[];
22
+ }
23
+ export interface OwaspReport {
24
+ mode: "path" | "live" | "catalog";
25
+ grade: Grade;
26
+ score: number;
27
+ scannedFiles?: number;
28
+ toolCount?: number;
29
+ totalFindings: number;
30
+ byOwasp: OwaspBucket[];
31
+ findings: NormalizedFinding[];
32
+ durationMs: number;
33
+ label: string;
34
+ }
35
+ export type ConnectionTarget = {
36
+ type: "stdio";
37
+ command: string;
38
+ args?: string[];
39
+ env?: Record<string, string>;
40
+ cwd?: string;
41
+ } | {
42
+ type: "http";
43
+ url: string;
44
+ };
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GACf,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,CAAC;AAEjB,MAAM,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/F;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,62 @@
1
1
  {
2
2
  "name": "@guardbee/mcp-owasp-scan",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "mcpName": "io.github.4hmetuyar/owasp-scan",
5
+ "description": "Unified OWASP MCP Top 10 scanner — one CLI/MCP that orchestrates GuardBee auditors against a path or a live tools/list, maps findings to MCP01–MCP10, and grades A–F",
6
+ "type": "module",
7
+ "bin": {
8
+ "guardbee-owasp-scan": "./dist/cli.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "TR.md",
22
+ "ZH.md"
23
+ ],
24
+ "dependencies": {
25
+ "@modelcontextprotocol/sdk": "^1.0.0",
26
+ "zod": "^4.5.4",
27
+ "@guardbee/mcp-audit-gap-auditor": "^0.2.0",
28
+ "@guardbee/mcp-context-oversharing-auditor": "^0.1.0",
29
+ "@guardbee/mcp-config-auditor": "^0.4.0",
30
+ "@guardbee/mcp-toxic-flow-auditor": "^0.1.5",
31
+ "@guardbee/mcp-telemetry": "^0.1.3",
32
+ "@guardbee/mcp-oauth-auditor": "^0.1.3",
33
+ "@guardbee/mcp-server-auditor": "^0.1.6",
34
+ "@guardbee/mcp-secret-scanner": "^0.2.11",
35
+ "@guardbee/mcp-tool-poisoning-scanner": "^0.2.1"
36
+ },
37
+ "keywords": [
38
+ "mcp",
39
+ "security",
40
+ "ai-security",
41
+ "mcp-security",
42
+ "owasp",
43
+ "owasp-mcp-top-10",
44
+ "guardbee",
45
+ "devtools"
46
+ ],
47
+ "license": "MIT",
48
+ "publishConfig": {
49
+ "access": "public"
50
+ },
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "https://github.com/GuardBee/guardbee-mcp.git",
54
+ "directory": "packages/owasp-scan"
55
+ },
56
+ "scripts": {
57
+ "build": "tsc",
58
+ "dev": "tsc --watch",
59
+ "start": "node dist/cli.js",
60
+ "test": "vitest run"
61
+ }
6
62
  }