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.
Files changed (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.ar.md +662 -0
  3. package/README.bn.md +662 -0
  4. package/README.bs.md +662 -0
  5. package/README.da.md +662 -0
  6. package/README.de.md +662 -0
  7. package/README.el.md +662 -0
  8. package/README.es.md +662 -0
  9. package/README.fr.md +663 -0
  10. package/README.hi.md +662 -0
  11. package/README.it.md +662 -0
  12. package/README.ja.md +663 -0
  13. package/README.ko.md +662 -0
  14. package/README.md +662 -0
  15. package/README.no.md +662 -0
  16. package/README.pl.md +662 -0
  17. package/README.pt-BR.md +662 -0
  18. package/README.ru.md +662 -0
  19. package/README.th.md +662 -0
  20. package/README.tr.md +662 -0
  21. package/README.uk.md +663 -0
  22. package/README.vi.md +662 -0
  23. package/README.zh-TW.md +661 -0
  24. package/README.zh.md +661 -0
  25. package/dist/config/env-scanner.d.ts +3 -0
  26. package/dist/config/env-scanner.d.ts.map +1 -0
  27. package/dist/config/env-scanner.js +85 -0
  28. package/dist/config/env-scanner.js.map +1 -0
  29. package/dist/config/index.d.ts +3 -0
  30. package/dist/config/index.d.ts.map +1 -0
  31. package/dist/config/index.js +169 -0
  32. package/dist/config/index.js.map +1 -0
  33. package/dist/config/mcp-config-parser.d.ts +16 -0
  34. package/dist/config/mcp-config-parser.d.ts.map +1 -0
  35. package/dist/config/mcp-config-parser.js +86 -0
  36. package/dist/config/mcp-config-parser.js.map +1 -0
  37. package/dist/config/server-verification.d.ts +5 -0
  38. package/dist/config/server-verification.d.ts.map +1 -0
  39. package/dist/config/server-verification.js +221 -0
  40. package/dist/config/server-verification.js.map +1 -0
  41. package/dist/data/dangerous-sinks.d.ts +13 -0
  42. package/dist/data/dangerous-sinks.d.ts.map +1 -0
  43. package/dist/data/dangerous-sinks.js +45 -0
  44. package/dist/data/dangerous-sinks.js.map +1 -0
  45. package/dist/data/owasp-mcp-top10.d.ts +12 -0
  46. package/dist/data/owasp-mcp-top10.d.ts.map +1 -0
  47. package/dist/data/owasp-mcp-top10.js +95 -0
  48. package/dist/data/owasp-mcp-top10.js.map +1 -0
  49. package/dist/data/poisoning-patterns.d.ts +15 -0
  50. package/dist/data/poisoning-patterns.d.ts.map +1 -0
  51. package/dist/data/poisoning-patterns.js +146 -0
  52. package/dist/data/poisoning-patterns.js.map +1 -0
  53. package/dist/data/popular-packages.d.ts +2 -0
  54. package/dist/data/popular-packages.d.ts.map +1 -0
  55. package/dist/data/popular-packages.js +71 -0
  56. package/dist/data/popular-packages.js.map +1 -0
  57. package/dist/data/secret-patterns.d.ts +8 -0
  58. package/dist/data/secret-patterns.d.ts.map +1 -0
  59. package/dist/data/secret-patterns.js +129 -0
  60. package/dist/data/secret-patterns.js.map +1 -0
  61. package/dist/deps/index.d.ts +3 -0
  62. package/dist/deps/index.d.ts.map +1 -0
  63. package/dist/deps/index.js +308 -0
  64. package/dist/deps/index.js.map +1 -0
  65. package/dist/deps/install-script-detector.d.ts +9 -0
  66. package/dist/deps/install-script-detector.d.ts.map +1 -0
  67. package/dist/deps/install-script-detector.js +98 -0
  68. package/dist/deps/install-script-detector.js.map +1 -0
  69. package/dist/deps/lockfile-parser.d.ts +15 -0
  70. package/dist/deps/lockfile-parser.d.ts.map +1 -0
  71. package/dist/deps/lockfile-parser.js +123 -0
  72. package/dist/deps/lockfile-parser.js.map +1 -0
  73. package/dist/deps/typosquat-checker.d.ts +10 -0
  74. package/dist/deps/typosquat-checker.d.ts.map +1 -0
  75. package/dist/deps/typosquat-checker.js +84 -0
  76. package/dist/deps/typosquat-checker.js.map +1 -0
  77. package/dist/index.d.ts +3 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +315 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/meta/sources.d.ts +3 -0
  82. package/dist/meta/sources.d.ts.map +1 -0
  83. package/dist/meta/sources.js +43 -0
  84. package/dist/meta/sources.js.map +1 -0
  85. package/dist/protocol/mcp-server.d.ts +4 -0
  86. package/dist/protocol/mcp-server.d.ts.map +1 -0
  87. package/dist/protocol/mcp-server.js +32 -0
  88. package/dist/protocol/mcp-server.js.map +1 -0
  89. package/dist/protocol/tools.d.ts +3 -0
  90. package/dist/protocol/tools.d.ts.map +1 -0
  91. package/dist/protocol/tools.js +21 -0
  92. package/dist/protocol/tools.js.map +1 -0
  93. package/dist/report/index.d.ts +3 -0
  94. package/dist/report/index.d.ts.map +1 -0
  95. package/dist/report/index.js +259 -0
  96. package/dist/report/index.js.map +1 -0
  97. package/dist/report/json-report.d.ts +4 -0
  98. package/dist/report/json-report.d.ts.map +1 -0
  99. package/dist/report/json-report.js +61 -0
  100. package/dist/report/json-report.js.map +1 -0
  101. package/dist/report/markdown.d.ts +3 -0
  102. package/dist/report/markdown.d.ts.map +1 -0
  103. package/dist/report/markdown.js +89 -0
  104. package/dist/report/markdown.js.map +1 -0
  105. package/dist/report/sarif.d.ts +3 -0
  106. package/dist/report/sarif.d.ts.map +1 -0
  107. package/dist/report/sarif.js +56 -0
  108. package/dist/report/sarif.js.map +1 -0
  109. package/dist/runtime/client.d.ts +31 -0
  110. package/dist/runtime/client.d.ts.map +1 -0
  111. package/dist/runtime/client.js +53 -0
  112. package/dist/runtime/client.js.map +1 -0
  113. package/dist/runtime/index.d.ts +3 -0
  114. package/dist/runtime/index.d.ts.map +1 -0
  115. package/dist/runtime/index.js +239 -0
  116. package/dist/runtime/index.js.map +1 -0
  117. package/dist/runtime/pinning.d.ts +21 -0
  118. package/dist/runtime/pinning.d.ts.map +1 -0
  119. package/dist/runtime/pinning.js +74 -0
  120. package/dist/runtime/pinning.js.map +1 -0
  121. package/dist/runtime/schema-analyzer.d.ts +14 -0
  122. package/dist/runtime/schema-analyzer.d.ts.map +1 -0
  123. package/dist/runtime/schema-analyzer.js +204 -0
  124. package/dist/runtime/schema-analyzer.js.map +1 -0
  125. package/dist/runtime/tool-analyzer.d.ts +6 -0
  126. package/dist/runtime/tool-analyzer.d.ts.map +1 -0
  127. package/dist/runtime/tool-analyzer.js +92 -0
  128. package/dist/runtime/tool-analyzer.js.map +1 -0
  129. package/dist/static/analyzers/code-execution.d.ts +4 -0
  130. package/dist/static/analyzers/code-execution.d.ts.map +1 -0
  131. package/dist/static/analyzers/code-execution.js +72 -0
  132. package/dist/static/analyzers/code-execution.js.map +1 -0
  133. package/dist/static/analyzers/command-injection.d.ts +4 -0
  134. package/dist/static/analyzers/command-injection.d.ts.map +1 -0
  135. package/dist/static/analyzers/command-injection.js +62 -0
  136. package/dist/static/analyzers/command-injection.js.map +1 -0
  137. package/dist/static/analyzers/info-disclosure.d.ts +4 -0
  138. package/dist/static/analyzers/info-disclosure.d.ts.map +1 -0
  139. package/dist/static/analyzers/info-disclosure.js +65 -0
  140. package/dist/static/analyzers/info-disclosure.js.map +1 -0
  141. package/dist/static/analyzers/insecure-crypto.d.ts +4 -0
  142. package/dist/static/analyzers/insecure-crypto.d.ts.map +1 -0
  143. package/dist/static/analyzers/insecure-crypto.js +65 -0
  144. package/dist/static/analyzers/insecure-crypto.js.map +1 -0
  145. package/dist/static/analyzers/logging-audit.d.ts +4 -0
  146. package/dist/static/analyzers/logging-audit.d.ts.map +1 -0
  147. package/dist/static/analyzers/logging-audit.js +81 -0
  148. package/dist/static/analyzers/logging-audit.js.map +1 -0
  149. package/dist/static/analyzers/path-traversal.d.ts +4 -0
  150. package/dist/static/analyzers/path-traversal.d.ts.map +1 -0
  151. package/dist/static/analyzers/path-traversal.js +42 -0
  152. package/dist/static/analyzers/path-traversal.js.map +1 -0
  153. package/dist/static/analyzers/prototype-pollution.d.ts +4 -0
  154. package/dist/static/analyzers/prototype-pollution.d.ts.map +1 -0
  155. package/dist/static/analyzers/prototype-pollution.js +80 -0
  156. package/dist/static/analyzers/prototype-pollution.js.map +1 -0
  157. package/dist/static/analyzers/regex-dos.d.ts +4 -0
  158. package/dist/static/analyzers/regex-dos.d.ts.map +1 -0
  159. package/dist/static/analyzers/regex-dos.js +78 -0
  160. package/dist/static/analyzers/regex-dos.js.map +1 -0
  161. package/dist/static/analyzers/secret-hardcoded.d.ts +4 -0
  162. package/dist/static/analyzers/secret-hardcoded.d.ts.map +1 -0
  163. package/dist/static/analyzers/secret-hardcoded.js +70 -0
  164. package/dist/static/analyzers/secret-hardcoded.js.map +1 -0
  165. package/dist/static/analyzers/ssrf.d.ts +4 -0
  166. package/dist/static/analyzers/ssrf.d.ts.map +1 -0
  167. package/dist/static/analyzers/ssrf.js +39 -0
  168. package/dist/static/analyzers/ssrf.js.map +1 -0
  169. package/dist/static/analyzers/unsafe-regex.d.ts +4 -0
  170. package/dist/static/analyzers/unsafe-regex.d.ts.map +1 -0
  171. package/dist/static/analyzers/unsafe-regex.js +36 -0
  172. package/dist/static/analyzers/unsafe-regex.js.map +1 -0
  173. package/dist/static/ast-engine.d.ts +22 -0
  174. package/dist/static/ast-engine.d.ts.map +1 -0
  175. package/dist/static/ast-engine.js +155 -0
  176. package/dist/static/ast-engine.js.map +1 -0
  177. package/dist/static/index.d.ts +3 -0
  178. package/dist/static/index.d.ts.map +1 -0
  179. package/dist/static/index.js +114 -0
  180. package/dist/static/index.js.map +1 -0
  181. package/dist/static/taint-tracker.d.ts +15 -0
  182. package/dist/static/taint-tracker.d.ts.map +1 -0
  183. package/dist/static/taint-tracker.js +70 -0
  184. package/dist/static/taint-tracker.js.map +1 -0
  185. package/dist/types/findings.d.ts +60 -0
  186. package/dist/types/findings.d.ts.map +1 -0
  187. package/dist/types/findings.js +9 -0
  188. package/dist/types/findings.js.map +1 -0
  189. package/dist/types/index.d.ts +23 -0
  190. package/dist/types/index.d.ts.map +1 -0
  191. package/dist/types/index.js +8 -0
  192. package/dist/types/index.js.map +1 -0
  193. package/dist/utils/crypto.d.ts +4 -0
  194. package/dist/utils/crypto.d.ts.map +1 -0
  195. package/dist/utils/crypto.js +12 -0
  196. package/dist/utils/crypto.js.map +1 -0
  197. package/dist/utils/fs-helpers.d.ts +7 -0
  198. package/dist/utils/fs-helpers.d.ts.map +1 -0
  199. package/dist/utils/fs-helpers.js +92 -0
  200. package/dist/utils/fs-helpers.js.map +1 -0
  201. package/dist/utils/levenshtein.d.ts +7 -0
  202. package/dist/utils/levenshtein.d.ts.map +1 -0
  203. package/dist/utils/levenshtein.js +89 -0
  204. package/dist/utils/levenshtein.js.map +1 -0
  205. 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":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const metaTools: ToolDef[];
3
+ //# sourceMappingURL=sources.d.ts.map
@@ -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,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolContext } from "../types/index.js";
3
+ export declare function startMcpStdio(ctx: ToolContext): Promise<McpServer>;
4
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -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,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const allTools: ToolDef[];
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -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,3 @@
1
+ import type { ToolDef } from "../types/index.js";
2
+ export declare const reportTools: ToolDef[];
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}