@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.
Files changed (67) hide show
  1. package/README.md +61 -307
  2. package/dist/bridge/http-server.d.ts +9 -0
  3. package/dist/bridge/http-server.d.ts.map +1 -1
  4. package/dist/bridge/http-server.js +32 -5
  5. package/dist/bridge/http-server.js.map +1 -1
  6. package/dist/cache/cache.d.ts +21 -0
  7. package/dist/cache/cache.d.ts.map +1 -1
  8. package/dist/cache/cache.js +44 -2
  9. package/dist/cache/cache.js.map +1 -1
  10. package/dist/cache/disk.d.ts.map +1 -1
  11. package/dist/cache/disk.js +36 -3
  12. package/dist/cache/disk.js.map +1 -1
  13. package/dist/cli/commands/import-servers.d.ts +12 -1
  14. package/dist/cli/commands/import-servers.d.ts.map +1 -1
  15. package/dist/cli/commands/import-servers.js +40 -3
  16. package/dist/cli/commands/import-servers.js.map +1 -1
  17. package/dist/config/defaults.d.ts.map +1 -1
  18. package/dist/config/defaults.js +1 -0
  19. package/dist/config/defaults.js.map +1 -1
  20. package/dist/config/schema.d.ts +7 -0
  21. package/dist/config/schema.d.ts.map +1 -1
  22. package/dist/daemon/client.d.ts +2 -0
  23. package/dist/daemon/client.d.ts.map +1 -1
  24. package/dist/daemon/client.js +30 -9
  25. package/dist/daemon/client.js.map +1 -1
  26. package/dist/daemon/server.d.ts +9 -0
  27. package/dist/daemon/server.d.ts.map +1 -1
  28. package/dist/daemon/server.js +109 -16
  29. package/dist/daemon/server.js.map +1 -1
  30. package/dist/metrics/index.d.ts +1 -1
  31. package/dist/metrics/index.d.ts.map +1 -1
  32. package/dist/metrics/index.js +1 -1
  33. package/dist/metrics/index.js.map +1 -1
  34. package/dist/metrics/metrics-collector.d.ts +120 -0
  35. package/dist/metrics/metrics-collector.d.ts.map +1 -1
  36. package/dist/metrics/metrics-collector.js +136 -0
  37. package/dist/metrics/metrics-collector.js.map +1 -1
  38. package/dist/runtime/executor.d.ts.map +1 -1
  39. package/dist/runtime/executor.js +45 -2
  40. package/dist/runtime/executor.js.map +1 -1
  41. package/dist/runtime/pool/recycle.d.ts +8 -2
  42. package/dist/runtime/pool/recycle.d.ts.map +1 -1
  43. package/dist/runtime/pool/recycle.js.map +1 -1
  44. package/dist/runtime/pool/worker-pool.d.ts.map +1 -1
  45. package/dist/runtime/pool/worker-pool.js +17 -10
  46. package/dist/runtime/pool/worker-pool.js.map +1 -1
  47. package/dist/runtime/pool/worker.d.ts +7 -1
  48. package/dist/runtime/pool/worker.d.ts.map +1 -1
  49. package/dist/runtime/pool/worker.js +9 -1
  50. package/dist/runtime/pool/worker.js.map +1 -1
  51. package/dist/server/mcp-server.d.ts +17 -3
  52. package/dist/server/mcp-server.d.ts.map +1 -1
  53. package/dist/server/mcp-server.js +133 -26
  54. package/dist/server/mcp-server.js.map +1 -1
  55. package/dist/server/passthrough-registrar.d.ts +55 -5
  56. package/dist/server/passthrough-registrar.d.ts.map +1 -1
  57. package/dist/server/passthrough-registrar.js +104 -15
  58. package/dist/server/passthrough-registrar.js.map +1 -1
  59. package/dist/utils/tokenize.d.ts +8 -0
  60. package/dist/utils/tokenize.d.ts.map +1 -1
  61. package/dist/utils/tokenize.js +8 -0
  62. package/dist/utils/tokenize.js.map +1 -1
  63. package/dist/version.d.ts +3 -3
  64. package/dist/version.d.ts.map +1 -1
  65. package/dist/version.js +3 -3
  66. package/dist/version.js.map +1 -1
  67. package/package.json +22 -3
@@ -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
- function loadOrCreateSecret(authPath) {
30
- if (existsSync(authPath)) {
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
- mkdirSync(CONDUCTOR_DIR, { recursive: true });
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
- writeFileSync(authPath, JSON.stringify(content, null, 2), 'utf-8');
38
- chmodSync(authPath, 0o600);
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 (!ok)
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
- const expected = hmacToken(this.sharedSecret, nonce);
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
- const pushPayload = JSON.stringify({ id: '__push__', result: { channel, message } });
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(pushPayload + '\n');
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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"}
@@ -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,GACrB,MAAM,wBAAwB,CAAC"}
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"}
@@ -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,GAKzB,MAAM,wBAAwB,CAAC"}
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":"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"}
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
  */