@indicated/vibeguard 1.4.0 → 1.5.1
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/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +296 -47
- package/dist/mcp/server.js.map +1 -1
- package/dist/scanner/rules/definitions.js +2 -2
- package/dist/scanner/rules/definitions.js.map +1 -1
- package/package.json +1 -1
- package/src/mcp/server.ts +339 -51
- package/src/scanner/rules/definitions.ts +2 -2
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA0TA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA+OpD"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -38,6 +38,7 @@ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
|
38
38
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
39
39
|
const zod_1 = require("zod");
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
41
42
|
const scanner_1 = require("../scanner");
|
|
42
43
|
const definitions_1 = require("../scanner/rules/definitions");
|
|
43
44
|
const license_1 = require("../api/license");
|
|
@@ -58,13 +59,266 @@ function calculateGrade(counts) {
|
|
|
58
59
|
return 'A';
|
|
59
60
|
return 'A+';
|
|
60
61
|
}
|
|
62
|
+
function getCodeSnippet(filePath, line, contextLines = 3) {
|
|
63
|
+
try {
|
|
64
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
65
|
+
const lines = content.split('\n');
|
|
66
|
+
const startLine = Math.max(0, line - contextLines - 1);
|
|
67
|
+
const endLine = Math.min(lines.length, line + contextLines);
|
|
68
|
+
return lines.slice(startLine, endLine).map((l, i) => {
|
|
69
|
+
const lineNum = startLine + i + 1;
|
|
70
|
+
const marker = lineNum === line ? '→' : ' ';
|
|
71
|
+
return `${marker} ${lineNum.toString().padStart(4)}: ${l}`;
|
|
72
|
+
}).join('\n');
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return '(Could not read file)';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function analyzeContext(finding, cwd) {
|
|
79
|
+
const signals = [];
|
|
80
|
+
let confidence = 'high';
|
|
81
|
+
let question = '';
|
|
82
|
+
const filePath = finding.file;
|
|
83
|
+
const relativePath = path.relative(cwd, filePath).toLowerCase();
|
|
84
|
+
// Read file content for analysis
|
|
85
|
+
let fileContent = '';
|
|
86
|
+
try {
|
|
87
|
+
fileContent = fs.readFileSync(filePath, 'utf-8').toLowerCase();
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Can't read file
|
|
91
|
+
}
|
|
92
|
+
// Check for dev-only files (production guard)
|
|
93
|
+
if (fileContent.includes('node_env') && fileContent.includes('production') &&
|
|
94
|
+
(fileContent.includes('process.exit') || fileContent.includes('return'))) {
|
|
95
|
+
signals.push({ signal: 'File has production guard (dev-only code)', type: 'positive' });
|
|
96
|
+
confidence = 'low';
|
|
97
|
+
}
|
|
98
|
+
// Analyze based on rule type
|
|
99
|
+
switch (finding.rule.id) {
|
|
100
|
+
case 'xss-innerhtml':
|
|
101
|
+
// Check for sanitizer imports
|
|
102
|
+
if (fileContent.includes('dompurify') || fileContent.includes('sanitize') ||
|
|
103
|
+
fileContent.includes('escapehtml') || fileContent.includes('escape-html')) {
|
|
104
|
+
signals.push({ signal: 'File imports sanitization library', type: 'positive' });
|
|
105
|
+
confidence = 'low';
|
|
106
|
+
}
|
|
107
|
+
// Check if file prefers textContent (good pattern)
|
|
108
|
+
const textContentCount = (fileContent.match(/textcontent\s*=/g) || []).length;
|
|
109
|
+
const innerHTMLCount = (fileContent.match(/innerhtml\s*=/g) || []).length;
|
|
110
|
+
if (textContentCount > innerHTMLCount) {
|
|
111
|
+
signals.push({ signal: `File prefers textContent (${textContentCount}x) over innerHTML (${innerHTMLCount}x)`, type: 'positive' });
|
|
112
|
+
confidence = 'low';
|
|
113
|
+
}
|
|
114
|
+
// Check if it's static HTML
|
|
115
|
+
if (finding.code.includes("'<") || finding.code.includes('"<') || finding.code.includes('`<')) {
|
|
116
|
+
const hasInterpolation = finding.code.includes('${') || finding.code.includes('" +') || finding.code.includes("' +");
|
|
117
|
+
if (!hasInterpolation) {
|
|
118
|
+
signals.push({ signal: 'Static HTML string with no interpolation', type: 'positive' });
|
|
119
|
+
confidence = 'low';
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Check for database/API data (higher risk for stored XSS)
|
|
123
|
+
if (finding.code.includes('.name') || finding.code.includes('.title') ||
|
|
124
|
+
finding.code.includes('.text') || finding.code.includes('.content') ||
|
|
125
|
+
finding.code.includes('.message') || finding.code.includes('.description')) {
|
|
126
|
+
signals.push({ signal: 'Inserts data field that could contain stored XSS', type: 'negative' });
|
|
127
|
+
confidence = 'high';
|
|
128
|
+
}
|
|
129
|
+
question = 'Is the data being inserted sanitized? Check for escapeHtml() or if this is static HTML only.';
|
|
130
|
+
break;
|
|
131
|
+
case 'supabase-no-rls':
|
|
132
|
+
// Check if it's server-side
|
|
133
|
+
if (relativePath.includes('/api/') || relativePath.includes('/server/') ||
|
|
134
|
+
relativePath.includes('/routes/') || relativePath.includes('/backend/')) {
|
|
135
|
+
signals.push({ signal: 'File is in server-side directory', type: 'positive' });
|
|
136
|
+
confidence = 'low';
|
|
137
|
+
}
|
|
138
|
+
// Check for service role key
|
|
139
|
+
if (fileContent.includes('service_role') || fileContent.includes('servicerole') ||
|
|
140
|
+
fileContent.includes('supabase_service')) {
|
|
141
|
+
signals.push({ signal: 'Uses service role key (server-side pattern)', type: 'positive' });
|
|
142
|
+
confidence = 'low';
|
|
143
|
+
}
|
|
144
|
+
// Check for auth middleware
|
|
145
|
+
if (fileContent.includes('requireauth') || fileContent.includes('requireadmin') ||
|
|
146
|
+
fileContent.includes('middleware') || fileContent.includes('authenticate')) {
|
|
147
|
+
signals.push({ signal: 'File has authentication middleware', type: 'positive' });
|
|
148
|
+
confidence = 'low';
|
|
149
|
+
}
|
|
150
|
+
// Client-side indicators
|
|
151
|
+
if (relativePath.includes('/components/') || relativePath.includes('/pages/') ||
|
|
152
|
+
relativePath.includes('/app/') && !relativePath.includes('/api/')) {
|
|
153
|
+
signals.push({ signal: 'File appears to be client-side', type: 'negative' });
|
|
154
|
+
confidence = 'high';
|
|
155
|
+
}
|
|
156
|
+
question = 'Is this server-side code with proper auth middleware, or client-side code that should use RLS?';
|
|
157
|
+
break;
|
|
158
|
+
case 'secrets-localstorage':
|
|
159
|
+
// Check if it's standard SPA auth pattern (accepted but not ideal)
|
|
160
|
+
if (finding.code.includes('authtoken') || finding.code.includes('accesstoken') ||
|
|
161
|
+
finding.code.includes('access_token') || finding.code.includes('jwt')) {
|
|
162
|
+
signals.push({ signal: 'Standard SPA JWT auth pattern (accepted practice)', type: 'positive' });
|
|
163
|
+
signals.push({ signal: 'Note: httpOnly cookies are more secure but this is common', type: 'neutral' });
|
|
164
|
+
confidence = 'low';
|
|
165
|
+
}
|
|
166
|
+
// Check for actual secrets vs session data
|
|
167
|
+
if (finding.code.includes('userrole') || finding.code.includes('userid') ||
|
|
168
|
+
finding.code.includes('user_id') || finding.code.includes('username')) {
|
|
169
|
+
signals.push({ signal: 'Stores user session data, not secrets', type: 'positive' });
|
|
170
|
+
confidence = 'low';
|
|
171
|
+
}
|
|
172
|
+
// Check for actual API keys (bad)
|
|
173
|
+
if (finding.code.includes('api_key') || finding.code.includes('apikey') ||
|
|
174
|
+
finding.code.includes('secret_key') || finding.code.includes('private')) {
|
|
175
|
+
signals.push({ signal: 'Storing actual API/secret keys (risky)', type: 'negative' });
|
|
176
|
+
confidence = 'high';
|
|
177
|
+
}
|
|
178
|
+
question = 'Is this storing API keys (bad) or JWT session tokens (accepted SPA pattern)?';
|
|
179
|
+
break;
|
|
180
|
+
case 'ssrf-vulnerability':
|
|
181
|
+
// Check if URL is from env var
|
|
182
|
+
if (finding.code.includes('process.env') || finding.code.includes('env.')) {
|
|
183
|
+
signals.push({ signal: 'URL appears to come from environment variable', type: 'positive' });
|
|
184
|
+
confidence = 'low';
|
|
185
|
+
}
|
|
186
|
+
// Check for user input
|
|
187
|
+
if (finding.code.includes('req.') || finding.code.includes('body.') ||
|
|
188
|
+
finding.code.includes('params.') || finding.code.includes('query.')) {
|
|
189
|
+
signals.push({ signal: 'URL contains user-controlled input', type: 'negative' });
|
|
190
|
+
confidence = 'high';
|
|
191
|
+
}
|
|
192
|
+
question = 'Is the URL/host controlled by user input, or is it a fixed/environment-based URL?';
|
|
193
|
+
break;
|
|
194
|
+
case 'prototype-pollution':
|
|
195
|
+
// Check if it's just spread operator
|
|
196
|
+
if (finding.code.includes('...') && !finding.code.includes('merge')) {
|
|
197
|
+
signals.push({ signal: 'Uses spread operator (generally safe)', type: 'positive' });
|
|
198
|
+
confidence = 'low';
|
|
199
|
+
}
|
|
200
|
+
// Check for deep merge
|
|
201
|
+
if (finding.code.includes('merge') || finding.code.includes('deepmerge')) {
|
|
202
|
+
signals.push({ signal: 'Uses deep merge function', type: 'negative' });
|
|
203
|
+
confidence = 'high';
|
|
204
|
+
}
|
|
205
|
+
question = 'Is this using deep merge with user input, or just shallow spread/assign?';
|
|
206
|
+
break;
|
|
207
|
+
case 'missing-auth-route':
|
|
208
|
+
case 'nextjs-api-route-no-auth':
|
|
209
|
+
// Check for auth in file
|
|
210
|
+
if (fileContent.includes('getsession') || fileContent.includes('getserversession') ||
|
|
211
|
+
fileContent.includes('requireauth') || fileContent.includes('authenticate') ||
|
|
212
|
+
fileContent.includes('verifytoken') || fileContent.includes('middleware')) {
|
|
213
|
+
signals.push({ signal: 'File contains authentication logic', type: 'positive' });
|
|
214
|
+
confidence = 'low';
|
|
215
|
+
}
|
|
216
|
+
// Check if it's a public endpoint
|
|
217
|
+
if (relativePath.includes('login') || relativePath.includes('signup') ||
|
|
218
|
+
relativePath.includes('register') || relativePath.includes('public') ||
|
|
219
|
+
relativePath.includes('health') || relativePath.includes('webhook')) {
|
|
220
|
+
signals.push({ signal: 'Endpoint appears to be intentionally public', type: 'positive' });
|
|
221
|
+
confidence = 'low';
|
|
222
|
+
}
|
|
223
|
+
question = 'Is this endpoint intentionally public (login, webhook, health check) or should it require authentication?';
|
|
224
|
+
break;
|
|
225
|
+
case 'hardcoded-secret':
|
|
226
|
+
// Check for Supabase anon key (designed to be public)
|
|
227
|
+
if (finding.code.includes('anon') || finding.code.includes('public') ||
|
|
228
|
+
fileContent.includes('supabase_anon') || fileContent.includes('anon_key') ||
|
|
229
|
+
fileContent.includes('supabase_url')) {
|
|
230
|
+
signals.push({ signal: 'Supabase anon key (designed to be public, protected by RLS)', type: 'positive' });
|
|
231
|
+
confidence = 'low';
|
|
232
|
+
}
|
|
233
|
+
// Check for other public keys (Firebase, Stripe publishable, etc.)
|
|
234
|
+
if (finding.code.includes('publishable') || finding.code.includes('pk_live') ||
|
|
235
|
+
finding.code.includes('pk_test') || fileContent.includes('firebase')) {
|
|
236
|
+
signals.push({ signal: 'Public/publishable key (designed for client-side)', type: 'positive' });
|
|
237
|
+
confidence = 'low';
|
|
238
|
+
}
|
|
239
|
+
// Check if it's in a test/example file
|
|
240
|
+
if (relativePath.includes('test') || relativePath.includes('example') ||
|
|
241
|
+
relativePath.includes('sample') || relativePath.includes('mock')) {
|
|
242
|
+
signals.push({ signal: 'File appears to be test/example code', type: 'positive' });
|
|
243
|
+
confidence = 'low';
|
|
244
|
+
}
|
|
245
|
+
// Check for placeholder indicators
|
|
246
|
+
if (finding.code.includes('xxx') || finding.code.includes('example') ||
|
|
247
|
+
finding.code.includes('placeholder') || finding.code.includes('your-')) {
|
|
248
|
+
signals.push({ signal: 'Value appears to be a placeholder', type: 'positive' });
|
|
249
|
+
confidence = 'low';
|
|
250
|
+
}
|
|
251
|
+
// Check for actual secret patterns (service role, private key, etc.)
|
|
252
|
+
if (finding.code.includes('service_role') || finding.code.includes('secret_key') ||
|
|
253
|
+
finding.code.includes('private_key') || finding.code.includes('sk_live')) {
|
|
254
|
+
signals.push({ signal: 'Actual secret key (should not be in code)', type: 'negative' });
|
|
255
|
+
confidence = 'high';
|
|
256
|
+
}
|
|
257
|
+
question = 'Is this a public key (anon/publishable) or an actual secret? Supabase anon keys are safe to expose.';
|
|
258
|
+
break;
|
|
259
|
+
default:
|
|
260
|
+
question = `Verify if this ${finding.rule.name} finding is a real security issue in your specific context.`;
|
|
261
|
+
}
|
|
262
|
+
// Add file path context
|
|
263
|
+
if (relativePath.includes('test') || relativePath.includes('spec') ||
|
|
264
|
+
relativePath.includes('mock') || relativePath.includes('fixture')) {
|
|
265
|
+
signals.push({ signal: 'File is in test/mock directory', type: 'positive' });
|
|
266
|
+
if (confidence === 'high')
|
|
267
|
+
confidence = 'medium';
|
|
268
|
+
}
|
|
269
|
+
if (signals.length === 0) {
|
|
270
|
+
signals.push({ signal: 'No additional context detected', type: 'neutral' });
|
|
271
|
+
}
|
|
272
|
+
return { signals, confidence, question };
|
|
273
|
+
}
|
|
274
|
+
function formatEnrichedFindings(findings) {
|
|
275
|
+
// Group by confidence
|
|
276
|
+
const highConf = findings.filter(f => f.confidence === 'high');
|
|
277
|
+
const medConf = findings.filter(f => f.confidence === 'medium');
|
|
278
|
+
const lowConf = findings.filter(f => f.confidence === 'low');
|
|
279
|
+
let output = '';
|
|
280
|
+
if (highConf.length > 0) {
|
|
281
|
+
output += `\n## 🔴 Likely Real Issues (${highConf.length})\nThese findings have high confidence and should be investigated:\n\n`;
|
|
282
|
+
output += highConf.map(f => formatSingleFinding(f)).join('\n---\n');
|
|
283
|
+
}
|
|
284
|
+
if (medConf.length > 0) {
|
|
285
|
+
output += `\n\n## 🟡 Needs Review (${medConf.length})\nThese findings need context to determine if they're issues:\n\n`;
|
|
286
|
+
output += medConf.map(f => formatSingleFinding(f)).join('\n---\n');
|
|
287
|
+
}
|
|
288
|
+
if (lowConf.length > 0) {
|
|
289
|
+
output += `\n\n## 🟢 Likely False Positives (${lowConf.length})\nThese findings appear safe based on context signals:\n\n`;
|
|
290
|
+
output += lowConf.map(f => formatSingleFinding(f)).join('\n---\n');
|
|
291
|
+
}
|
|
292
|
+
return output;
|
|
293
|
+
}
|
|
294
|
+
function formatSingleFinding(f) {
|
|
295
|
+
const signalIcons = f.contextSignals.map(s => {
|
|
296
|
+
const icon = s.type === 'positive' ? '✓' : s.type === 'negative' ? '⚠' : '•';
|
|
297
|
+
return ` ${icon} ${s.signal}`;
|
|
298
|
+
}).join('\n');
|
|
299
|
+
return `
|
|
300
|
+
**[${f.severity.toUpperCase()}] ${f.name}**
|
|
301
|
+
📍 ${f.file}:${f.line}
|
|
302
|
+
|
|
303
|
+
\`\`\`
|
|
304
|
+
${f.codeSnippet}
|
|
305
|
+
\`\`\`
|
|
306
|
+
|
|
307
|
+
**Context signals:**
|
|
308
|
+
${signalIcons}
|
|
309
|
+
|
|
310
|
+
**🤔 Analysis needed:** ${f.analysisQuestion}
|
|
311
|
+
|
|
312
|
+
**💡 Suggested fix:** ${f.fix}
|
|
313
|
+
`;
|
|
314
|
+
}
|
|
61
315
|
async function startMcpServer() {
|
|
62
316
|
const server = new mcp_js_1.McpServer({
|
|
63
317
|
name: 'vibeguard',
|
|
64
318
|
version: '1.0.0',
|
|
65
319
|
});
|
|
66
320
|
// Tool: scan_code
|
|
67
|
-
server.tool('scan_code', 'Scan files or directories for security vulnerabilities. Returns findings with
|
|
321
|
+
server.tool('scan_code', 'Scan files or directories for security vulnerabilities. Returns findings with context analysis to help determine real issues vs false positives. After receiving results, analyze each finding based on the context signals and code snippets provided.', {
|
|
68
322
|
paths: zod_1.z.array(zod_1.z.string()).describe('File or directory paths to scan (relative to current working directory)'),
|
|
69
323
|
staged_only: zod_1.z.boolean().optional().describe('If true, only scan git staged files'),
|
|
70
324
|
exclude: zod_1.z.array(zod_1.z.string()).optional().describe('Glob patterns to exclude (e.g., "**/vendor/**", "*.min.js")'),
|
|
@@ -85,7 +339,7 @@ async function startMcpServer() {
|
|
|
85
339
|
content: [
|
|
86
340
|
{
|
|
87
341
|
type: 'text',
|
|
88
|
-
text: `✅ No security issues found in ${result.files} file(s).\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
342
|
+
text: `✅ **No security issues found** in ${result.files} file(s).\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
89
343
|
},
|
|
90
344
|
],
|
|
91
345
|
};
|
|
@@ -97,42 +351,52 @@ async function startMcpServer() {
|
|
|
97
351
|
low: result.findings.filter(f => f.rule.severity === 'low').length,
|
|
98
352
|
};
|
|
99
353
|
const grade = calculateGrade(counts);
|
|
100
|
-
|
|
101
|
-
// Free tier: show counts only, no individual findings
|
|
354
|
+
// Free tier: show counts only
|
|
102
355
|
if (userTier === 'free') {
|
|
103
356
|
return {
|
|
104
357
|
content: [
|
|
105
358
|
{
|
|
106
359
|
type: 'text',
|
|
107
|
-
text:
|
|
360
|
+
text: `# Security Scan Results\n\n**Found ${result.findings.length} potential issue(s):** ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low\n\n**Grade: ${grade}** | Tier: ${tierLabel}\n\nUpgrade to Pro to see detailed findings with context analysis.\nRun \`vibeguard upgrade\` to unlock.`,
|
|
108
361
|
},
|
|
109
362
|
],
|
|
110
363
|
};
|
|
111
364
|
}
|
|
112
|
-
// Pro tier:
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
const
|
|
365
|
+
// Pro tier: enrich findings with context
|
|
366
|
+
const enrichedFindings = result.findings.map(f => {
|
|
367
|
+
const { signals, confidence, question } = analyzeContext(f, cwd);
|
|
368
|
+
return {
|
|
369
|
+
severity: f.rule.severity,
|
|
370
|
+
rule: f.rule.id,
|
|
371
|
+
name: f.rule.name,
|
|
372
|
+
file: path.relative(cwd, f.file),
|
|
373
|
+
line: f.line,
|
|
374
|
+
codeSnippet: getCodeSnippet(f.file, f.line),
|
|
375
|
+
contextSignals: signals,
|
|
376
|
+
analysisQuestion: question,
|
|
377
|
+
confidence,
|
|
378
|
+
fix: f.rule.fix || 'Review and fix as appropriate',
|
|
379
|
+
};
|
|
380
|
+
});
|
|
381
|
+
const highConfCount = enrichedFindings.filter(f => f.confidence === 'high').length;
|
|
382
|
+
const lowConfCount = enrichedFindings.filter(f => f.confidence === 'low').length;
|
|
383
|
+
const header = `# Security Scan Results
|
|
384
|
+
|
|
385
|
+
**Found ${result.findings.length} potential issue(s):** ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low
|
|
386
|
+
**Grade: ${grade}** | Tier: ${tierLabel}
|
|
387
|
+
|
|
388
|
+
**Confidence breakdown:**
|
|
389
|
+
- 🔴 ${highConfCount} likely real issues
|
|
390
|
+
- 🟢 ${lowConfCount} likely false positives
|
|
391
|
+
|
|
392
|
+
> **Instructions:** Review each finding below. Use the context signals and code snippets to determine if each is a real security issue. Focus on 🔴 high-confidence findings first.
|
|
393
|
+
`;
|
|
394
|
+
const formattedFindings = formatEnrichedFindings(enrichedFindings);
|
|
131
395
|
return {
|
|
132
396
|
content: [
|
|
133
397
|
{
|
|
134
398
|
type: 'text',
|
|
135
|
-
text:
|
|
399
|
+
text: header + formattedFindings,
|
|
136
400
|
},
|
|
137
401
|
],
|
|
138
402
|
};
|
|
@@ -173,7 +437,6 @@ async function startMcpServer() {
|
|
|
173
437
|
language: zod_1.z.enum(['javascript', 'typescript', 'python']).describe('The programming language'),
|
|
174
438
|
}, async ({ code, language }) => {
|
|
175
439
|
try {
|
|
176
|
-
const fs = await Promise.resolve().then(() => __importStar(require('fs')));
|
|
177
440
|
const os = await Promise.resolve().then(() => __importStar(require('os')));
|
|
178
441
|
// Create temp file
|
|
179
442
|
const ext = language === 'python' ? '.py' : language === 'typescript' ? '.ts' : '.js';
|
|
@@ -192,7 +455,7 @@ async function startMcpServer() {
|
|
|
192
455
|
content: [
|
|
193
456
|
{
|
|
194
457
|
type: 'text',
|
|
195
|
-
text: `✅ No security issues found in this code snippet.\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
458
|
+
text: `✅ **No security issues found** in this code snippet.\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
196
459
|
},
|
|
197
460
|
],
|
|
198
461
|
};
|
|
@@ -204,40 +467,26 @@ async function startMcpServer() {
|
|
|
204
467
|
low: result.findings.filter(f => f.rule.severity === 'low').length,
|
|
205
468
|
};
|
|
206
469
|
const grade = calculateGrade(counts);
|
|
207
|
-
|
|
208
|
-
// Free tier: show counts only, no individual findings
|
|
470
|
+
// Free tier: show counts only
|
|
209
471
|
if (userTier === 'free') {
|
|
210
472
|
return {
|
|
211
473
|
content: [
|
|
212
474
|
{
|
|
213
475
|
type: 'text',
|
|
214
|
-
text:
|
|
476
|
+
text: `Found ${result.findings.length} potential issue(s): ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low\n\nGrade: ${grade} | Tier: ${tierLabel}\n\nUpgrade to Pro to see details.`,
|
|
215
477
|
},
|
|
216
478
|
],
|
|
217
479
|
};
|
|
218
480
|
}
|
|
219
|
-
// Pro tier: show
|
|
220
|
-
const
|
|
221
|
-
severity: f.rule.
|
|
222
|
-
rule: f.rule.id,
|
|
223
|
-
name: f.rule.name,
|
|
224
|
-
line: f.line,
|
|
225
|
-
fix: f.rule.fix,
|
|
226
|
-
isRestricted: f.isRestricted,
|
|
227
|
-
}));
|
|
228
|
-
const formatted = findings.map(f => {
|
|
229
|
-
const proTag = f.isRestricted ? ' [PRO]' : '';
|
|
230
|
-
const fixLine = f.isRestricted
|
|
231
|
-
? ' Fix: Upgrade to Pro to see fix details'
|
|
232
|
-
: ` Fix: ${f.fix}`;
|
|
233
|
-
return `[${f.severity.toUpperCase()}]${proTag} Line ${f.line}: ${f.name}\n${fixLine}`;
|
|
481
|
+
// Pro tier: show findings with line numbers
|
|
482
|
+
const formatted = result.findings.map(f => {
|
|
483
|
+
return `**[${f.rule.severity.toUpperCase()}] Line ${f.line}: ${f.rule.name}**\n ${f.rule.description}\n 💡 Fix: ${f.rule.fix}`;
|
|
234
484
|
}).join('\n\n');
|
|
235
|
-
const footer = `\nGrade: ${grade} | Tier: ${tierLabel}`;
|
|
236
485
|
return {
|
|
237
486
|
content: [
|
|
238
487
|
{
|
|
239
488
|
type: 'text',
|
|
240
|
-
text:
|
|
489
|
+
text: `# Code Snippet Security Check\n\n**Found ${result.findings.length} issue(s):** ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low\n**Grade: ${grade}** | Tier: ${tierLabel}\n\n${formatted}`,
|
|
241
490
|
},
|
|
242
491
|
],
|
|
243
492
|
};
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,8 +29,8 @@ exports.securityRules = [
|
|
|
29
29
|
/(['"`])[a-zA-Z0-9+/]{40}\1(?=.*(?:aws|secret|key))/i,
|
|
30
30
|
// Google API keys
|
|
31
31
|
/(['"`])AIza[a-zA-Z0-9_-]{35}\1/,
|
|
32
|
-
// Stripe keys
|
|
33
|
-
/(['"`])(?:
|
|
32
|
+
// Stripe secret keys only (sk_), NOT publishable keys (pk_) which are meant to be public
|
|
33
|
+
/(['"`])sk_(?:live|test)_[a-zA-Z0-9]{24,}\1/,
|
|
34
34
|
// SendGrid
|
|
35
35
|
/(['"`])SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}\1/,
|
|
36
36
|
// Twilio
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/scanner/rules/definitions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/scanner/rules/definitions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/mcp/server.ts
CHANGED
|
@@ -2,10 +2,11 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
2
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
5
6
|
import { Scanner } from '../scanner';
|
|
6
7
|
import { securityRules } from '../scanner/rules/definitions';
|
|
7
8
|
import { getLicenseKey } from '../api/license';
|
|
8
|
-
import { Severity, Tier } from '../types';
|
|
9
|
+
import { Severity, Tier, Finding } from '../types';
|
|
9
10
|
|
|
10
11
|
function calculateGrade(counts: Record<Severity, number>): string {
|
|
11
12
|
if (counts.critical > 0) return 'F';
|
|
@@ -18,6 +19,299 @@ function calculateGrade(counts: Record<Severity, number>): string {
|
|
|
18
19
|
return 'A+';
|
|
19
20
|
}
|
|
20
21
|
|
|
22
|
+
interface ContextSignal {
|
|
23
|
+
signal: string;
|
|
24
|
+
type: 'positive' | 'negative' | 'neutral';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface EnrichedFinding {
|
|
28
|
+
severity: string;
|
|
29
|
+
rule: string;
|
|
30
|
+
name: string;
|
|
31
|
+
file: string;
|
|
32
|
+
line: number;
|
|
33
|
+
codeSnippet: string;
|
|
34
|
+
contextSignals: ContextSignal[];
|
|
35
|
+
analysisQuestion: string;
|
|
36
|
+
confidence: 'high' | 'medium' | 'low';
|
|
37
|
+
fix: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function getCodeSnippet(filePath: string, line: number, contextLines: number = 3): string {
|
|
41
|
+
try {
|
|
42
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
43
|
+
const lines = content.split('\n');
|
|
44
|
+
const startLine = Math.max(0, line - contextLines - 1);
|
|
45
|
+
const endLine = Math.min(lines.length, line + contextLines);
|
|
46
|
+
|
|
47
|
+
return lines.slice(startLine, endLine).map((l, i) => {
|
|
48
|
+
const lineNum = startLine + i + 1;
|
|
49
|
+
const marker = lineNum === line ? '→' : ' ';
|
|
50
|
+
return `${marker} ${lineNum.toString().padStart(4)}: ${l}`;
|
|
51
|
+
}).join('\n');
|
|
52
|
+
} catch {
|
|
53
|
+
return '(Could not read file)';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function analyzeContext(finding: Finding, cwd: string): { signals: ContextSignal[], confidence: 'high' | 'medium' | 'low', question: string } {
|
|
58
|
+
const signals: ContextSignal[] = [];
|
|
59
|
+
let confidence: 'high' | 'medium' | 'low' = 'high';
|
|
60
|
+
let question = '';
|
|
61
|
+
|
|
62
|
+
const filePath = finding.file;
|
|
63
|
+
const relativePath = path.relative(cwd, filePath).toLowerCase();
|
|
64
|
+
|
|
65
|
+
// Read file content for analysis
|
|
66
|
+
let fileContent = '';
|
|
67
|
+
try {
|
|
68
|
+
fileContent = fs.readFileSync(filePath, 'utf-8').toLowerCase();
|
|
69
|
+
} catch {
|
|
70
|
+
// Can't read file
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Check for dev-only files (production guard)
|
|
74
|
+
if (fileContent.includes('node_env') && fileContent.includes('production') &&
|
|
75
|
+
(fileContent.includes('process.exit') || fileContent.includes('return'))) {
|
|
76
|
+
signals.push({ signal: 'File has production guard (dev-only code)', type: 'positive' });
|
|
77
|
+
confidence = 'low';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Analyze based on rule type
|
|
81
|
+
switch (finding.rule.id) {
|
|
82
|
+
case 'xss-innerhtml':
|
|
83
|
+
// Check for sanitizer imports
|
|
84
|
+
if (fileContent.includes('dompurify') || fileContent.includes('sanitize') ||
|
|
85
|
+
fileContent.includes('escapehtml') || fileContent.includes('escape-html')) {
|
|
86
|
+
signals.push({ signal: 'File imports sanitization library', type: 'positive' });
|
|
87
|
+
confidence = 'low';
|
|
88
|
+
}
|
|
89
|
+
// Check if file prefers textContent (good pattern)
|
|
90
|
+
const textContentCount = (fileContent.match(/textcontent\s*=/g) || []).length;
|
|
91
|
+
const innerHTMLCount = (fileContent.match(/innerhtml\s*=/g) || []).length;
|
|
92
|
+
if (textContentCount > innerHTMLCount) {
|
|
93
|
+
signals.push({ signal: `File prefers textContent (${textContentCount}x) over innerHTML (${innerHTMLCount}x)`, type: 'positive' });
|
|
94
|
+
confidence = 'low';
|
|
95
|
+
}
|
|
96
|
+
// Check if it's static HTML
|
|
97
|
+
if (finding.code.includes("'<") || finding.code.includes('"<') || finding.code.includes('`<')) {
|
|
98
|
+
const hasInterpolation = finding.code.includes('${') || finding.code.includes('" +') || finding.code.includes("' +");
|
|
99
|
+
if (!hasInterpolation) {
|
|
100
|
+
signals.push({ signal: 'Static HTML string with no interpolation', type: 'positive' });
|
|
101
|
+
confidence = 'low';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Check for database/API data (higher risk for stored XSS)
|
|
105
|
+
if (finding.code.includes('.name') || finding.code.includes('.title') ||
|
|
106
|
+
finding.code.includes('.text') || finding.code.includes('.content') ||
|
|
107
|
+
finding.code.includes('.message') || finding.code.includes('.description')) {
|
|
108
|
+
signals.push({ signal: 'Inserts data field that could contain stored XSS', type: 'negative' });
|
|
109
|
+
confidence = 'high';
|
|
110
|
+
}
|
|
111
|
+
question = 'Is the data being inserted sanitized? Check for escapeHtml() or if this is static HTML only.';
|
|
112
|
+
break;
|
|
113
|
+
|
|
114
|
+
case 'supabase-no-rls':
|
|
115
|
+
// Check if it's server-side
|
|
116
|
+
if (relativePath.includes('/api/') || relativePath.includes('/server/') ||
|
|
117
|
+
relativePath.includes('/routes/') || relativePath.includes('/backend/')) {
|
|
118
|
+
signals.push({ signal: 'File is in server-side directory', type: 'positive' });
|
|
119
|
+
confidence = 'low';
|
|
120
|
+
}
|
|
121
|
+
// Check for service role key
|
|
122
|
+
if (fileContent.includes('service_role') || fileContent.includes('servicerole') ||
|
|
123
|
+
fileContent.includes('supabase_service')) {
|
|
124
|
+
signals.push({ signal: 'Uses service role key (server-side pattern)', type: 'positive' });
|
|
125
|
+
confidence = 'low';
|
|
126
|
+
}
|
|
127
|
+
// Check for auth middleware
|
|
128
|
+
if (fileContent.includes('requireauth') || fileContent.includes('requireadmin') ||
|
|
129
|
+
fileContent.includes('middleware') || fileContent.includes('authenticate')) {
|
|
130
|
+
signals.push({ signal: 'File has authentication middleware', type: 'positive' });
|
|
131
|
+
confidence = 'low';
|
|
132
|
+
}
|
|
133
|
+
// Client-side indicators
|
|
134
|
+
if (relativePath.includes('/components/') || relativePath.includes('/pages/') ||
|
|
135
|
+
relativePath.includes('/app/') && !relativePath.includes('/api/')) {
|
|
136
|
+
signals.push({ signal: 'File appears to be client-side', type: 'negative' });
|
|
137
|
+
confidence = 'high';
|
|
138
|
+
}
|
|
139
|
+
question = 'Is this server-side code with proper auth middleware, or client-side code that should use RLS?';
|
|
140
|
+
break;
|
|
141
|
+
|
|
142
|
+
case 'secrets-localstorage':
|
|
143
|
+
// Check if it's standard SPA auth pattern (accepted but not ideal)
|
|
144
|
+
if (finding.code.includes('authtoken') || finding.code.includes('accesstoken') ||
|
|
145
|
+
finding.code.includes('access_token') || finding.code.includes('jwt')) {
|
|
146
|
+
signals.push({ signal: 'Standard SPA JWT auth pattern (accepted practice)', type: 'positive' });
|
|
147
|
+
signals.push({ signal: 'Note: httpOnly cookies are more secure but this is common', type: 'neutral' });
|
|
148
|
+
confidence = 'low';
|
|
149
|
+
}
|
|
150
|
+
// Check for actual secrets vs session data
|
|
151
|
+
if (finding.code.includes('userrole') || finding.code.includes('userid') ||
|
|
152
|
+
finding.code.includes('user_id') || finding.code.includes('username')) {
|
|
153
|
+
signals.push({ signal: 'Stores user session data, not secrets', type: 'positive' });
|
|
154
|
+
confidence = 'low';
|
|
155
|
+
}
|
|
156
|
+
// Check for actual API keys (bad)
|
|
157
|
+
if (finding.code.includes('api_key') || finding.code.includes('apikey') ||
|
|
158
|
+
finding.code.includes('secret_key') || finding.code.includes('private')) {
|
|
159
|
+
signals.push({ signal: 'Storing actual API/secret keys (risky)', type: 'negative' });
|
|
160
|
+
confidence = 'high';
|
|
161
|
+
}
|
|
162
|
+
question = 'Is this storing API keys (bad) or JWT session tokens (accepted SPA pattern)?';
|
|
163
|
+
break;
|
|
164
|
+
|
|
165
|
+
case 'ssrf-vulnerability':
|
|
166
|
+
// Check if URL is from env var
|
|
167
|
+
if (finding.code.includes('process.env') || finding.code.includes('env.')) {
|
|
168
|
+
signals.push({ signal: 'URL appears to come from environment variable', type: 'positive' });
|
|
169
|
+
confidence = 'low';
|
|
170
|
+
}
|
|
171
|
+
// Check for user input
|
|
172
|
+
if (finding.code.includes('req.') || finding.code.includes('body.') ||
|
|
173
|
+
finding.code.includes('params.') || finding.code.includes('query.')) {
|
|
174
|
+
signals.push({ signal: 'URL contains user-controlled input', type: 'negative' });
|
|
175
|
+
confidence = 'high';
|
|
176
|
+
}
|
|
177
|
+
question = 'Is the URL/host controlled by user input, or is it a fixed/environment-based URL?';
|
|
178
|
+
break;
|
|
179
|
+
|
|
180
|
+
case 'prototype-pollution':
|
|
181
|
+
// Check if it's just spread operator
|
|
182
|
+
if (finding.code.includes('...') && !finding.code.includes('merge')) {
|
|
183
|
+
signals.push({ signal: 'Uses spread operator (generally safe)', type: 'positive' });
|
|
184
|
+
confidence = 'low';
|
|
185
|
+
}
|
|
186
|
+
// Check for deep merge
|
|
187
|
+
if (finding.code.includes('merge') || finding.code.includes('deepmerge')) {
|
|
188
|
+
signals.push({ signal: 'Uses deep merge function', type: 'negative' });
|
|
189
|
+
confidence = 'high';
|
|
190
|
+
}
|
|
191
|
+
question = 'Is this using deep merge with user input, or just shallow spread/assign?';
|
|
192
|
+
break;
|
|
193
|
+
|
|
194
|
+
case 'missing-auth-route':
|
|
195
|
+
case 'nextjs-api-route-no-auth':
|
|
196
|
+
// Check for auth in file
|
|
197
|
+
if (fileContent.includes('getsession') || fileContent.includes('getserversession') ||
|
|
198
|
+
fileContent.includes('requireauth') || fileContent.includes('authenticate') ||
|
|
199
|
+
fileContent.includes('verifytoken') || fileContent.includes('middleware')) {
|
|
200
|
+
signals.push({ signal: 'File contains authentication logic', type: 'positive' });
|
|
201
|
+
confidence = 'low';
|
|
202
|
+
}
|
|
203
|
+
// Check if it's a public endpoint
|
|
204
|
+
if (relativePath.includes('login') || relativePath.includes('signup') ||
|
|
205
|
+
relativePath.includes('register') || relativePath.includes('public') ||
|
|
206
|
+
relativePath.includes('health') || relativePath.includes('webhook')) {
|
|
207
|
+
signals.push({ signal: 'Endpoint appears to be intentionally public', type: 'positive' });
|
|
208
|
+
confidence = 'low';
|
|
209
|
+
}
|
|
210
|
+
question = 'Is this endpoint intentionally public (login, webhook, health check) or should it require authentication?';
|
|
211
|
+
break;
|
|
212
|
+
|
|
213
|
+
case 'hardcoded-secret':
|
|
214
|
+
// Check for Supabase anon key (designed to be public)
|
|
215
|
+
if (finding.code.includes('anon') || finding.code.includes('public') ||
|
|
216
|
+
fileContent.includes('supabase_anon') || fileContent.includes('anon_key') ||
|
|
217
|
+
fileContent.includes('supabase_url')) {
|
|
218
|
+
signals.push({ signal: 'Supabase anon key (designed to be public, protected by RLS)', type: 'positive' });
|
|
219
|
+
confidence = 'low';
|
|
220
|
+
}
|
|
221
|
+
// Check for other public keys (Firebase, Stripe publishable, etc.)
|
|
222
|
+
if (finding.code.includes('publishable') || finding.code.includes('pk_live') ||
|
|
223
|
+
finding.code.includes('pk_test') || fileContent.includes('firebase')) {
|
|
224
|
+
signals.push({ signal: 'Public/publishable key (designed for client-side)', type: 'positive' });
|
|
225
|
+
confidence = 'low';
|
|
226
|
+
}
|
|
227
|
+
// Check if it's in a test/example file
|
|
228
|
+
if (relativePath.includes('test') || relativePath.includes('example') ||
|
|
229
|
+
relativePath.includes('sample') || relativePath.includes('mock')) {
|
|
230
|
+
signals.push({ signal: 'File appears to be test/example code', type: 'positive' });
|
|
231
|
+
confidence = 'low';
|
|
232
|
+
}
|
|
233
|
+
// Check for placeholder indicators
|
|
234
|
+
if (finding.code.includes('xxx') || finding.code.includes('example') ||
|
|
235
|
+
finding.code.includes('placeholder') || finding.code.includes('your-')) {
|
|
236
|
+
signals.push({ signal: 'Value appears to be a placeholder', type: 'positive' });
|
|
237
|
+
confidence = 'low';
|
|
238
|
+
}
|
|
239
|
+
// Check for actual secret patterns (service role, private key, etc.)
|
|
240
|
+
if (finding.code.includes('service_role') || finding.code.includes('secret_key') ||
|
|
241
|
+
finding.code.includes('private_key') || finding.code.includes('sk_live')) {
|
|
242
|
+
signals.push({ signal: 'Actual secret key (should not be in code)', type: 'negative' });
|
|
243
|
+
confidence = 'high';
|
|
244
|
+
}
|
|
245
|
+
question = 'Is this a public key (anon/publishable) or an actual secret? Supabase anon keys are safe to expose.';
|
|
246
|
+
break;
|
|
247
|
+
|
|
248
|
+
default:
|
|
249
|
+
question = `Verify if this ${finding.rule.name} finding is a real security issue in your specific context.`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Add file path context
|
|
253
|
+
if (relativePath.includes('test') || relativePath.includes('spec') ||
|
|
254
|
+
relativePath.includes('mock') || relativePath.includes('fixture')) {
|
|
255
|
+
signals.push({ signal: 'File is in test/mock directory', type: 'positive' });
|
|
256
|
+
if (confidence === 'high') confidence = 'medium';
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if (signals.length === 0) {
|
|
260
|
+
signals.push({ signal: 'No additional context detected', type: 'neutral' });
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
return { signals, confidence, question };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function formatEnrichedFindings(findings: EnrichedFinding[]): string {
|
|
267
|
+
// Group by confidence
|
|
268
|
+
const highConf = findings.filter(f => f.confidence === 'high');
|
|
269
|
+
const medConf = findings.filter(f => f.confidence === 'medium');
|
|
270
|
+
const lowConf = findings.filter(f => f.confidence === 'low');
|
|
271
|
+
|
|
272
|
+
let output = '';
|
|
273
|
+
|
|
274
|
+
if (highConf.length > 0) {
|
|
275
|
+
output += `\n## 🔴 Likely Real Issues (${highConf.length})\nThese findings have high confidence and should be investigated:\n\n`;
|
|
276
|
+
output += highConf.map(f => formatSingleFinding(f)).join('\n---\n');
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
if (medConf.length > 0) {
|
|
280
|
+
output += `\n\n## 🟡 Needs Review (${medConf.length})\nThese findings need context to determine if they're issues:\n\n`;
|
|
281
|
+
output += medConf.map(f => formatSingleFinding(f)).join('\n---\n');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (lowConf.length > 0) {
|
|
285
|
+
output += `\n\n## 🟢 Likely False Positives (${lowConf.length})\nThese findings appear safe based on context signals:\n\n`;
|
|
286
|
+
output += lowConf.map(f => formatSingleFinding(f)).join('\n---\n');
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return output;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
function formatSingleFinding(f: EnrichedFinding): string {
|
|
293
|
+
const signalIcons = f.contextSignals.map(s => {
|
|
294
|
+
const icon = s.type === 'positive' ? '✓' : s.type === 'negative' ? '⚠' : '•';
|
|
295
|
+
return ` ${icon} ${s.signal}`;
|
|
296
|
+
}).join('\n');
|
|
297
|
+
|
|
298
|
+
return `
|
|
299
|
+
**[${f.severity.toUpperCase()}] ${f.name}**
|
|
300
|
+
📍 ${f.file}:${f.line}
|
|
301
|
+
|
|
302
|
+
\`\`\`
|
|
303
|
+
${f.codeSnippet}
|
|
304
|
+
\`\`\`
|
|
305
|
+
|
|
306
|
+
**Context signals:**
|
|
307
|
+
${signalIcons}
|
|
308
|
+
|
|
309
|
+
**🤔 Analysis needed:** ${f.analysisQuestion}
|
|
310
|
+
|
|
311
|
+
**💡 Suggested fix:** ${f.fix}
|
|
312
|
+
`;
|
|
313
|
+
}
|
|
314
|
+
|
|
21
315
|
export async function startMcpServer(): Promise<void> {
|
|
22
316
|
const server = new McpServer({
|
|
23
317
|
name: 'vibeguard',
|
|
@@ -27,7 +321,7 @@ export async function startMcpServer(): Promise<void> {
|
|
|
27
321
|
// Tool: scan_code
|
|
28
322
|
server.tool(
|
|
29
323
|
'scan_code',
|
|
30
|
-
'Scan files or directories for security vulnerabilities. Returns findings with
|
|
324
|
+
'Scan files or directories for security vulnerabilities. Returns findings with context analysis to help determine real issues vs false positives. After receiving results, analyze each finding based on the context signals and code snippets provided.',
|
|
31
325
|
{
|
|
32
326
|
paths: z.array(z.string()).describe('File or directory paths to scan (relative to current working directory)'),
|
|
33
327
|
staged_only: z.boolean().optional().describe('If true, only scan git staged files'),
|
|
@@ -54,7 +348,7 @@ export async function startMcpServer(): Promise<void> {
|
|
|
54
348
|
content: [
|
|
55
349
|
{
|
|
56
350
|
type: 'text' as const,
|
|
57
|
-
text: `✅ No security issues found in ${result.files} file(s).\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
351
|
+
text: `✅ **No security issues found** in ${result.files} file(s).\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
58
352
|
},
|
|
59
353
|
],
|
|
60
354
|
};
|
|
@@ -68,47 +362,58 @@ export async function startMcpServer(): Promise<void> {
|
|
|
68
362
|
};
|
|
69
363
|
|
|
70
364
|
const grade = calculateGrade(counts);
|
|
71
|
-
const summary = `Found ${result.findings.length} issue(s): ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low`;
|
|
72
365
|
|
|
73
|
-
// Free tier: show counts only
|
|
366
|
+
// Free tier: show counts only
|
|
74
367
|
if (userTier === 'free') {
|
|
75
368
|
return {
|
|
76
369
|
content: [
|
|
77
370
|
{
|
|
78
371
|
type: 'text' as const,
|
|
79
|
-
text:
|
|
372
|
+
text: `# Security Scan Results\n\n**Found ${result.findings.length} potential issue(s):** ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low\n\n**Grade: ${grade}** | Tier: ${tierLabel}\n\nUpgrade to Pro to see detailed findings with context analysis.\nRun \`vibeguard upgrade\` to unlock.`,
|
|
80
373
|
},
|
|
81
374
|
],
|
|
82
375
|
};
|
|
83
376
|
}
|
|
84
377
|
|
|
85
|
-
// Pro tier:
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
378
|
+
// Pro tier: enrich findings with context
|
|
379
|
+
const enrichedFindings: EnrichedFinding[] = result.findings.map(f => {
|
|
380
|
+
const { signals, confidence, question } = analyzeContext(f, cwd);
|
|
381
|
+
return {
|
|
382
|
+
severity: f.rule.severity,
|
|
383
|
+
rule: f.rule.id,
|
|
384
|
+
name: f.rule.name,
|
|
385
|
+
file: path.relative(cwd, f.file),
|
|
386
|
+
line: f.line,
|
|
387
|
+
codeSnippet: getCodeSnippet(f.file, f.line),
|
|
388
|
+
contextSignals: signals,
|
|
389
|
+
analysisQuestion: question,
|
|
390
|
+
confidence,
|
|
391
|
+
fix: f.rule.fix || 'Review and fix as appropriate',
|
|
392
|
+
};
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
const highConfCount = enrichedFindings.filter(f => f.confidence === 'high').length;
|
|
396
|
+
const lowConfCount = enrichedFindings.filter(f => f.confidence === 'low').length;
|
|
397
|
+
|
|
398
|
+
const header = `# Security Scan Results
|
|
399
|
+
|
|
400
|
+
**Found ${result.findings.length} potential issue(s):** ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low
|
|
401
|
+
**Grade: ${grade}** | Tier: ${tierLabel}
|
|
104
402
|
|
|
105
|
-
|
|
403
|
+
**Confidence breakdown:**
|
|
404
|
+
- 🔴 ${highConfCount} likely real issues
|
|
405
|
+
- 🟢 ${lowConfCount} likely false positives
|
|
406
|
+
|
|
407
|
+
> **Instructions:** Review each finding below. Use the context signals and code snippets to determine if each is a real security issue. Focus on 🔴 high-confidence findings first.
|
|
408
|
+
`;
|
|
409
|
+
|
|
410
|
+
const formattedFindings = formatEnrichedFindings(enrichedFindings);
|
|
106
411
|
|
|
107
412
|
return {
|
|
108
413
|
content: [
|
|
109
414
|
{
|
|
110
415
|
type: 'text' as const,
|
|
111
|
-
text:
|
|
416
|
+
text: header + formattedFindings,
|
|
112
417
|
},
|
|
113
418
|
],
|
|
114
419
|
};
|
|
@@ -165,7 +470,6 @@ export async function startMcpServer(): Promise<void> {
|
|
|
165
470
|
},
|
|
166
471
|
async ({ code, language }) => {
|
|
167
472
|
try {
|
|
168
|
-
const fs = await import('fs');
|
|
169
473
|
const os = await import('os');
|
|
170
474
|
|
|
171
475
|
// Create temp file
|
|
@@ -190,7 +494,7 @@ export async function startMcpServer(): Promise<void> {
|
|
|
190
494
|
content: [
|
|
191
495
|
{
|
|
192
496
|
type: 'text' as const,
|
|
193
|
-
text: `✅ No security issues found in this code snippet.\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
497
|
+
text: `✅ **No security issues found** in this code snippet.\n\nGrade: A+ | Tier: ${tierLabel}`,
|
|
194
498
|
},
|
|
195
499
|
],
|
|
196
500
|
};
|
|
@@ -204,45 +508,29 @@ export async function startMcpServer(): Promise<void> {
|
|
|
204
508
|
};
|
|
205
509
|
|
|
206
510
|
const grade = calculateGrade(counts);
|
|
207
|
-
const summary = `Found ${result.findings.length} issue(s): ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low`;
|
|
208
511
|
|
|
209
|
-
// Free tier: show counts only
|
|
512
|
+
// Free tier: show counts only
|
|
210
513
|
if (userTier === 'free') {
|
|
211
514
|
return {
|
|
212
515
|
content: [
|
|
213
516
|
{
|
|
214
517
|
type: 'text' as const,
|
|
215
|
-
text:
|
|
518
|
+
text: `Found ${result.findings.length} potential issue(s): ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low\n\nGrade: ${grade} | Tier: ${tierLabel}\n\nUpgrade to Pro to see details.`,
|
|
216
519
|
},
|
|
217
520
|
],
|
|
218
521
|
};
|
|
219
522
|
}
|
|
220
523
|
|
|
221
|
-
// Pro tier: show
|
|
222
|
-
const
|
|
223
|
-
severity: f.rule.
|
|
224
|
-
rule: f.rule.id,
|
|
225
|
-
name: f.rule.name,
|
|
226
|
-
line: f.line,
|
|
227
|
-
fix: f.rule.fix,
|
|
228
|
-
isRestricted: f.isRestricted,
|
|
229
|
-
}));
|
|
230
|
-
|
|
231
|
-
const formatted = findings.map(f => {
|
|
232
|
-
const proTag = f.isRestricted ? ' [PRO]' : '';
|
|
233
|
-
const fixLine = f.isRestricted
|
|
234
|
-
? ' Fix: Upgrade to Pro to see fix details'
|
|
235
|
-
: ` Fix: ${f.fix}`;
|
|
236
|
-
return `[${f.severity.toUpperCase()}]${proTag} Line ${f.line}: ${f.name}\n${fixLine}`;
|
|
524
|
+
// Pro tier: show findings with line numbers
|
|
525
|
+
const formatted = result.findings.map(f => {
|
|
526
|
+
return `**[${f.rule.severity.toUpperCase()}] Line ${f.line}: ${f.rule.name}**\n ${f.rule.description}\n 💡 Fix: ${f.rule.fix}`;
|
|
237
527
|
}).join('\n\n');
|
|
238
528
|
|
|
239
|
-
const footer = `\nGrade: ${grade} | Tier: ${tierLabel}`;
|
|
240
|
-
|
|
241
529
|
return {
|
|
242
530
|
content: [
|
|
243
531
|
{
|
|
244
532
|
type: 'text' as const,
|
|
245
|
-
text:
|
|
533
|
+
text: `# Code Snippet Security Check\n\n**Found ${result.findings.length} issue(s):** ${counts.critical} critical, ${counts.high} high, ${counts.medium} medium, ${counts.low} low\n**Grade: ${grade}** | Tier: ${tierLabel}\n\n${formatted}`,
|
|
246
534
|
},
|
|
247
535
|
],
|
|
248
536
|
};
|
|
@@ -27,8 +27,8 @@ export const securityRules: SecurityRule[] = [
|
|
|
27
27
|
/(['"`])[a-zA-Z0-9+/]{40}\1(?=.*(?:aws|secret|key))/i,
|
|
28
28
|
// Google API keys
|
|
29
29
|
/(['"`])AIza[a-zA-Z0-9_-]{35}\1/,
|
|
30
|
-
// Stripe keys
|
|
31
|
-
/(['"`])(?:
|
|
30
|
+
// Stripe secret keys only (sk_), NOT publishable keys (pk_) which are meant to be public
|
|
31
|
+
/(['"`])sk_(?:live|test)_[a-zA-Z0-9]{24,}\1/,
|
|
32
32
|
// SendGrid
|
|
33
33
|
/(['"`])SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}\1/,
|
|
34
34
|
// Twilio
|