mcp-security-scanner 1.0.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.
- package/LICENSE +21 -0
- package/README.ar.md +662 -0
- package/README.bn.md +662 -0
- package/README.bs.md +662 -0
- package/README.da.md +662 -0
- package/README.de.md +662 -0
- package/README.el.md +662 -0
- package/README.es.md +662 -0
- package/README.fr.md +663 -0
- package/README.hi.md +662 -0
- package/README.it.md +662 -0
- package/README.ja.md +663 -0
- package/README.ko.md +662 -0
- package/README.md +662 -0
- package/README.no.md +662 -0
- package/README.pl.md +662 -0
- package/README.pt-BR.md +662 -0
- package/README.ru.md +662 -0
- package/README.th.md +662 -0
- package/README.tr.md +662 -0
- package/README.uk.md +663 -0
- package/README.vi.md +662 -0
- package/README.zh-TW.md +661 -0
- package/README.zh.md +661 -0
- package/dist/config/env-scanner.d.ts +3 -0
- package/dist/config/env-scanner.d.ts.map +1 -0
- package/dist/config/env-scanner.js +85 -0
- package/dist/config/env-scanner.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +169 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/mcp-config-parser.d.ts +16 -0
- package/dist/config/mcp-config-parser.d.ts.map +1 -0
- package/dist/config/mcp-config-parser.js +86 -0
- package/dist/config/mcp-config-parser.js.map +1 -0
- package/dist/config/server-verification.d.ts +5 -0
- package/dist/config/server-verification.d.ts.map +1 -0
- package/dist/config/server-verification.js +221 -0
- package/dist/config/server-verification.js.map +1 -0
- package/dist/data/dangerous-sinks.d.ts +13 -0
- package/dist/data/dangerous-sinks.d.ts.map +1 -0
- package/dist/data/dangerous-sinks.js +45 -0
- package/dist/data/dangerous-sinks.js.map +1 -0
- package/dist/data/owasp-mcp-top10.d.ts +12 -0
- package/dist/data/owasp-mcp-top10.d.ts.map +1 -0
- package/dist/data/owasp-mcp-top10.js +95 -0
- package/dist/data/owasp-mcp-top10.js.map +1 -0
- package/dist/data/poisoning-patterns.d.ts +15 -0
- package/dist/data/poisoning-patterns.d.ts.map +1 -0
- package/dist/data/poisoning-patterns.js +146 -0
- package/dist/data/poisoning-patterns.js.map +1 -0
- package/dist/data/popular-packages.d.ts +2 -0
- package/dist/data/popular-packages.d.ts.map +1 -0
- package/dist/data/popular-packages.js +71 -0
- package/dist/data/popular-packages.js.map +1 -0
- package/dist/data/secret-patterns.d.ts +8 -0
- package/dist/data/secret-patterns.d.ts.map +1 -0
- package/dist/data/secret-patterns.js +129 -0
- package/dist/data/secret-patterns.js.map +1 -0
- package/dist/deps/index.d.ts +3 -0
- package/dist/deps/index.d.ts.map +1 -0
- package/dist/deps/index.js +308 -0
- package/dist/deps/index.js.map +1 -0
- package/dist/deps/install-script-detector.d.ts +9 -0
- package/dist/deps/install-script-detector.d.ts.map +1 -0
- package/dist/deps/install-script-detector.js +98 -0
- package/dist/deps/install-script-detector.js.map +1 -0
- package/dist/deps/lockfile-parser.d.ts +15 -0
- package/dist/deps/lockfile-parser.d.ts.map +1 -0
- package/dist/deps/lockfile-parser.js +123 -0
- package/dist/deps/lockfile-parser.js.map +1 -0
- package/dist/deps/typosquat-checker.d.ts +10 -0
- package/dist/deps/typosquat-checker.d.ts.map +1 -0
- package/dist/deps/typosquat-checker.js +84 -0
- package/dist/deps/typosquat-checker.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +315 -0
- package/dist/index.js.map +1 -0
- package/dist/meta/sources.d.ts +3 -0
- package/dist/meta/sources.d.ts.map +1 -0
- package/dist/meta/sources.js +43 -0
- package/dist/meta/sources.js.map +1 -0
- package/dist/protocol/mcp-server.d.ts +4 -0
- package/dist/protocol/mcp-server.d.ts.map +1 -0
- package/dist/protocol/mcp-server.js +32 -0
- package/dist/protocol/mcp-server.js.map +1 -0
- package/dist/protocol/tools.d.ts +3 -0
- package/dist/protocol/tools.d.ts.map +1 -0
- package/dist/protocol/tools.js +21 -0
- package/dist/protocol/tools.js.map +1 -0
- package/dist/report/index.d.ts +3 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +259 -0
- package/dist/report/index.js.map +1 -0
- package/dist/report/json-report.d.ts +4 -0
- package/dist/report/json-report.d.ts.map +1 -0
- package/dist/report/json-report.js +61 -0
- package/dist/report/json-report.js.map +1 -0
- package/dist/report/markdown.d.ts +3 -0
- package/dist/report/markdown.d.ts.map +1 -0
- package/dist/report/markdown.js +89 -0
- package/dist/report/markdown.js.map +1 -0
- package/dist/report/sarif.d.ts +3 -0
- package/dist/report/sarif.d.ts.map +1 -0
- package/dist/report/sarif.js +56 -0
- package/dist/report/sarif.js.map +1 -0
- package/dist/runtime/client.d.ts +31 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +53 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +239 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/pinning.d.ts +21 -0
- package/dist/runtime/pinning.d.ts.map +1 -0
- package/dist/runtime/pinning.js +74 -0
- package/dist/runtime/pinning.js.map +1 -0
- package/dist/runtime/schema-analyzer.d.ts +14 -0
- package/dist/runtime/schema-analyzer.d.ts.map +1 -0
- package/dist/runtime/schema-analyzer.js +204 -0
- package/dist/runtime/schema-analyzer.js.map +1 -0
- package/dist/runtime/tool-analyzer.d.ts +6 -0
- package/dist/runtime/tool-analyzer.d.ts.map +1 -0
- package/dist/runtime/tool-analyzer.js +92 -0
- package/dist/runtime/tool-analyzer.js.map +1 -0
- package/dist/static/analyzers/code-execution.d.ts +4 -0
- package/dist/static/analyzers/code-execution.d.ts.map +1 -0
- package/dist/static/analyzers/code-execution.js +72 -0
- package/dist/static/analyzers/code-execution.js.map +1 -0
- package/dist/static/analyzers/command-injection.d.ts +4 -0
- package/dist/static/analyzers/command-injection.d.ts.map +1 -0
- package/dist/static/analyzers/command-injection.js +62 -0
- package/dist/static/analyzers/command-injection.js.map +1 -0
- package/dist/static/analyzers/info-disclosure.d.ts +4 -0
- package/dist/static/analyzers/info-disclosure.d.ts.map +1 -0
- package/dist/static/analyzers/info-disclosure.js +65 -0
- package/dist/static/analyzers/info-disclosure.js.map +1 -0
- package/dist/static/analyzers/insecure-crypto.d.ts +4 -0
- package/dist/static/analyzers/insecure-crypto.d.ts.map +1 -0
- package/dist/static/analyzers/insecure-crypto.js +65 -0
- package/dist/static/analyzers/insecure-crypto.js.map +1 -0
- package/dist/static/analyzers/logging-audit.d.ts +4 -0
- package/dist/static/analyzers/logging-audit.d.ts.map +1 -0
- package/dist/static/analyzers/logging-audit.js +81 -0
- package/dist/static/analyzers/logging-audit.js.map +1 -0
- package/dist/static/analyzers/path-traversal.d.ts +4 -0
- package/dist/static/analyzers/path-traversal.d.ts.map +1 -0
- package/dist/static/analyzers/path-traversal.js +42 -0
- package/dist/static/analyzers/path-traversal.js.map +1 -0
- package/dist/static/analyzers/prototype-pollution.d.ts +4 -0
- package/dist/static/analyzers/prototype-pollution.d.ts.map +1 -0
- package/dist/static/analyzers/prototype-pollution.js +80 -0
- package/dist/static/analyzers/prototype-pollution.js.map +1 -0
- package/dist/static/analyzers/regex-dos.d.ts +4 -0
- package/dist/static/analyzers/regex-dos.d.ts.map +1 -0
- package/dist/static/analyzers/regex-dos.js +78 -0
- package/dist/static/analyzers/regex-dos.js.map +1 -0
- package/dist/static/analyzers/secret-hardcoded.d.ts +4 -0
- package/dist/static/analyzers/secret-hardcoded.d.ts.map +1 -0
- package/dist/static/analyzers/secret-hardcoded.js +70 -0
- package/dist/static/analyzers/secret-hardcoded.js.map +1 -0
- package/dist/static/analyzers/ssrf.d.ts +4 -0
- package/dist/static/analyzers/ssrf.d.ts.map +1 -0
- package/dist/static/analyzers/ssrf.js +39 -0
- package/dist/static/analyzers/ssrf.js.map +1 -0
- package/dist/static/analyzers/unsafe-regex.d.ts +4 -0
- package/dist/static/analyzers/unsafe-regex.d.ts.map +1 -0
- package/dist/static/analyzers/unsafe-regex.js +36 -0
- package/dist/static/analyzers/unsafe-regex.js.map +1 -0
- package/dist/static/ast-engine.d.ts +22 -0
- package/dist/static/ast-engine.d.ts.map +1 -0
- package/dist/static/ast-engine.js +155 -0
- package/dist/static/ast-engine.js.map +1 -0
- package/dist/static/index.d.ts +3 -0
- package/dist/static/index.d.ts.map +1 -0
- package/dist/static/index.js +114 -0
- package/dist/static/index.js.map +1 -0
- package/dist/static/taint-tracker.d.ts +15 -0
- package/dist/static/taint-tracker.d.ts.map +1 -0
- package/dist/static/taint-tracker.js +70 -0
- package/dist/static/taint-tracker.js.map +1 -0
- package/dist/types/findings.d.ts +60 -0
- package/dist/types/findings.d.ts.map +1 -0
- package/dist/types/findings.js +9 -0
- package/dist/types/findings.js.map +1 -0
- package/dist/types/index.d.ts +23 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/crypto.d.ts +4 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +12 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/fs-helpers.d.ts +7 -0
- package/dist/utils/fs-helpers.d.ts.map +1 -0
- package/dist/utils/fs-helpers.js +92 -0
- package/dist/utils/fs-helpers.js.map +1 -0
- package/dist/utils/levenshtein.d.ts +7 -0
- package/dist/utils/levenshtein.d.ts.map +1 -0
- package/dist/utils/levenshtein.js +89 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { POPULAR_PACKAGES } from "../data/popular-packages.js";
|
|
2
|
+
import { levenshtein, isKeyboardAdjacent, isVowelSwap, isSeparatorConfusion, isScopeSquatting } from "../utils/levenshtein.js";
|
|
3
|
+
export function checkTyposquatting(depNames) {
|
|
4
|
+
const matches = [];
|
|
5
|
+
for (const dep of depNames) {
|
|
6
|
+
// Skip if it IS a popular package
|
|
7
|
+
if (POPULAR_PACKAGES.includes(dep))
|
|
8
|
+
continue;
|
|
9
|
+
// Strip scope for comparison
|
|
10
|
+
const depBase = dep.replace(/^@[^/]+\//, "");
|
|
11
|
+
for (const popular of POPULAR_PACKAGES) {
|
|
12
|
+
const popBase = popular.replace(/^@[^/]+\//, "");
|
|
13
|
+
// Skip exact match
|
|
14
|
+
if (depBase === popBase)
|
|
15
|
+
continue;
|
|
16
|
+
// Levenshtein distance <= 2
|
|
17
|
+
const dist = levenshtein(depBase.toLowerCase(), popBase.toLowerCase());
|
|
18
|
+
if (dist > 0 && dist <= 2) {
|
|
19
|
+
matches.push({
|
|
20
|
+
dependency: dep,
|
|
21
|
+
target: popular,
|
|
22
|
+
method: `levenshtein (distance: ${dist})`,
|
|
23
|
+
distance: dist,
|
|
24
|
+
});
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Keyboard adjacent
|
|
28
|
+
if (isKeyboardAdjacent(depBase.toLowerCase(), popBase.toLowerCase())) {
|
|
29
|
+
matches.push({
|
|
30
|
+
dependency: dep,
|
|
31
|
+
target: popular,
|
|
32
|
+
method: "keyboard-adjacent substitution",
|
|
33
|
+
});
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
// Vowel swap
|
|
37
|
+
if (isVowelSwap(depBase.toLowerCase(), popBase.toLowerCase())) {
|
|
38
|
+
matches.push({
|
|
39
|
+
dependency: dep,
|
|
40
|
+
target: popular,
|
|
41
|
+
method: "vowel swap",
|
|
42
|
+
});
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
// Separator confusion
|
|
46
|
+
if (isSeparatorConfusion(depBase.toLowerCase(), popBase.toLowerCase())) {
|
|
47
|
+
matches.push({
|
|
48
|
+
dependency: dep,
|
|
49
|
+
target: popular,
|
|
50
|
+
method: "separator confusion",
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Scope squatting (check against all scoped popular packages)
|
|
56
|
+
if (dep.startsWith("@")) {
|
|
57
|
+
for (const popular of POPULAR_PACKAGES) {
|
|
58
|
+
if (popular.startsWith("@") && isScopeSquatting(dep, popular)) {
|
|
59
|
+
matches.push({
|
|
60
|
+
dependency: dep,
|
|
61
|
+
target: popular,
|
|
62
|
+
method: "scope squatting",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return matches;
|
|
69
|
+
}
|
|
70
|
+
export function typosquatFindings(matches, filePath) {
|
|
71
|
+
return matches.map((m, i) => ({
|
|
72
|
+
id: `DEP-TYPO-${String(i + 1).padStart(3, "0")}`,
|
|
73
|
+
title: `Potential Typosquat: "${m.dependency}" → "${m.target}"`,
|
|
74
|
+
severity: "high",
|
|
75
|
+
owasp_mcp: "MCP04",
|
|
76
|
+
owasp_mcp_title: "Supply Chain & Dependency Vulnerabilities",
|
|
77
|
+
category: "deps",
|
|
78
|
+
file: filePath,
|
|
79
|
+
evidence: `"${m.dependency}" is similar to popular package "${m.target}" (method: ${m.method})`,
|
|
80
|
+
remediation: `Verify that "${m.dependency}" is the intended package. If not, replace with "${m.target}".`,
|
|
81
|
+
cwe: "CWE-1357",
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=typosquat-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typosquat-checker.js","sourceRoot":"","sources":["../../src/deps/typosquat-checker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAU/H,MAAM,UAAU,kBAAkB,CAAC,QAAkB;IACnD,MAAM,OAAO,GAAqB,EAAE,CAAC;IAErC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,kCAAkC;QAClC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAE7C,6BAA6B;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE7C,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAEjD,mBAAmB;YACnB,IAAI,OAAO,KAAK,OAAO;gBAAE,SAAS;YAElC,4BAA4B;YAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;YACvE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,0BAA0B,IAAI,GAAG;oBACzC,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,oBAAoB;YACpB,IAAI,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,gCAAgC;iBACzC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,aAAa;YACb,IAAI,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,YAAY;iBACrB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,sBAAsB;YACtB,IAAI,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC;oBACX,UAAU,EAAE,GAAG;oBACf,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,qBAAqB;iBAC9B,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC9D,OAAO,CAAC,IAAI,CAAC;wBACX,UAAU,EAAE,GAAG;wBACf,MAAM,EAAE,OAAO;wBACf,MAAM,EAAE,iBAAiB;qBAC1B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAyB,EAAE,QAAgB;IAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5B,EAAE,EAAE,YAAY,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;QAChD,KAAK,EAAE,yBAAyB,CAAC,CAAC,UAAU,QAAQ,CAAC,CAAC,MAAM,GAAG;QAC/D,QAAQ,EAAE,MAAe;QACzB,SAAS,EAAE,OAAgB;QAC3B,eAAe,EAAE,2CAA2C;QAC5D,QAAQ,EAAE,MAAe;QACzB,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI,CAAC,CAAC,UAAU,oCAAoC,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC,MAAM,GAAG;QAC/F,WAAW,EAAE,gBAAgB,CAAC,CAAC,UAAU,oDAAoD,CAAC,CAAC,MAAM,IAAI;QACzG,GAAG,EAAE,UAAU;KAChB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
5
|
+
import { startMcpStdio } from "./protocol/mcp-server.js";
|
|
6
|
+
import { allTools } from "./protocol/tools.js";
|
|
7
|
+
import { discoverConfigs } from "./config/mcp-config-parser.js";
|
|
8
|
+
// ─── Build ToolContext ───
|
|
9
|
+
async function buildToolContext() {
|
|
10
|
+
const pinDir = join(homedir(), ".mcp-security-scanner", "pins");
|
|
11
|
+
await mkdir(pinDir, { recursive: true });
|
|
12
|
+
return {
|
|
13
|
+
config: {
|
|
14
|
+
pinDir,
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// ─── Tool Categories for --list display ───
|
|
19
|
+
const TOOL_CATEGORIES = [
|
|
20
|
+
{ category: "Runtime Inspection", prefix: "rt_" },
|
|
21
|
+
{ category: "Static Analysis", prefix: "sast_" },
|
|
22
|
+
{ category: "Config Audit", prefix: "cfg_" },
|
|
23
|
+
{ category: "Dependency Analysis", prefix: "dep_" },
|
|
24
|
+
{ category: "Report & Compliance", prefix: "report_" },
|
|
25
|
+
{ category: "Meta", prefix: "scanner_" },
|
|
26
|
+
];
|
|
27
|
+
function categorize(toolName) {
|
|
28
|
+
for (const { category, prefix } of TOOL_CATEGORIES) {
|
|
29
|
+
if (toolName.startsWith(prefix))
|
|
30
|
+
return category;
|
|
31
|
+
}
|
|
32
|
+
return "Other";
|
|
33
|
+
}
|
|
34
|
+
// ─── CLI: --help ───
|
|
35
|
+
function printHelp() {
|
|
36
|
+
console.log(`mcp-security-scanner — MCP Server Security Scanner
|
|
37
|
+
|
|
38
|
+
USAGE:
|
|
39
|
+
mcp-security-scanner Start MCP server on stdio
|
|
40
|
+
mcp-security-scanner --help Show this help message
|
|
41
|
+
mcp-security-scanner --list List all ${allTools.length} tools grouped by category
|
|
42
|
+
mcp-security-scanner --tool NAME '{}' Run a single tool with JSON args
|
|
43
|
+
|
|
44
|
+
SCAN SHORTCUTS:
|
|
45
|
+
mcp-security-scanner --scan-server "node server.js" Runtime: 11 checks
|
|
46
|
+
mcp-security-scanner --scan-source ./src SAST: 12 checks
|
|
47
|
+
mcp-security-scanner --scan-config ~/config.json Config: 7 checks
|
|
48
|
+
mcp-security-scanner --scan-deps . Deps: 7 checks
|
|
49
|
+
mcp-security-scanner --full-audit ./my-mcp-server ALL checks combined
|
|
50
|
+
|
|
51
|
+
OUTPUT CONTROL:
|
|
52
|
+
--report json|markdown|sarif Report format (default: json)
|
|
53
|
+
--output FILE Write to file (default: stdout)
|
|
54
|
+
--severity critical,high Filter by minimum severity
|
|
55
|
+
--owasp MCP03,MCP05 Filter by OWASP category
|
|
56
|
+
|
|
57
|
+
TOOL PINNING:
|
|
58
|
+
--pin "node server.js" --pin-name NAME Pin tool definitions
|
|
59
|
+
--verify-pin "node server.js" --pin-name NAME Verify against pin
|
|
60
|
+
|
|
61
|
+
CONFIG DISCOVERY:
|
|
62
|
+
--discover Find all MCP configs on system
|
|
63
|
+
|
|
64
|
+
CATEGORIES:
|
|
65
|
+
rt_* Runtime Inspection (11) — Live server analysis
|
|
66
|
+
sast_* Static Analysis (12) — AST-based code scanning
|
|
67
|
+
cfg_* Config Audit (7) — MCP config file audit
|
|
68
|
+
dep_* Dependency Analysis (7) — Lockfile & supply chain
|
|
69
|
+
report_* Report (4) — Multi-format reports
|
|
70
|
+
scanner_* Meta (2) — Check listing & OWASP map
|
|
71
|
+
|
|
72
|
+
OWASP MCP Top 10:
|
|
73
|
+
MCP01 Excessive Privilege & Token Mismanagement
|
|
74
|
+
MCP02 Tool & Scope Mismanagement
|
|
75
|
+
MCP03 Tool Poisoning via Description Injection
|
|
76
|
+
MCP04 Supply Chain & Dependency Vulnerabilities
|
|
77
|
+
MCP05 Command Injection & Code Execution
|
|
78
|
+
MCP06 Context & Tool Shadowing
|
|
79
|
+
MCP07 Insufficient Authentication & Transport Security
|
|
80
|
+
MCP08 Insufficient Logging & Error Handling
|
|
81
|
+
MCP09 Shadow Servers & Unauthorized MCP Endpoints
|
|
82
|
+
MCP10 Context Over-sharing & Data Exposure
|
|
83
|
+
`);
|
|
84
|
+
}
|
|
85
|
+
// ─── CLI: --list ───
|
|
86
|
+
function printToolList() {
|
|
87
|
+
const grouped = new Map();
|
|
88
|
+
for (const tool of allTools) {
|
|
89
|
+
const cat = categorize(tool.name);
|
|
90
|
+
if (!grouped.has(cat))
|
|
91
|
+
grouped.set(cat, []);
|
|
92
|
+
grouped.get(cat).push(tool);
|
|
93
|
+
}
|
|
94
|
+
console.log(`\nmcp-security-scanner — ${allTools.length} tools\n`);
|
|
95
|
+
for (const [category, tools] of grouped) {
|
|
96
|
+
console.log(`━━━ ${category} (${tools.length}) ━━━`);
|
|
97
|
+
for (const tool of tools) {
|
|
98
|
+
const schemaKeys = Object.keys(tool.schema);
|
|
99
|
+
const params = schemaKeys.length > 0 ? `(${schemaKeys.join(", ")})` : "()";
|
|
100
|
+
console.log(` ${tool.name}${params}`);
|
|
101
|
+
console.log(` ${tool.description.split(".")[0]}.`);
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// ─── CLI: --tool ───
|
|
107
|
+
async function runSingleTool(toolName, argsJson) {
|
|
108
|
+
const tool = allTools.find((t) => t.name === toolName);
|
|
109
|
+
if (!tool) {
|
|
110
|
+
console.error(`Unknown tool: ${toolName}`);
|
|
111
|
+
console.error(`Run --list to see all ${allTools.length} available tools.`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
let parsedArgs;
|
|
115
|
+
try {
|
|
116
|
+
parsedArgs = JSON.parse(argsJson);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
console.error(`Invalid JSON: ${argsJson}`);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
const ctx = await buildToolContext();
|
|
123
|
+
try {
|
|
124
|
+
const result = await tool.execute(parsedArgs, ctx);
|
|
125
|
+
for (const item of result.content) {
|
|
126
|
+
console.log(item.text);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
console.error(`Error: ${err.message}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ─── CLI helpers ───
|
|
135
|
+
function getArg(args, flag) {
|
|
136
|
+
const idx = args.indexOf(flag);
|
|
137
|
+
if (idx === -1 || idx + 1 >= args.length)
|
|
138
|
+
return undefined;
|
|
139
|
+
return args[idx + 1];
|
|
140
|
+
}
|
|
141
|
+
async function runToolAndOutput(toolName, toolArgs, outputPath) {
|
|
142
|
+
const tool = allTools.find((t) => t.name === toolName);
|
|
143
|
+
if (!tool) {
|
|
144
|
+
console.error(`Internal error: tool "${toolName}" not found.`);
|
|
145
|
+
process.exit(1);
|
|
146
|
+
}
|
|
147
|
+
const ctx = await buildToolContext();
|
|
148
|
+
const result = await tool.execute(toolArgs, ctx);
|
|
149
|
+
const output = result.content.map((c) => c.text).join("\n");
|
|
150
|
+
if (outputPath) {
|
|
151
|
+
await writeFile(outputPath, output, "utf8");
|
|
152
|
+
console.log(`Report written to ${outputPath}`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log(output);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// ─── Main ───
|
|
159
|
+
async function main() {
|
|
160
|
+
const args = process.argv.slice(2);
|
|
161
|
+
if (args.includes("--help") || args.includes("-h")) {
|
|
162
|
+
printHelp();
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (args.includes("--list") || args.includes("-l")) {
|
|
166
|
+
printToolList();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// --tool NAME '{json}'
|
|
170
|
+
const toolIdx = args.indexOf("--tool");
|
|
171
|
+
if (toolIdx !== -1) {
|
|
172
|
+
const toolName = args[toolIdx + 1];
|
|
173
|
+
const toolArgs = args[toolIdx + 2] ?? "{}";
|
|
174
|
+
if (!toolName) {
|
|
175
|
+
console.error("--tool requires a tool name. Run --list to see available tools.");
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
await runSingleTool(toolName, toolArgs);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// --discover
|
|
182
|
+
if (args.includes("--discover")) {
|
|
183
|
+
const configs = await discoverConfigs();
|
|
184
|
+
if (configs.length === 0) {
|
|
185
|
+
console.log("No MCP configuration files found.");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
console.log(`Found ${configs.length} MCP configuration file(s):\n`);
|
|
189
|
+
for (const cfg of configs) {
|
|
190
|
+
console.log(`${cfg.client}: ${cfg.path}`);
|
|
191
|
+
console.log(` Servers: ${cfg.servers.length}`);
|
|
192
|
+
for (const s of cfg.servers) {
|
|
193
|
+
console.log(` - ${s.name}: ${s.command ?? s.url ?? "unknown"}`);
|
|
194
|
+
}
|
|
195
|
+
console.log();
|
|
196
|
+
}
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const outputPath = getArg(args, "--output");
|
|
200
|
+
const reportFormat = getArg(args, "--report") ?? "json";
|
|
201
|
+
// --full-audit PATH [--command CMD] [--report FORMAT] [--output FILE]
|
|
202
|
+
const fullAuditIdx = args.indexOf("--full-audit");
|
|
203
|
+
if (fullAuditIdx !== -1) {
|
|
204
|
+
const path = args[fullAuditIdx + 1];
|
|
205
|
+
if (!path) {
|
|
206
|
+
console.error("--full-audit requires a project directory path.");
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
const command = getArg(args, "--command");
|
|
210
|
+
const cmdArgs = getArg(args, "--args");
|
|
211
|
+
const toolArgs = {
|
|
212
|
+
path: resolve(path),
|
|
213
|
+
report_format: reportFormat,
|
|
214
|
+
};
|
|
215
|
+
if (command) {
|
|
216
|
+
toolArgs.command = command;
|
|
217
|
+
if (cmdArgs)
|
|
218
|
+
toolArgs.args = cmdArgs.split(",");
|
|
219
|
+
}
|
|
220
|
+
await runToolAndOutput("report_full_audit", toolArgs, outputPath);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// --scan-source PATH
|
|
224
|
+
const scanSourceIdx = args.indexOf("--scan-source");
|
|
225
|
+
if (scanSourceIdx !== -1) {
|
|
226
|
+
const path = args[scanSourceIdx + 1];
|
|
227
|
+
if (!path) {
|
|
228
|
+
console.error("--scan-source requires a directory path.");
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
await runToolAndOutput("sast_scan_directory", { path: resolve(path) }, outputPath);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
// --scan-deps PATH
|
|
235
|
+
const scanDepsIdx = args.indexOf("--scan-deps");
|
|
236
|
+
if (scanDepsIdx !== -1) {
|
|
237
|
+
const path = args[scanDepsIdx + 1];
|
|
238
|
+
if (!path) {
|
|
239
|
+
console.error("--scan-deps requires a directory path.");
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
// Run multiple dep checks
|
|
243
|
+
const ctx = await buildToolContext();
|
|
244
|
+
const results = [];
|
|
245
|
+
for (const name of ["dep_audit_lockfile", "dep_check_typosquatting", "dep_check_unpinned", "dep_check_install_scripts", "dep_check_mcp_sdk_version"]) {
|
|
246
|
+
const tool = allTools.find((t) => t.name === name);
|
|
247
|
+
try {
|
|
248
|
+
const r = await tool.execute({ path: resolve(path) }, ctx);
|
|
249
|
+
results.push(`── ${name} ──\n${r.content.map(c => c.text).join("\n")}\n`);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
results.push(`── ${name} ── ERROR: ${err.message}\n`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const output = results.join("\n");
|
|
256
|
+
if (outputPath) {
|
|
257
|
+
await writeFile(outputPath, output, "utf8");
|
|
258
|
+
console.log(`Written to ${outputPath}`);
|
|
259
|
+
}
|
|
260
|
+
else
|
|
261
|
+
console.log(output);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// --scan-config PATH
|
|
265
|
+
const scanConfigIdx = args.indexOf("--scan-config");
|
|
266
|
+
if (scanConfigIdx !== -1) {
|
|
267
|
+
const path = args[scanConfigIdx + 1];
|
|
268
|
+
if (!path) {
|
|
269
|
+
console.error("--scan-config requires a config file path.");
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
await runToolAndOutput("cfg_audit_mcp_config", { path: resolve(path) }, outputPath);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// --scan-server "command args..."
|
|
276
|
+
const scanServerIdx = args.indexOf("--scan-server");
|
|
277
|
+
if (scanServerIdx !== -1) {
|
|
278
|
+
const cmdStr = args[scanServerIdx + 1];
|
|
279
|
+
if (!cmdStr) {
|
|
280
|
+
console.error("--scan-server requires a command string.");
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
const parts = cmdStr.split(/\s+/);
|
|
284
|
+
const command = parts[0];
|
|
285
|
+
const cmdArgs = parts.slice(1);
|
|
286
|
+
const ctx = await buildToolContext();
|
|
287
|
+
const results = [];
|
|
288
|
+
for (const name of ["rt_inspect_server", "rt_check_tool_poisoning", "rt_check_ansi_injection", "rt_check_unicode_steganography", "rt_check_scope_creep", "rt_check_tool_shadowing", "rt_check_cross_origin", "rt_check_resource_exposure"]) {
|
|
289
|
+
const tool = allTools.find((t) => t.name === name);
|
|
290
|
+
try {
|
|
291
|
+
const r = await tool.execute({ command, args: cmdArgs }, ctx);
|
|
292
|
+
results.push(`── ${name} ──\n${r.content.map(c => c.text).join("\n")}\n`);
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
results.push(`── ${name} ── ERROR: ${err.message}\n`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
const output = results.join("\n");
|
|
299
|
+
if (outputPath) {
|
|
300
|
+
await writeFile(outputPath, output, "utf8");
|
|
301
|
+
console.log(`Written to ${outputPath}`);
|
|
302
|
+
}
|
|
303
|
+
else
|
|
304
|
+
console.log(output);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// Default: start MCP server on stdio
|
|
308
|
+
const ctx = await buildToolContext();
|
|
309
|
+
await startMcpStdio(ctx);
|
|
310
|
+
}
|
|
311
|
+
main().catch((err) => {
|
|
312
|
+
console.error("Fatal error:", err);
|
|
313
|
+
process.exit(1);
|
|
314
|
+
});
|
|
315
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/meta/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAoDjD,eAAO,MAAM,SAAS,EAAE,OAAO,EAA6C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { text } from "../types/index.js";
|
|
2
|
+
import { OWASP_MCP_TOP10 } from "../data/owasp-mcp-top10.js";
|
|
3
|
+
const scannerListChecks = {
|
|
4
|
+
name: "scanner_list_checks",
|
|
5
|
+
description: "List all security checks available in mcp-security-scanner with name, description, OWASP MCP Top 10 mapping, severity range, and category.",
|
|
6
|
+
schema: {},
|
|
7
|
+
async execute() {
|
|
8
|
+
const checks = [
|
|
9
|
+
{ category: "Runtime Inspection (rt_)", count: 11, owasp: "MCP02,MCP03,MCP06,MCP07,MCP10", description: "Connect to live MCP servers, inspect tool definitions, detect poisoning, verify pins" },
|
|
10
|
+
{ category: "Static Analysis (sast_)", count: 12, owasp: "MCP01,MCP05,MCP08", description: "AST-based code scanning: command injection, SSRF, path traversal, code execution, secrets, crypto" },
|
|
11
|
+
{ category: "Config Audit (cfg_)", count: 7, owasp: "MCP01,MCP07,MCP09,MCP10", description: "Parse MCP configs, scan env files, detect shadow servers, check transport security" },
|
|
12
|
+
{ category: "Dependency Analysis (dep_)", count: 7, owasp: "MCP04", description: "Lockfile audit, typosquatting detection, install scripts, SDK version check" },
|
|
13
|
+
{ category: "Report & Compliance (report_)", count: 4, owasp: "ALL", description: "Generate markdown, SARIF, JSON reports. Full audit orchestrator." },
|
|
14
|
+
{ category: "Meta (scanner_)", count: 2, owasp: "ALL", description: "Check listing, OWASP MCP mapping" },
|
|
15
|
+
];
|
|
16
|
+
const total = checks.reduce((sum, c) => sum + c.count, 0);
|
|
17
|
+
let output = `mcp-security-scanner — ${total} security checks\n\n`;
|
|
18
|
+
for (const c of checks) {
|
|
19
|
+
output += `━━━ ${c.category} — ${c.count} tools ━━━\n`;
|
|
20
|
+
output += ` OWASP: ${c.owasp}\n`;
|
|
21
|
+
output += ` ${c.description}\n\n`;
|
|
22
|
+
}
|
|
23
|
+
return text(output.trim());
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const scannerOwaspMapping = {
|
|
27
|
+
name: "scanner_owasp_mapping",
|
|
28
|
+
description: "Display the full OWASP MCP Top 10 with ID, title, description, remediation guidance, CWE mappings, and external references.",
|
|
29
|
+
schema: {},
|
|
30
|
+
async execute() {
|
|
31
|
+
let output = "OWASP MCP Top 10 — Security Categories\n\n";
|
|
32
|
+
for (const cat of OWASP_MCP_TOP10) {
|
|
33
|
+
output += `━━━ ${cat.id}: ${cat.title} ━━━\n`;
|
|
34
|
+
output += ` ${cat.description}\n`;
|
|
35
|
+
output += ` Remediation: ${cat.remediation}\n`;
|
|
36
|
+
output += ` CWE: ${cat.cwe.join(", ")}\n`;
|
|
37
|
+
output += ` References: ${cat.references.join(", ")}\n\n`;
|
|
38
|
+
}
|
|
39
|
+
return text(output.trim());
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
export const metaTools = [scannerListChecks, scannerOwaspMapping];
|
|
43
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/meta/sources.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAQ,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,MAAM,iBAAiB,GAAY;IACjC,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,4IAA4I;IAC9I,MAAM,EAAE,EAAE;IACV,KAAK,CAAC,OAAO;QACX,MAAM,MAAM,GAAG;YACb,EAAE,QAAQ,EAAE,0BAA0B,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,+BAA+B,EAAE,WAAW,EAAE,sFAAsF,EAAE;YAChM,EAAE,QAAQ,EAAE,yBAAyB,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,mGAAmG,EAAE;YAChM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,WAAW,EAAE,oFAAoF,EAAE;YAClL,EAAE,QAAQ,EAAE,4BAA4B,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,6EAA6E,EAAE;YAChK,EAAE,QAAQ,EAAE,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,kEAAkE,EAAE;YACtJ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,kCAAkC,EAAE;SACzG,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1D,IAAI,MAAM,GAAG,0BAA0B,KAAK,sBAAsB,CAAC;QAEnE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,OAAO,CAAC,CAAC,QAAQ,MAAM,CAAC,CAAC,KAAK,cAAc,CAAC;YACvD,MAAM,IAAI,YAAY,CAAC,CAAC,KAAK,IAAI,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,MAAM,CAAC;QACrC,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAEF,MAAM,mBAAmB,GAAY;IACnC,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,6HAA6H;IAC/H,MAAM,EAAE,EAAE;IACV,KAAK,CAAC,OAAO;QACX,IAAI,MAAM,GAAG,4CAA4C,CAAC;QAE1D,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,MAAM,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,QAAQ,CAAC;YAC9C,MAAM,IAAI,KAAK,GAAG,CAAC,WAAW,IAAI,CAAC;YACnC,MAAM,IAAI,kBAAkB,GAAG,CAAC,WAAW,IAAI,CAAC;YAChD,MAAM,IAAI,UAAU,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3C,MAAM,IAAI,iBAAiB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7D,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAc,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/protocol/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA8BrD,wBAAsB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAMxE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { allTools } from "./tools.js";
|
|
4
|
+
function createMcpServer(ctx) {
|
|
5
|
+
const server = new McpServer({
|
|
6
|
+
name: "mcp-security-scanner",
|
|
7
|
+
version: "0.1.0",
|
|
8
|
+
});
|
|
9
|
+
for (const tool of allTools) {
|
|
10
|
+
server.tool(tool.name, tool.description, tool.schema, async (args) => {
|
|
11
|
+
try {
|
|
12
|
+
const result = await tool.execute(args, ctx);
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
return {
|
|
17
|
+
content: [{ type: "text", text: `Error: ${err.message}` }],
|
|
18
|
+
isError: true,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return server;
|
|
24
|
+
}
|
|
25
|
+
export async function startMcpStdio(ctx) {
|
|
26
|
+
const server = createMcpServer(ctx);
|
|
27
|
+
const transport = new StdioServerTransport();
|
|
28
|
+
await server.connect(transport);
|
|
29
|
+
console.error("[mcp-security-scanner] MCP server started on stdio");
|
|
30
|
+
return server;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/protocol/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,SAAS,eAAe,CAAC,GAAgB;IACvC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,EACX,KAAK,EAAE,IAA6B,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC7C,OAAO,MAAa,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC;oBAC9E,OAAO,EAAE,IAAI;iBACP,CAAC;YACX,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAgB;IAClD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/protocol/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAQjD,eAAO,MAAM,QAAQ,EAAE,OAAO,EAa7B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { metaTools } from "../meta/sources.js";
|
|
2
|
+
import { runtimeTools } from "../runtime/index.js";
|
|
3
|
+
import { staticTools } from "../static/index.js";
|
|
4
|
+
import { configTools } from "../config/index.js";
|
|
5
|
+
import { depsTools } from "../deps/index.js";
|
|
6
|
+
import { reportTools } from "../report/index.js";
|
|
7
|
+
export const allTools = [
|
|
8
|
+
// Runtime Inspection (11)
|
|
9
|
+
...runtimeTools,
|
|
10
|
+
// Static Analysis (12)
|
|
11
|
+
...staticTools,
|
|
12
|
+
// Config Audit (7)
|
|
13
|
+
...configTools,
|
|
14
|
+
// Dependency Analysis (7)
|
|
15
|
+
...depsTools,
|
|
16
|
+
// Report & Compliance (4)
|
|
17
|
+
...reportTools,
|
|
18
|
+
// Meta (2)
|
|
19
|
+
...metaTools,
|
|
20
|
+
];
|
|
21
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/protocol/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,0BAA0B;IAC1B,GAAG,YAAY;IACf,uBAAuB;IACvB,GAAG,WAAW;IACd,mBAAmB;IACnB,GAAG,WAAW;IACd,0BAA0B;IAC1B,GAAG,SAAS;IACZ,0BAA0B;IAC1B,GAAG,WAAW;IACd,WAAW;IACX,GAAG,SAAS;CACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAgSjD,eAAO,MAAM,WAAW,EAAE,OAAO,EAKhC,CAAC"}
|