@securecode-ai/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +71 -0
- package/dist/api/client.d.ts +22 -0
- package/dist/api/client.js +141 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/types.d.ts +129 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/approval/auditLog.d.ts +3 -0
- package/dist/approval/auditLog.js +67 -0
- package/dist/approval/auditLog.js.map +1 -0
- package/dist/approval/broker.d.ts +11 -0
- package/dist/approval/broker.js +252 -0
- package/dist/approval/broker.js.map +1 -0
- package/dist/approval/types.d.ts +26 -0
- package/dist/approval/types.js +58 -0
- package/dist/approval/types.js.map +1 -0
- package/dist/attack/agentLoop.d.ts +21 -0
- package/dist/attack/agentLoop.js +148 -0
- package/dist/attack/agentLoop.js.map +1 -0
- package/dist/attack/executor.d.ts +17 -0
- package/dist/attack/executor.js +162 -0
- package/dist/attack/executor.js.map +1 -0
- package/dist/attack/policy.d.ts +26 -0
- package/dist/attack/policy.js +73 -0
- package/dist/attack/policy.js.map +1 -0
- package/dist/attack/protocol.d.ts +64 -0
- package/dist/attack/protocol.js +3 -0
- package/dist/attack/protocol.js.map +1 -0
- package/dist/attack/report.d.ts +16 -0
- package/dist/attack/report.js +54 -0
- package/dist/attack/report.js.map +1 -0
- package/dist/auth/credentialStore.d.ts +20 -0
- package/dist/auth/credentialStore.js +148 -0
- package/dist/auth/credentialStore.js.map +1 -0
- package/dist/auth/keychain.d.ts +14 -0
- package/dist/auth/keychain.js +267 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +183 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -0
- package/dist/mcp/tools.js +120 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +26 -0
- package/dist/mcp/types.js +3 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/project-map/astHelpers.d.ts +89 -0
- package/dist/project-map/astHelpers.js +468 -0
- package/dist/project-map/astHelpers.js.map +1 -0
- package/dist/project-map/cache.d.ts +11 -0
- package/dist/project-map/cache.js +86 -0
- package/dist/project-map/cache.js.map +1 -0
- package/dist/project-map/confidence.d.ts +50 -0
- package/dist/project-map/confidence.js +87 -0
- package/dist/project-map/confidence.js.map +1 -0
- package/dist/project-map/crossFile.d.ts +73 -0
- package/dist/project-map/crossFile.js +33 -0
- package/dist/project-map/crossFile.js.map +1 -0
- package/dist/project-map/detectors.d.ts +83 -0
- package/dist/project-map/detectors.js +376 -0
- package/dist/project-map/detectors.js.map +1 -0
- package/dist/project-map/layer1.d.ts +74 -0
- package/dist/project-map/layer1.js +928 -0
- package/dist/project-map/layer1.js.map +1 -0
- package/dist/project-map/layer2.d.ts +30 -0
- package/dist/project-map/layer2.js +249 -0
- package/dist/project-map/layer2.js.map +1 -0
- package/dist/project-map/mapBuilder.d.ts +17 -0
- package/dist/project-map/mapBuilder.js +164 -0
- package/dist/project-map/mapBuilder.js.map +1 -0
- package/dist/project-map/parserLoader.d.ts +61 -0
- package/dist/project-map/parserLoader.js +175 -0
- package/dist/project-map/parserLoader.js.map +1 -0
- package/dist/project-map/schemas.d.ts +28 -0
- package/dist/project-map/schemas.js +131 -0
- package/dist/project-map/schemas.js.map +1 -0
- package/dist/project-map/types.d.ts +232 -0
- package/dist/project-map/types.js +61 -0
- package/dist/project-map/types.js.map +1 -0
- package/dist/tools/attack.d.ts +2 -0
- package/dist/tools/attack.js +80 -0
- package/dist/tools/attack.js.map +1 -0
- package/dist/tools/fix.d.ts +2 -0
- package/dist/tools/fix.js +60 -0
- package/dist/tools/fix.js.map +1 -0
- package/dist/tools/map.d.ts +2 -0
- package/dist/tools/map.js +46 -0
- package/dist/tools/map.js.map +1 -0
- package/dist/tools/scan.d.ts +2 -0
- package/dist/tools/scan.js +55 -0
- package/dist/tools/scan.js.map +1 -0
- package/dist/utils/files.d.ts +8 -0
- package/dist/utils/files.js +79 -0
- package/dist/utils/files.js.map +1 -0
- package/package.json +53 -0
- package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Keychain = void 0;
|
|
37
|
+
const child_process_1 = require("child_process");
|
|
38
|
+
const os = __importStar(require("os"));
|
|
39
|
+
const SERVICE_NAME = 'SecureCode-MCP';
|
|
40
|
+
const ACCOUNT_NAME = 'api-token';
|
|
41
|
+
function detectPlatform() {
|
|
42
|
+
const platform = os.platform();
|
|
43
|
+
if (platform === 'darwin' || platform === 'win32' || platform === 'linux') {
|
|
44
|
+
return platform;
|
|
45
|
+
}
|
|
46
|
+
return 'linux';
|
|
47
|
+
}
|
|
48
|
+
const KeychainDarwin = {
|
|
49
|
+
set(token) {
|
|
50
|
+
(0, child_process_1.execSync)(`security add-generic-password -s "${SERVICE_NAME}" -a "${ACCOUNT_NAME}" -w "${token.replace(/"/g, '\\"')}" -U`, { stdio: 'pipe' });
|
|
51
|
+
},
|
|
52
|
+
get() {
|
|
53
|
+
try {
|
|
54
|
+
const buf = (0, child_process_1.execSync)(`security find-generic-password -s "${SERVICE_NAME}" -a "${ACCOUNT_NAME}" -w`, { stdio: 'pipe', encoding: 'utf8' });
|
|
55
|
+
return buf.trim() || null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
delete() {
|
|
62
|
+
try {
|
|
63
|
+
(0, child_process_1.execSync)(`security delete-generic-password -s "${SERVICE_NAME}" -a "${ACCOUNT_NAME}"`, { stdio: 'pipe' });
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
const KeychainWin32 = {
|
|
72
|
+
set(token) {
|
|
73
|
+
const psScript = `
|
|
74
|
+
Add-Type @"
|
|
75
|
+
using System;
|
|
76
|
+
using System.Runtime.InteropServices;
|
|
77
|
+
public class CredMan {
|
|
78
|
+
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
|
79
|
+
public static extern bool CredWriteW(ref CREDENTIAL cred, uint flags);
|
|
80
|
+
|
|
81
|
+
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
82
|
+
public struct CREDENTIAL {
|
|
83
|
+
public uint Flags;
|
|
84
|
+
public uint Type;
|
|
85
|
+
public string TargetName;
|
|
86
|
+
public string Comment;
|
|
87
|
+
public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten;
|
|
88
|
+
public uint CredentialBlobSize;
|
|
89
|
+
public string CredentialBlob;
|
|
90
|
+
public uint Persist;
|
|
91
|
+
public uint AttributeCount;
|
|
92
|
+
public IntPtr Attributes;
|
|
93
|
+
public string TargetAlias;
|
|
94
|
+
public string UserName;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
"@
|
|
98
|
+
$blob = [System.Text.Encoding]::Unicode.GetBytes("${token.replace(/"/g, '`"')}")
|
|
99
|
+
$cred = New-Object CredMan+CREDENTIAL
|
|
100
|
+
$cred.Flags = 0
|
|
101
|
+
$cred.Type = 1
|
|
102
|
+
$cred.TargetName = "${SERVICE_NAME}"
|
|
103
|
+
$cred.CredentialBlobSize = $blob.Length
|
|
104
|
+
$cred.CredentialBlob = "${token.replace(/"/g, '`"')}"
|
|
105
|
+
$cred.Persist = 2
|
|
106
|
+
$cred.UserName = "${ACCOUNT_NAME}"
|
|
107
|
+
[CredMan]::CredWriteW([ref]$cred, 0) | Out-Null
|
|
108
|
+
`;
|
|
109
|
+
(0, child_process_1.execSync)('powershell -NoProfile -Command "' + psScript.replace(/"/g, '\\"').replace(/\n/g, ' ') + '"', {
|
|
110
|
+
stdio: 'pipe',
|
|
111
|
+
encoding: 'utf8',
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
get() {
|
|
115
|
+
const psScript = `
|
|
116
|
+
Add-Type @"
|
|
117
|
+
using System;
|
|
118
|
+
using System.Runtime.InteropServices;
|
|
119
|
+
public class CredMan {
|
|
120
|
+
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
|
121
|
+
public static extern bool CredReadW(string target, uint type, uint flags, out IntPtr cred);
|
|
122
|
+
|
|
123
|
+
[DllImport("advapi32.dll")]
|
|
124
|
+
public static extern void CredFree(IntPtr cred);
|
|
125
|
+
|
|
126
|
+
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
|
127
|
+
public struct CREDENTIAL {
|
|
128
|
+
public uint Flags;
|
|
129
|
+
public uint Type;
|
|
130
|
+
public string TargetName;
|
|
131
|
+
public string Comment;
|
|
132
|
+
public System.Runtime.InteropServices.ComTypes.FILETIME LastWritten;
|
|
133
|
+
public uint CredentialBlobSize;
|
|
134
|
+
public string CredentialBlob;
|
|
135
|
+
public uint Persist;
|
|
136
|
+
public uint AttributeCount;
|
|
137
|
+
public IntPtr Attributes;
|
|
138
|
+
public string TargetAlias;
|
|
139
|
+
public string UserName;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
"@
|
|
143
|
+
$ptr = [IntPtr]::Zero
|
|
144
|
+
$ok = [CredMan]::CredReadW("${SERVICE_NAME}", 1, 0, [ref]$ptr)
|
|
145
|
+
if (-not $ok) { return "" }
|
|
146
|
+
$cred = [Runtime.InteropServices.Marshal]::PtrToStructure[CredMan+CREDENTIAL]($ptr)
|
|
147
|
+
[CredMan]::CredFree($ptr)
|
|
148
|
+
return $cred.CredentialBlob
|
|
149
|
+
`;
|
|
150
|
+
try {
|
|
151
|
+
const result = (0, child_process_1.execSync)('powershell -NoProfile -Command "' + psScript.replace(/"/g, '\\"').replace(/\n/g, ' ') + '"', {
|
|
152
|
+
stdio: 'pipe',
|
|
153
|
+
encoding: 'utf8',
|
|
154
|
+
});
|
|
155
|
+
const token = result.trim();
|
|
156
|
+
return token || null;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
delete() {
|
|
163
|
+
const psScript = `
|
|
164
|
+
Add-Type @"
|
|
165
|
+
using System;
|
|
166
|
+
using System.Runtime.InteropServices;
|
|
167
|
+
public class CredMan {
|
|
168
|
+
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
|
169
|
+
public static extern bool CredDeleteW(string target, uint type, uint flags);
|
|
170
|
+
}
|
|
171
|
+
"@
|
|
172
|
+
[CredMan]::CredDeleteW("${SERVICE_NAME}", 1, 0) | Out-Null
|
|
173
|
+
`;
|
|
174
|
+
try {
|
|
175
|
+
(0, child_process_1.execSync)('powershell -NoProfile -Command "' + psScript.replace(/"/g, '\\"').replace(/\n/g, ' ') + '"', {
|
|
176
|
+
stdio: 'pipe',
|
|
177
|
+
});
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
const KeychainLinux = {
|
|
186
|
+
set(token) {
|
|
187
|
+
(0, child_process_1.execSync)(`secret-tool store --label="${SERVICE_NAME}" service "${SERVICE_NAME}" account "${ACCOUNT_NAME}" <<< '${token.replace(/'/g, "'\\''")}'`, { stdio: 'pipe', shell: '/bin/bash' });
|
|
188
|
+
},
|
|
189
|
+
get() {
|
|
190
|
+
try {
|
|
191
|
+
const buf = (0, child_process_1.execSync)(`secret-tool lookup service "${SERVICE_NAME}" account "${ACCOUNT_NAME}"`, { stdio: 'pipe', encoding: 'utf8' });
|
|
192
|
+
return buf.trim() || null;
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
delete() {
|
|
199
|
+
try {
|
|
200
|
+
(0, child_process_1.execSync)(`secret-tool clear service "${SERVICE_NAME}" account "${ACCOUNT_NAME}"`, { stdio: 'pipe' });
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
const IMPLS = {
|
|
209
|
+
darwin: KeychainDarwin,
|
|
210
|
+
win32: KeychainWin32,
|
|
211
|
+
linux: KeychainLinux,
|
|
212
|
+
};
|
|
213
|
+
class Keychain {
|
|
214
|
+
static isAvailable() {
|
|
215
|
+
const platform = detectPlatform();
|
|
216
|
+
try {
|
|
217
|
+
if (platform === 'darwin') {
|
|
218
|
+
(0, child_process_1.execSync)('which security', { stdio: 'pipe' });
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
else if (platform === 'win32') {
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
else if (platform === 'linux') {
|
|
225
|
+
(0, child_process_1.execSync)('which secret-tool', { stdio: 'pipe' });
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
static get() {
|
|
235
|
+
const platform = detectPlatform();
|
|
236
|
+
try {
|
|
237
|
+
return IMPLS[platform].get();
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
static set(token) {
|
|
244
|
+
const platform = detectPlatform();
|
|
245
|
+
try {
|
|
246
|
+
IMPLS[platform].set(token);
|
|
247
|
+
return { success: true, method: 'keychain', platform };
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
return { success: false, method: 'file', platform, error: err.message };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
static delete() {
|
|
254
|
+
const platform = detectPlatform();
|
|
255
|
+
try {
|
|
256
|
+
return IMPLS[platform].delete();
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
static getPlatform() {
|
|
263
|
+
return detectPlatform();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
exports.Keychain = Keychain;
|
|
267
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../src/auth/keychain.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const credentialStore_1 = require("./auth/credentialStore");
|
|
39
|
+
const server_1 = require("./mcp/server");
|
|
40
|
+
function printUsage() {
|
|
41
|
+
console.log(`SecureCode MCP — standalone security scanner for AI coding tools
|
|
42
|
+
|
|
43
|
+
Usage:
|
|
44
|
+
securecode-mcp serve [--workspace <path>] Start the MCP stdio server
|
|
45
|
+
securecode-mcp login [--api-url <url>] Store your API token
|
|
46
|
+
securecode-mcp status Show current auth status
|
|
47
|
+
securecode-mcp logout Remove stored credentials
|
|
48
|
+
securecode-mcp --help Show this help
|
|
49
|
+
|
|
50
|
+
Environment:
|
|
51
|
+
SECURECODE_API_TOKEN API token (alternative to login)
|
|
52
|
+
SECURECODE_API_URL API base URL (default: https://api.usesecurecode.tech)
|
|
53
|
+
|
|
54
|
+
MCP client configuration (Cursor, Claude Code, Windsurf, Codex):
|
|
55
|
+
{
|
|
56
|
+
"mcpServers": {
|
|
57
|
+
"securecode": {
|
|
58
|
+
"command": "securecode-mcp",
|
|
59
|
+
"args": ["serve", "--workspace", "/path/to/your/project"]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
`);
|
|
64
|
+
}
|
|
65
|
+
async function cmdServe(args) {
|
|
66
|
+
let workspace = process.cwd();
|
|
67
|
+
for (let i = 0; i < args.length; i++) {
|
|
68
|
+
if (args[i] === '--workspace' && i + 1 < args.length) {
|
|
69
|
+
workspace = path.resolve(args[++i]);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (!path.isAbsolute(workspace)) {
|
|
73
|
+
workspace = path.resolve(workspace);
|
|
74
|
+
}
|
|
75
|
+
const creds = credentialStore_1.CredentialStore.getOrThrow();
|
|
76
|
+
const ctx = {
|
|
77
|
+
apiUrl: creds.apiUrl,
|
|
78
|
+
apiToken: creds.apiToken,
|
|
79
|
+
workspaceRoot: workspace,
|
|
80
|
+
};
|
|
81
|
+
(0, server_1.startServer)(ctx);
|
|
82
|
+
}
|
|
83
|
+
async function cmdLogin(args) {
|
|
84
|
+
let apiUrl = 'https://api.usesecurecode.tech';
|
|
85
|
+
for (let i = 0; i < args.length; i++) {
|
|
86
|
+
if (args[i] === '--api-url' && i + 1 < args.length) {
|
|
87
|
+
apiUrl = args[++i];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const readline = require('readline');
|
|
91
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
92
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, resolve));
|
|
93
|
+
console.log('SecureCode MCP Login');
|
|
94
|
+
console.log(`API URL: ${apiUrl}`);
|
|
95
|
+
console.log('');
|
|
96
|
+
const token = await ask('Enter your SecureCode API token: ');
|
|
97
|
+
rl.close();
|
|
98
|
+
if (!token || token.trim().length === 0) {
|
|
99
|
+
console.error('Error: No token provided.');
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
const result = credentialStore_1.CredentialStore.save({
|
|
103
|
+
apiToken: token.trim(),
|
|
104
|
+
apiUrl,
|
|
105
|
+
storedAt: new Date().toISOString(),
|
|
106
|
+
});
|
|
107
|
+
console.log('');
|
|
108
|
+
if (result.method === 'keychain') {
|
|
109
|
+
console.log('Credentials saved to OS keychain.');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(`Credentials saved to ~/.securecode/credentials.json (mode 0600).`);
|
|
113
|
+
if (result.warning) {
|
|
114
|
+
console.log(`Warning: ${result.warning}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
console.log('You can now run: securecode-mcp serve --workspace /path/to/project');
|
|
118
|
+
}
|
|
119
|
+
function cmdStatus() {
|
|
120
|
+
const creds = credentialStore_1.CredentialStore.get();
|
|
121
|
+
if (!creds) {
|
|
122
|
+
console.log('Not authenticated. Run: securecode-mcp login');
|
|
123
|
+
process.exit(0);
|
|
124
|
+
}
|
|
125
|
+
console.log('Authenticated');
|
|
126
|
+
console.log(` API URL: ${creds.apiUrl}`);
|
|
127
|
+
console.log(` Token: ${creds.apiToken.substring(0, 8)}...${creds.apiToken.slice(-4)}`);
|
|
128
|
+
console.log(` Storage: ${creds.storedAt}`);
|
|
129
|
+
}
|
|
130
|
+
function cmdLogout() {
|
|
131
|
+
const removed = credentialStore_1.CredentialStore.clear();
|
|
132
|
+
if (removed) {
|
|
133
|
+
console.log('Credentials removed.');
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log('No stored credentials found.');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function main() {
|
|
140
|
+
const args = process.argv.slice(2);
|
|
141
|
+
const command = args[0];
|
|
142
|
+
if (!command || command === '--help' || command === '-h') {
|
|
143
|
+
printUsage();
|
|
144
|
+
process.exit(0);
|
|
145
|
+
}
|
|
146
|
+
const subArgs = args.slice(1);
|
|
147
|
+
switch (command) {
|
|
148
|
+
case 'serve':
|
|
149
|
+
await cmdServe(subArgs);
|
|
150
|
+
break;
|
|
151
|
+
case 'login':
|
|
152
|
+
await cmdLogin(subArgs);
|
|
153
|
+
break;
|
|
154
|
+
case 'status':
|
|
155
|
+
cmdStatus();
|
|
156
|
+
break;
|
|
157
|
+
case 'logout':
|
|
158
|
+
cmdLogout();
|
|
159
|
+
break;
|
|
160
|
+
default:
|
|
161
|
+
console.error(`Unknown command: ${command}`);
|
|
162
|
+
printUsage();
|
|
163
|
+
process.exit(1);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
main().catch((err) => {
|
|
167
|
+
console.error(err.message || String(err));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.startServer = startServer;
|
|
37
|
+
const readline = __importStar(require("readline"));
|
|
38
|
+
const tools_1 = require("./tools");
|
|
39
|
+
const scan_1 = require("../tools/scan");
|
|
40
|
+
const map_1 = require("../tools/map");
|
|
41
|
+
const fix_1 = require("../tools/fix");
|
|
42
|
+
const attack_1 = require("../tools/attack");
|
|
43
|
+
const PROTOCOL_VERSION = '2025-03-26';
|
|
44
|
+
const SERVER_NAME = 'securecode-mcp';
|
|
45
|
+
const SERVER_VERSION = '0.1.0';
|
|
46
|
+
let initialized = false;
|
|
47
|
+
function send(msg) {
|
|
48
|
+
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
49
|
+
}
|
|
50
|
+
function result(id, value) {
|
|
51
|
+
send({ jsonrpc: '2.0', id, result: value });
|
|
52
|
+
}
|
|
53
|
+
function error(id, code, message, data) {
|
|
54
|
+
send({ jsonrpc: '2.0', id, error: { code, message, data } });
|
|
55
|
+
}
|
|
56
|
+
const TOOL_HANDLERS = {
|
|
57
|
+
'securecode.scan': scan_1.toolScan,
|
|
58
|
+
'securecode.map': map_1.toolMap,
|
|
59
|
+
'securecode.fix': fix_1.toolFix,
|
|
60
|
+
'securecode.attack': attack_1.toolAttack,
|
|
61
|
+
};
|
|
62
|
+
function validateArgs(tool, args) {
|
|
63
|
+
const schema = tool.inputSchema;
|
|
64
|
+
const props = schema.properties || {};
|
|
65
|
+
for (const name of schema.required || []) {
|
|
66
|
+
if (args[name] === undefined || args[name] === null) {
|
|
67
|
+
return `Missing required parameter '${name}' for ${tool.name}.`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const [name, value] of Object.entries(args)) {
|
|
71
|
+
const declared = props[name]?.type;
|
|
72
|
+
if (!declared || value === undefined || value === null)
|
|
73
|
+
continue;
|
|
74
|
+
const ok = declared === 'string' ? typeof value === 'string' :
|
|
75
|
+
declared === 'number' ? typeof value === 'number' && Number.isFinite(value) :
|
|
76
|
+
declared === 'boolean' ? typeof value === 'boolean' :
|
|
77
|
+
declared === 'object' ? typeof value === 'object' && !Array.isArray(value) :
|
|
78
|
+
declared === 'array' ? Array.isArray(value) :
|
|
79
|
+
true;
|
|
80
|
+
if (!ok) {
|
|
81
|
+
return `Parameter '${name}' of ${tool.name} must be a ${declared}, got ${Array.isArray(value) ? 'array' : typeof value}.`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
async function handleRequest(ctx, req) {
|
|
87
|
+
const id = req.id ?? null;
|
|
88
|
+
try {
|
|
89
|
+
switch (req.method) {
|
|
90
|
+
case 'initialize': {
|
|
91
|
+
initialized = true;
|
|
92
|
+
return {
|
|
93
|
+
jsonrpc: '2.0', id,
|
|
94
|
+
result: {
|
|
95
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
96
|
+
capabilities: { tools: { listChanged: false } },
|
|
97
|
+
serverInfo: { name: SERVER_NAME, version: SERVER_VERSION },
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
case 'notifications/initialized': {
|
|
102
|
+
return { jsonrpc: '2.0', id: null };
|
|
103
|
+
}
|
|
104
|
+
case 'tools/list': {
|
|
105
|
+
return { jsonrpc: '2.0', id, result: { tools: tools_1.TOOLS } };
|
|
106
|
+
}
|
|
107
|
+
case 'tools/call': {
|
|
108
|
+
const params = (req.params || {});
|
|
109
|
+
const name = params.name;
|
|
110
|
+
const args = params.arguments || {};
|
|
111
|
+
const handler = name ? TOOL_HANDLERS[name] : undefined;
|
|
112
|
+
if (!handler) {
|
|
113
|
+
return { jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } };
|
|
114
|
+
}
|
|
115
|
+
const toolDef = tools_1.TOOLS.find((t) => t.name === name);
|
|
116
|
+
if (!toolDef) {
|
|
117
|
+
return { jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } };
|
|
118
|
+
}
|
|
119
|
+
const invalid = validateArgs(toolDef, args);
|
|
120
|
+
if (invalid) {
|
|
121
|
+
return { jsonrpc: '2.0', id, error: { code: -32602, message: invalid } };
|
|
122
|
+
}
|
|
123
|
+
const result_data = await handler(ctx, args);
|
|
124
|
+
return {
|
|
125
|
+
jsonrpc: '2.0', id,
|
|
126
|
+
result: {
|
|
127
|
+
content: [{ type: 'text', text: JSON.stringify(result_data, null, 2) }],
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
default: {
|
|
132
|
+
if (req.method.startsWith('notifications/')) {
|
|
133
|
+
return { jsonrpc: '2.0', id: null };
|
|
134
|
+
}
|
|
135
|
+
return { jsonrpc: '2.0', id, error: { code: -32601, message: `Method not found: ${req.method}` } };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
const code = err.code || -32603;
|
|
141
|
+
return { jsonrpc: '2.0', id, error: { code, message: err.message || String(err) } };
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function startServer(ctx) {
|
|
145
|
+
const rl = readline.createInterface({ input: process.stdin, terminal: false });
|
|
146
|
+
rl.on('line', (line) => {
|
|
147
|
+
const trimmed = line.trim();
|
|
148
|
+
if (!trimmed)
|
|
149
|
+
return;
|
|
150
|
+
let parsed;
|
|
151
|
+
try {
|
|
152
|
+
parsed = JSON.parse(trimmed);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
error(null, -32700, 'Parse error');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (parsed === null ||
|
|
159
|
+
typeof parsed !== 'object' ||
|
|
160
|
+
Array.isArray(parsed) ||
|
|
161
|
+
typeof parsed.method !== 'string') {
|
|
162
|
+
const maybeId = parsed && typeof parsed === 'object' && !Array.isArray(parsed)
|
|
163
|
+
? parsed.id ?? null
|
|
164
|
+
: null;
|
|
165
|
+
error(maybeId, -32600, 'Invalid Request');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const req = parsed;
|
|
169
|
+
handleRequest(ctx, req).then((res) => {
|
|
170
|
+
if (req.id !== undefined && req.id !== null) {
|
|
171
|
+
send(res);
|
|
172
|
+
}
|
|
173
|
+
}).catch((err) => {
|
|
174
|
+
if (req.id !== undefined && req.id !== null) {
|
|
175
|
+
error(req.id, -32603, err.message || String(err));
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
rl.on('close', () => {
|
|
180
|
+
process.exit(0);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|