@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.
Files changed (58) hide show
  1. package/README.md +107 -13
  2. package/dist/api/client.d.ts +1 -1
  3. package/dist/api/client.js +2 -1
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/types.d.ts +18 -0
  6. package/dist/attack/agentScanExecutor.js +159 -5
  7. package/dist/attack/agentScanExecutor.js.map +1 -1
  8. package/dist/attack/agentScanLoop.js +157 -3
  9. package/dist/attack/agentScanLoop.js.map +1 -1
  10. package/dist/attack/agentScanProtocol.d.ts +47 -5
  11. package/dist/attack/agentScanProtocol.js +3 -3
  12. package/dist/index.js +218 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/mcp/server.js +5 -0
  15. package/dist/mcp/server.js.map +1 -1
  16. package/dist/mcp/tools.js +80 -3
  17. package/dist/mcp/tools.js.map +1 -1
  18. package/dist/project-map/agentMemory.d.ts +75 -0
  19. package/dist/project-map/agentMemory.js +230 -0
  20. package/dist/project-map/agentMemory.js.map +1 -0
  21. package/dist/project-map/crossFileTaintTracker.d.ts +51 -0
  22. package/dist/project-map/crossFileTaintTracker.js +429 -0
  23. package/dist/project-map/crossFileTaintTracker.js.map +1 -0
  24. package/dist/project-map/endpointDiscovery.d.ts +24 -0
  25. package/dist/project-map/endpointDiscovery.js +101 -0
  26. package/dist/project-map/endpointDiscovery.js.map +1 -0
  27. package/dist/project-map/guardEvaluator.js +37 -0
  28. package/dist/project-map/guardEvaluator.js.map +1 -1
  29. package/dist/project-map/guardPatterns.js +16 -5
  30. package/dist/project-map/guardPatterns.js.map +1 -1
  31. package/dist/project-map/sanitizers.js +10 -0
  32. package/dist/project-map/sanitizers.js.map +1 -1
  33. package/dist/project-map/scanCache.d.ts +67 -0
  34. package/dist/project-map/scanCache.js +169 -0
  35. package/dist/project-map/scanCache.js.map +1 -0
  36. package/dist/project-map/sinkRegistry.js +165 -0
  37. package/dist/project-map/sinkRegistry.js.map +1 -1
  38. package/dist/project-map/taintSources.d.ts +19 -1
  39. package/dist/project-map/taintSources.js +69 -2
  40. package/dist/project-map/taintSources.js.map +1 -1
  41. package/dist/project-map/taintTracker.d.ts +4 -1
  42. package/dist/project-map/taintTracker.js +188 -5
  43. package/dist/project-map/taintTracker.js.map +1 -1
  44. package/dist/tools/agentMemoryTools.d.ts +18 -0
  45. package/dist/tools/agentMemoryTools.js +107 -0
  46. package/dist/tools/agentMemoryTools.js.map +1 -0
  47. package/dist/tools/agentScan.d.ts +8 -7
  48. package/dist/tools/agentScan.js +245 -23
  49. package/dist/tools/agentScan.js.map +1 -1
  50. package/dist/utils/files.js +19 -2
  51. package/dist/utils/files.js.map +1 -1
  52. package/dist/utils/listFiles.d.ts +17 -0
  53. package/dist/utils/listFiles.js +126 -0
  54. package/dist/utils/listFiles.js.map +1 -0
  55. package/dist/utils/listImports.d.ts +15 -0
  56. package/dist/utils/listImports.js +164 -0
  57. package/dist/utils/listImports.js.map +1 -0
  58. 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
- const stepResp = await client.postJson('/agent/scan/step', stepReq);
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
- const observation = await (0, agentScanExecutor_1.executeAction)(action, ctx, startResp.runId, client, target);
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":"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"}
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: 20;
9
- readonly costCapUsd: 0.4;
10
- readonly wallClockMs: 180000;
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: 20,
12
- costCapUsd: 0.40,
13
- wallClockMs: 180_000,
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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"}
@@ -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;