@monoes/monomindcli 1.15.4 → 1.15.6
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/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +7 -0
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-tools/coherence/causal-infer.d.ts +15 -0
- package/dist/src/mcp-tools/coherence/causal-infer.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/causal-infer.js +347 -0
- package/dist/src/mcp-tools/coherence/causal-infer.js.map +1 -0
- package/dist/src/mcp-tools/coherence/coherence-check.d.ts +15 -0
- package/dist/src/mcp-tools/coherence/coherence-check.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/coherence-check.js +206 -0
- package/dist/src/mcp-tools/coherence/coherence-check.js.map +1 -0
- package/dist/src/mcp-tools/coherence/consensus-verify.d.ts +15 -0
- package/dist/src/mcp-tools/coherence/consensus-verify.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/consensus-verify.js +303 -0
- package/dist/src/mcp-tools/coherence/consensus-verify.js.map +1 -0
- package/dist/src/mcp-tools/coherence/memory-gate.d.ts +15 -0
- package/dist/src/mcp-tools/coherence/memory-gate.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/memory-gate.js +266 -0
- package/dist/src/mcp-tools/coherence/memory-gate.js.map +1 -0
- package/dist/src/mcp-tools/coherence/quantum-topology.d.ts +15 -0
- package/dist/src/mcp-tools/coherence/quantum-topology.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/quantum-topology.js +406 -0
- package/dist/src/mcp-tools/coherence/quantum-topology.js.map +1 -0
- package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts +15 -0
- package/dist/src/mcp-tools/coherence/spectral-analyze.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/spectral-analyze.js +293 -0
- package/dist/src/mcp-tools/coherence/spectral-analyze.js.map +1 -0
- package/dist/src/mcp-tools/coherence/types.d.ts +277 -0
- package/dist/src/mcp-tools/coherence/types.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence/types.js +159 -0
- package/dist/src/mcp-tools/coherence/types.js.map +1 -0
- package/dist/src/mcp-tools/coherence-tools.d.ts +9 -0
- package/dist/src/mcp-tools/coherence-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/coherence-tools.js +25 -0
- package/dist/src/mcp-tools/coherence-tools.js.map +1 -0
- package/dist/src/mcp-tools/quality/chaos-resilience/chaos-inject.d.ts +163 -0
- package/dist/src/mcp-tools/quality/chaos-resilience/chaos-inject.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/chaos-resilience/chaos-inject.js +414 -0
- package/dist/src/mcp-tools/quality/chaos-resilience/chaos-inject.js.map +1 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/analyze-coverage.d.ts +128 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/analyze-coverage.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/analyze-coverage.js +375 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/analyze-coverage.js.map +1 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.d.ts +161 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js +423 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/prioritize-gaps.js.map +1 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/track-trends.d.ts +165 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/track-trends.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/track-trends.js +395 -0
- package/dist/src/mcp-tools/quality/coverage-analysis/track-trends.js.map +1 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/analyze-root-cause.d.ts +165 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/analyze-root-cause.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/analyze-root-cause.js +508 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/analyze-root-cause.js.map +1 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/find-similar-defects.d.ts +147 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/find-similar-defects.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/find-similar-defects.js +391 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/find-similar-defects.js.map +1 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/predict-defects.d.ts +147 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/predict-defects.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/predict-defects.js +422 -0
- package/dist/src/mcp-tools/quality/defect-intelligence/predict-defects.js.map +1 -0
- package/dist/src/mcp-tools/quality/quality-assessment/assess-readiness.d.ts +185 -0
- package/dist/src/mcp-tools/quality/quality-assessment/assess-readiness.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/quality-assessment/assess-readiness.js +437 -0
- package/dist/src/mcp-tools/quality/quality-assessment/assess-readiness.js.map +1 -0
- package/dist/src/mcp-tools/quality/quality-assessment/calculate-risk.d.ts +166 -0
- package/dist/src/mcp-tools/quality/quality-assessment/calculate-risk.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/quality-assessment/calculate-risk.js +410 -0
- package/dist/src/mcp-tools/quality/quality-assessment/calculate-risk.js.map +1 -0
- package/dist/src/mcp-tools/quality/quality-assessment/evaluate-quality-gate.d.ts +201 -0
- package/dist/src/mcp-tools/quality/quality-assessment/evaluate-quality-gate.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/quality-assessment/evaluate-quality-gate.js +363 -0
- package/dist/src/mcp-tools/quality/quality-assessment/evaluate-quality-gate.js.map +1 -0
- package/dist/src/mcp-tools/quality/security-compliance/audit-compliance.d.ts +166 -0
- package/dist/src/mcp-tools/quality/security-compliance/audit-compliance.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/security-compliance/audit-compliance.js +394 -0
- package/dist/src/mcp-tools/quality/security-compliance/audit-compliance.js.map +1 -0
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts +129 -0
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js +383 -0
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js.map +1 -0
- package/dist/src/mcp-tools/quality/security-compliance/security-scan.d.ts +171 -0
- package/dist/src/mcp-tools/quality/security-compliance/security-scan.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/security-compliance/security-scan.js +476 -0
- package/dist/src/mcp-tools/quality/security-compliance/security-scan.js.map +1 -0
- package/dist/src/mcp-tools/quality/test-generation/generate-tests.d.ts +147 -0
- package/dist/src/mcp-tools/quality/test-generation/generate-tests.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/test-generation/generate-tests.js +400 -0
- package/dist/src/mcp-tools/quality/test-generation/generate-tests.js.map +1 -0
- package/dist/src/mcp-tools/quality/test-generation/suggest-tests.d.ts +145 -0
- package/dist/src/mcp-tools/quality/test-generation/suggest-tests.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/test-generation/suggest-tests.js +328 -0
- package/dist/src/mcp-tools/quality/test-generation/suggest-tests.js.map +1 -0
- package/dist/src/mcp-tools/quality/test-generation/tdd-cycle.d.ts +126 -0
- package/dist/src/mcp-tools/quality/test-generation/tdd-cycle.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality/test-generation/tdd-cycle.js +348 -0
- package/dist/src/mcp-tools/quality/test-generation/tdd-cycle.js.map +1 -0
- package/dist/src/mcp-tools/quality-tools.d.ts +9 -0
- package/dist/src/mcp-tools/quality-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/quality-tools.js +308 -0
- package/dist/src/mcp-tools/quality-tools.js.map +1 -0
- package/dist/src/plugins/store/discovery.d.ts.map +1 -1
- package/dist/src/plugins/store/discovery.js +4 -124
- package/dist/src/plugins/store/discovery.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/scripts/publish-registry.ts +0 -2
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* detect-secrets.ts - Secret detection MCP tool handler
|
|
3
|
+
*
|
|
4
|
+
* Detects secrets, API keys, passwords, and other sensitive data in code
|
|
5
|
+
* using pattern matching and entropy analysis.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { readFileSync, statSync, existsSync, readdirSync } from 'node:fs';
|
|
9
|
+
import { join, extname, relative } from 'node:path';
|
|
10
|
+
// Input schema for detect-secrets tool
|
|
11
|
+
export const DetectSecretsInputSchema = z.object({
|
|
12
|
+
targetPath: z.string().describe('Path to scan for secrets'),
|
|
13
|
+
secretTypes: z
|
|
14
|
+
.array(z.enum([
|
|
15
|
+
'api-key',
|
|
16
|
+
'password',
|
|
17
|
+
'private-key',
|
|
18
|
+
'token',
|
|
19
|
+
'connection-string',
|
|
20
|
+
'certificate',
|
|
21
|
+
'aws-key',
|
|
22
|
+
'aws-secret',
|
|
23
|
+
'gcp-key',
|
|
24
|
+
'azure-key',
|
|
25
|
+
'generic',
|
|
26
|
+
]))
|
|
27
|
+
.default(['api-key', 'password', 'private-key', 'token', 'aws-key', 'aws-secret'])
|
|
28
|
+
.describe('Types of secrets to detect'),
|
|
29
|
+
excludePatterns: z
|
|
30
|
+
.array(z.string())
|
|
31
|
+
.default(['*.test.ts', '*.spec.ts', 'node_modules', '.git'])
|
|
32
|
+
.describe('File patterns to exclude'),
|
|
33
|
+
includeEntropy: z.boolean().default(true).describe('Use entropy analysis for detection'),
|
|
34
|
+
entropyThreshold: z.number().min(0).max(8).default(4.5).describe('Entropy threshold (higher = stricter)'),
|
|
35
|
+
verifySecrets: z.boolean().default(false).describe('Attempt to verify if secrets are active'),
|
|
36
|
+
scanHistory: z.boolean().default(false).describe('Scan git history for secrets'),
|
|
37
|
+
});
|
|
38
|
+
// Secret patterns
|
|
39
|
+
const SECRET_PATTERNS = {
|
|
40
|
+
'api-key': {
|
|
41
|
+
pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"][a-zA-Z0-9_\-]{16,}['"]/gi,
|
|
42
|
+
severity: 'high',
|
|
43
|
+
description: 'API key detected',
|
|
44
|
+
},
|
|
45
|
+
'aws-key': {
|
|
46
|
+
pattern: /(?:AKIA|ABIA|ACCA|ASIA)[0-9A-Z]{16}/g,
|
|
47
|
+
severity: 'critical',
|
|
48
|
+
description: 'AWS access key detected',
|
|
49
|
+
},
|
|
50
|
+
'aws-secret': {
|
|
51
|
+
pattern: /(?:aws[_-]?secret|secret[_-]?access)\s*[:=]\s*['"][a-zA-Z0-9/+=]{40}['"]/gi,
|
|
52
|
+
severity: 'critical',
|
|
53
|
+
description: 'AWS secret key detected',
|
|
54
|
+
},
|
|
55
|
+
'private-key': {
|
|
56
|
+
pattern: /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/g,
|
|
57
|
+
severity: 'critical',
|
|
58
|
+
description: 'Private key detected',
|
|
59
|
+
},
|
|
60
|
+
password: {
|
|
61
|
+
pattern: /(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}['"]/gi,
|
|
62
|
+
severity: 'high',
|
|
63
|
+
description: 'Hardcoded password detected',
|
|
64
|
+
},
|
|
65
|
+
token: {
|
|
66
|
+
pattern: /(?:bearer|token|auth|jwt)\s*[:=]\s*['"][a-zA-Z0-9_\-.]{20,}['"]/gi,
|
|
67
|
+
severity: 'high',
|
|
68
|
+
description: 'Authentication token detected',
|
|
69
|
+
},
|
|
70
|
+
'connection-string': {
|
|
71
|
+
pattern: /(?:mongodb|postgres|mysql|redis):\/\/[^'"\\s]+:[^'"\\s]+@/gi,
|
|
72
|
+
severity: 'critical',
|
|
73
|
+
description: 'Database connection string with credentials',
|
|
74
|
+
},
|
|
75
|
+
'gcp-key': {
|
|
76
|
+
pattern: /"type":\s*"service_account"/g,
|
|
77
|
+
severity: 'critical',
|
|
78
|
+
description: 'GCP service account key detected',
|
|
79
|
+
},
|
|
80
|
+
'azure-key': {
|
|
81
|
+
pattern: /(?:azure|microsoft)[_-]?(?:key|secret|token)\s*[:=]\s*['"][a-zA-Z0-9_\-]{32,}['"]/gi,
|
|
82
|
+
severity: 'critical',
|
|
83
|
+
description: 'Azure credential detected',
|
|
84
|
+
},
|
|
85
|
+
generic: {
|
|
86
|
+
pattern: /(?:secret|credential|key)\s*[:=]\s*['"][a-zA-Z0-9_\-]{12,}['"]/gi,
|
|
87
|
+
severity: 'medium',
|
|
88
|
+
description: 'Potential secret detected',
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* MCP Tool Handler for detect-secrets
|
|
93
|
+
*/
|
|
94
|
+
export async function handler(input, context) {
|
|
95
|
+
const startTime = Date.now();
|
|
96
|
+
try {
|
|
97
|
+
// Validate input
|
|
98
|
+
const validatedInput = DetectSecretsInputSchema.parse(input);
|
|
99
|
+
// Scan for secrets
|
|
100
|
+
const { findings, scanStats } = await scanForSecrets(validatedInput.targetPath, validatedInput.secretTypes, validatedInput.excludePatterns, validatedInput.includeEntropy, validatedInput.entropyThreshold);
|
|
101
|
+
// Calculate summary
|
|
102
|
+
const summary = calculateSummary(findings);
|
|
103
|
+
// Group by type
|
|
104
|
+
const byType = groupByType(findings);
|
|
105
|
+
// Generate recommendations
|
|
106
|
+
const recommendations = generateRecommendations(findings, byType);
|
|
107
|
+
// Build result
|
|
108
|
+
const result = {
|
|
109
|
+
success: true,
|
|
110
|
+
summary,
|
|
111
|
+
findings,
|
|
112
|
+
byType,
|
|
113
|
+
recommendations,
|
|
114
|
+
metadata: {
|
|
115
|
+
scannedAt: new Date().toISOString(),
|
|
116
|
+
durationMs: Date.now() - startTime,
|
|
117
|
+
filesScanned: scanStats.filesScanned,
|
|
118
|
+
linesScanned: scanStats.linesScanned,
|
|
119
|
+
patternsUsed: validatedInput.secretTypes.length,
|
|
120
|
+
entropyEnabled: validatedInput.includeEntropy,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
return {
|
|
124
|
+
content: [
|
|
125
|
+
{
|
|
126
|
+
type: 'text',
|
|
127
|
+
text: JSON.stringify(result, null, 2),
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
134
|
+
return {
|
|
135
|
+
content: [
|
|
136
|
+
{
|
|
137
|
+
type: 'text',
|
|
138
|
+
text: JSON.stringify({
|
|
139
|
+
success: false,
|
|
140
|
+
error: errorMessage,
|
|
141
|
+
findings: [],
|
|
142
|
+
metadata: {
|
|
143
|
+
scannedAt: new Date().toISOString(),
|
|
144
|
+
durationMs: Date.now() - startTime,
|
|
145
|
+
},
|
|
146
|
+
}, null, 2),
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const SCANNABLE_EXTENSIONS = new Set([
|
|
153
|
+
'.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',
|
|
154
|
+
'.json', '.yaml', '.yml', '.env', '.toml', '.ini',
|
|
155
|
+
'.sh', '.bash', '.zsh', '.py', '.rb', '.go',
|
|
156
|
+
]);
|
|
157
|
+
function collectFiles(targetPath, excludePatterns) {
|
|
158
|
+
if (!existsSync(targetPath))
|
|
159
|
+
return [];
|
|
160
|
+
const stat = statSync(targetPath);
|
|
161
|
+
if (stat.isFile())
|
|
162
|
+
return [targetPath];
|
|
163
|
+
const results = [];
|
|
164
|
+
function walk(dir) {
|
|
165
|
+
let entries;
|
|
166
|
+
try {
|
|
167
|
+
entries = readdirSync(dir);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
for (const entry of entries) {
|
|
173
|
+
const fullPath = join(dir, entry);
|
|
174
|
+
const relPath = relative(targetPath, fullPath);
|
|
175
|
+
if (excludePatterns.some((p) => relPath.includes(p.replace('*.', '')) || entry === p))
|
|
176
|
+
continue;
|
|
177
|
+
let entryStat;
|
|
178
|
+
try {
|
|
179
|
+
entryStat = statSync(fullPath);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
if (entryStat.isDirectory()) {
|
|
185
|
+
walk(fullPath);
|
|
186
|
+
}
|
|
187
|
+
else if (SCANNABLE_EXTENSIONS.has(extname(entry).toLowerCase())) {
|
|
188
|
+
results.push(fullPath);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
walk(targetPath);
|
|
193
|
+
return results;
|
|
194
|
+
}
|
|
195
|
+
function shannonEntropy(value) {
|
|
196
|
+
const freq = {};
|
|
197
|
+
for (const ch of value) {
|
|
198
|
+
freq[ch] = (freq[ch] ?? 0) + 1;
|
|
199
|
+
}
|
|
200
|
+
let entropy = 0;
|
|
201
|
+
for (const count of Object.values(freq)) {
|
|
202
|
+
const p = count / value.length;
|
|
203
|
+
entropy -= p * Math.log2(p);
|
|
204
|
+
}
|
|
205
|
+
return entropy;
|
|
206
|
+
}
|
|
207
|
+
function maskValue(raw) {
|
|
208
|
+
if (raw.length <= 8)
|
|
209
|
+
return '****';
|
|
210
|
+
return raw.slice(0, 4) + '*'.repeat(Math.max(4, Math.min(raw.length - 8, 20))) + raw.slice(-4);
|
|
211
|
+
}
|
|
212
|
+
async function scanForSecrets(targetPath, secretTypes, excludePatterns, includeEntropy, entropyThreshold) {
|
|
213
|
+
const findings = [];
|
|
214
|
+
const files = collectFiles(targetPath, excludePatterns);
|
|
215
|
+
let totalLines = 0;
|
|
216
|
+
let findingIndex = 0;
|
|
217
|
+
const activePatterns = secretTypes
|
|
218
|
+
.map((t) => ({ type: t, ...(SECRET_PATTERNS[t] ?? SECRET_PATTERNS.generic) }));
|
|
219
|
+
for (const filePath of files) {
|
|
220
|
+
let content;
|
|
221
|
+
try {
|
|
222
|
+
content = readFileSync(filePath, 'utf8');
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const lines = content.split('\n');
|
|
228
|
+
totalLines += lines.length;
|
|
229
|
+
for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
|
|
230
|
+
const line = lines[lineIdx];
|
|
231
|
+
for (const patternInfo of activePatterns) {
|
|
232
|
+
let match;
|
|
233
|
+
const regex = new RegExp(patternInfo.pattern.source, patternInfo.pattern.flags);
|
|
234
|
+
while ((match = regex.exec(line)) !== null) {
|
|
235
|
+
const rawValue = match[0];
|
|
236
|
+
const entropy = shannonEntropy(rawValue);
|
|
237
|
+
if (includeEntropy && entropy < entropyThreshold)
|
|
238
|
+
continue;
|
|
239
|
+
findings.push({
|
|
240
|
+
id: `SEC-${patternInfo.type}-${findingIndex++}`,
|
|
241
|
+
type: patternInfo.type,
|
|
242
|
+
severity: patternInfo.severity,
|
|
243
|
+
location: {
|
|
244
|
+
file: filePath,
|
|
245
|
+
line: lineIdx + 1,
|
|
246
|
+
column: match.index + 1,
|
|
247
|
+
context: line.trim().slice(0, 120),
|
|
248
|
+
masked: maskValue(rawValue),
|
|
249
|
+
},
|
|
250
|
+
pattern: patternInfo.description,
|
|
251
|
+
entropy: Math.round(entropy * 100) / 100,
|
|
252
|
+
verified: null,
|
|
253
|
+
active: null,
|
|
254
|
+
exposureRisk: getExposureRisk(patternInfo.severity),
|
|
255
|
+
remediation: getRemediation(patternInfo.type),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
findings.sort((a, b) => {
|
|
262
|
+
const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
263
|
+
return severityOrder[a.severity] - severityOrder[b.severity];
|
|
264
|
+
});
|
|
265
|
+
return { findings, scanStats: { filesScanned: files.length, linesScanned: totalLines } };
|
|
266
|
+
}
|
|
267
|
+
function getExposureRisk(severity) {
|
|
268
|
+
const risks = {
|
|
269
|
+
critical: 'High risk - immediate unauthorized access possible',
|
|
270
|
+
high: 'Significant risk - sensitive data exposure likely',
|
|
271
|
+
medium: 'Moderate risk - potential security issue',
|
|
272
|
+
low: 'Low risk - minor exposure concern',
|
|
273
|
+
};
|
|
274
|
+
return risks[severity] || 'Unknown risk level';
|
|
275
|
+
}
|
|
276
|
+
function getRemediation(type) {
|
|
277
|
+
const remediations = {
|
|
278
|
+
'api-key': 'Move API key to environment variable or secrets manager',
|
|
279
|
+
'aws-key': 'Rotate AWS credentials immediately and use IAM roles',
|
|
280
|
+
'aws-secret': 'Rotate AWS credentials and use AWS Secrets Manager',
|
|
281
|
+
'private-key': 'Remove private key from code, store in secure vault',
|
|
282
|
+
password: 'Use environment variables or secrets manager',
|
|
283
|
+
token: 'Use secure token storage, implement token rotation',
|
|
284
|
+
'connection-string': 'Use environment variables for connection strings',
|
|
285
|
+
'gcp-key': 'Use workload identity instead of service account keys',
|
|
286
|
+
'azure-key': 'Use Azure Key Vault for credential management',
|
|
287
|
+
generic: 'Review and move to secure configuration',
|
|
288
|
+
};
|
|
289
|
+
return remediations[type] || 'Remove secret from code and use secure storage';
|
|
290
|
+
}
|
|
291
|
+
function calculateSummary(findings) {
|
|
292
|
+
const counts = { critical: 0, high: 0, medium: 0, low: 0 };
|
|
293
|
+
for (const finding of findings) {
|
|
294
|
+
counts[finding.severity]++;
|
|
295
|
+
}
|
|
296
|
+
const files = new Set(findings.map((f) => f.location.file));
|
|
297
|
+
const verifiedCount = findings.filter((f) => f.verified).length;
|
|
298
|
+
// Calculate risk score
|
|
299
|
+
const riskScore = Math.max(0, 100 - (counts.critical * 25 + counts.high * 15 + counts.medium * 5 + counts.low * 2));
|
|
300
|
+
return {
|
|
301
|
+
totalFindings: findings.length,
|
|
302
|
+
criticalCount: counts.critical,
|
|
303
|
+
highCount: counts.high,
|
|
304
|
+
mediumCount: counts.medium,
|
|
305
|
+
lowCount: counts.low,
|
|
306
|
+
verifiedCount,
|
|
307
|
+
filesAffected: files.size,
|
|
308
|
+
riskScore,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function groupByType(findings) {
|
|
312
|
+
const groups = new Map();
|
|
313
|
+
for (const finding of findings) {
|
|
314
|
+
if (!groups.has(finding.type)) {
|
|
315
|
+
groups.set(finding.type, []);
|
|
316
|
+
}
|
|
317
|
+
groups.get(finding.type).push(finding);
|
|
318
|
+
}
|
|
319
|
+
return Array.from(groups.entries()).map(([type, typeFindings]) => ({
|
|
320
|
+
type,
|
|
321
|
+
count: typeFindings.length,
|
|
322
|
+
severity: typeFindings[0].severity,
|
|
323
|
+
files: [...new Set(typeFindings.map((f) => f.location.file))],
|
|
324
|
+
}));
|
|
325
|
+
}
|
|
326
|
+
function generateRecommendations(findings, byType) {
|
|
327
|
+
const recommendations = [];
|
|
328
|
+
let priority = 1;
|
|
329
|
+
// Critical secrets first
|
|
330
|
+
const criticalFindings = findings.filter((f) => f.severity === 'critical');
|
|
331
|
+
if (criticalFindings.length > 0) {
|
|
332
|
+
recommendations.push({
|
|
333
|
+
priority: priority++,
|
|
334
|
+
action: 'Immediately rotate all critical credentials (AWS keys, private keys)',
|
|
335
|
+
affectedSecrets: criticalFindings.map((f) => f.id),
|
|
336
|
+
effort: 'high',
|
|
337
|
+
automatable: false,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
// Active secrets
|
|
341
|
+
const activeFindings = findings.filter((f) => f.active);
|
|
342
|
+
if (activeFindings.length > 0) {
|
|
343
|
+
recommendations.push({
|
|
344
|
+
priority: priority++,
|
|
345
|
+
action: 'Revoke active secrets and regenerate with proper storage',
|
|
346
|
+
affectedSecrets: activeFindings.map((f) => f.id),
|
|
347
|
+
effort: 'medium',
|
|
348
|
+
automatable: false,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
// General recommendations
|
|
352
|
+
recommendations.push({
|
|
353
|
+
priority: priority++,
|
|
354
|
+
action: 'Implement pre-commit hooks to prevent future secret commits',
|
|
355
|
+
affectedSecrets: findings.map((f) => f.id),
|
|
356
|
+
effort: 'low',
|
|
357
|
+
automatable: true,
|
|
358
|
+
}, {
|
|
359
|
+
priority: priority++,
|
|
360
|
+
action: 'Set up secrets management solution (HashiCorp Vault, AWS Secrets Manager)',
|
|
361
|
+
affectedSecrets: findings.map((f) => f.id),
|
|
362
|
+
effort: 'medium',
|
|
363
|
+
automatable: true,
|
|
364
|
+
}, {
|
|
365
|
+
priority: priority++,
|
|
366
|
+
action: 'Audit git history for exposed secrets using git-secrets or truffleHog',
|
|
367
|
+
affectedSecrets: [],
|
|
368
|
+
effort: 'low',
|
|
369
|
+
automatable: true,
|
|
370
|
+
});
|
|
371
|
+
return recommendations;
|
|
372
|
+
}
|
|
373
|
+
// Export tool definition for MCP registration
|
|
374
|
+
export const toolDefinition = {
|
|
375
|
+
name: 'aqe/detect-secrets',
|
|
376
|
+
description: 'Detect secrets, API keys, and sensitive data in code',
|
|
377
|
+
category: 'security-compliance',
|
|
378
|
+
version: '3.2.3',
|
|
379
|
+
inputSchema: DetectSecretsInputSchema,
|
|
380
|
+
handler,
|
|
381
|
+
};
|
|
382
|
+
export default toolDefinition;
|
|
383
|
+
//# sourceMappingURL=detect-secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-secrets.js","sourceRoot":"","sources":["../../../../../src/mcp-tools/quality/security-compliance/detect-secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* security-scan.ts - SAST/DAST security scanning MCP tool handler
|
|
3
|
+
*
|
|
4
|
+
* Performs static (SAST) and dynamic (DAST) security analysis to identify
|
|
5
|
+
* vulnerabilities, security weaknesses, and compliance issues.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
export declare const SecurityScanInputSchema: z.ZodObject<{
|
|
9
|
+
targetPath: z.ZodString;
|
|
10
|
+
scanType: z.ZodDefault<z.ZodEnum<{
|
|
11
|
+
both: "both";
|
|
12
|
+
sast: "sast";
|
|
13
|
+
dast: "dast";
|
|
14
|
+
}>>;
|
|
15
|
+
compliance: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
16
|
+
"owasp-top-10": "owasp-top-10";
|
|
17
|
+
"sans-25": "sans-25";
|
|
18
|
+
"pci-dss": "pci-dss";
|
|
19
|
+
hipaa: "hipaa";
|
|
20
|
+
gdpr: "gdpr";
|
|
21
|
+
soc2: "soc2";
|
|
22
|
+
}>>>;
|
|
23
|
+
severity: z.ZodDefault<z.ZodEnum<{
|
|
24
|
+
critical: "critical";
|
|
25
|
+
high: "high";
|
|
26
|
+
all: "all";
|
|
27
|
+
medium: "medium";
|
|
28
|
+
}>>;
|
|
29
|
+
includeRemediation: z.ZodDefault<z.ZodBoolean>;
|
|
30
|
+
scanDepth: z.ZodDefault<z.ZodEnum<{
|
|
31
|
+
standard: "standard";
|
|
32
|
+
deep: "deep";
|
|
33
|
+
quick: "quick";
|
|
34
|
+
}>>;
|
|
35
|
+
excludePatterns: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
36
|
+
targetUrl: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, z.core.$strip>;
|
|
38
|
+
export type SecurityScanInput = z.infer<typeof SecurityScanInputSchema>;
|
|
39
|
+
export interface SecurityScanOutput {
|
|
40
|
+
success: boolean;
|
|
41
|
+
summary: ScanSummary;
|
|
42
|
+
findings: SecurityFinding[];
|
|
43
|
+
complianceResults: ComplianceResult[];
|
|
44
|
+
metrics: SecurityMetrics;
|
|
45
|
+
recommendations: SecurityRecommendation[];
|
|
46
|
+
metadata: ScanMetadata;
|
|
47
|
+
}
|
|
48
|
+
export interface ScanSummary {
|
|
49
|
+
totalFindings: number;
|
|
50
|
+
criticalCount: number;
|
|
51
|
+
highCount: number;
|
|
52
|
+
mediumCount: number;
|
|
53
|
+
lowCount: number;
|
|
54
|
+
infoCount: number;
|
|
55
|
+
passedChecks: number;
|
|
56
|
+
failedChecks: number;
|
|
57
|
+
riskScore: number;
|
|
58
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F';
|
|
59
|
+
}
|
|
60
|
+
export interface SecurityFinding {
|
|
61
|
+
id: string;
|
|
62
|
+
title: string;
|
|
63
|
+
description: string;
|
|
64
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
65
|
+
category: string;
|
|
66
|
+
cweId?: string;
|
|
67
|
+
cvss?: number;
|
|
68
|
+
location: FindingLocation;
|
|
69
|
+
evidence: string;
|
|
70
|
+
remediation?: RemediationGuidance;
|
|
71
|
+
compliance: string[];
|
|
72
|
+
falsePositiveLikelihood: 'low' | 'medium' | 'high';
|
|
73
|
+
}
|
|
74
|
+
export interface FindingLocation {
|
|
75
|
+
file: string;
|
|
76
|
+
startLine: number;
|
|
77
|
+
endLine: number;
|
|
78
|
+
column?: number;
|
|
79
|
+
codeSnippet?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface RemediationGuidance {
|
|
82
|
+
description: string;
|
|
83
|
+
steps: string[];
|
|
84
|
+
codeExample?: string;
|
|
85
|
+
effort: 'low' | 'medium' | 'high';
|
|
86
|
+
priority: number;
|
|
87
|
+
}
|
|
88
|
+
export interface ComplianceResult {
|
|
89
|
+
framework: string;
|
|
90
|
+
status: 'compliant' | 'partial' | 'non-compliant';
|
|
91
|
+
score: number;
|
|
92
|
+
passedRules: number;
|
|
93
|
+
failedRules: number;
|
|
94
|
+
findings: string[];
|
|
95
|
+
}
|
|
96
|
+
export interface SecurityMetrics {
|
|
97
|
+
vulnerabilityDensity: number;
|
|
98
|
+
avgSeverity: number;
|
|
99
|
+
owaspCoverage: number;
|
|
100
|
+
fixRate: number;
|
|
101
|
+
mttr: string;
|
|
102
|
+
}
|
|
103
|
+
export interface SecurityRecommendation {
|
|
104
|
+
priority: number;
|
|
105
|
+
category: string;
|
|
106
|
+
title: string;
|
|
107
|
+
description: string;
|
|
108
|
+
impact: 'low' | 'medium' | 'high';
|
|
109
|
+
effort: 'low' | 'medium' | 'high';
|
|
110
|
+
affectedFindings: string[];
|
|
111
|
+
}
|
|
112
|
+
export interface ScanMetadata {
|
|
113
|
+
scannedAt: string;
|
|
114
|
+
durationMs: number;
|
|
115
|
+
scanType: string;
|
|
116
|
+
filesScanned: number;
|
|
117
|
+
linesScanned: number;
|
|
118
|
+
rulesExecuted: number;
|
|
119
|
+
engineVersion: string;
|
|
120
|
+
}
|
|
121
|
+
export interface ToolContext {
|
|
122
|
+
get<T>(key: string): T | undefined;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* MCP Tool Handler for security-scan
|
|
126
|
+
*/
|
|
127
|
+
export declare function handler(input: SecurityScanInput, context: ToolContext): Promise<{
|
|
128
|
+
content: Array<{
|
|
129
|
+
type: 'text';
|
|
130
|
+
text: string;
|
|
131
|
+
}>;
|
|
132
|
+
}>;
|
|
133
|
+
export declare const toolDefinition: {
|
|
134
|
+
name: string;
|
|
135
|
+
description: string;
|
|
136
|
+
category: string;
|
|
137
|
+
version: string;
|
|
138
|
+
inputSchema: z.ZodObject<{
|
|
139
|
+
targetPath: z.ZodString;
|
|
140
|
+
scanType: z.ZodDefault<z.ZodEnum<{
|
|
141
|
+
both: "both";
|
|
142
|
+
sast: "sast";
|
|
143
|
+
dast: "dast";
|
|
144
|
+
}>>;
|
|
145
|
+
compliance: z.ZodDefault<z.ZodArray<z.ZodEnum<{
|
|
146
|
+
"owasp-top-10": "owasp-top-10";
|
|
147
|
+
"sans-25": "sans-25";
|
|
148
|
+
"pci-dss": "pci-dss";
|
|
149
|
+
hipaa: "hipaa";
|
|
150
|
+
gdpr: "gdpr";
|
|
151
|
+
soc2: "soc2";
|
|
152
|
+
}>>>;
|
|
153
|
+
severity: z.ZodDefault<z.ZodEnum<{
|
|
154
|
+
critical: "critical";
|
|
155
|
+
high: "high";
|
|
156
|
+
all: "all";
|
|
157
|
+
medium: "medium";
|
|
158
|
+
}>>;
|
|
159
|
+
includeRemediation: z.ZodDefault<z.ZodBoolean>;
|
|
160
|
+
scanDepth: z.ZodDefault<z.ZodEnum<{
|
|
161
|
+
standard: "standard";
|
|
162
|
+
deep: "deep";
|
|
163
|
+
quick: "quick";
|
|
164
|
+
}>>;
|
|
165
|
+
excludePatterns: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
166
|
+
targetUrl: z.ZodOptional<z.ZodString>;
|
|
167
|
+
}, z.core.$strip>;
|
|
168
|
+
handler: typeof handler;
|
|
169
|
+
};
|
|
170
|
+
export default toolDefinition;
|
|
171
|
+
//# sourceMappingURL=security-scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-scan.d.ts","sourceRoot":"","sources":["../../../../../src/mcp-tools/quality/security-compliance/security-scan.ts"],"names":[],"mappings":"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"}
|