@darkiceinteractive/mcp-conductor 3.0.0-beta.1 → 3.1.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -307
- package/dist/bridge/http-server.d.ts +9 -0
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +32 -5
- package/dist/bridge/http-server.js.map +1 -1
- package/dist/cache/cache.d.ts +21 -0
- package/dist/cache/cache.d.ts.map +1 -1
- package/dist/cache/cache.js +44 -2
- package/dist/cache/cache.js.map +1 -1
- package/dist/cache/disk.d.ts.map +1 -1
- package/dist/cache/disk.js +36 -3
- package/dist/cache/disk.js.map +1 -1
- package/dist/cli/commands/import-servers.d.ts +12 -1
- package/dist/cli/commands/import-servers.d.ts.map +1 -1
- package/dist/cli/commands/import-servers.js +40 -3
- package/dist/cli/commands/import-servers.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +7 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/daemon/client.d.ts +2 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +30 -9
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/server.d.ts +9 -0
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +109 -16
- package/dist/daemon/server.js.map +1 -1
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/metrics-collector.d.ts +120 -0
- package/dist/metrics/metrics-collector.d.ts.map +1 -1
- package/dist/metrics/metrics-collector.js +136 -0
- package/dist/metrics/metrics-collector.js.map +1 -1
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +45 -2
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/pool/recycle.d.ts +8 -2
- package/dist/runtime/pool/recycle.d.ts.map +1 -1
- package/dist/runtime/pool/recycle.js.map +1 -1
- package/dist/runtime/pool/worker-pool.d.ts.map +1 -1
- package/dist/runtime/pool/worker-pool.js +17 -10
- package/dist/runtime/pool/worker-pool.js.map +1 -1
- package/dist/runtime/pool/worker.d.ts +7 -1
- package/dist/runtime/pool/worker.d.ts.map +1 -1
- package/dist/runtime/pool/worker.js +9 -1
- package/dist/runtime/pool/worker.js.map +1 -1
- package/dist/server/mcp-server.d.ts +17 -3
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +133 -26
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/passthrough-registrar.d.ts +55 -5
- package/dist/server/passthrough-registrar.d.ts.map +1 -1
- package/dist/server/passthrough-registrar.js +104 -15
- package/dist/server/passthrough-registrar.js.map +1 -1
- package/dist/utils/tokenize.d.ts +8 -0
- package/dist/utils/tokenize.d.ts.map +1 -1
- package/dist/utils/tokenize.js +8 -0
- package/dist/utils/tokenize.js.map +1 -1
- package/dist/version.d.ts +3 -3
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +22 -3
package/dist/daemon/server.js
CHANGED
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
*
|
|
15
15
|
* @module daemon/server
|
|
16
16
|
*/
|
|
17
|
-
import { createServer } from 'node:net';
|
|
17
|
+
import { createServer, createConnection } from 'node:net';
|
|
18
18
|
import { existsSync, mkdirSync, writeFileSync, readFileSync, chmodSync, unlinkSync, } from 'node:fs';
|
|
19
|
-
import { join } from 'node:path';
|
|
19
|
+
import { join, dirname, resolve, isAbsolute } from 'node:path';
|
|
20
20
|
import { homedir } from 'node:os';
|
|
21
21
|
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
22
22
|
import { EventEmitter } from 'node:events';
|
|
@@ -26,22 +26,33 @@ import { SharedLock } from './shared-lock.js';
|
|
|
26
26
|
const DEFAULT_AUTH_PATH = join(homedir(), '.mcp-conductor', 'daemon-auth.json');
|
|
27
27
|
const DEFAULT_SOCKET_PATH = join(homedir(), '.mcp-conductor', 'daemon.sock');
|
|
28
28
|
const CONDUCTOR_DIR = join(homedir(), '.mcp-conductor');
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
// B2: Maximum receive-buffer size per client connection (10 MB).
|
|
30
|
+
// A client that streams data without ever sending a newline would grow the
|
|
31
|
+
// buffer without bound, causing an OOM. Destroy the socket if exceeded.
|
|
32
|
+
const MAX_BUFFER_BYTES = 10 * 1024 * 1024;
|
|
33
|
+
/** @internal Exported for testing only. Do not call directly in production code. */
|
|
34
|
+
export function loadOrCreateSecret(authPath) {
|
|
35
|
+
// MED-1: open the file directly instead of existsSync + readFileSync to
|
|
36
|
+
// eliminate the TOCTOU window. Treat ENOENT as "not found" and fall through
|
|
37
|
+
// to generation; re-throw anything else (permission denied, I/O error, etc.).
|
|
38
|
+
try {
|
|
31
39
|
const raw = readFileSync(authPath, 'utf-8');
|
|
32
40
|
return JSON.parse(raw).sharedSecret;
|
|
33
41
|
}
|
|
34
|
-
|
|
42
|
+
catch (err) {
|
|
43
|
+
if (err.code !== 'ENOENT') {
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
// File does not exist — fall through to generate a new secret.
|
|
47
|
+
}
|
|
48
|
+
mkdirSync(dirname(authPath), { recursive: true });
|
|
35
49
|
const secret = randomBytes(32).toString('hex');
|
|
36
50
|
const content = { sharedSecret: secret };
|
|
37
|
-
|
|
38
|
-
|
|
51
|
+
// Pass mode: 0o600 atomically so the file is never world-readable (CRIT-4).
|
|
52
|
+
writeFileSync(authPath, JSON.stringify(content, null, 2), { mode: 0o600, encoding: 'utf-8' });
|
|
39
53
|
logger.info('DaemonServer: generated new shared secret', { authPath });
|
|
40
54
|
return secret;
|
|
41
55
|
}
|
|
42
|
-
function hmacToken(secret, nonce) {
|
|
43
|
-
return createHmac('sha256', secret).update(nonce).digest('hex');
|
|
44
|
-
}
|
|
45
56
|
class PubSubBus {
|
|
46
57
|
emitter = new EventEmitter();
|
|
47
58
|
subscribe(channel, handler) {
|
|
@@ -73,6 +84,16 @@ export class DaemonServer {
|
|
|
73
84
|
this.socketPath = options.socketPath ?? DEFAULT_SOCKET_PATH;
|
|
74
85
|
this.tcpPort = options.tcpPort;
|
|
75
86
|
const authPath = options.auth?.sharedSecretPath ?? DEFAULT_AUTH_PATH;
|
|
87
|
+
// B4: Validate that sharedSecretPath resolves within CONDUCTOR_DIR.
|
|
88
|
+
// A caller-controlled path could otherwise cause chmodSync to narrow
|
|
89
|
+
// permissions on an arbitrary file outside the conductor directory.
|
|
90
|
+
if (options.auth?.sharedSecretPath !== undefined) {
|
|
91
|
+
const resolvedDir = resolve(dirname(authPath));
|
|
92
|
+
const conductorDir = resolve(CONDUCTOR_DIR);
|
|
93
|
+
if (!isAbsolute(authPath) || !resolvedDir.startsWith(conductorDir + '/') && resolvedDir !== conductorDir) {
|
|
94
|
+
throw new Error(`DaemonServer: sharedSecretPath must resolve within CONDUCTOR_DIR (~/.mcp-conductor). Got: ${authPath}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
76
97
|
this.sharedSecret = options.auth?.sharedSecret ?? loadOrCreateSecret(authPath);
|
|
77
98
|
this.kv = new SharedKV(options.kvOptions);
|
|
78
99
|
this.lock = new SharedLock();
|
|
@@ -86,6 +107,16 @@ export class DaemonServer {
|
|
|
86
107
|
this.running = true;
|
|
87
108
|
mkdirSync(CONDUCTOR_DIR, { recursive: true });
|
|
88
109
|
if (existsSync(this.socketPath)) {
|
|
110
|
+
// B9: Before unlinking the socket, probe whether a daemon is already
|
|
111
|
+
// listening. An unconditional unlink would silently evict a live daemon.
|
|
112
|
+
// We attempt a connect + ping with a 200ms timeout. If the socket
|
|
113
|
+
// responds (live daemon), we refuse to start. If it is stale (no
|
|
114
|
+
// response / connection refused), we unlink and proceed.
|
|
115
|
+
const isLive = await this._probeSocketLiveness(this.socketPath, 200);
|
|
116
|
+
if (isLive) {
|
|
117
|
+
this.running = false;
|
|
118
|
+
throw new Error(`DaemonServer: another daemon is already listening on ${this.socketPath}; refusing to evict`);
|
|
119
|
+
}
|
|
89
120
|
unlinkSync(this.socketPath);
|
|
90
121
|
}
|
|
91
122
|
await this.startUnixServer();
|
|
@@ -97,6 +128,32 @@ export class DaemonServer {
|
|
|
97
128
|
tcpPort: this.tcpPort,
|
|
98
129
|
});
|
|
99
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* B9: Probe whether a Unix socket at `socketPath` has a live daemon behind
|
|
133
|
+
* it. Connects, waits up to `timeoutMs` for any data (the daemon sends a
|
|
134
|
+
* nonce challenge immediately on connect), and returns true if data arrives.
|
|
135
|
+
* Returns false on connection error, timeout, or if the socket is stale.
|
|
136
|
+
*/
|
|
137
|
+
_probeSocketLiveness(socketPath, timeoutMs) {
|
|
138
|
+
return new Promise((resolve) => {
|
|
139
|
+
let settled = false;
|
|
140
|
+
const finish = (result) => {
|
|
141
|
+
if (settled)
|
|
142
|
+
return;
|
|
143
|
+
settled = true;
|
|
144
|
+
try {
|
|
145
|
+
sock.destroy();
|
|
146
|
+
}
|
|
147
|
+
catch { /* ignore */ }
|
|
148
|
+
resolve(result);
|
|
149
|
+
};
|
|
150
|
+
const timer = setTimeout(() => finish(false), timeoutMs);
|
|
151
|
+
const sock = createConnection({ path: socketPath });
|
|
152
|
+
sock.once('data', () => { clearTimeout(timer); finish(true); });
|
|
153
|
+
sock.once('error', () => { clearTimeout(timer); finish(false); });
|
|
154
|
+
sock.once('close', () => { clearTimeout(timer); finish(false); });
|
|
155
|
+
});
|
|
156
|
+
}
|
|
100
157
|
async shutdown() {
|
|
101
158
|
this.running = false;
|
|
102
159
|
const closePromises = [];
|
|
@@ -185,9 +242,28 @@ export class DaemonServer {
|
|
|
185
242
|
let buffer = '';
|
|
186
243
|
const nonce = randomBytes(16).toString('hex');
|
|
187
244
|
this.sendRaw(socket, { id: '__auth_challenge__', result: { nonce } });
|
|
245
|
+
// CRIT-3: close sockets that never complete auth within 10 s → prevents FD exhaustion.
|
|
246
|
+
const authDeadline = setTimeout(() => {
|
|
247
|
+
if (!authenticated) {
|
|
248
|
+
logger.warn('DaemonServer: auth timeout, destroying socket', { remote: socket.remoteAddress });
|
|
249
|
+
socket.destroy();
|
|
250
|
+
}
|
|
251
|
+
}, 10_000);
|
|
252
|
+
authDeadline.unref();
|
|
188
253
|
socket.setEncoding('utf-8');
|
|
189
254
|
socket.on('data', (chunk) => {
|
|
190
255
|
buffer += chunk;
|
|
256
|
+
// B2: Destroy the socket if the receive buffer exceeds the cap.
|
|
257
|
+
// This prevents an authenticated client from causing OOM by streaming
|
|
258
|
+
// data without ever sending a newline delimiter.
|
|
259
|
+
if (buffer.length > MAX_BUFFER_BYTES) {
|
|
260
|
+
logger.warn('DaemonServer: client exceeded buffer cap, destroying socket', {
|
|
261
|
+
remote: socket.remoteAddress,
|
|
262
|
+
bufferLength: buffer.length,
|
|
263
|
+
});
|
|
264
|
+
socket.destroy();
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
191
267
|
const lines = buffer.split('\n');
|
|
192
268
|
buffer = lines.pop() ?? '';
|
|
193
269
|
for (const line of lines) {
|
|
@@ -199,8 +275,12 @@ export class DaemonServer {
|
|
|
199
275
|
if (!authenticated) {
|
|
200
276
|
this.handleAuth(socket, msg, nonce, (ok) => {
|
|
201
277
|
authenticated = ok;
|
|
202
|
-
if (
|
|
278
|
+
if (ok) {
|
|
279
|
+
clearTimeout(authDeadline); // CRIT-3: auth succeeded; cancel deadline
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
203
282
|
socket.destroy();
|
|
283
|
+
}
|
|
204
284
|
});
|
|
205
285
|
return;
|
|
206
286
|
}
|
|
@@ -215,6 +295,7 @@ export class DaemonServer {
|
|
|
215
295
|
}
|
|
216
296
|
});
|
|
217
297
|
socket.on('close', () => {
|
|
298
|
+
clearTimeout(authDeadline);
|
|
218
299
|
// Release all locks held by this client on disconnect.
|
|
219
300
|
for (const [key, handle] of state.lockHandles) {
|
|
220
301
|
handle.release().catch(() => { });
|
|
@@ -237,7 +318,10 @@ export class DaemonServer {
|
|
|
237
318
|
callback(false);
|
|
238
319
|
return;
|
|
239
320
|
}
|
|
240
|
-
|
|
321
|
+
// B11: hmacToken() was previously a module-level function. Inlined here to
|
|
322
|
+
// prevent future callers from accidentally reusing it with a caller-supplied
|
|
323
|
+
// nonce outside of the auth flow.
|
|
324
|
+
const expected = createHmac('sha256', this.sharedSecret).update(nonce).digest('hex');
|
|
241
325
|
const expectedBuf = Buffer.from(expected, 'utf-8');
|
|
242
326
|
const providedBuf = Buffer.from(token, 'utf-8');
|
|
243
327
|
const ok = expectedBuf.length === providedBuf.length &&
|
|
@@ -282,13 +366,17 @@ export class DaemonServer {
|
|
|
282
366
|
case 'lock.acquire': {
|
|
283
367
|
const key = p?.key;
|
|
284
368
|
const timeoutMs = p?.timeoutMs;
|
|
369
|
+
// HIGH-2: Reject if this client already holds the lock for this key.
|
|
370
|
+
// Silently overwriting the handle would orphan the old handle and
|
|
371
|
+
// permanently deadlock the key for all clients.
|
|
372
|
+
if (state.lockHandles.has(key)) {
|
|
373
|
+
throw new Error(`ALREADY_HOLDS_LOCK: Already holding lock for key '${key}'`);
|
|
374
|
+
}
|
|
285
375
|
// Acquire the lock — this awaits until the lock is free.
|
|
286
376
|
// Node.js is async; concurrent awaits on different sockets yield to
|
|
287
377
|
// the event loop, so release RPCs from other clients can proceed.
|
|
288
378
|
const handle = await this.lock.acquire(key, { timeoutMs });
|
|
289
379
|
// Persist the handle so lock.release can find and call it.
|
|
290
|
-
// Use a composite key of lockKey + requestId to support multiple
|
|
291
|
-
// concurrent locks per client on different keys.
|
|
292
380
|
state.lockHandles.set(key, handle);
|
|
293
381
|
return { acquired: true, key };
|
|
294
382
|
}
|
|
@@ -307,10 +395,15 @@ export class DaemonServer {
|
|
|
307
395
|
const channel = p?.channel;
|
|
308
396
|
const message = p?.message;
|
|
309
397
|
this.bus.broadcast(channel, message);
|
|
310
|
-
|
|
398
|
+
// HIGH-3: wrap in a dedicated envelope so clients cannot confuse a
|
|
399
|
+
// broadcast with an RPC response (e.g. a malicious {id:42,result:{}}
|
|
400
|
+
// broadcast would not be routed to pending RPC id 42).
|
|
401
|
+
// Note: sender is included so self-subscribing clients receive their
|
|
402
|
+
// own broadcasts (the envelope protection prevents injection regardless).
|
|
403
|
+
const envelope = JSON.stringify({ __broadcast__: true, channel, message }) + '\n';
|
|
311
404
|
for (const [client] of this.clients) {
|
|
312
405
|
if (!client.destroyed) {
|
|
313
|
-
client.write(
|
|
406
|
+
client.write(envelope);
|
|
314
407
|
}
|
|
315
408
|
}
|
|
316
409
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
package/dist/metrics/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* session-level statistics exposed via the `get_metrics` tool.
|
|
4
4
|
* @module metrics
|
|
5
5
|
*/
|
|
6
|
-
export { MetricsCollector, getMetricsCollector, shutdownMetricsCollector, type TokenEstimationConfig, type ExecutionMetrics, type SessionMetrics, type WindowedMetrics, } from './metrics-collector.js';
|
|
6
|
+
export { MetricsCollector, getMetricsCollector, shutdownMetricsCollector, computeTokenSavings, TOOL_CALL_OVERHEAD_TOKENS, TOKENS_PER_KB, CODE_CHARS_PER_TOKEN, JSON_CHARS_PER_TOKEN, type TokenEstimationConfig, type ExecutionMetrics, type SessionMetrics, type WindowedMetrics, type TokenSavingsInput, type TokenSavings, type ToolSavingsBucket, type SessionTokenSavings, } from './metrics-collector.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,wBAAwB,CAAC"}
|
package/dist/metrics/index.js
CHANGED
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
* session-level statistics exposed via the `get_metrics` tool.
|
|
4
4
|
* @module metrics
|
|
5
5
|
*/
|
|
6
|
-
export { MetricsCollector, getMetricsCollector, shutdownMetricsCollector, } from './metrics-collector.js';
|
|
6
|
+
export { MetricsCollector, getMetricsCollector, shutdownMetricsCollector, computeTokenSavings, TOOL_CALL_OVERHEAD_TOKENS, TOKENS_PER_KB, CODE_CHARS_PER_TOKEN, JSON_CHARS_PER_TOKEN, } from './metrics-collector.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,yBAAyB,EACzB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,GASrB,MAAM,wBAAwB,CAAC"}
|
|
@@ -6,6 +6,102 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { EventEmitter } from 'node:events';
|
|
8
8
|
import type { MetricsConfig } from '../config/index.js';
|
|
9
|
+
/** Per-call overhead tokens (request + response envelope) */
|
|
10
|
+
export declare const TOOL_CALL_OVERHEAD_TOKENS = 150;
|
|
11
|
+
/** Tokens per KB of raw passthrough data (~4 bytes per token) */
|
|
12
|
+
export declare const TOKENS_PER_KB = 256;
|
|
13
|
+
/** Characters per token for TypeScript/JavaScript code */
|
|
14
|
+
export declare const CODE_CHARS_PER_TOKEN = 3.5;
|
|
15
|
+
/** Characters per token for JSON result payloads */
|
|
16
|
+
export declare const JSON_CHARS_PER_TOKEN = 3.8;
|
|
17
|
+
/**
|
|
18
|
+
* Input parameters for the token savings computation.
|
|
19
|
+
* All four values must come from the same execute_code call.
|
|
20
|
+
*/
|
|
21
|
+
export interface TokenSavingsInput {
|
|
22
|
+
/** Number of MCP tool calls made inside the sandbox */
|
|
23
|
+
toolCalls: number;
|
|
24
|
+
/** Total bytes of raw data processed (would be in context in passthrough) */
|
|
25
|
+
dataProcessedBytes: number;
|
|
26
|
+
/** Character count of the user code submitted to execute_code */
|
|
27
|
+
codeChars: number;
|
|
28
|
+
/** Byte length of the JSON-serialised result returned from the sandbox */
|
|
29
|
+
resultBytes: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Token savings block returned by computeTokenSavings() and attached to
|
|
33
|
+
* execute_code responses when show_token_savings is true.
|
|
34
|
+
*/
|
|
35
|
+
export interface TokenSavings {
|
|
36
|
+
/** Estimated tokens if every tool call result had been placed in context */
|
|
37
|
+
estimatedPassthroughTokens: number;
|
|
38
|
+
/** Actual tokens consumed by execution mode (code + result) */
|
|
39
|
+
actualExecutionTokens: number;
|
|
40
|
+
/** Tokens saved: passthrough - execution (clamped to >= 0) */
|
|
41
|
+
tokensSaved: number;
|
|
42
|
+
/** Percentage savings, rounded to one decimal place */
|
|
43
|
+
savingsPercent: number;
|
|
44
|
+
/**
|
|
45
|
+
* Human-readable note. Populated for passthrough-mode tools to signal
|
|
46
|
+
* the savings estimate is not applicable.
|
|
47
|
+
*/
|
|
48
|
+
note?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Per-tool aggregation bucket used by the session-level reporter.
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export interface ToolSavingsBucket {
|
|
55
|
+
server: string;
|
|
56
|
+
tool: string;
|
|
57
|
+
calls: number;
|
|
58
|
+
totalActualTokens: number;
|
|
59
|
+
totalEstimatedPassthroughTokens: number;
|
|
60
|
+
isPassthrough: boolean;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Session-level token savings block returned by getTokenSavings().
|
|
64
|
+
*/
|
|
65
|
+
export interface SessionTokenSavings {
|
|
66
|
+
/** Total actual tokens across all execute_code calls this session */
|
|
67
|
+
sessionActual: number;
|
|
68
|
+
/** Total estimated passthrough tokens across all calls this session */
|
|
69
|
+
sessionEstimatedDirect: number;
|
|
70
|
+
/** Overall savings percentage this session */
|
|
71
|
+
sessionSavingsPercent: number;
|
|
72
|
+
/** Per-tool breakdown (server x tool) */
|
|
73
|
+
perTool: Array<{
|
|
74
|
+
server: string;
|
|
75
|
+
tool: string;
|
|
76
|
+
calls: number;
|
|
77
|
+
actualTokens: number;
|
|
78
|
+
estimatedPassthroughTokens: number;
|
|
79
|
+
savingsPercent: number;
|
|
80
|
+
note?: string;
|
|
81
|
+
}>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Compute token savings for a single execute_code invocation.
|
|
85
|
+
*
|
|
86
|
+
* This is a **pure function** — it does not mutate any collector state and can
|
|
87
|
+
* be called independently without an active MetricsCollector instance.
|
|
88
|
+
*
|
|
89
|
+
* Formula (mirrors MetricsCollector.estimatePassthroughTokens / calculateTokenSavings):
|
|
90
|
+
* passthroughTokens = (toolCalls x 150) + (dataProcessedBytes / 1024 x 256)
|
|
91
|
+
* executionTokens = ceil(codeChars / 3.5) + ceil(resultBytes / 3.8)
|
|
92
|
+
*
|
|
93
|
+
* Caveats:
|
|
94
|
+
* - 256 tokens/KB is an observed average; actual tokeniser output varies.
|
|
95
|
+
* - Per-call overhead (150 tokens) dominates for tiny responses; savings may
|
|
96
|
+
* appear negative when overhead > data tokens. tokensSaved is clamped to 0.
|
|
97
|
+
* - For passthrough-mode tools set toolCalls=0, dataProcessedBytes=0;
|
|
98
|
+
* the note field will indicate savings are not applicable.
|
|
99
|
+
* - For mutation tools (write, upsert) the number is informational only.
|
|
100
|
+
*
|
|
101
|
+
* @param input - The four metrics from an execute_code call
|
|
102
|
+
* @returns A TokenSavings block suitable for embedding in a tool response
|
|
103
|
+
*/
|
|
104
|
+
export declare function computeTokenSavings(input: TokenSavingsInput): TokenSavings;
|
|
9
105
|
/**
|
|
10
106
|
* Token estimation configuration for different content types
|
|
11
107
|
*/
|
|
@@ -95,6 +191,8 @@ export declare class MetricsCollector extends EventEmitter {
|
|
|
95
191
|
private executions;
|
|
96
192
|
private maxStoredExecutions;
|
|
97
193
|
private logPath;
|
|
194
|
+
/** Per-tool aggregation for the token savings reporter (Mode B). */
|
|
195
|
+
private toolSavingsBuckets;
|
|
98
196
|
constructor(config: MetricsConfig, estimationConfig?: Partial<TokenEstimationConfig>);
|
|
99
197
|
/**
|
|
100
198
|
* Generate a unique session ID
|
|
@@ -195,6 +293,28 @@ export declare class MetricsCollector extends EventEmitter {
|
|
|
195
293
|
* Reset all metrics
|
|
196
294
|
*/
|
|
197
295
|
reset(): void;
|
|
296
|
+
/**
|
|
297
|
+
* Record a single MCP tool call for per-tool savings aggregation (Mode B).
|
|
298
|
+
*
|
|
299
|
+
* Call this once per tool call that passes through the hub. The server and
|
|
300
|
+
* tool names form the bucket key; responseBytes is the raw JSON response size
|
|
301
|
+
* that would have been placed in the context window in passthrough mode.
|
|
302
|
+
*
|
|
303
|
+
* @param server - MCP server name (e.g. "google-drive")
|
|
304
|
+
* @param tool - Tool name (e.g. "export_file")
|
|
305
|
+
* @param responseBytes - Byte length of the tool response payload
|
|
306
|
+
* @param isPassthrough - True when this server/tool routes as passthrough
|
|
307
|
+
*/
|
|
308
|
+
recordToolCall(server: string, tool: string, responseBytes: number, isPassthrough: boolean): void;
|
|
309
|
+
/**
|
|
310
|
+
* Return the session-level token savings block for the get_metrics reporter
|
|
311
|
+
* (Mode B). Aggregates across all recordExecution() calls.
|
|
312
|
+
*
|
|
313
|
+
* The session totals are derived from the existing executions array (which
|
|
314
|
+
* already tracks estimatedTokensSaved and the direct-mode estimate) so they
|
|
315
|
+
* are always consistent with getSessionMetrics().
|
|
316
|
+
*/
|
|
317
|
+
getTokenSavings(): SessionTokenSavings;
|
|
198
318
|
/**
|
|
199
319
|
* Check if metrics collection is enabled
|
|
200
320
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics-collector.d.ts","sourceRoot":"","sources":["../../src/metrics/metrics-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,63 @@ import { EventEmitter } from 'node:events';
|
|
|
8
8
|
import { appendFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
9
9
|
import { dirname } from 'node:path';
|
|
10
10
|
import { logger } from '../utils/index.js';
|
|
11
|
+
// ─── Token Savings constants (public, shared with fixtures and benchmarks) ────
|
|
12
|
+
/** Per-call overhead tokens (request + response envelope) */
|
|
13
|
+
export const TOOL_CALL_OVERHEAD_TOKENS = 150;
|
|
14
|
+
/** Tokens per KB of raw passthrough data (~4 bytes per token) */
|
|
15
|
+
export const TOKENS_PER_KB = 256;
|
|
16
|
+
/** Characters per token for TypeScript/JavaScript code */
|
|
17
|
+
export const CODE_CHARS_PER_TOKEN = 3.5;
|
|
18
|
+
/** Characters per token for JSON result payloads */
|
|
19
|
+
export const JSON_CHARS_PER_TOKEN = 3.8;
|
|
20
|
+
// ─── Pure helpers ─────────────────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Compute token savings for a single execute_code invocation.
|
|
23
|
+
*
|
|
24
|
+
* This is a **pure function** — it does not mutate any collector state and can
|
|
25
|
+
* be called independently without an active MetricsCollector instance.
|
|
26
|
+
*
|
|
27
|
+
* Formula (mirrors MetricsCollector.estimatePassthroughTokens / calculateTokenSavings):
|
|
28
|
+
* passthroughTokens = (toolCalls x 150) + (dataProcessedBytes / 1024 x 256)
|
|
29
|
+
* executionTokens = ceil(codeChars / 3.5) + ceil(resultBytes / 3.8)
|
|
30
|
+
*
|
|
31
|
+
* Caveats:
|
|
32
|
+
* - 256 tokens/KB is an observed average; actual tokeniser output varies.
|
|
33
|
+
* - Per-call overhead (150 tokens) dominates for tiny responses; savings may
|
|
34
|
+
* appear negative when overhead > data tokens. tokensSaved is clamped to 0.
|
|
35
|
+
* - For passthrough-mode tools set toolCalls=0, dataProcessedBytes=0;
|
|
36
|
+
* the note field will indicate savings are not applicable.
|
|
37
|
+
* - For mutation tools (write, upsert) the number is informational only.
|
|
38
|
+
*
|
|
39
|
+
* @param input - The four metrics from an execute_code call
|
|
40
|
+
* @returns A TokenSavings block suitable for embedding in a tool response
|
|
41
|
+
*/
|
|
42
|
+
export function computeTokenSavings(input) {
|
|
43
|
+
const { toolCalls, dataProcessedBytes, codeChars, resultBytes } = input;
|
|
44
|
+
const estimatedPassthroughTokens = Math.ceil(toolCalls * TOOL_CALL_OVERHEAD_TOKENS + (dataProcessedBytes / 1024) * TOKENS_PER_KB);
|
|
45
|
+
const actualExecutionTokens = Math.ceil(codeChars / CODE_CHARS_PER_TOKEN) +
|
|
46
|
+
Math.ceil(resultBytes / JSON_CHARS_PER_TOKEN);
|
|
47
|
+
const tokensSaved = Math.max(0, estimatedPassthroughTokens - actualExecutionTokens);
|
|
48
|
+
const savingsPercent = estimatedPassthroughTokens > 0
|
|
49
|
+
? Math.round((tokensSaved / estimatedPassthroughTokens) * 1000) / 10
|
|
50
|
+
: 0;
|
|
51
|
+
// Passthrough-mode tool: no tool calls and no data — savings not applicable.
|
|
52
|
+
if (toolCalls === 0 && dataProcessedBytes === 0) {
|
|
53
|
+
return {
|
|
54
|
+
estimatedPassthroughTokens,
|
|
55
|
+
actualExecutionTokens,
|
|
56
|
+
tokensSaved: 0,
|
|
57
|
+
savingsPercent: 0,
|
|
58
|
+
note: 'This tool is passthrough — execute_code routing not applicable.',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
estimatedPassthroughTokens,
|
|
63
|
+
actualExecutionTokens,
|
|
64
|
+
tokensSaved,
|
|
65
|
+
savingsPercent,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
11
68
|
/**
|
|
12
69
|
* Metrics Collector class
|
|
13
70
|
*/
|
|
@@ -19,6 +76,8 @@ export class MetricsCollector extends EventEmitter {
|
|
|
19
76
|
executions = [];
|
|
20
77
|
maxStoredExecutions = 100;
|
|
21
78
|
logPath = null;
|
|
79
|
+
/** Per-tool aggregation for the token savings reporter (Mode B). */
|
|
80
|
+
toolSavingsBuckets = new Map();
|
|
22
81
|
constructor(config, estimationConfig) {
|
|
23
82
|
super();
|
|
24
83
|
this.config = config;
|
|
@@ -404,6 +463,83 @@ export class MetricsCollector extends EventEmitter {
|
|
|
404
463
|
this.executions = [];
|
|
405
464
|
this.emit('reset');
|
|
406
465
|
}
|
|
466
|
+
/**
|
|
467
|
+
* Record a single MCP tool call for per-tool savings aggregation (Mode B).
|
|
468
|
+
*
|
|
469
|
+
* Call this once per tool call that passes through the hub. The server and
|
|
470
|
+
* tool names form the bucket key; responseBytes is the raw JSON response size
|
|
471
|
+
* that would have been placed in the context window in passthrough mode.
|
|
472
|
+
*
|
|
473
|
+
* @param server - MCP server name (e.g. "google-drive")
|
|
474
|
+
* @param tool - Tool name (e.g. "export_file")
|
|
475
|
+
* @param responseBytes - Byte length of the tool response payload
|
|
476
|
+
* @param isPassthrough - True when this server/tool routes as passthrough
|
|
477
|
+
*/
|
|
478
|
+
recordToolCall(server, tool, responseBytes, isPassthrough) {
|
|
479
|
+
const key = `${server}::${tool}`;
|
|
480
|
+
const existing = this.toolSavingsBuckets.get(key);
|
|
481
|
+
// Compute the per-call token cost for this tool call in each mode.
|
|
482
|
+
const passthroughTokens = Math.ceil(TOOL_CALL_OVERHEAD_TOKENS + (responseBytes / 1024) * TOKENS_PER_KB);
|
|
483
|
+
// Execution mode has no per-call cost for individual tools — the overhead
|
|
484
|
+
// is already captured in the code+result tokens of the execute_code call.
|
|
485
|
+
// We record 0 so the per-tool diff correctly reflects passthrough cost.
|
|
486
|
+
const executionTokens = 0;
|
|
487
|
+
if (existing) {
|
|
488
|
+
existing.calls += 1;
|
|
489
|
+
existing.totalEstimatedPassthroughTokens += passthroughTokens;
|
|
490
|
+
existing.totalActualTokens += executionTokens;
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
this.toolSavingsBuckets.set(key, {
|
|
494
|
+
server,
|
|
495
|
+
tool,
|
|
496
|
+
calls: 1,
|
|
497
|
+
totalEstimatedPassthroughTokens: passthroughTokens,
|
|
498
|
+
totalActualTokens: executionTokens,
|
|
499
|
+
isPassthrough,
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Return the session-level token savings block for the get_metrics reporter
|
|
505
|
+
* (Mode B). Aggregates across all recordExecution() calls.
|
|
506
|
+
*
|
|
507
|
+
* The session totals are derived from the existing executions array (which
|
|
508
|
+
* already tracks estimatedTokensSaved and the direct-mode estimate) so they
|
|
509
|
+
* are always consistent with getSessionMetrics().
|
|
510
|
+
*/
|
|
511
|
+
getTokenSavings() {
|
|
512
|
+
const sessionMetrics = this.getSessionMetrics();
|
|
513
|
+
const sessionActual = sessionMetrics.totalCodeTokens + sessionMetrics.totalResultTokens;
|
|
514
|
+
const sessionEstimatedDirect = sessionMetrics.totalEstimatedDirectTokens;
|
|
515
|
+
const totalSaved = Math.max(0, sessionEstimatedDirect - sessionActual);
|
|
516
|
+
const sessionSavingsPercent = sessionEstimatedDirect > 0
|
|
517
|
+
? Math.round((totalSaved / sessionEstimatedDirect) * 1000) / 10
|
|
518
|
+
: 0;
|
|
519
|
+
const perTool = Array.from(this.toolSavingsBuckets.values()).map((bucket) => {
|
|
520
|
+
const saved = Math.max(0, bucket.totalEstimatedPassthroughTokens - bucket.totalActualTokens);
|
|
521
|
+
const pct = bucket.totalEstimatedPassthroughTokens > 0
|
|
522
|
+
? Math.round((saved / bucket.totalEstimatedPassthroughTokens) * 1000) / 10
|
|
523
|
+
: 0;
|
|
524
|
+
return {
|
|
525
|
+
server: bucket.server,
|
|
526
|
+
tool: bucket.tool,
|
|
527
|
+
calls: bucket.calls,
|
|
528
|
+
actualTokens: bucket.totalActualTokens,
|
|
529
|
+
estimatedPassthroughTokens: bucket.totalEstimatedPassthroughTokens,
|
|
530
|
+
savingsPercent: pct,
|
|
531
|
+
...(bucket.isPassthrough
|
|
532
|
+
? { note: 'This tool is passthrough — execute_code routing not applicable.' }
|
|
533
|
+
: {}),
|
|
534
|
+
};
|
|
535
|
+
});
|
|
536
|
+
return {
|
|
537
|
+
sessionActual,
|
|
538
|
+
sessionEstimatedDirect,
|
|
539
|
+
sessionSavingsPercent,
|
|
540
|
+
perTool,
|
|
541
|
+
};
|
|
542
|
+
}
|
|
407
543
|
/**
|
|
408
544
|
* Check if metrics collection is enabled
|
|
409
545
|
*/
|