@aimarket/warden 0.8.1 → 0.9.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/CHANGELOG.md +41 -5
- package/README-es.md +27 -9
- package/README-fr.md +28 -9
- package/README-ru.md +28 -9
- package/README-zh.md +23 -9
- package/README.md +27 -9
- package/dist/classifier.d.ts +50 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +164 -0
- package/dist/classifier.js.map +1 -0
- package/dist/claude-hook.d.ts +53 -0
- package/dist/claude-hook.d.ts.map +1 -0
- package/dist/claude-hook.js +192 -0
- package/dist/claude-hook.js.map +1 -0
- package/dist/histor.d.ts +69 -0
- package/dist/histor.d.ts.map +1 -0
- package/dist/histor.js +82 -0
- package/dist/histor.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/jcs.d.ts +8 -0
- package/dist/jcs.d.ts.map +1 -1
- package/dist/jcs.js +25 -5
- package/dist/jcs.js.map +1 -1
- package/dist/mcp-client.d.ts +58 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +451 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-rpc.js +1 -1
- package/dist/mcp-server.js +8 -0
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js +7 -6
- package/dist/mcp-tools.js.map +1 -1
- package/dist/mtl.d.ts +28 -0
- package/dist/mtl.d.ts.map +1 -0
- package/dist/mtl.js +77 -0
- package/dist/mtl.js.map +1 -0
- package/dist/pin-store.js +3 -3
- package/dist/pin-store.js.map +1 -1
- package/dist/pinning.d.ts +18 -2
- package/dist/pinning.d.ts.map +1 -1
- package/dist/pinning.js +34 -7
- package/dist/pinning.js.map +1 -1
- package/dist/scan-cli.d.ts +3 -0
- package/dist/scan-cli.d.ts.map +1 -0
- package/dist/scan-cli.js +36 -0
- package/dist/scan-cli.js.map +1 -0
- package/dist/scan-config.d.ts +72 -0
- package/dist/scan-config.d.ts.map +1 -0
- package/dist/scan-config.js +239 -0
- package/dist/scan-config.js.map +1 -0
- package/dist/scan-lock.d.ts +46 -0
- package/dist/scan-lock.d.ts.map +1 -0
- package/dist/scan-lock.js +112 -0
- package/dist/scan-lock.js.map +1 -0
- package/dist/scan-report.d.ts +21 -0
- package/dist/scan-report.d.ts.map +1 -0
- package/dist/scan-report.js +273 -0
- package/dist/scan-report.js.map +1 -0
- package/dist/scan.d.ts +137 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +534 -0
- package/dist/scan.js.map +1 -0
- package/dist/static-scan.d.ts +1 -1
- package/dist/static-scan.d.ts.map +1 -1
- package/dist/static-scan.js +262 -12
- package/dist/static-scan.js.map +1 -1
- package/dist/tool-list.d.ts +34 -0
- package/dist/tool-list.d.ts.map +1 -0
- package/dist/tool-list.js +57 -0
- package/dist/tool-list.js.map +1 -0
- package/dist/wrap-cli.d.ts.map +1 -1
- package/dist/wrap-cli.js +6 -4
- package/dist/wrap-cli.js.map +1 -1
- package/dist/wrap-state.d.ts +3 -0
- package/dist/wrap-state.d.ts.map +1 -1
- package/dist/wrap-state.js +7 -4
- package/dist/wrap-state.js.map +1 -1
- package/dist/wrap.js +50 -42
- package/dist/wrap.js.map +1 -1
- package/docs/gates.es.md +59 -10
- package/docs/gates.fr.md +59 -10
- package/docs/gates.md +55 -10
- package/docs/gates.ru.md +59 -11
- package/docs/gates.zh.md +13 -7
- package/docs/scan.es.md +184 -0
- package/docs/scan.fr.md +184 -0
- package/docs/scan.md +184 -0
- package/docs/scan.ru.md +184 -0
- package/docs/scan.zh.md +184 -0
- package/docs/scanner-comparison.es.md +218 -0
- package/docs/scanner-comparison.fr.md +223 -0
- package/docs/scanner-comparison.md +209 -0
- package/docs/scanner-comparison.ru.md +214 -0
- package/docs/scanner-comparison.zh.md +135 -0
- package/package.json +5 -3
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { request as httpRequest } from 'node:http';
|
|
3
|
+
import { request as httpsRequest } from 'node:https';
|
|
4
|
+
import { lookup as dnsLookup } from 'node:dns';
|
|
5
|
+
import { isIP } from 'node:net';
|
|
6
|
+
import { WrapFrames, readFrames } from './wrap-wire.js';
|
|
7
|
+
import { listAllTools, SCAN_LIST_LIMITS } from './tool-list.js';
|
|
8
|
+
/**
|
|
9
|
+
* A one-shot MCP client for `scan`: initialize, list every tool, close.
|
|
10
|
+
*
|
|
11
|
+
* It never calls a tool, reads a resource or answers a sampling request. Over
|
|
12
|
+
* stdio it starts the server the way the client config says to — which runs
|
|
13
|
+
* that program, exactly as the MCP client would — so `scan --no-launch` exists
|
|
14
|
+
* for places (CI on a pull request) where running it is not acceptable.
|
|
15
|
+
*/
|
|
16
|
+
export const PROTOCOL_VERSION = '2025-06-18';
|
|
17
|
+
export const RESPONSE_BYTES = SCAN_LIST_LIMITS.maxBytes;
|
|
18
|
+
export class McpClientError extends Error {
|
|
19
|
+
kind;
|
|
20
|
+
constructor(kind, message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.kind = kind;
|
|
23
|
+
this.name = 'McpClientError';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function initParams(version) {
|
|
27
|
+
return { protocolVersion: PROTOCOL_VERSION, capabilities: {}, clientInfo: { name: 'warden-scan', version } };
|
|
28
|
+
}
|
|
29
|
+
function readInit(result) {
|
|
30
|
+
if (!result || typeof result !== 'object')
|
|
31
|
+
throw new McpClientError('protocol', 'initialize returned no result');
|
|
32
|
+
const r = result;
|
|
33
|
+
const info = r.serverInfo && typeof r.serverInfo === 'object' ? r.serverInfo : {};
|
|
34
|
+
return {
|
|
35
|
+
protocolVersion: typeof r.protocolVersion === 'string' ? r.protocolVersion : undefined,
|
|
36
|
+
serverInfo: { name: typeof info.name === 'string' ? info.name : undefined, version: typeof info.version === 'string' ? info.version : undefined },
|
|
37
|
+
instructions: typeof r.instructions === 'string' ? r.instructions : undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Answer what a well-behaved client must answer; refuse everything else. */
|
|
41
|
+
function answerServerRequest(msg) {
|
|
42
|
+
if (msg.method === 'ping')
|
|
43
|
+
return { jsonrpc: '2.0', id: msg.id, result: {} };
|
|
44
|
+
if (msg.method === 'roots/list')
|
|
45
|
+
return { jsonrpc: '2.0', id: msg.id, result: { roots: [] } };
|
|
46
|
+
return { jsonrpc: '2.0', id: msg.id, error: { code: -32601, message: 'warden scan does not serve this request' } };
|
|
47
|
+
}
|
|
48
|
+
// ── stdio ────────────────────────────────────────────────────────────────────
|
|
49
|
+
export async function fetchStdio(ref, opts) {
|
|
50
|
+
if (!ref.command)
|
|
51
|
+
throw new McpClientError('spawn', 'no command');
|
|
52
|
+
const child = spawn(ref.command, ref.args ?? [], {
|
|
53
|
+
stdio: ['pipe', 'pipe', 'pipe'], cwd: opts.cwd,
|
|
54
|
+
env: { ...(opts.baseEnv ?? process.env), ...(ref.env ?? {}) },
|
|
55
|
+
});
|
|
56
|
+
let stderrTail = '';
|
|
57
|
+
child.stderr.on('data', chunk => { stderrTail = (stderrTail + String(chunk)).slice(-2000); });
|
|
58
|
+
const pending = new Map();
|
|
59
|
+
let failure;
|
|
60
|
+
const fail = (err) => {
|
|
61
|
+
if (failure)
|
|
62
|
+
return;
|
|
63
|
+
failure = err;
|
|
64
|
+
for (const p of pending.values())
|
|
65
|
+
p.reject(err);
|
|
66
|
+
pending.clear();
|
|
67
|
+
};
|
|
68
|
+
child.on('error', e => fail(new McpClientError('spawn', `could not start: ${e.message}`)));
|
|
69
|
+
child.on('close', code => fail(new McpClientError('spawn', `exited (code ${code ?? 'signal'}) before answering${stderrTail ? `: ${lastLine(stderrTail)}` : ''}`)));
|
|
70
|
+
child.stdin.on('error', () => { });
|
|
71
|
+
const send = (msg) => { if (!child.stdin.destroyed)
|
|
72
|
+
child.stdin.write(JSON.stringify(msg) + '\n'); };
|
|
73
|
+
readFrames(child.stdout, new WrapFrames('ndjson'), body => {
|
|
74
|
+
let msg;
|
|
75
|
+
try {
|
|
76
|
+
msg = JSON.parse(body);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return;
|
|
80
|
+
} // a stray log line on stdout is not our concern
|
|
81
|
+
if (!msg || typeof msg !== 'object')
|
|
82
|
+
return;
|
|
83
|
+
if (msg.method !== undefined) {
|
|
84
|
+
if (msg.id !== undefined && msg.id !== null)
|
|
85
|
+
send(answerServerRequest(msg));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (typeof msg.id !== 'string')
|
|
89
|
+
return;
|
|
90
|
+
const p = pending.get(msg.id);
|
|
91
|
+
if (!p)
|
|
92
|
+
return;
|
|
93
|
+
pending.delete(msg.id);
|
|
94
|
+
p.resolve({ msg, bytes: Buffer.byteLength(body) });
|
|
95
|
+
}, e => fail(new McpClientError('protocol', e instanceof Error ? e.message : String(e))), () => { });
|
|
96
|
+
let seq = 0;
|
|
97
|
+
const call = (method, params) => new Promise((resolve, reject) => {
|
|
98
|
+
if (failure) {
|
|
99
|
+
reject(failure);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const id = `warden-scan:${seq++}`;
|
|
103
|
+
pending.set(id, { resolve, reject });
|
|
104
|
+
send({ jsonrpc: '2.0', id, method, params });
|
|
105
|
+
});
|
|
106
|
+
const result = async (method, params) => {
|
|
107
|
+
const { msg, bytes } = await call(method, params);
|
|
108
|
+
if (msg.error)
|
|
109
|
+
throw new McpClientError('protocol', `${method} failed: ${msg.error.message ?? JSON.stringify(msg.error)}`);
|
|
110
|
+
return { result: msg.result, bytes };
|
|
111
|
+
};
|
|
112
|
+
const work = (async () => {
|
|
113
|
+
const init = readInit((await result('initialize', initParams(opts.clientVersion))).result);
|
|
114
|
+
send({ jsonrpc: '2.0', method: 'notifications/initialized' });
|
|
115
|
+
const tools = await listAllTools(cursor => result('tools/list', cursor === undefined ? {} : { cursor }), SCAN_LIST_LIMITS);
|
|
116
|
+
return { ...init, tools };
|
|
117
|
+
})();
|
|
118
|
+
try {
|
|
119
|
+
return await withTimeout(work, opts.timeoutMs, () => new McpClientError('timeout', `no answer within ${opts.timeoutMs} ms${stderrTail ? `: ${lastLine(stderrTail)}` : ''}`));
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
stopChild(child);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function stopChild(child) {
|
|
126
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
127
|
+
return;
|
|
128
|
+
try {
|
|
129
|
+
child.stdin?.end();
|
|
130
|
+
}
|
|
131
|
+
catch { /* already closed */ }
|
|
132
|
+
const term = setTimeout(() => { try {
|
|
133
|
+
child.kill('SIGTERM');
|
|
134
|
+
}
|
|
135
|
+
catch { /* gone */ } }, 1500);
|
|
136
|
+
const kill = setTimeout(() => { try {
|
|
137
|
+
child.kill('SIGKILL');
|
|
138
|
+
}
|
|
139
|
+
catch { /* gone */ } }, 4000);
|
|
140
|
+
term.unref();
|
|
141
|
+
kill.unref();
|
|
142
|
+
child.once('close', () => { clearTimeout(term); clearTimeout(kill); });
|
|
143
|
+
child.stdout?.destroy();
|
|
144
|
+
child.stderr?.destroy();
|
|
145
|
+
child.unref();
|
|
146
|
+
}
|
|
147
|
+
/** The most telling stderr line: the last one that is not a stack frame or Node's version footer. */
|
|
148
|
+
function lastLine(text) {
|
|
149
|
+
const lines = text.trim().split('\n').map(l => l.trimEnd()).filter(l => l && !/^\s+at\s/.test(l) && !/^Node\.js v\d/.test(l) && !/^\s*\^+\s*$/.test(l));
|
|
150
|
+
const errorLine = [...lines].reverse().find(l => /error|cannot|not found|missing|denied|refused/i.test(l));
|
|
151
|
+
return (errorLine ?? lines[lines.length - 1] ?? '').slice(0, 300);
|
|
152
|
+
}
|
|
153
|
+
function withTimeout(work, ms, error) {
|
|
154
|
+
let timer;
|
|
155
|
+
const timeout = new Promise((_, reject) => { timer = setTimeout(() => reject(error()), ms); });
|
|
156
|
+
return Promise.race([work, timeout]).finally(() => clearTimeout(timer));
|
|
157
|
+
}
|
|
158
|
+
// ── address policy for remote servers ────────────────────────────────────────
|
|
159
|
+
/** True for addresses a CI scan must not be steered into: loopback, private, link-local, metadata, CGNAT, ULA. */
|
|
160
|
+
export function isNonPublicAddress(address) {
|
|
161
|
+
const v = isIP(address);
|
|
162
|
+
if (v === 4) {
|
|
163
|
+
const [a, b] = address.split('.').map(Number);
|
|
164
|
+
return a === 0 || a === 10 || a === 127 || (a === 100 && b >= 64 && b <= 127) || (a === 169 && b === 254) ||
|
|
165
|
+
(a === 172 && b >= 16 && b <= 31) || (a === 192 && b === 168) || (a === 198 && (b === 18 || b === 19)) || a >= 224;
|
|
166
|
+
}
|
|
167
|
+
if (v === 6) {
|
|
168
|
+
const x = address.toLowerCase();
|
|
169
|
+
if (x === '::' || x === '::1')
|
|
170
|
+
return true;
|
|
171
|
+
const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/.exec(x);
|
|
172
|
+
if (mapped)
|
|
173
|
+
return isNonPublicAddress(mapped[1]);
|
|
174
|
+
return /^(fc|fd|fe8|fe9|fea|feb|ff)/.test(x) || x.startsWith('fd00:ec2:');
|
|
175
|
+
}
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
function guardedLookup(publicOnly) {
|
|
179
|
+
return (hostname, options, callback) => {
|
|
180
|
+
dnsLookup(hostname, { ...options, all: true }, (err, addresses) => {
|
|
181
|
+
if (err) {
|
|
182
|
+
callback(err, '');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const list = addresses;
|
|
186
|
+
if (publicOnly) {
|
|
187
|
+
const bad = list.find(a => isNonPublicAddress(a.address));
|
|
188
|
+
if (bad) {
|
|
189
|
+
callback(Object.assign(new Error(`${hostname} resolves to a non-public address (${bad.address}); refused by --public-only`), { code: 'EWARDENREFUSED' }), '');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (options.all)
|
|
194
|
+
callback(null, list);
|
|
195
|
+
else
|
|
196
|
+
callback(null, list[0].address, list[0].family);
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function open(url, method, headers, body, opts, signal) {
|
|
201
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:')
|
|
202
|
+
return Promise.reject(new McpClientError('refused', `unsupported URL scheme ${url.protocol}`));
|
|
203
|
+
if (opts.publicOnly && isIP(url.hostname.replace(/^\[|\]$/g, '')) && isNonPublicAddress(url.hostname.replace(/^\[|\]$/g, ''))) {
|
|
204
|
+
return Promise.reject(new McpClientError('refused', `${url.hostname} is a non-public address; refused by --public-only`));
|
|
205
|
+
}
|
|
206
|
+
const fn = url.protocol === 'https:' ? httpsRequest : httpRequest;
|
|
207
|
+
return new Promise((resolve, reject) => {
|
|
208
|
+
const req = fn(url, { method, headers: { 'user-agent': `warden-scan/${opts.clientVersion}`, ...headers, ...(body ? { 'content-length': String(Buffer.byteLength(body)) } : {}) }, lookup: guardedLookup(!!opts.publicOnly), signal }, res => resolve({ status: res.statusCode ?? 0, headers: res.headers, res }));
|
|
209
|
+
req.on('error', e => reject(e.code === 'EWARDENREFUSED' ? new McpClientError('refused', e.message)
|
|
210
|
+
: signal.aborted ? new McpClientError('timeout', 'timed out') : new McpClientError('network', e.message)));
|
|
211
|
+
if (body)
|
|
212
|
+
req.write(body);
|
|
213
|
+
req.end();
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
async function readAll(res, limit = RESPONSE_BYTES) {
|
|
217
|
+
const chunks = [];
|
|
218
|
+
let total = 0;
|
|
219
|
+
for await (const chunk of res) {
|
|
220
|
+
total += chunk.length;
|
|
221
|
+
if (total > limit) {
|
|
222
|
+
res.destroy();
|
|
223
|
+
throw new McpClientError('protocol', `response exceeds ${limit} bytes`);
|
|
224
|
+
}
|
|
225
|
+
chunks.push(chunk);
|
|
226
|
+
}
|
|
227
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
228
|
+
}
|
|
229
|
+
/** Incremental SSE parser: yields `{event, data}` per dispatched event. */
|
|
230
|
+
export class SseParser {
|
|
231
|
+
buf = '';
|
|
232
|
+
event = '';
|
|
233
|
+
data = [];
|
|
234
|
+
push(text) {
|
|
235
|
+
this.buf += text;
|
|
236
|
+
const out = [];
|
|
237
|
+
let nl;
|
|
238
|
+
while ((nl = this.buf.search(/\r\n|\r|\n/)) >= 0) {
|
|
239
|
+
const line = this.buf.slice(0, nl);
|
|
240
|
+
this.buf = this.buf.slice(nl + (this.buf.startsWith('\r\n', nl) ? 2 : 1));
|
|
241
|
+
if (line === '') {
|
|
242
|
+
if (this.data.length)
|
|
243
|
+
out.push({ event: this.event || 'message', data: this.data.join('\n') });
|
|
244
|
+
this.event = '';
|
|
245
|
+
this.data = [];
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
if (line.startsWith(':'))
|
|
249
|
+
continue;
|
|
250
|
+
const colon = line.indexOf(':');
|
|
251
|
+
const field = colon < 0 ? line : line.slice(0, colon);
|
|
252
|
+
const value = colon < 0 ? '' : line.slice(colon + 1).replace(/^ /, '');
|
|
253
|
+
if (field === 'event')
|
|
254
|
+
this.event = value;
|
|
255
|
+
else if (field === 'data')
|
|
256
|
+
this.data.push(value);
|
|
257
|
+
}
|
|
258
|
+
if (this.buf.length > RESPONSE_BYTES)
|
|
259
|
+
throw new McpClientError('protocol', 'SSE line exceeds the response limit');
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
end() { return this.push('\n\n'); }
|
|
263
|
+
}
|
|
264
|
+
function parseRpc(text) {
|
|
265
|
+
let v;
|
|
266
|
+
try {
|
|
267
|
+
v = JSON.parse(text);
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return [];
|
|
271
|
+
}
|
|
272
|
+
return (Array.isArray(v) ? v : [v]).filter((m) => !!m && typeof m === 'object');
|
|
273
|
+
}
|
|
274
|
+
/** Streamable HTTP (2025-03-26 and later): every request is a POST; the reply is JSON or an SSE stream. */
|
|
275
|
+
export async function fetchStreamableHttp(ref, opts) {
|
|
276
|
+
const url = new URL(ref.url);
|
|
277
|
+
const controller = new AbortController();
|
|
278
|
+
let session, negotiated, seq = 0;
|
|
279
|
+
const post = async (msg, expectReply) => {
|
|
280
|
+
const headers = { ...(opts.headers ?? {}), 'content-type': 'application/json', accept: 'application/json, text/event-stream' };
|
|
281
|
+
if (session)
|
|
282
|
+
headers['mcp-session-id'] = session;
|
|
283
|
+
if (negotiated)
|
|
284
|
+
headers['mcp-protocol-version'] = negotiated;
|
|
285
|
+
const body = JSON.stringify(msg);
|
|
286
|
+
const reply = await open(url, 'POST', headers, body, opts, controller.signal);
|
|
287
|
+
const sid = reply.headers['mcp-session-id'];
|
|
288
|
+
if (typeof sid === 'string' && sid)
|
|
289
|
+
session = sid;
|
|
290
|
+
if (reply.status >= 300 && reply.status < 400) {
|
|
291
|
+
reply.res.resume();
|
|
292
|
+
throw new McpClientError('http', `HTTP ${reply.status} redirect (not followed)`);
|
|
293
|
+
}
|
|
294
|
+
if (reply.status === 401 || reply.status === 403) {
|
|
295
|
+
reply.res.resume();
|
|
296
|
+
throw new McpClientError('http', `HTTP ${reply.status}: the server needs credentials this config does not carry`);
|
|
297
|
+
}
|
|
298
|
+
if (reply.status >= 400) {
|
|
299
|
+
reply.res.resume();
|
|
300
|
+
throw new McpClientError('http', `HTTP ${reply.status}`);
|
|
301
|
+
}
|
|
302
|
+
if (!expectReply) {
|
|
303
|
+
reply.res.resume();
|
|
304
|
+
return { bytes: 0 };
|
|
305
|
+
}
|
|
306
|
+
const type = String(reply.headers['content-type'] ?? '');
|
|
307
|
+
if (type.includes('text/event-stream')) {
|
|
308
|
+
const parser = new SseParser();
|
|
309
|
+
let bytes = 0;
|
|
310
|
+
for await (const chunk of reply.res) {
|
|
311
|
+
bytes += chunk.length;
|
|
312
|
+
if (bytes > RESPONSE_BYTES) {
|
|
313
|
+
reply.res.destroy();
|
|
314
|
+
throw new McpClientError('protocol', 'SSE response exceeds the limit');
|
|
315
|
+
}
|
|
316
|
+
for (const ev of parser.push(String(chunk))) {
|
|
317
|
+
for (const m of parseRpc(ev.data)) {
|
|
318
|
+
if (m.id === msg.id && m.method === undefined) {
|
|
319
|
+
reply.res.destroy();
|
|
320
|
+
return { msg: m, bytes };
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
for (const ev of parser.end())
|
|
326
|
+
for (const m of parseRpc(ev.data))
|
|
327
|
+
if (m.id === msg.id && m.method === undefined)
|
|
328
|
+
return { msg: m, bytes };
|
|
329
|
+
throw new McpClientError('protocol', `${msg.method}: the event stream ended without a reply`);
|
|
330
|
+
}
|
|
331
|
+
const text = await readAll(reply.res);
|
|
332
|
+
const m = parseRpc(text).find(r => r.id === msg.id);
|
|
333
|
+
if (!m)
|
|
334
|
+
throw new McpClientError('protocol', `${msg.method}: no JSON-RPC reply in the response`);
|
|
335
|
+
return { msg: m, bytes: Buffer.byteLength(text) };
|
|
336
|
+
};
|
|
337
|
+
const call = async (method, params) => {
|
|
338
|
+
const { msg, bytes } = await post({ jsonrpc: '2.0', id: `warden-scan:${seq++}`, method, params }, true);
|
|
339
|
+
if (msg.error)
|
|
340
|
+
throw new McpClientError('protocol', `${method} failed: ${msg.error.message ?? JSON.stringify(msg.error)}`);
|
|
341
|
+
return { result: msg.result, bytes };
|
|
342
|
+
};
|
|
343
|
+
const work = (async () => {
|
|
344
|
+
const init = readInit((await call('initialize', initParams(opts.clientVersion))).result);
|
|
345
|
+
negotiated = init.protocolVersion;
|
|
346
|
+
await post({ jsonrpc: '2.0', method: 'notifications/initialized' }, false).catch(() => { });
|
|
347
|
+
const tools = await listAllTools(cursor => call('tools/list', cursor === undefined ? {} : { cursor }), SCAN_LIST_LIMITS);
|
|
348
|
+
return { ...init, tools };
|
|
349
|
+
})();
|
|
350
|
+
try {
|
|
351
|
+
return await withTimeout(work, opts.timeoutMs, () => new McpClientError('timeout', `no answer within ${opts.timeoutMs} ms`));
|
|
352
|
+
}
|
|
353
|
+
finally {
|
|
354
|
+
controller.abort();
|
|
355
|
+
if (session) {
|
|
356
|
+
// Courtesy: end the session. Never awaited past a short bound, never fatal.
|
|
357
|
+
const end = new AbortController();
|
|
358
|
+
const t = setTimeout(() => end.abort(), 2000);
|
|
359
|
+
t.unref();
|
|
360
|
+
open(url, 'GET', {}, undefined, opts, end.signal).then(r => r.res.resume(), () => { }).finally(() => clearTimeout(t));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/** Legacy HTTP+SSE (2024-11-05): GET opens the stream, its `endpoint` event names where to POST. */
|
|
365
|
+
export async function fetchLegacySse(ref, opts) {
|
|
366
|
+
const url = new URL(ref.url);
|
|
367
|
+
const controller = new AbortController();
|
|
368
|
+
const work = (async () => {
|
|
369
|
+
const reply = await open(url, 'GET', { ...(opts.headers ?? {}), accept: 'text/event-stream' }, undefined, opts, controller.signal);
|
|
370
|
+
if (reply.status >= 400) {
|
|
371
|
+
reply.res.resume();
|
|
372
|
+
throw new McpClientError('http', `HTTP ${reply.status}`);
|
|
373
|
+
}
|
|
374
|
+
if (reply.status >= 300) {
|
|
375
|
+
reply.res.resume();
|
|
376
|
+
throw new McpClientError('http', `HTTP ${reply.status} redirect (not followed)`);
|
|
377
|
+
}
|
|
378
|
+
const parser = new SseParser();
|
|
379
|
+
const pending = new Map();
|
|
380
|
+
let endpoint, endpointReady = () => { }, streamError = () => { };
|
|
381
|
+
const ready = new Promise((resolve, reject) => { endpointReady = resolve; streamError = reject; });
|
|
382
|
+
let bytes = 0;
|
|
383
|
+
reply.res.on('data', chunk => {
|
|
384
|
+
bytes += chunk.length;
|
|
385
|
+
if (bytes > RESPONSE_BYTES * 4) {
|
|
386
|
+
reply.res.destroy();
|
|
387
|
+
streamError(new McpClientError('protocol', 'SSE stream exceeds the limit'));
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
for (const ev of parser.push(String(chunk))) {
|
|
391
|
+
if (ev.event === 'endpoint' && !endpoint) {
|
|
392
|
+
const target = new URL(ev.data.trim(), url);
|
|
393
|
+
if (target.origin !== url.origin) {
|
|
394
|
+
streamError(new McpClientError('refused', `endpoint event points at another origin (${target.origin})`));
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
endpoint = target;
|
|
398
|
+
endpointReady(target);
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
for (const m of parseRpc(ev.data)) {
|
|
402
|
+
if (m.method !== undefined) {
|
|
403
|
+
if (m.id !== undefined && m.id !== null && endpoint)
|
|
404
|
+
void open(endpoint, 'POST', { ...(opts.headers ?? {}), 'content-type': 'application/json' }, JSON.stringify(answerServerRequest(m)), opts, controller.signal).then(r => r.res.resume(), () => { });
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
const resolve = typeof m.id === 'string' ? pending.get(m.id) : undefined;
|
|
408
|
+
if (resolve) {
|
|
409
|
+
pending.delete(m.id);
|
|
410
|
+
resolve({ msg: m, bytes: Buffer.byteLength(ev.data) });
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
});
|
|
415
|
+
reply.res.on('error', e => streamError(new McpClientError('network', e.message)));
|
|
416
|
+
reply.res.on('end', () => streamError(new McpClientError('protocol', 'the event stream closed')));
|
|
417
|
+
const postUrl = await ready;
|
|
418
|
+
let seq = 0;
|
|
419
|
+
const call = async (method, params) => {
|
|
420
|
+
const id = `warden-scan:${seq++}`;
|
|
421
|
+
const answered = new Promise((resolve, reject) => { pending.set(id, resolve); ready.catch(reject); reply.res.once('end', () => reject(new McpClientError('protocol', 'the event stream closed'))); });
|
|
422
|
+
const r = await open(postUrl, 'POST', { ...(opts.headers ?? {}), 'content-type': 'application/json' }, JSON.stringify({ jsonrpc: '2.0', id, method, params }), opts, controller.signal);
|
|
423
|
+
r.res.resume();
|
|
424
|
+
if (r.status >= 400)
|
|
425
|
+
throw new McpClientError('http', `${method}: HTTP ${r.status}`);
|
|
426
|
+
const { msg, bytes: n } = await answered;
|
|
427
|
+
if (msg.error)
|
|
428
|
+
throw new McpClientError('protocol', `${method} failed: ${msg.error.message ?? JSON.stringify(msg.error)}`);
|
|
429
|
+
return { result: msg.result, bytes: n };
|
|
430
|
+
};
|
|
431
|
+
const init = readInit((await call('initialize', initParams(opts.clientVersion))).result);
|
|
432
|
+
await open(postUrl, 'POST', { ...(opts.headers ?? {}), 'content-type': 'application/json' }, JSON.stringify({ jsonrpc: '2.0', method: 'notifications/initialized' }), opts, controller.signal).then(r => r.res.resume(), () => { });
|
|
433
|
+
const tools = await listAllTools(cursor => call('tools/list', cursor === undefined ? {} : { cursor }), SCAN_LIST_LIMITS);
|
|
434
|
+
return { ...init, tools };
|
|
435
|
+
})();
|
|
436
|
+
try {
|
|
437
|
+
return await withTimeout(work, opts.timeoutMs, () => new McpClientError('timeout', `no answer within ${opts.timeoutMs} ms`));
|
|
438
|
+
}
|
|
439
|
+
finally {
|
|
440
|
+
controller.abort();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/** Dispatch on the server's transport. */
|
|
444
|
+
export function fetchServer(ref, opts) {
|
|
445
|
+
if (ref.transport === 'stdio')
|
|
446
|
+
return fetchStdio(ref, opts);
|
|
447
|
+
if (ref.transport === 'sse')
|
|
448
|
+
return fetchLegacySse(ref, opts);
|
|
449
|
+
return fetchStreamableHttp(ref, opts);
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=mcp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../src/mcp-client.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-rpc.js
CHANGED
|
@@ -6,7 +6,7 @@ import { dirname, join } from "node:path";
|
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
import { callMcpTool, MCP_INSTRUCTIONS, MCP_TOOLS, McpToolError, payloadTooLarge } from "./mcp-tools.js";
|
|
8
8
|
export const PROTOCOL = "2025-03-26";
|
|
9
|
-
const FALLBACK_VERSION = "0.
|
|
9
|
+
const FALLBACK_VERSION = "0.9.0";
|
|
10
10
|
export function packageVersion() {
|
|
11
11
|
try {
|
|
12
12
|
const pkgPath = join(dirname(fileURLToPath(import.meta.url)), "..", "package.json");
|
package/dist/mcp-server.js
CHANGED
|
@@ -79,6 +79,14 @@ async function main() {
|
|
|
79
79
|
async function entry() {
|
|
80
80
|
if (process.argv.length <= 2)
|
|
81
81
|
return main();
|
|
82
|
+
if (process.argv[2] === 'scan' || process.argv[2] === 'hook') {
|
|
83
|
+
const code = process.argv[2] === 'scan'
|
|
84
|
+
? await (await import("./scan-cli.js")).runScanCli(process.argv.slice(3))
|
|
85
|
+
: await (await import("./claude-hook.js")).runHookCli(process.argv.slice(3));
|
|
86
|
+
// Servers scan started are already told to stop; do not wait on their pipes.
|
|
87
|
+
stdout.write("", () => process.exit(code));
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
82
90
|
const { parseWrapArgs, runPins } = await import("./wrap-cli.js");
|
|
83
91
|
let options;
|
|
84
92
|
try {
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tools.d.ts","sourceRoot":"","sources":["../src/mcp-tools.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAKV,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,UAAU,QAAS,CAAC;AACjC,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAIzC,eAAO,MAAM,kBAAkB,EAAE,YAKhC,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;QACzB,cAAc,EAAE,OAAO,CAAC;QACxB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"mcp-tools.d.ts","sourceRoot":"","sources":["../src/mcp-tools.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAKV,YAAY,EAEb,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,UAAU,QAAS,CAAC;AACjC,eAAO,MAAM,iBAAiB,SAAU,CAAC;AAIzC,eAAO,MAAM,kBAAkB,EAAE,YAKhC,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;QACzB,cAAc,EAAE,OAAO,CAAC;QACxB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AA8DD,eAAO,MAAM,SAAS,EAAE,UAAU,EA0XjC,CAAC;AA2BF,eAAO,MAAM,gBAAgB,QAUgK,CAAC;AAqE9L,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAkBnD;AAED,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAqBtG;AAqID,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAMtD"}
|
package/dist/mcp-tools.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FilePinStore, pinRevision } from "./pin-store.js";
|
|
2
|
-
import {
|
|
2
|
+
import { pinToolsHash, serverIdentityHash } from "./pinning.js";
|
|
3
3
|
/**
|
|
4
4
|
* MCP tool surface for the WARDEN stdio server.
|
|
5
5
|
*
|
|
@@ -25,7 +25,8 @@ export const DEFAULT_MCP_POLICY = {
|
|
|
25
25
|
const TOOL_DEF_ITEM = {
|
|
26
26
|
type: "object",
|
|
27
27
|
additionalProperties: true,
|
|
28
|
-
|
|
28
|
+
// What asTools() enforces; title/outputSchema/annotations and extensions are optional, scanned when present.
|
|
29
|
+
required: ["name", "description", "inputSchema"],
|
|
29
30
|
properties: {
|
|
30
31
|
title: { type: "string", description: "Unmodified advertised tool title; scanned and pinned." },
|
|
31
32
|
outputSchema: { type: "object", description: "Unmodified output schema, including nested descriptions; scanned and pinned." },
|
|
@@ -206,7 +207,7 @@ export const MCP_TOOLS = [
|
|
|
206
207
|
{
|
|
207
208
|
name: "static_scan_tools",
|
|
208
209
|
title: "Static-scan MCP tool definitions for injection and exfil",
|
|
209
|
-
description: "Run only the static-scan gate (ruleset
|
|
210
|
+
description: "Run only the static-scan gate (ruleset v10, 35 signatures with context guards, text folded first) over every advertised tool field: name, description, input schema, title, output schema, annotations and extension metadata. Returns findings, a 0..1 gate score, and the published ruleset digest.\n\n" +
|
|
210
211
|
"When to use: you have a tools/list dump and want injection / credential / hidden-Unicode hits without origin, pinning, or the threat feed. Cheaper and narrower than vet_mcp_server.\n\n" +
|
|
211
212
|
"When NOT to use: you need the full host decision (vet_mcp_server); you want operator glob classification (classify_sensitive_tools); you want the published rule table itself (list_scan_rules).\n\n" +
|
|
212
213
|
"Behaviour: local regex+guard evaluation, no network, no mutation. Advisory-tier hits are reported with advisory=true and do not reduce the score. Does not launch servers or send tool output to a model.\n\n" +
|
|
@@ -378,8 +379,8 @@ export const MCP_TOOLS = [
|
|
|
378
379
|
{
|
|
379
380
|
name: "list_scan_rules",
|
|
380
381
|
title: "List the published WARDEN static-scan rule table",
|
|
381
|
-
description: "Return the in-force static-scan ruleset: version, digest, and every rule's code, severity, tier (block vs advise), surfaces (name / description / inputSchema), optional regex source, and named guards. A recorded verdict is only reproducible together with this identity.\n\n" +
|
|
382
|
-
"When to use: explain a finding code, confirm you are on ruleset
|
|
382
|
+
description: "Return the in-force static-scan ruleset: version, digest, and every rule's code, severity, tier (block vs advise), surfaces (name / description / inputSchema / title / outputSchema / annotations / metadata), optional regex source, and named guards. A recorded verdict is only reproducible together with this identity.\n\n" +
|
|
383
|
+
"When to use: explain a finding code, confirm you are on ruleset v10, or re-run a scan with the same table. include_source=true adds the regex source and flags for an independent re-implementation.\n\n" +
|
|
383
384
|
"When NOT to use: evaluating a live tools/list (static_scan_tools or vet_mcp_server — those apply the table). This tool does not scan anything.\n\n" +
|
|
384
385
|
"Behaviour: local snapshot of the compiled rule table, no network, no mutation. Digest is sha256 over the RFC 8785 form of {version, fold, rules} (each rule carries its `raw` flag).\n\n" +
|
|
385
386
|
"Returns the ruleset object. Example: list_scan_rules({ include_source: false }).",
|
|
@@ -622,7 +623,7 @@ async function managePin(name, args) {
|
|
|
622
623
|
return { revoked: true, serverId: server.id };
|
|
623
624
|
}
|
|
624
625
|
const tools = asTools(args.tools);
|
|
625
|
-
const toolsHash =
|
|
626
|
+
const toolsHash = pinToolsHash(tools);
|
|
626
627
|
const identityHash = serverIdentityHash(server);
|
|
627
628
|
if (name === "status_mcp_server") {
|
|
628
629
|
return { serverId: server.id, previous: previous ?? null, previousRevision: pinRevision(previous), currentToolsHash: toolsHash, currentIdentityHash: identityHash,
|