@mcp-index/sdk 0.14.1 → 0.16.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 +26 -0
- package/README.md +53 -22
- package/dist/src/canonical.d.ts +7 -0
- package/dist/src/canonical.d.ts.map +1 -1
- package/dist/src/canonical.js +56 -0
- package/dist/src/canonical.js.map +1 -1
- package/dist/src/fileLock.d.ts +20 -0
- package/dist/src/fileLock.d.ts.map +1 -0
- package/dist/src/fileLock.js +191 -0
- package/dist/src/fileLock.js.map +1 -0
- package/dist/src/gate.d.ts +23 -3
- package/dist/src/gate.d.ts.map +1 -1
- package/dist/src/gate.js +56 -3
- package/dist/src/gate.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/listingFilter.d.ts +41 -0
- package/dist/src/listingFilter.d.ts.map +1 -0
- package/dist/src/listingFilter.js +186 -0
- package/dist/src/listingFilter.js.map +1 -0
- package/dist/src/pendingStore.d.ts +53 -0
- package/dist/src/pendingStore.d.ts.map +1 -0
- package/dist/src/pendingStore.js +307 -0
- package/dist/src/pendingStore.js.map +1 -0
- package/dist/src/preflight.d.ts +49 -6
- package/dist/src/preflight.d.ts.map +1 -1
- package/dist/src/preflight.js +487 -6
- package/dist/src/preflight.js.map +1 -1
- package/dist/src/wrap.d.ts +27 -14
- package/dist/src/wrap.d.ts.map +1 -1
- package/dist/src/wrap.js +196 -19
- package/dist/src/wrap.js.map +1 -1
- package/package.json +1 -1
package/dist/src/preflight.js
CHANGED
|
@@ -4,8 +4,14 @@
|
|
|
4
4
|
* `PreflightVerdict`). The pin stores ONLY the public-contract hash (+ optional
|
|
5
5
|
* PUBLIC schema for diff detail) — NEVER a token, by construction.
|
|
6
6
|
*/
|
|
7
|
+
import { randomBytes } from "node:crypto";
|
|
8
|
+
import { chmodSync, closeSync, constants, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeSync, } from "node:fs";
|
|
9
|
+
import { tmpdir, homedir } from "node:os";
|
|
10
|
+
import { basename, dirname, join } from "node:path";
|
|
11
|
+
import { withExclusiveLock } from "./fileLock.js";
|
|
7
12
|
import { mdText } from "./render.js";
|
|
8
|
-
|
|
13
|
+
const PIN_STORE_VERSION = 2;
|
|
14
|
+
const EVER_PINNED_NAME = ".ever-pinned.json";
|
|
9
15
|
export var Decision;
|
|
10
16
|
(function (Decision) {
|
|
11
17
|
Decision["PROCEED"] = "PROCEED";
|
|
@@ -57,6 +63,7 @@ export function makeVerdict(v) {
|
|
|
57
63
|
descAfter: v.descAfter ?? null,
|
|
58
64
|
actionClassification: v.actionClassification ?? null,
|
|
59
65
|
fleetAdvisory: v.fleetAdvisory ?? null,
|
|
66
|
+
tamperEvidence: v.tamperEvidence ?? false,
|
|
60
67
|
};
|
|
61
68
|
}
|
|
62
69
|
export function isProceed(v) {
|
|
@@ -120,11 +127,68 @@ function renderVerdictBody(v) {
|
|
|
120
127
|
}
|
|
121
128
|
return `HOLD ${sid}/${tool} — ${mdText(v.reason)}`;
|
|
122
129
|
}
|
|
123
|
-
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
130
|
+
/** Pin store keyed by `(serverId, toolName)`. Stores ONLY hashes (+ optional
|
|
131
|
+
* PUBLIC schema). A path argument persists to JSON under a sibling flock so a
|
|
132
|
+
* Python CLI approval and another process cannot lose each other's writes. */
|
|
126
133
|
export class PreflightPin {
|
|
127
134
|
index = new Map();
|
|
135
|
+
taintedReason = null;
|
|
136
|
+
newerFormat = false;
|
|
137
|
+
diskSig = null;
|
|
138
|
+
/** On-disk baseline, or null for an in-memory pin. */
|
|
139
|
+
path;
|
|
140
|
+
constructor(path) {
|
|
141
|
+
this.path = path ?? null;
|
|
142
|
+
if (this.path !== null) {
|
|
143
|
+
const st = this.lstatStore(this.path);
|
|
144
|
+
if (st === null) {
|
|
145
|
+
if (wasEverPinned(this.path)) {
|
|
146
|
+
this.taintedReason = "baseline file is missing but this server was pinned before";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else if (!st.isFile()) {
|
|
150
|
+
this.taintedReason = "baseline path is not a regular file";
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.loadIntoIndex();
|
|
154
|
+
// An empty-but-valid store after we have pinned here is not a first run.
|
|
155
|
+
if (this.index.size === 0 &&
|
|
156
|
+
this.taintedReason === null &&
|
|
157
|
+
!this.newerFormat &&
|
|
158
|
+
wasEverPinned(this.path)) {
|
|
159
|
+
this.taintedReason =
|
|
160
|
+
"baseline file has no pins for a server that was pinned before";
|
|
161
|
+
}
|
|
162
|
+
this.diskSig = this.signature();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Taint the store when it holds no pins for `serverId` but has before.
|
|
168
|
+
*
|
|
169
|
+
* The constructor check only sees the whole file. A valid store that holds
|
|
170
|
+
* another server's pins passes it, so the per-server check runs once the
|
|
171
|
+
* server id is known (the Gate calls this). An index written before server
|
|
172
|
+
* ids were recorded never taints here.
|
|
173
|
+
*/
|
|
174
|
+
expectServer(serverId) {
|
|
175
|
+
if (this.path === null || this.taintedReason !== null || this.newerFormat)
|
|
176
|
+
return;
|
|
177
|
+
for (const pin of this.index.values()) {
|
|
178
|
+
if (pin.serverId === serverId)
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (wasEverPinnedServer(this.path, serverId)) {
|
|
182
|
+
this.taintedReason = "baseline file has no pins for a server that was pinned before";
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/** Closed reason when a baseline that should have been readable was not. */
|
|
186
|
+
get tainted() {
|
|
187
|
+
return this.taintedReason;
|
|
188
|
+
}
|
|
189
|
+
get unsupportedVersion() {
|
|
190
|
+
return this.newerFormat;
|
|
191
|
+
}
|
|
128
192
|
key(serverId, toolName) {
|
|
129
193
|
// \u001f (UNIT SEPARATOR), not a literal NUL. A raw NUL byte makes git classify this file
|
|
130
194
|
// as BINARY, so `git diff` printed "Bin 8426 -> 9318 bytes" and FIVE rounds of security
|
|
@@ -133,18 +197,435 @@ export class PreflightPin {
|
|
|
133
197
|
// only one is reviewable. Python's twin keys on a tuple and needs no separator at all.
|
|
134
198
|
return `${serverId}\u001f${toolName}`;
|
|
135
199
|
}
|
|
200
|
+
lstatStore(path) {
|
|
201
|
+
try {
|
|
202
|
+
const st = lstatSync(path);
|
|
203
|
+
return {
|
|
204
|
+
isFile: () => st.isFile(),
|
|
205
|
+
ino: Number(st.ino),
|
|
206
|
+
mtimeMs: Number(st.mtimeMs),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
signature() {
|
|
214
|
+
if (this.path === null)
|
|
215
|
+
return null;
|
|
216
|
+
const st = this.lstatStore(this.path);
|
|
217
|
+
if (st === null || !st.isFile())
|
|
218
|
+
return null;
|
|
219
|
+
return { ino: st.ino, mtimeNs: Math.trunc(st.mtimeMs * 1_000_000) };
|
|
220
|
+
}
|
|
221
|
+
parsePin(row) {
|
|
222
|
+
const sid = row["server_id"];
|
|
223
|
+
const tname = row["tool_name"];
|
|
224
|
+
const dh = row["definition_hash"];
|
|
225
|
+
const pinnedAt = row["pinned_at"];
|
|
226
|
+
if (typeof sid !== "string" ||
|
|
227
|
+
typeof tname !== "string" ||
|
|
228
|
+
typeof dh !== "string" ||
|
|
229
|
+
typeof pinnedAt !== "string") {
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
const schema = row["schema"];
|
|
233
|
+
const via = row["via"];
|
|
234
|
+
const launchKey = row["launch_key"];
|
|
235
|
+
return {
|
|
236
|
+
serverId: sid,
|
|
237
|
+
toolName: tname,
|
|
238
|
+
definitionHash: dh,
|
|
239
|
+
pinnedAt,
|
|
240
|
+
schema: schema !== null && typeof schema === "object" && !Array.isArray(schema)
|
|
241
|
+
? schema
|
|
242
|
+
: null,
|
|
243
|
+
via: typeof via === "string" && via.length > 0 ? via : "tofu",
|
|
244
|
+
classification: row["classification"],
|
|
245
|
+
launchKey: typeof launchKey === "string" && launchKey.length > 0 ? launchKey : undefined,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
loadIntoIndex() {
|
|
249
|
+
const path = this.path;
|
|
250
|
+
if (path === null)
|
|
251
|
+
return;
|
|
252
|
+
let raw;
|
|
253
|
+
try {
|
|
254
|
+
raw = JSON.parse(readFileSync(path, "utf8"));
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
this.taintedReason = "baseline file is present but unreadable";
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
261
|
+
this.taintedReason = "baseline file is not a pin store";
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
const body = raw;
|
|
265
|
+
const version = body["version"];
|
|
266
|
+
if (typeof version === "number" && version > PIN_STORE_VERSION) {
|
|
267
|
+
this.newerFormat = true;
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const records = body["pins"] ?? [];
|
|
271
|
+
if (!Array.isArray(records)) {
|
|
272
|
+
this.taintedReason = "baseline file has no readable pin list";
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
for (const rec of records) {
|
|
276
|
+
if (rec === null || typeof rec !== "object" || Array.isArray(rec)) {
|
|
277
|
+
this.taintedReason = "baseline file contains an unreadable record";
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
const pin = this.parsePin(rec);
|
|
281
|
+
if (pin === null) {
|
|
282
|
+
this.taintedReason = "baseline file contains an unreadable record";
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
this.index.set(this.key(pin.serverId, pin.toolName), pin);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
emptyStoreIsUnreadable(records, savedIndex) {
|
|
289
|
+
const ever = this.path !== null && wasEverPinned(this.path);
|
|
290
|
+
if (records.length === 0 && (ever || savedIndex.size > 0))
|
|
291
|
+
return true;
|
|
292
|
+
const serversMem = new Set();
|
|
293
|
+
for (const pin of savedIndex.values())
|
|
294
|
+
serversMem.add(pin.serverId);
|
|
295
|
+
if (serversMem.size === 0)
|
|
296
|
+
return false;
|
|
297
|
+
const serversDisk = new Set(records.map((p) => p.serverId));
|
|
298
|
+
for (const sid of serversMem) {
|
|
299
|
+
if (!serversDisk.has(sid))
|
|
300
|
+
return true;
|
|
301
|
+
}
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
recordsFromDisk() {
|
|
305
|
+
if (this.path === null)
|
|
306
|
+
return [];
|
|
307
|
+
const st = this.lstatStore(this.path);
|
|
308
|
+
if (st === null) {
|
|
309
|
+
if (wasEverPinned(this.path) || this.index.size > 0) {
|
|
310
|
+
this.taintedReason =
|
|
311
|
+
"baseline file is missing but this server was pinned before";
|
|
312
|
+
return null;
|
|
313
|
+
}
|
|
314
|
+
return [];
|
|
315
|
+
}
|
|
316
|
+
if (!st.isFile()) {
|
|
317
|
+
this.taintedReason = "baseline path is not a regular file";
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const savedIndex = this.index;
|
|
321
|
+
const savedTaint = this.taintedReason;
|
|
322
|
+
const savedUnsupported = this.newerFormat;
|
|
323
|
+
this.index = new Map();
|
|
324
|
+
this.taintedReason = null;
|
|
325
|
+
this.newerFormat = false;
|
|
326
|
+
this.loadIntoIndex();
|
|
327
|
+
if (this.newerFormat || this.taintedReason !== null) {
|
|
328
|
+
const loadTaint = this.taintedReason;
|
|
329
|
+
this.index = savedIndex;
|
|
330
|
+
this.taintedReason = loadTaint ?? savedTaint;
|
|
331
|
+
this.newerFormat = savedUnsupported || this.newerFormat;
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
const records = [...this.index.values()];
|
|
335
|
+
this.index = savedIndex;
|
|
336
|
+
this.taintedReason = savedTaint;
|
|
337
|
+
this.newerFormat = savedUnsupported;
|
|
338
|
+
if (this.emptyStoreIsUnreadable(records, savedIndex)) {
|
|
339
|
+
this.taintedReason =
|
|
340
|
+
"baseline file has no pins for a server that was pinned before";
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
return records;
|
|
344
|
+
}
|
|
345
|
+
reloadHoldingLock() {
|
|
346
|
+
if (this.path === null)
|
|
347
|
+
return;
|
|
348
|
+
const sig = this.signature();
|
|
349
|
+
if (sig !== null &&
|
|
350
|
+
this.diskSig !== null &&
|
|
351
|
+
sig.ino === this.diskSig.ino &&
|
|
352
|
+
sig.mtimeNs === this.diskSig.mtimeNs) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
withExclusiveLock(this.path, () => {
|
|
356
|
+
const again = this.signature();
|
|
357
|
+
if (again !== null &&
|
|
358
|
+
this.diskSig !== null &&
|
|
359
|
+
again.ino === this.diskSig.ino &&
|
|
360
|
+
again.mtimeNs === this.diskSig.mtimeNs) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
const records = this.recordsFromDisk();
|
|
364
|
+
if (records === null)
|
|
365
|
+
return;
|
|
366
|
+
this.index = new Map(records.map((p) => [this.key(p.serverId, p.toolName), p]));
|
|
367
|
+
this.diskSig = this.signature();
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
/** Reload when another process replaced the file. No-op for an in-memory pin. */
|
|
371
|
+
reloadIfChanged() {
|
|
372
|
+
this.reloadHoldingLock();
|
|
373
|
+
}
|
|
136
374
|
get(serverId, toolName) {
|
|
375
|
+
this.reloadHoldingLock();
|
|
137
376
|
return this.index.get(this.key(serverId, toolName)) ?? null;
|
|
138
377
|
}
|
|
139
378
|
put(pin) {
|
|
140
|
-
|
|
379
|
+
if (this.path === null) {
|
|
380
|
+
this.index.set(this.key(pin.serverId, pin.toolName), pin);
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
if (this.taintedReason !== null) {
|
|
384
|
+
throw new Error("pin store is tainted");
|
|
385
|
+
}
|
|
386
|
+
withExclusiveLock(this.path, () => {
|
|
387
|
+
if (this.taintedReason !== null) {
|
|
388
|
+
throw new Error("pin store is tainted");
|
|
389
|
+
}
|
|
390
|
+
const records = this.recordsFromDisk();
|
|
391
|
+
if (records === null)
|
|
392
|
+
throw new Error("pin store is unreadable");
|
|
393
|
+
this.index = new Map(records.map((p) => [this.key(p.serverId, p.toolName), p]));
|
|
394
|
+
this.index.set(this.key(pin.serverId, pin.toolName), pin);
|
|
395
|
+
this.flush();
|
|
396
|
+
this.diskSig = this.signature();
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
flush() {
|
|
400
|
+
const path = this.path;
|
|
401
|
+
if (path === null)
|
|
402
|
+
return;
|
|
403
|
+
if (this.taintedReason !== null) {
|
|
404
|
+
throw new Error("pin store is tainted");
|
|
405
|
+
}
|
|
406
|
+
const pins = [...this.index.values()].map((p) => {
|
|
407
|
+
const row = {
|
|
408
|
+
server_id: p.serverId,
|
|
409
|
+
tool_name: p.toolName,
|
|
410
|
+
definition_hash: p.definitionHash,
|
|
411
|
+
pinned_at: p.pinnedAt,
|
|
412
|
+
};
|
|
413
|
+
if (p.schema !== null)
|
|
414
|
+
row["schema"] = p.schema;
|
|
415
|
+
if (p.via !== undefined && p.via !== "tofu")
|
|
416
|
+
row["via"] = p.via;
|
|
417
|
+
if (p.classification !== undefined)
|
|
418
|
+
row["classification"] = p.classification;
|
|
419
|
+
if (p.launchKey !== undefined && p.launchKey.length > 0)
|
|
420
|
+
row["launch_key"] = p.launchKey;
|
|
421
|
+
return row;
|
|
422
|
+
});
|
|
423
|
+
const payload = { version: PIN_STORE_VERSION, pins };
|
|
424
|
+
const directory = dirname(path) || ".";
|
|
425
|
+
mkdirSync(directory, { recursive: true });
|
|
426
|
+
const suffix = randomBytes(8).toString("hex");
|
|
427
|
+
const tmp = join(directory, `.${basename(path)}.${process.pid}.${suffix}.tmp`);
|
|
428
|
+
const encoded = Buffer.from(stableStringify(payload), "utf8");
|
|
429
|
+
let flags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL;
|
|
430
|
+
if (typeof constants.O_NOFOLLOW === "number") {
|
|
431
|
+
flags |= constants.O_NOFOLLOW;
|
|
432
|
+
}
|
|
433
|
+
const fd = openSync(tmp, flags, 0o600);
|
|
434
|
+
try {
|
|
435
|
+
writeSync(fd, encoded);
|
|
436
|
+
fsyncSync(fd);
|
|
437
|
+
closeSync(fd);
|
|
438
|
+
chmodSync(tmp, 0o600);
|
|
439
|
+
renameSync(tmp, path);
|
|
440
|
+
}
|
|
441
|
+
catch (err) {
|
|
442
|
+
try {
|
|
443
|
+
unlinkSync(tmp);
|
|
444
|
+
}
|
|
445
|
+
catch {
|
|
446
|
+
// the temp file may already be gone
|
|
447
|
+
}
|
|
448
|
+
throw err;
|
|
449
|
+
}
|
|
450
|
+
recordEverPinned(path, new Set([...this.index.values()].map((p) => p.serverId)));
|
|
141
451
|
}
|
|
142
452
|
toolsFor(serverId) {
|
|
453
|
+
this.reloadHoldingLock();
|
|
143
454
|
return [...this.index.values()].filter((p) => p.serverId === serverId);
|
|
144
455
|
}
|
|
145
456
|
allPins() {
|
|
457
|
+
this.reloadHoldingLock();
|
|
146
458
|
return [...this.index.values()];
|
|
147
459
|
}
|
|
148
460
|
}
|
|
149
|
-
|
|
461
|
+
function stableStringify(value) {
|
|
462
|
+
return JSON.stringify(sortKeys(value), null, 2) + "\n";
|
|
463
|
+
}
|
|
464
|
+
function sortKeys(value) {
|
|
465
|
+
if (Array.isArray(value))
|
|
466
|
+
return value.map(sortKeys);
|
|
467
|
+
if (value !== null && typeof value === "object") {
|
|
468
|
+
const out = {};
|
|
469
|
+
for (const key of Object.keys(value).sort()) {
|
|
470
|
+
out[key] = sortKeys(value[key]);
|
|
471
|
+
}
|
|
472
|
+
return out;
|
|
473
|
+
}
|
|
474
|
+
return value;
|
|
475
|
+
}
|
|
476
|
+
function everPinnedPath(storePath) {
|
|
477
|
+
return join(dirname(storePath) || ".", EVER_PINNED_NAME);
|
|
478
|
+
}
|
|
479
|
+
function wasEverPinned(storePath) {
|
|
480
|
+
try {
|
|
481
|
+
const raw = JSON.parse(readFileSync(everPinnedPath(storePath), "utf8"));
|
|
482
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
483
|
+
return false;
|
|
484
|
+
const stores = raw["stores"];
|
|
485
|
+
return Array.isArray(stores) && stores.includes(basename(storePath));
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
function readEverPinned(indexPath) {
|
|
492
|
+
const out = { stores: [], servers: {} };
|
|
493
|
+
try {
|
|
494
|
+
const raw = JSON.parse(readFileSync(indexPath, "utf8"));
|
|
495
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
496
|
+
return out;
|
|
497
|
+
const stores = raw["stores"];
|
|
498
|
+
if (Array.isArray(stores))
|
|
499
|
+
out.stores = stores.filter((s) => typeof s === "string");
|
|
500
|
+
const servers = raw["servers"];
|
|
501
|
+
if (servers !== null && typeof servers === "object" && !Array.isArray(servers)) {
|
|
502
|
+
for (const [key, ids] of Object.entries(servers)) {
|
|
503
|
+
if (Array.isArray(ids))
|
|
504
|
+
out.servers[key] = ids.filter((i) => typeof i === "string");
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
// an absent or unreadable index is no evidence
|
|
510
|
+
}
|
|
511
|
+
return out;
|
|
512
|
+
}
|
|
513
|
+
/** True iff this store has held pins for `serverId`. Fails open like `wasEverPinned`. */
|
|
514
|
+
function wasEverPinnedServer(storePath, serverId) {
|
|
515
|
+
const { servers } = readEverPinned(everPinnedPath(storePath));
|
|
516
|
+
return (servers[basename(storePath)] ?? []).includes(serverId);
|
|
517
|
+
}
|
|
518
|
+
function writeEverPinnedStores(indexPath, stores, servers = {}) {
|
|
519
|
+
const directory = dirname(indexPath) || ".";
|
|
520
|
+
mkdirSync(directory, { recursive: true });
|
|
521
|
+
const suffix = randomBytes(8).toString("hex");
|
|
522
|
+
const tmp = join(directory, `.ever-pinned.${process.pid}.${suffix}.tmp`);
|
|
523
|
+
let flags = constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL;
|
|
524
|
+
if (typeof constants.O_NOFOLLOW === "number") {
|
|
525
|
+
flags |= constants.O_NOFOLLOW;
|
|
526
|
+
}
|
|
527
|
+
const fd = openSync(tmp, flags, 0o600);
|
|
528
|
+
try {
|
|
529
|
+
const body = { stores: [...stores].sort() };
|
|
530
|
+
const keys = Object.keys(servers).filter((k) => servers[k].length > 0);
|
|
531
|
+
if (keys.length > 0) {
|
|
532
|
+
const sorted = {};
|
|
533
|
+
for (const key of keys.sort())
|
|
534
|
+
sorted[key] = [...new Set(servers[key])].sort();
|
|
535
|
+
body["servers"] = sorted;
|
|
536
|
+
}
|
|
537
|
+
writeSync(fd, Buffer.from(stableStringify(body), "utf8"));
|
|
538
|
+
fsyncSync(fd);
|
|
539
|
+
closeSync(fd);
|
|
540
|
+
chmodSync(tmp, 0o600);
|
|
541
|
+
renameSync(tmp, indexPath);
|
|
542
|
+
}
|
|
543
|
+
catch (err) {
|
|
544
|
+
try {
|
|
545
|
+
unlinkSync(tmp);
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
// already removed
|
|
549
|
+
}
|
|
550
|
+
throw err;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
function recordEverPinned(storePath, serverIds = new Set()) {
|
|
554
|
+
const indexPath = everPinnedPath(storePath);
|
|
555
|
+
const name = basename(storePath);
|
|
556
|
+
try {
|
|
557
|
+
const { stores, servers } = readEverPinned(indexPath);
|
|
558
|
+
const known = new Set(servers[name] ?? []);
|
|
559
|
+
const wanted = new Set([...known, ...serverIds]);
|
|
560
|
+
if (stores.includes(name) && wanted.size === known.size)
|
|
561
|
+
return;
|
|
562
|
+
if (!stores.includes(name))
|
|
563
|
+
stores.push(name);
|
|
564
|
+
if (wanted.size > 0)
|
|
565
|
+
servers[name] = [...wanted].sort();
|
|
566
|
+
writeEverPinnedStores(indexPath, stores, servers);
|
|
567
|
+
}
|
|
568
|
+
catch {
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
/** Remove ``storePath`` from the ever-pinned index. */
|
|
573
|
+
export function clearEverPinned(storePath) {
|
|
574
|
+
const indexPath = everPinnedPath(storePath);
|
|
575
|
+
const name = basename(storePath);
|
|
576
|
+
try {
|
|
577
|
+
let raw;
|
|
578
|
+
try {
|
|
579
|
+
raw = JSON.parse(readFileSync(indexPath, "utf8"));
|
|
580
|
+
}
|
|
581
|
+
catch {
|
|
582
|
+
return;
|
|
583
|
+
}
|
|
584
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
585
|
+
return;
|
|
586
|
+
const found = raw["stores"];
|
|
587
|
+
if (!Array.isArray(found))
|
|
588
|
+
return;
|
|
589
|
+
const stores = found.filter((s) => typeof s === "string" && s !== name);
|
|
590
|
+
const { servers } = readEverPinned(indexPath);
|
|
591
|
+
delete servers[name];
|
|
592
|
+
if (stores.length > 0) {
|
|
593
|
+
writeEverPinnedStores(indexPath, stores, servers);
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
try {
|
|
597
|
+
unlinkSync(indexPath);
|
|
598
|
+
}
|
|
599
|
+
catch {
|
|
600
|
+
// best effort
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
catch {
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
export function sanitizeServerId(serverId) {
|
|
609
|
+
const safe = serverId
|
|
610
|
+
.replace(/[^A-Za-z0-9._-]/g, "_")
|
|
611
|
+
.replace(/^[._]+|[._]+$/g, "")
|
|
612
|
+
.slice(0, 128);
|
|
613
|
+
return safe.length > 0 ? safe : "_";
|
|
614
|
+
}
|
|
615
|
+
/** Pin file for one server. `MCPINDEX_STATE_DIR/pins/<id>.json`, else `~/.mcpindex/pins/<id>.json`. */
|
|
616
|
+
export function defaultPinStorePath(serverId) {
|
|
617
|
+
const fromEnv = process.env.MCPINDEX_STATE_DIR;
|
|
618
|
+
let root;
|
|
619
|
+
if (typeof fromEnv === "string" && fromEnv.trim().length > 0) {
|
|
620
|
+
root = fromEnv;
|
|
621
|
+
}
|
|
622
|
+
else if (process.execArgv.includes("--test") || process.argv.includes("--test")) {
|
|
623
|
+
root = join(tmpdir(), "mcpindex-sdk-test", String(process.pid));
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
root = join(homedir(), ".mcpindex");
|
|
627
|
+
}
|
|
628
|
+
return join(root, "pins", `${sanitizeServerId(serverId)}.json`);
|
|
629
|
+
}
|
|
630
|
+
export { hashTool, approvalDigest } from "./canonical.js";
|
|
150
631
|
//# sourceMappingURL=preflight.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/preflight.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/src/wrap.d.ts
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* `wrap(session)` returns a transparent JS `Proxy` over the real
|
|
6
6
|
* `@modelcontextprotocol/sdk` `Client`: every method/prop passes through the
|
|
7
7
|
* get-trap UNTOUCHED, EXCEPT the three gated seams:
|
|
8
|
-
* - `listTools`
|
|
9
|
-
*
|
|
10
|
-
* - `
|
|
8
|
+
* - `listTools` - pin first-seen tools; under guard/strict a new tool on an
|
|
9
|
+
* already-pinned server is left out until reviewed.
|
|
10
|
+
* - `callTool` - run the shared Gate before delegating; HOLD on drift.
|
|
11
|
+
* - `request` - the low-level RPC chokepoint (the TS analog of Python's
|
|
11
12
|
* `send_request`). `callTool` is sugar over `request({method:'tools/call'})`,
|
|
12
13
|
* so a caller can invoke any tool straight through `request`; we gate a
|
|
13
14
|
* `tools/call` there too, or the pre-flight check is a paper wall.
|
|
@@ -52,11 +53,17 @@ export declare class PreflightHold extends Error {
|
|
|
52
53
|
* TOFU baseline needs. Pass an explicit `serverId` for a durable/fleet setup. */
|
|
53
54
|
export declare const DEFAULT_SERVER_ID = "mcp";
|
|
54
55
|
export interface WrapOptions {
|
|
55
|
-
/** The pin store the tools are checked against. Optional: when omitted
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
56
|
+
/** The pin store the tools are checked against. Optional: when omitted and a
|
|
57
|
+
* `serverId` is given, pins are kept in a file under the state directory and
|
|
58
|
+
* survive a process restart. With no `serverId` the default stays in memory.
|
|
59
|
+
* Pass `pinStore: "memory"` for a store that dies with the process, or pass
|
|
60
|
+
* your own `PreflightPin`. */
|
|
59
61
|
pin?: PreflightPin;
|
|
62
|
+
/** `"memory"` keeps pins in this process only. `"file"` forces the file store
|
|
63
|
+
* even without a `serverId`. The default is a file when `serverId` is set. */
|
|
64
|
+
pinStore?: "memory" | "file";
|
|
65
|
+
/** Called when a tool is left out of a list: server id, tool, reason, live hash. */
|
|
66
|
+
onWithheld?: ((serverId: string, tool: string, reason: string, definitionHash: string) => void) | null;
|
|
60
67
|
/** Logical id the tools are pinned under. Optional: defaults to
|
|
61
68
|
* `DEFAULT_SERVER_ID` ("mcp"), which is correct for the ephemeral in-memory
|
|
62
69
|
* baseline. Pass a stable id when you persist pins or opt into fleet telemetry. */
|
|
@@ -70,6 +77,8 @@ export interface WrapOptions {
|
|
|
70
77
|
verifier?: BehavioralVerifier | null;
|
|
71
78
|
autoValidateBehavior?: boolean;
|
|
72
79
|
posture?: Posture;
|
|
80
|
+
/** ``review`` (default) holds a new tool on an already-pinned server. ``tofu`` pins it. */
|
|
81
|
+
newTools?: "review" | "tofu";
|
|
73
82
|
stats?: LocalStats | null;
|
|
74
83
|
outcomes?: OutcomeStore | null;
|
|
75
84
|
errors?: ErrorStore | null;
|
|
@@ -93,16 +102,20 @@ export interface WrapOptions {
|
|
|
93
102
|
* delegated UNTOUCHED. NO credential is read, stored, or transmitted.
|
|
94
103
|
*
|
|
95
104
|
* `T` is the wrapped session type (e.g. the SDK `Client`); the return type adds
|
|
96
|
-
* the wrapper's management methods (`repin` / `
|
|
97
|
-
* `holdBanner`).
|
|
105
|
+
* the wrapper's management methods (`repin` / `approvePending` /
|
|
106
|
+
* `validateBehaviorNow` / `holdBanner`).
|
|
98
107
|
*
|
|
99
|
-
* `opts` is OPTIONAL. `wrap(session)`
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
* gate.
|
|
108
|
+
* `opts` is OPTIONAL. `wrap(session)` keeps pins in a file under the state
|
|
109
|
+
* directory (see `defaultPinStorePath`) and HOLDs on drift. Pass
|
|
110
|
+
* `{ pinStore: "memory" }` for an in-process store, or `{ pin, serverId }` to
|
|
111
|
+
* supply the store. Pass `{ scanResults, onHold, onWithheld, posture }` to tune
|
|
112
|
+
* the gate. Under guard and strict, `listTools` leaves out a tool whose
|
|
113
|
+
* description or input-schema text changed, and a new tool on an already-pinned
|
|
114
|
+
* server until it is reviewed (`approvePending` or the upgrade CLI). The SDK
|
|
115
|
+
* client's listChanged refresh calls the inner client and is not filtered. */
|
|
104
116
|
export type Wrapped<T> = T & {
|
|
105
117
|
repin(tool?: string): PinnedTool[];
|
|
118
|
+
approvePending(name: string, definitionHash: string): PinnedTool | null;
|
|
106
119
|
validateBehaviorNow(toolName: string, verifier?: BehavioralVerifier): PreflightVerdict;
|
|
107
120
|
holdBanner(verdict: PreflightVerdict): string;
|
|
108
121
|
readonly __interceptor__: unknown;
|