nodebench-mcp 2.0.0 → 2.2.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.
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Security tools — dependency auditing and code security analysis.
3
+ *
4
+ * - scan_dependencies: Parse package manifests, detect known vulnerabilities and outdated packages
5
+ * - run_code_analysis: Static analysis on code/text for security patterns, secrets, quality issues
6
+ *
7
+ * Both tools work locally without API keys — pure regex/pattern-based detection.
8
+ */
9
+ import * as fs from "node:fs";
10
+ import * as path from "node:path";
11
+ import * as childProcess from "node:child_process";
12
+ function parsePackageJson(content) {
13
+ try {
14
+ const pkg = JSON.parse(content);
15
+ const deps = [];
16
+ for (const [name, version] of Object.entries(pkg.dependencies ?? {})) {
17
+ deps.push({ name, version: String(version), type: "production" });
18
+ }
19
+ for (const [name, version] of Object.entries(pkg.devDependencies ?? {})) {
20
+ deps.push({ name, version: String(version), type: "dev" });
21
+ }
22
+ for (const [name, version] of Object.entries(pkg.optionalDependencies ?? {})) {
23
+ deps.push({ name, version: String(version), type: "optional" });
24
+ }
25
+ return deps;
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ function parseRequirementsTxt(content) {
32
+ return content
33
+ .split("\n")
34
+ .map((line) => line.trim())
35
+ .filter((line) => line && !line.startsWith("#") && !line.startsWith("-"))
36
+ .map((line) => {
37
+ const match = line.match(/^([a-zA-Z0-9_-]+)\s*([><=!~]+\s*[\d.]+)?/);
38
+ if (!match)
39
+ return null;
40
+ return { name: match[1], version: match[2]?.trim() || "*", type: "production" };
41
+ })
42
+ .filter(Boolean);
43
+ }
44
+ function runNpmAudit(projectRoot) {
45
+ try {
46
+ const result = childProcess.execSync("npm audit --json 2>/dev/null", {
47
+ cwd: projectRoot,
48
+ timeout: 30000,
49
+ encoding: "utf-8",
50
+ stdio: ["pipe", "pipe", "pipe"],
51
+ });
52
+ const audit = JSON.parse(result);
53
+ const vulns = [];
54
+ if (audit.vulnerabilities) {
55
+ for (const [pkg, info] of Object.entries(audit.vulnerabilities)) {
56
+ vulns.push({
57
+ package: pkg,
58
+ severity: info.severity ?? "moderate",
59
+ title: info.fixAvailable ? `Fix available: ${typeof info.fixAvailable === "object" ? info.fixAvailable.name : "update"}` : "Vulnerable",
60
+ url: info.via?.[0]?.url,
61
+ });
62
+ }
63
+ }
64
+ return vulns;
65
+ }
66
+ catch (err) {
67
+ // npm audit returns exit code 1 when vulnerabilities found — still has valid JSON
68
+ try {
69
+ const output = err.stdout || err.output?.[1];
70
+ if (typeof output === "string" && output.includes('"vulnerabilities"')) {
71
+ const audit = JSON.parse(output);
72
+ const vulns = [];
73
+ for (const [pkg, info] of Object.entries(audit.vulnerabilities ?? {})) {
74
+ vulns.push({
75
+ package: pkg,
76
+ severity: info.severity ?? "moderate",
77
+ title: info.fixAvailable ? "Fix available" : "Vulnerable",
78
+ url: info.via?.[0]?.url,
79
+ });
80
+ }
81
+ return vulns;
82
+ }
83
+ }
84
+ catch { /* parsing failed */ }
85
+ return [];
86
+ }
87
+ }
88
+ // Secret patterns (HIGH severity)
89
+ const SECRET_PATTERNS = [
90
+ { pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"][a-zA-Z0-9_\-]{20,}['"]/gi, desc: "Hardcoded API key", remediation: "Move to environment variable" },
91
+ { pattern: /(?:secret|token|password|passwd|pwd)\s*[:=]\s*['"][^'"]{8,}['"]/gi, desc: "Hardcoded secret/password", remediation: "Use a secrets manager or env var" },
92
+ { pattern: /(?:sk|pk)[-_](?:live|test|prod)[a-zA-Z0-9_\-]{20,}/g, desc: "Stripe-style API key", remediation: "Move to environment variable" },
93
+ { pattern: /ghp_[a-zA-Z0-9]{36}/g, desc: "GitHub personal access token", remediation: "Use GITHUB_TOKEN env var" },
94
+ { pattern: /(?:AKIA|ASIA)[A-Z0-9]{16}/g, desc: "AWS access key ID", remediation: "Use AWS credentials file or IAM roles" },
95
+ { pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/g, desc: "Private key in source", remediation: "Move to secure key store" },
96
+ ];
97
+ // Homograph patterns (same as terminal-security-scanner)
98
+ const CONFUSABLE_RANGES = [
99
+ { start: 0x0400, end: 0x04ff, script: "Cyrillic" },
100
+ { start: 0x0370, end: 0x03ff, script: "Greek" },
101
+ { start: 0xff00, end: 0xffef, script: "Fullwidth" },
102
+ ];
103
+ const INVISIBLE_CHARS = [0x200b, 0x200c, 0x200d, 0x2060, 0xfeff];
104
+ // ANSI injection patterns
105
+ const ANSI_PATTERNS = [
106
+ { pattern: /\x1b\]52;[^\x07\x1b]*(?:\x07|\x1b\\)/g, severity: "HIGH", desc: "OSC 52 clipboard access" },
107
+ { pattern: /\x1b\](?:0|1|2);[^\x07\x1b]*(?:\x07|\x1b\\)/g, severity: "MEDIUM", desc: "OSC title spoofing" },
108
+ { pattern: /\x1bP[^\x1b]*\x1b\\/g, severity: "MEDIUM", desc: "DCS sequence" },
109
+ { pattern: /\\x1[bB]|\\033|\\e\[/g, severity: "LOW", desc: "Encoded ANSI escape" },
110
+ ];
111
+ // URL patterns
112
+ const URL_RISK_PATTERNS = [
113
+ { pattern: /data:\s*(?:text\/html|application\/javascript)[;,][^\s'")\]]+/gi, severity: "HIGH", desc: "Executable data: URL" },
114
+ { pattern: /javascript\s*:/gi, severity: "HIGH", desc: "javascript: URL scheme" },
115
+ { pattern: /https?:\/\/[^\s/]*xn--[^\s/]+/gi, severity: "MEDIUM", desc: "Punycode/IDN domain" },
116
+ { pattern: /https?:\/\/[^\s]*@[^\s]+/g, severity: "MEDIUM", desc: "URL with credential confusion (@)" },
117
+ ];
118
+ // Quality patterns
119
+ const QUALITY_PATTERNS = [
120
+ { pattern: /\bTODO\b/gi, severity: "LOW", desc: "TODO comment found" },
121
+ { pattern: /\bFIXME\b/gi, severity: "MEDIUM", desc: "FIXME comment found" },
122
+ { pattern: /\bHACK\b/gi, severity: "LOW", desc: "HACK comment found" },
123
+ { pattern: /\bconsole\.(log|warn|error|debug)\s*\(/g, severity: "LOW", desc: "Console statement (may be debug leftover)" },
124
+ { pattern: /debugger\s*;/g, severity: "MEDIUM", desc: "Debugger statement" },
125
+ ];
126
+ function analyzeCode(content, checks) {
127
+ const findings = [];
128
+ const lines = content.split("\n");
129
+ const runPatterns = (patterns, check, defaultSeverity) => {
130
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
131
+ for (const p of patterns) {
132
+ const regex = new RegExp(p.pattern.source, p.pattern.flags);
133
+ let match;
134
+ while ((match = regex.exec(lines[lineIdx])) !== null) {
135
+ findings.push({
136
+ check,
137
+ severity: p.severity ?? defaultSeverity,
138
+ line: lineIdx + 1,
139
+ column: match.index + 1,
140
+ description: p.desc,
141
+ remediation: p.remediation ?? `Review and address this ${check} finding`,
142
+ });
143
+ }
144
+ }
145
+ }
146
+ };
147
+ if (checks.includes("secrets")) {
148
+ runPatterns(SECRET_PATTERNS, "secrets", "HIGH");
149
+ }
150
+ if (checks.includes("homograph")) {
151
+ for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
152
+ for (let col = 0; col < lines[lineIdx].length; col++) {
153
+ const cp = lines[lineIdx].codePointAt(col);
154
+ if (cp === undefined)
155
+ continue;
156
+ if (INVISIBLE_CHARS.includes(cp)) {
157
+ findings.push({
158
+ check: "homograph",
159
+ severity: "HIGH",
160
+ line: lineIdx + 1,
161
+ column: col + 1,
162
+ description: `Invisible Unicode character (U+${cp.toString(16).toUpperCase().padStart(4, "0")})`,
163
+ remediation: "Remove invisible characters that could hide malicious content",
164
+ });
165
+ }
166
+ else {
167
+ for (const range of CONFUSABLE_RANGES) {
168
+ if (cp >= range.start && cp <= range.end) {
169
+ findings.push({
170
+ check: "homograph",
171
+ severity: "MEDIUM",
172
+ line: lineIdx + 1,
173
+ column: col + 1,
174
+ description: `${range.script} character (U+${cp.toString(16).toUpperCase().padStart(4, "0")}) may mimic ASCII`,
175
+ remediation: `Replace with ASCII equivalent`,
176
+ });
177
+ break;
178
+ }
179
+ }
180
+ }
181
+ if (cp > 0xffff)
182
+ col++; // Skip surrogate pair
183
+ }
184
+ }
185
+ }
186
+ if (checks.includes("ansi")) {
187
+ runPatterns(ANSI_PATTERNS, "ansi", "MEDIUM");
188
+ }
189
+ if (checks.includes("urls")) {
190
+ runPatterns(URL_RISK_PATTERNS, "urls", "MEDIUM");
191
+ }
192
+ if (checks.includes("quality")) {
193
+ runPatterns(QUALITY_PATTERNS, "quality", "LOW");
194
+ }
195
+ return findings;
196
+ }
197
+ // ─── Tools ───────────────────────────────────────────────────────────────────
198
+ export const securityTools = [
199
+ {
200
+ name: "scan_dependencies",
201
+ description: "Scan a project's dependency manifest for vulnerabilities and outdated packages. Auto-detects package.json, requirements.txt, Cargo.toml, and go.mod. Runs npm audit when available. Returns structured findings with severity and remediation guidance.",
202
+ inputSchema: {
203
+ type: "object",
204
+ properties: {
205
+ projectRoot: { type: "string", description: "Project root directory (default: current working directory)" },
206
+ packageFile: { type: "string", description: "Specific package file path to scan (overrides auto-detection)" },
207
+ },
208
+ },
209
+ handler: async (args) => {
210
+ const root = args.projectRoot || process.cwd();
211
+ // Auto-detect or use specified package file
212
+ const manifests = [];
213
+ if (args.packageFile) {
214
+ const ext = path.extname(args.packageFile);
215
+ manifests.push({
216
+ path: args.packageFile,
217
+ type: ext === ".txt" ? "pip" : args.packageFile.includes("Cargo") ? "cargo" : "npm",
218
+ });
219
+ }
220
+ else {
221
+ const candidates = [
222
+ { file: "package.json", type: "npm" },
223
+ { file: "requirements.txt", type: "pip" },
224
+ { file: "Cargo.toml", type: "cargo" },
225
+ { file: "go.mod", type: "go" },
226
+ ];
227
+ for (const c of candidates) {
228
+ const fullPath = path.join(root, c.file);
229
+ try {
230
+ if (fs.statSync(fullPath).isFile()) {
231
+ manifests.push({ path: fullPath, type: c.type });
232
+ }
233
+ }
234
+ catch { /* not found */ }
235
+ }
236
+ }
237
+ if (manifests.length === 0) {
238
+ return { error: true, message: "No package manifest found", scannedPaths: [root] };
239
+ }
240
+ const results = [];
241
+ for (const manifest of manifests) {
242
+ let content;
243
+ try {
244
+ content = fs.readFileSync(manifest.path, "utf-8");
245
+ }
246
+ catch {
247
+ continue;
248
+ }
249
+ let dependencies = [];
250
+ let vulnerabilities = [];
251
+ if (manifest.type === "npm") {
252
+ dependencies = parsePackageJson(content);
253
+ vulnerabilities = runNpmAudit(root);
254
+ }
255
+ else if (manifest.type === "pip") {
256
+ dependencies = parseRequirementsTxt(content);
257
+ }
258
+ results.push({
259
+ manifest: manifest.path,
260
+ type: manifest.type,
261
+ packages: dependencies.length,
262
+ dependencies,
263
+ vulnerabilities,
264
+ });
265
+ }
266
+ const totalPackages = results.reduce((s, r) => s + r.packages, 0);
267
+ const totalVulns = results.reduce((s, r) => s + r.vulnerabilities.length, 0);
268
+ const criticalVulns = results.flatMap((r) => r.vulnerabilities).filter((v) => v.severity === "critical").length;
269
+ const highVulns = results.flatMap((r) => r.vulnerabilities).filter((v) => v.severity === "high").length;
270
+ return {
271
+ projectRoot: root,
272
+ manifests: results.map((r) => r.manifest),
273
+ totalPackages,
274
+ totalVulnerabilities: totalVulns,
275
+ bySeverity: {
276
+ critical: criticalVulns,
277
+ high: highVulns,
278
+ moderate: results.flatMap((r) => r.vulnerabilities).filter((v) => v.severity === "moderate").length,
279
+ low: results.flatMap((r) => r.vulnerabilities).filter((v) => v.severity === "low").length,
280
+ },
281
+ vulnerabilities: results.flatMap((r) => r.vulnerabilities),
282
+ dependencies: results.flatMap((r) => r.dependencies),
283
+ summary: totalVulns === 0
284
+ ? `Scanned ${totalPackages} packages across ${results.length} manifest(s). No known vulnerabilities detected.`
285
+ : `Scanned ${totalPackages} packages. Found ${totalVulns} vulnerabilities (${criticalVulns} critical, ${highVulns} high). Run 'npm audit fix' to resolve.`,
286
+ };
287
+ },
288
+ },
289
+ {
290
+ name: "run_code_analysis",
291
+ description: "Static analysis on code or text content for security issues, secrets, homograph attacks, ANSI injections, suspicious URLs, and code quality. Returns structured findings with severity, line numbers, and remediation. Works on any text content — no file system access needed.",
292
+ inputSchema: {
293
+ type: "object",
294
+ properties: {
295
+ content: { type: "string", description: "The code or text content to analyze" },
296
+ checks: {
297
+ type: "array",
298
+ items: { type: "string", enum: ["security", "secrets", "homograph", "ansi", "urls", "quality", "all"] },
299
+ description: "Which checks to run (default: ['all'])",
300
+ },
301
+ filename: { type: "string", description: "Optional filename for context in findings" },
302
+ },
303
+ required: ["content"],
304
+ },
305
+ handler: async (args) => {
306
+ let checks = args.checks ?? ["all"];
307
+ // Expand "all" and "security"
308
+ if (checks.includes("all")) {
309
+ checks = ["secrets", "homograph", "ansi", "urls", "quality"];
310
+ }
311
+ else if (checks.includes("security")) {
312
+ checks = [...new Set([...checks.filter((c) => c !== "security"), "secrets", "homograph", "ansi", "urls"])];
313
+ }
314
+ const findings = analyzeCode(args.content, checks);
315
+ const fname = args.filename ?? "<input>";
316
+ // Add filename to findings
317
+ const withFile = findings.map((f) => ({ ...f, file: fname }));
318
+ const bySeverity = { HIGH: 0, MEDIUM: 0, LOW: 0, INFO: 0 };
319
+ for (const f of findings)
320
+ bySeverity[f.severity]++;
321
+ const byCheck = {};
322
+ for (const f of findings)
323
+ byCheck[f.check] = (byCheck[f.check] || 0) + 1;
324
+ return {
325
+ findings: withFile,
326
+ totalFindings: findings.length,
327
+ bySeverity,
328
+ byCheck,
329
+ checksRun: checks,
330
+ linesAnalyzed: args.content.split("\n").length,
331
+ summary: findings.length === 0
332
+ ? `No issues found across ${checks.length} check categories.`
333
+ : `Found ${findings.length} issues: ${bySeverity.HIGH} HIGH, ${bySeverity.MEDIUM} MEDIUM, ${bySeverity.LOW} LOW.`,
334
+ };
335
+ },
336
+ },
337
+ ];
338
+ //# sourceMappingURL=securityTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"securityTools.js","sourceRoot":"","sources":["../../src/tools/securityTools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "nodebench-mcp",
3
- "version": "2.0.0",
4
- "description": "Make AI agents catch the bugs they normally ship. Structured research, risk assessment, 3-layer testing, quality gates, and persistent knowledge that compounds across tasks. Benchmarked: 13 issues caught, 26 blind spots prevented, 0 shipped to production. 75 MCP tools including parallel agent coordination for Claude Code subagents.",
3
+ "version": "2.2.0",
4
+ "description": "Make AI agents catch the bugs they normally ship. 80 MCP tools: structured research, 3-layer testing, quality gates, persistent knowledge, LLM calling, and security analysis. v2.2: +5 'doer' tools call_llm, extract_structured_data, diff_outputs, scan_dependencies, run_code_analysis. --preset lite (32), core (57), or full (80). Benchmarked: 13 issues caught, 26 blind spots prevented.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "nodebench-mcp": "./dist/index.js"
@@ -45,7 +45,13 @@
45
45
  "github",
46
46
  "vision",
47
47
  "verification",
48
- "sqlite"
48
+ "sqlite",
49
+ "quality-gates",
50
+ "parallel-agents",
51
+ "toolset-gating",
52
+ "eval",
53
+ "qa-automation",
54
+ "agentic"
49
55
  ],
50
56
  "repository": {
51
57
  "type": "git",