@securecode-ai/mcp 0.3.9 → 0.4.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/README.md +107 -13
- package/dist/api/client.d.ts +1 -1
- package/dist/api/client.js +2 -1
- package/dist/api/client.js.map +1 -1
- package/dist/api/types.d.ts +18 -0
- package/dist/attack/agentScanExecutor.js +159 -5
- package/dist/attack/agentScanExecutor.js.map +1 -1
- package/dist/attack/agentScanLoop.js +157 -3
- package/dist/attack/agentScanLoop.js.map +1 -1
- package/dist/attack/agentScanProtocol.d.ts +47 -5
- package/dist/attack/agentScanProtocol.js +3 -3
- package/dist/index.js +218 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.js +5 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.js +80 -3
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-map/agentMemory.d.ts +75 -0
- package/dist/project-map/agentMemory.js +230 -0
- package/dist/project-map/agentMemory.js.map +1 -0
- package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
- package/dist/project-map/crossFileTaintTracker.js +429 -0
- package/dist/project-map/crossFileTaintTracker.js.map +1 -0
- package/dist/project-map/endpointDiscovery.d.ts +24 -0
- package/dist/project-map/endpointDiscovery.js +101 -0
- package/dist/project-map/endpointDiscovery.js.map +1 -0
- package/dist/project-map/guardEvaluator.js +37 -0
- package/dist/project-map/guardEvaluator.js.map +1 -1
- package/dist/project-map/guardPatterns.js +16 -5
- package/dist/project-map/guardPatterns.js.map +1 -1
- package/dist/project-map/sanitizers.js +10 -0
- package/dist/project-map/sanitizers.js.map +1 -1
- package/dist/project-map/scanCache.d.ts +67 -0
- package/dist/project-map/scanCache.js +169 -0
- package/dist/project-map/scanCache.js.map +1 -0
- package/dist/project-map/sinkRegistry.js +165 -0
- package/dist/project-map/sinkRegistry.js.map +1 -1
- package/dist/project-map/taintSources.d.ts +19 -1
- package/dist/project-map/taintSources.js +69 -2
- package/dist/project-map/taintSources.js.map +1 -1
- package/dist/project-map/taintTracker.d.ts +4 -1
- package/dist/project-map/taintTracker.js +188 -5
- package/dist/project-map/taintTracker.js.map +1 -1
- package/dist/tools/agentMemoryTools.d.ts +18 -0
- package/dist/tools/agentMemoryTools.js +107 -0
- package/dist/tools/agentMemoryTools.js.map +1 -0
- package/dist/tools/agentScan.d.ts +8 -7
- package/dist/tools/agentScan.js +245 -23
- package/dist/tools/agentScan.js.map +1 -1
- package/dist/utils/files.js +19 -2
- package/dist/utils/files.js.map +1 -1
- package/dist/utils/listFiles.d.ts +17 -0
- package/dist/utils/listFiles.js +126 -0
- package/dist/utils/listFiles.js.map +1 -0
- package/dist/utils/listImports.d.ts +15 -0
- package/dist/utils/listImports.js +164 -0
- package/dist/utils/listImports.js.map +1 -0
- package/package.json +1 -1
|
@@ -34,8 +34,20 @@ async function runAgentScan(ctx, target, options = {}) {
|
|
|
34
34
|
let stepsTaken = 0;
|
|
35
35
|
let costSpentUsd = 0;
|
|
36
36
|
try {
|
|
37
|
-
const startResp = await client.postJson('/agent/scan/start', {});
|
|
37
|
+
const startResp = await client.postJson('/agent/scan/start', {}, options.signal);
|
|
38
38
|
const transcript = [];
|
|
39
|
+
const readFiles = new Set();
|
|
40
|
+
// Track read count per file path (case-insensitive) to prevent
|
|
41
|
+
// the agent re-reading the same file dozens of times with different
|
|
42
|
+
// line ranges, which wastes the entire step budget on one file.
|
|
43
|
+
const readFileCounts = new Map();
|
|
44
|
+
const MAX_READS_PER_FILE = 5;
|
|
45
|
+
// Track non-read tool calls to prevent the agent from looping on the
|
|
46
|
+
// same search_code/trace_flow call repeatedly. Keyed by (type + args).
|
|
47
|
+
const toolCallCounts = new Map();
|
|
48
|
+
const MAX_SAME_TOOL_CALL = 2;
|
|
49
|
+
let consecutiveErrors = 0;
|
|
50
|
+
let consecutiveBlockedReads = 0;
|
|
39
51
|
while (true) {
|
|
40
52
|
// Wall clock check
|
|
41
53
|
if (Date.now() - startTime > wallClockMs) {
|
|
@@ -69,8 +81,68 @@ async function runAgentScan(ctx, target, options = {}) {
|
|
|
69
81
|
costCapUsd: budget.costCapUsd,
|
|
70
82
|
},
|
|
71
83
|
};
|
|
72
|
-
|
|
84
|
+
let stepResp;
|
|
85
|
+
try {
|
|
86
|
+
stepResp = await client.postJson('/agent/scan/step', stepReq, options.signal);
|
|
87
|
+
}
|
|
88
|
+
catch (stepErr) {
|
|
89
|
+
const errMsg = stepErr?.message || String(stepErr);
|
|
90
|
+
const apiCode = stepErr?.apiCode || '';
|
|
91
|
+
// Detect API server restart — the run was lost. Don't waste
|
|
92
|
+
// 3 retry steps on a dead run; return immediately.
|
|
93
|
+
if (apiCode === 'AGENT_RUN_NOT_FOUND' || /AGENT_RUN_NOT_FOUND|Invalid or expired agent run/i.test(errMsg)) {
|
|
94
|
+
console.warn(`[Agent Scan Loop] Agent run expired (API server restarted?). Stopping scan.`);
|
|
95
|
+
return {
|
|
96
|
+
status: 'spawn_failed',
|
|
97
|
+
findings: [],
|
|
98
|
+
transcript,
|
|
99
|
+
stepsUsed: stepsTaken,
|
|
100
|
+
costSpentUsd,
|
|
101
|
+
error: 'API server restarted mid-scan — the run was lost. Please retry the scan.',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// Detect abort — the user cancelled. Don't treat as error.
|
|
105
|
+
if (options.signal?.aborted || /aborted/i.test(errMsg)) {
|
|
106
|
+
return {
|
|
107
|
+
status: 'cancelled',
|
|
108
|
+
findings: [],
|
|
109
|
+
transcript,
|
|
110
|
+
stepsUsed: stepsTaken,
|
|
111
|
+
costSpentUsd,
|
|
112
|
+
summary: 'Cancelled by user.',
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// The API rejected the action (malformed, missing field, etc).
|
|
116
|
+
// Add the error to the transcript so the LLM sees it on the
|
|
117
|
+
// next step and can correct itself. Then retry — don't waste
|
|
118
|
+
// the step silently.
|
|
119
|
+
console.warn(`[Agent Scan Loop] Step ${stepsTaken + 1} error: ${errMsg}`);
|
|
120
|
+
consecutiveErrors++;
|
|
121
|
+
stepsTaken++;
|
|
122
|
+
budget.stepsRemaining--;
|
|
123
|
+
// Push the error into the transcript so the LLM sees it
|
|
124
|
+
transcript.push({
|
|
125
|
+
action: {
|
|
126
|
+
type: 'read_file',
|
|
127
|
+
path: '__ERROR__',
|
|
128
|
+
rationale: 'Previous action was invalid',
|
|
129
|
+
},
|
|
130
|
+
observation: `ERROR: Your previous action was rejected: ${errMsg}. Please try a DIFFERENT action with ALL required fields. Set unused fields to null.`,
|
|
131
|
+
});
|
|
132
|
+
if (consecutiveErrors >= 3 || budget.stepsRemaining <= 0) {
|
|
133
|
+
return {
|
|
134
|
+
status: 'capped',
|
|
135
|
+
findings: [],
|
|
136
|
+
transcript,
|
|
137
|
+
stepsUsed: stepsTaken,
|
|
138
|
+
costSpentUsd,
|
|
139
|
+
summary: `Step budget exhausted after ${consecutiveErrors} consecutive API errors. Last error: ${errMsg}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
73
144
|
costSpentUsd += stepResp.costUsd || 0;
|
|
145
|
+
consecutiveErrors = 0;
|
|
74
146
|
// Null next = done (cost capped or steps exhausted)
|
|
75
147
|
if (!stepResp.next) {
|
|
76
148
|
const status = stepResp.costCapped
|
|
@@ -107,7 +179,85 @@ async function runAgentScan(ctx, target, options = {}) {
|
|
|
107
179
|
};
|
|
108
180
|
}
|
|
109
181
|
// Execute the action locally
|
|
110
|
-
|
|
182
|
+
let observation;
|
|
183
|
+
let wasBlocked = false;
|
|
184
|
+
if (action.type === 'read_file') {
|
|
185
|
+
const normalizedPath = action.path.replace(/\\/g, '/').toLowerCase();
|
|
186
|
+
// Track by (path, startLine, endLine) — allow re-reading with different ranges
|
|
187
|
+
const rangeKey = `${normalizedPath}:${action.startLine || 0}:${action.endLine || 0}`;
|
|
188
|
+
if (readFiles.has(rangeKey)) {
|
|
189
|
+
observation = `File "${action.path}" (lines ${action.startLine || 'all'}-${action.endLine || 'all'}) was already read. The content is in the transcript above. Use a DIFFERENT line range or a different tool.`;
|
|
190
|
+
wasBlocked = true;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Per-file read cap: prevent the agent from re-reading the
|
|
194
|
+
// same file with slightly different line ranges dozens of
|
|
195
|
+
// times (observed 28 re-reads on one file). After 3 reads
|
|
196
|
+
// of any range, force the agent to use a different tool.
|
|
197
|
+
const count = (readFileCounts.get(normalizedPath) || 0) + 1;
|
|
198
|
+
if (count > MAX_READS_PER_FILE) {
|
|
199
|
+
observation = `BLOCKED: You have already read "${action.path}" ${MAX_READS_PER_FILE} times. Further read_file calls on this file will also be blocked. You MUST use a different tool (search_code, trace_flow, check_guard, check_policy, list_imports, or finish) to proceed.`;
|
|
200
|
+
wasBlocked = true;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
readFileCounts.set(normalizedPath, count);
|
|
204
|
+
readFiles.add(rangeKey);
|
|
205
|
+
observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Dedup non-read tools: prevent the agent from calling the
|
|
211
|
+
// same search_code("foo") or trace_flow("bar.ts") repeatedly.
|
|
212
|
+
// Build a key from the action type + its primary argument.
|
|
213
|
+
let toolKey = '';
|
|
214
|
+
if (action.type === 'search_code') {
|
|
215
|
+
toolKey = `search_code:${action.pattern || ''}:${action.glob || ''}`;
|
|
216
|
+
}
|
|
217
|
+
else if (action.type === 'trace_flow' || action.type === 'trace_flow_cross_file') {
|
|
218
|
+
toolKey = `${action.type}:${action.filePath || ''}`;
|
|
219
|
+
}
|
|
220
|
+
else if (action.type === 'check_guard') {
|
|
221
|
+
toolKey = `check_guard:${action.guardName || ''}:${action.attackType || ''}`;
|
|
222
|
+
}
|
|
223
|
+
else if (action.type === 'check_policy') {
|
|
224
|
+
toolKey = `check_policy:${action.filePath || ''}`;
|
|
225
|
+
}
|
|
226
|
+
if (toolKey) {
|
|
227
|
+
const count = (toolCallCounts.get(toolKey) || 0) + 1;
|
|
228
|
+
toolCallCounts.set(toolKey, count);
|
|
229
|
+
if (count > MAX_SAME_TOOL_CALL) {
|
|
230
|
+
observation = `You have already called this exact tool with the same arguments ${MAX_SAME_TOOL_CALL} times. The result is in the transcript above. Use a DIFFERENT tool, different arguments, or call finish to report your findings.`;
|
|
231
|
+
wasBlocked = true;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Track consecutive blocked reads — if the agent keeps requesting
|
|
242
|
+
// read_file on blocked files, force-finish to stop wasting steps.
|
|
243
|
+
if (wasBlocked) {
|
|
244
|
+
consecutiveBlockedReads++;
|
|
245
|
+
if (consecutiveBlockedReads >= 5) {
|
|
246
|
+
console.warn(`[Agent Scan Loop] ${consecutiveBlockedReads} consecutive blocked reads — force-finishing to stop wasting steps.`);
|
|
247
|
+
transcript.push({ action, observation });
|
|
248
|
+
return {
|
|
249
|
+
status: 'completed',
|
|
250
|
+
findings: [],
|
|
251
|
+
transcript,
|
|
252
|
+
stepsUsed: stepsTaken,
|
|
253
|
+
costSpentUsd,
|
|
254
|
+
summary: `Investigation cut short — agent was stuck re-reading files. No findings reported.`,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
consecutiveBlockedReads = 0;
|
|
260
|
+
}
|
|
111
261
|
transcript.push({ action, observation });
|
|
112
262
|
}
|
|
113
263
|
}
|
|
@@ -127,8 +277,12 @@ function describeAction(action) {
|
|
|
127
277
|
case 'read_file': return `read_file(${action.path})`;
|
|
128
278
|
case 'search_code': return `search_code("${action.pattern}")`;
|
|
129
279
|
case 'trace_flow': return `trace_flow(${action.filePath})`;
|
|
280
|
+
case 'trace_flow_cross_file': return `trace_flow_cross_file(${action.filePath})`;
|
|
130
281
|
case 'check_guard': return `check_guard(${action.guardName})`;
|
|
131
282
|
case 'check_policy': return `check_policy(${action.filePath})`;
|
|
283
|
+
case 'get_endpoints': return `get_endpoints(${action.glob || 'all'})`;
|
|
284
|
+
case 'list_imports': return `list_imports(${action.filePath})`;
|
|
285
|
+
case 'list_files': return `list_files(${action.path || 'root'})`;
|
|
132
286
|
case 'finish': return 'finish';
|
|
133
287
|
}
|
|
134
288
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentScanLoop.js","sourceRoot":"","sources":["../../src/attack/agentScanLoop.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAyBH,
|
|
1
|
+
{"version":3,"file":"agentScanLoop.js","sourceRoot":"","sources":["../../src/attack/agentScanLoop.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* Types are duplicated (not shared) between the API and MCP repos.
|
|
6
6
|
*/
|
|
7
7
|
export declare const AGENT_SCAN_DEFAULTS: {
|
|
8
|
-
readonly maxSteps:
|
|
9
|
-
readonly costCapUsd: 0.
|
|
10
|
-
readonly wallClockMs:
|
|
8
|
+
readonly maxSteps: 30;
|
|
9
|
+
readonly costCapUsd: 0.5;
|
|
10
|
+
readonly wallClockMs: 300000;
|
|
11
11
|
readonly perStepEstimateUsd: 0.08;
|
|
12
12
|
readonly creditsPerRun: 5;
|
|
13
13
|
readonly dailyRunLimit: 20;
|
|
@@ -15,6 +15,8 @@ export declare const AGENT_SCAN_DEFAULTS: {
|
|
|
15
15
|
export interface AgentScanReadFileAction {
|
|
16
16
|
type: 'read_file';
|
|
17
17
|
path: string;
|
|
18
|
+
startLine?: number;
|
|
19
|
+
endLine?: number;
|
|
18
20
|
rationale: string;
|
|
19
21
|
}
|
|
20
22
|
export interface AgentScanSearchCodeAction {
|
|
@@ -40,6 +42,32 @@ export interface AgentScanCheckPolicyAction {
|
|
|
40
42
|
filePath: string;
|
|
41
43
|
rationale: string;
|
|
42
44
|
}
|
|
45
|
+
export interface AgentScanTraceFlowCrossFileAction {
|
|
46
|
+
type: 'trace_flow_cross_file';
|
|
47
|
+
filePath: string;
|
|
48
|
+
/** How many import hops to follow (default 3). */
|
|
49
|
+
maxDepth?: number;
|
|
50
|
+
rationale: string;
|
|
51
|
+
}
|
|
52
|
+
export interface AgentScanGetEndpointsAction {
|
|
53
|
+
type: 'get_endpoints';
|
|
54
|
+
/** Optional glob filter (e.g. "*.ts"). */
|
|
55
|
+
glob?: string;
|
|
56
|
+
rationale: string;
|
|
57
|
+
}
|
|
58
|
+
export interface AgentScanListImportsAction {
|
|
59
|
+
type: 'list_imports';
|
|
60
|
+
filePath: string;
|
|
61
|
+
rationale: string;
|
|
62
|
+
}
|
|
63
|
+
export interface AgentScanListFilesAction {
|
|
64
|
+
type: 'list_files';
|
|
65
|
+
/** Directory to list (relative to workspace root). Defaults to root. */
|
|
66
|
+
path?: string;
|
|
67
|
+
/** Optional glob filter (e.g. "*.ts"). */
|
|
68
|
+
glob?: string;
|
|
69
|
+
rationale: string;
|
|
70
|
+
}
|
|
43
71
|
export interface AgentScanFinding {
|
|
44
72
|
line: number;
|
|
45
73
|
lineEnd?: number;
|
|
@@ -49,14 +77,26 @@ export interface AgentScanFinding {
|
|
|
49
77
|
evidence: string;
|
|
50
78
|
why: string;
|
|
51
79
|
fixStrategy?: string;
|
|
80
|
+
fix?: {
|
|
81
|
+
fixedCode: string;
|
|
82
|
+
replaceRange: {
|
|
83
|
+
start_line: number;
|
|
84
|
+
end_line: number;
|
|
85
|
+
};
|
|
86
|
+
fixSummary: string;
|
|
87
|
+
importsNeeded?: string[];
|
|
88
|
+
confidence?: number;
|
|
89
|
+
};
|
|
52
90
|
}
|
|
53
91
|
export interface AgentScanFinishAction {
|
|
54
92
|
type: 'finish';
|
|
55
93
|
findings: AgentScanFinding[];
|
|
56
94
|
summary: string;
|
|
95
|
+
/** Self-critique the agent writes before reporting — visible to the user. */
|
|
96
|
+
selfCritique?: string | null;
|
|
57
97
|
}
|
|
58
|
-
export type AgentScanAction = AgentScanReadFileAction | AgentScanSearchCodeAction | AgentScanTraceFlowAction | AgentScanCheckGuardAction | AgentScanCheckPolicyAction | AgentScanFinishAction;
|
|
59
|
-
export type AgentScanActionType = 'read_file' | 'search_code' | 'trace_flow' | 'check_guard' | 'check_policy' | 'finish';
|
|
98
|
+
export type AgentScanAction = AgentScanReadFileAction | AgentScanSearchCodeAction | AgentScanTraceFlowAction | AgentScanTraceFlowCrossFileAction | AgentScanCheckGuardAction | AgentScanCheckPolicyAction | AgentScanGetEndpointsAction | AgentScanListImportsAction | AgentScanListFilesAction | AgentScanFinishAction;
|
|
99
|
+
export type AgentScanActionType = 'read_file' | 'search_code' | 'trace_flow' | 'trace_flow_cross_file' | 'check_guard' | 'check_policy' | 'get_endpoints' | 'list_imports' | 'list_files' | 'finish';
|
|
60
100
|
export type AttackType = 'sql_injection' | 'nosql_injection' | 'command_injection' | 'xss' | 'ssrf' | 'path_traversal' | 'open_redirect' | 'prototype_pollution' | 'insecure_deserialization' | 'broken_access_control';
|
|
61
101
|
export interface AgentScanTranscriptStep {
|
|
62
102
|
action: AgentScanAction;
|
|
@@ -72,6 +112,8 @@ export interface AgentScanTarget {
|
|
|
72
112
|
language: string;
|
|
73
113
|
fileContent: string;
|
|
74
114
|
endpointContext?: unknown;
|
|
115
|
+
/** Formatted workspace memory string (false positives + known facts). */
|
|
116
|
+
workspaceMemory?: string;
|
|
75
117
|
}
|
|
76
118
|
export interface AgentScanStartResponse {
|
|
77
119
|
runId: string;
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.AGENT_SCAN_DEFAULTS = void 0;
|
|
10
10
|
exports.AGENT_SCAN_DEFAULTS = {
|
|
11
|
-
maxSteps:
|
|
12
|
-
costCapUsd: 0.
|
|
13
|
-
wallClockMs:
|
|
11
|
+
maxSteps: 30,
|
|
12
|
+
costCapUsd: 0.50,
|
|
13
|
+
wallClockMs: 300_000,
|
|
14
14
|
perStepEstimateUsd: 0.08,
|
|
15
15
|
creditsPerRun: 5,
|
|
16
16
|
dailyRunLimit: 20,
|
package/dist/index.js
CHANGED
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
})();
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
38
39
|
const credentialStore_1 = require("./auth/credentialStore");
|
|
39
40
|
const server_1 = require("./mcp/server");
|
|
40
41
|
const client_1 = require("./api/client");
|
|
@@ -46,8 +47,15 @@ Usage:
|
|
|
46
47
|
securecode-mcp login [--api-url <url>] Authenticate via email + OTP
|
|
47
48
|
securecode-mcp status Show current auth status
|
|
48
49
|
securecode-mcp logout Remove stored credentials
|
|
50
|
+
securecode-mcp scan <filePath> [--json] Scan a single file for vulnerabilities
|
|
51
|
+
securecode-mcp doctor Verify setup (credentials, API, scan)
|
|
49
52
|
securecode-mcp --help Show this help
|
|
50
53
|
|
|
54
|
+
Scan options:
|
|
55
|
+
--json Output results as JSON (for CI/automation)
|
|
56
|
+
--depth <fast|deep|agent> Scan depth (default: agent). "fast" = no AI, "deep" = full pipeline
|
|
57
|
+
--workspace <path> Workspace root (default: current directory)
|
|
58
|
+
|
|
51
59
|
Environment:
|
|
52
60
|
SECURECODE_API_TOKEN API token (alternative to login)
|
|
53
61
|
SECURECODE_API_URL API base URL (default: https://api.usesecurecode.tech)
|
|
@@ -193,6 +201,210 @@ function cmdLogout() {
|
|
|
193
201
|
console.log('No stored credentials found.');
|
|
194
202
|
}
|
|
195
203
|
}
|
|
204
|
+
async function cmdScan(args) {
|
|
205
|
+
let filePath = '';
|
|
206
|
+
let jsonOutput = false;
|
|
207
|
+
let depth = 'agent';
|
|
208
|
+
let workspace = process.cwd();
|
|
209
|
+
for (let i = 0; i < args.length; i++) {
|
|
210
|
+
if (args[i] === '--json') {
|
|
211
|
+
jsonOutput = true;
|
|
212
|
+
}
|
|
213
|
+
else if (args[i] === '--depth' && i + 1 < args.length) {
|
|
214
|
+
depth = args[++i];
|
|
215
|
+
}
|
|
216
|
+
else if (args[i] === '--workspace' && i + 1 < args.length) {
|
|
217
|
+
workspace = path.resolve(args[++i]);
|
|
218
|
+
}
|
|
219
|
+
else if (!args[i].startsWith('-')) {
|
|
220
|
+
filePath = args[i];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!filePath) {
|
|
224
|
+
console.error('Usage: securecode-mcp scan <filePath> [--json] [--depth <fast|deep|agent>]');
|
|
225
|
+
process.exit(1);
|
|
226
|
+
}
|
|
227
|
+
const absPath = path.resolve(filePath);
|
|
228
|
+
if (!fs.existsSync(absPath)) {
|
|
229
|
+
console.error(`Error: File not found: ${filePath}`);
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
const creds = credentialStore_1.CredentialStore.getOrThrow();
|
|
233
|
+
const ctx = {
|
|
234
|
+
apiUrl: creds.apiUrl,
|
|
235
|
+
apiToken: creds.apiToken,
|
|
236
|
+
workspaceRoot: workspace,
|
|
237
|
+
};
|
|
238
|
+
// Read the file
|
|
239
|
+
const { readFileFromWorkspace } = require('./utils/files');
|
|
240
|
+
let fileResult;
|
|
241
|
+
try {
|
|
242
|
+
fileResult = readFileFromWorkspace(workspace, filePath);
|
|
243
|
+
}
|
|
244
|
+
catch (e) {
|
|
245
|
+
console.error(`Error: ${e.message}`);
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
if (!jsonOutput) {
|
|
249
|
+
console.log(`Scanning: ${filePath}`);
|
|
250
|
+
console.log(`Language: ${fileResult.language}`);
|
|
251
|
+
console.log(`Depth: ${depth}`);
|
|
252
|
+
console.log('');
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
if (depth === 'agent') {
|
|
256
|
+
const { toolAgentScan } = require('./tools/agentScan');
|
|
257
|
+
const result = await toolAgentScan(ctx, {
|
|
258
|
+
filePath,
|
|
259
|
+
_noCache: true,
|
|
260
|
+
_progress: (_p, _t, msg) => {
|
|
261
|
+
if (!jsonOutput)
|
|
262
|
+
process.stderr.write(` ${msg}\r`);
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
if (jsonOutput) {
|
|
266
|
+
console.log(JSON.stringify(result, null, 2));
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const findings = result.agentFindings || [];
|
|
270
|
+
console.log(`Status: ${result.status}`);
|
|
271
|
+
console.log(`Summary: ${result.summary || 'Scan complete'}`);
|
|
272
|
+
console.log(`Findings: ${findings.length}`);
|
|
273
|
+
console.log(`Steps: ${result.stepsUsed || 0}`);
|
|
274
|
+
console.log(`Cost: $${(result.costSpentUsd || 0).toFixed(4)}`);
|
|
275
|
+
console.log('');
|
|
276
|
+
findings.forEach((f, i) => {
|
|
277
|
+
const proven = f.proven ? ` [${f.proven}]` : '';
|
|
278
|
+
console.log(` [${i + 1}] ${f.type} L${f.line} (${f.severity}, confidence ${f.confidence})${proven}`);
|
|
279
|
+
console.log(` ${f.evidence?.slice(0, 100)}...`);
|
|
280
|
+
if (f.proven === 'PROVEN')
|
|
281
|
+
console.log(` PROVEN: ${f.provenReason?.slice(0, 100)}`);
|
|
282
|
+
console.log('');
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
process.exit(findingsCount(result));
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
const { toolScan } = require('./tools/scan');
|
|
289
|
+
const result = await toolScan(ctx, {
|
|
290
|
+
filePath,
|
|
291
|
+
scanDepth: depth === 'fast' ? 'fast' : 'deep',
|
|
292
|
+
});
|
|
293
|
+
const scanFindings = result.findings || [];
|
|
294
|
+
if (jsonOutput) {
|
|
295
|
+
console.log(JSON.stringify(result, null, 2));
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
console.log(`Findings: ${scanFindings.length}`);
|
|
299
|
+
scanFindings.forEach((f, i) => {
|
|
300
|
+
console.log(` [${i + 1}] ${f.type} L${f.line} (${f.severity}) — ${f.message?.slice(0, 80)}`);
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
process.exit(scanFindings.length > 0 ? 1 : 0);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
console.error(`Error: ${e.message}`);
|
|
308
|
+
process.exit(2);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
function findingsCount(result) {
|
|
312
|
+
return (result.agentFindings || []).length > 0 ? 1 : 0;
|
|
313
|
+
}
|
|
314
|
+
async function cmdDoctor() {
|
|
315
|
+
const creds = credentialStore_1.CredentialStore.get();
|
|
316
|
+
let allOk = true;
|
|
317
|
+
console.log('SecureCode Setup Verification');
|
|
318
|
+
console.log('═══════════════════════════════════════════════════');
|
|
319
|
+
console.log('');
|
|
320
|
+
// 1. Check credentials
|
|
321
|
+
if (!creds) {
|
|
322
|
+
console.log('✗ Credentials: Not authenticated. Run: securecode-mcp login');
|
|
323
|
+
allOk = false;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
console.log(`✓ Credentials: Authenticated (token: ${creds.apiToken.substring(0, 8)}...${creds.apiToken.slice(-4)})`);
|
|
327
|
+
console.log(` API URL: ${creds.apiUrl}`);
|
|
328
|
+
}
|
|
329
|
+
console.log('');
|
|
330
|
+
// 2. Ping /health
|
|
331
|
+
if (creds) {
|
|
332
|
+
try {
|
|
333
|
+
const { ApiClient } = require('./api/client');
|
|
334
|
+
const client = new ApiClient({ baseUrl: creds.apiUrl, token: creds.apiToken });
|
|
335
|
+
// Use a simple GET to /health via fetch
|
|
336
|
+
const response = await fetch(`${creds.apiUrl}/health`);
|
|
337
|
+
if (response.ok) {
|
|
338
|
+
const body = await response.json();
|
|
339
|
+
console.log(`✓ API reachable: ${creds.apiUrl}/health → ${body.status || 'ok'}`);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
console.log(`✗ API reachable: HTTP ${response.status}`);
|
|
343
|
+
allOk = false;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
catch (e) {
|
|
347
|
+
console.log(`✗ API reachable: ${e.message}`);
|
|
348
|
+
allOk = false;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
console.log('⚠ API reachable: Skipped (no credentials)');
|
|
353
|
+
}
|
|
354
|
+
console.log('');
|
|
355
|
+
// 3. Check workspace
|
|
356
|
+
const workspace = process.cwd();
|
|
357
|
+
const securecodeDir = path.join(workspace, '.securecode');
|
|
358
|
+
if (fs.existsSync(securecodeDir)) {
|
|
359
|
+
console.log(`✓ Workspace: ${workspace} (.securecode/ directory exists)`);
|
|
360
|
+
const memFile = path.join(securecodeDir, 'agent-memory.json');
|
|
361
|
+
if (fs.existsSync(memFile)) {
|
|
362
|
+
try {
|
|
363
|
+
const mem = JSON.parse(fs.readFileSync(memFile, 'utf8'));
|
|
364
|
+
console.log(` Agent memory: ${mem.falsePositives?.length || 0} false positive(s), ${mem.knownFacts?.length || 0} known fact(s)`);
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
console.log(' Agent memory: (corrupt file — will be recreated)');
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
console.log(' Agent memory: (none yet — created on first dismiss/scan)');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
console.log(`✓ Workspace: ${workspace} (.securecode/ will be created on first scan)`);
|
|
376
|
+
}
|
|
377
|
+
console.log('');
|
|
378
|
+
// 4. Check tree-sitter
|
|
379
|
+
try {
|
|
380
|
+
const { parseSource } = require('./project-map/parserLoader');
|
|
381
|
+
const parsed = await parseSource('const x = 1;', 'javascript');
|
|
382
|
+
console.log(`✓ Tree-sitter: ${parsed ? 'working' : 'failed to parse'}`);
|
|
383
|
+
if (!parsed)
|
|
384
|
+
allOk = false;
|
|
385
|
+
}
|
|
386
|
+
catch (e) {
|
|
387
|
+
console.log(`✗ Tree-sitter: ${e.message}`);
|
|
388
|
+
allOk = false;
|
|
389
|
+
}
|
|
390
|
+
console.log('');
|
|
391
|
+
// Summary
|
|
392
|
+
console.log('═══════════════════════════════════════════════════');
|
|
393
|
+
if (allOk && creds) {
|
|
394
|
+
console.log('All checks passed! You are ready to scan.');
|
|
395
|
+
console.log('');
|
|
396
|
+
console.log('Next steps:');
|
|
397
|
+
console.log(' securecode-mcp scan src/app.ts # scan a file');
|
|
398
|
+
console.log(' securecode-mcp serve # start MCP server');
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
console.log('Some checks failed. Fix the issues above before scanning.');
|
|
402
|
+
if (!creds) {
|
|
403
|
+
console.log(' Run: securecode-mcp login');
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
process.exit(allOk && creds ? 0 : 1);
|
|
407
|
+
}
|
|
196
408
|
async function main() {
|
|
197
409
|
const args = process.argv.slice(2);
|
|
198
410
|
const command = args[0];
|
|
@@ -214,6 +426,12 @@ async function main() {
|
|
|
214
426
|
case 'logout':
|
|
215
427
|
cmdLogout();
|
|
216
428
|
break;
|
|
429
|
+
case 'scan':
|
|
430
|
+
await cmdScan(subArgs);
|
|
431
|
+
break;
|
|
432
|
+
case 'doctor':
|
|
433
|
+
await cmdDoctor();
|
|
434
|
+
break;
|
|
217
435
|
default:
|
|
218
436
|
console.error(`Unknown command: ${command}`);
|
|
219
437
|
printUsage();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -44,6 +44,7 @@ const scanDependencies_1 = require("../tools/scanDependencies");
|
|
|
44
44
|
const scanBatch_1 = require("../tools/scanBatch");
|
|
45
45
|
const scanSecrets_1 = require("../tools/scanSecrets");
|
|
46
46
|
const agentScan_1 = require("../tools/agentScan");
|
|
47
|
+
const agentMemoryTools_1 = require("../tools/agentMemoryTools");
|
|
47
48
|
const PROTOCOL_VERSION = '2025-03-26';
|
|
48
49
|
const SERVER_NAME = 'securecode-mcp';
|
|
49
50
|
const SERVER_VERSION = '0.2.0';
|
|
@@ -76,6 +77,10 @@ const TOOL_HANDLERS = {
|
|
|
76
77
|
'securecode.scan-batch': scanBatch_1.toolScanBatch,
|
|
77
78
|
'securecode.scan-secrets': scanSecrets_1.toolScanSecrets,
|
|
78
79
|
'securecode.agent-scan': agentScan_1.toolAgentScan,
|
|
80
|
+
'securecode.record-false-positive': agentMemoryTools_1.toolRecordFalsePositive,
|
|
81
|
+
'securecode.get-agent-memory': agentMemoryTools_1.toolGetAgentMemory,
|
|
82
|
+
'securecode.clear-agent-memory': agentMemoryTools_1.toolClearAgentMemory,
|
|
83
|
+
'securecode.add-known-fact': agentMemoryTools_1.toolAddKnownFact,
|
|
79
84
|
};
|
|
80
85
|
function validateArgs(tool, args) {
|
|
81
86
|
const schema = tool.inputSchema;
|