apcore-mcp 0.12.0 → 0.14.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.
Files changed (113) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +165 -19
  3. package/dist/acl-builder.d.ts +43 -0
  4. package/dist/acl-builder.d.ts.map +1 -0
  5. package/dist/acl-builder.js +115 -0
  6. package/dist/acl-builder.js.map +1 -0
  7. package/dist/adapters/annotations.d.ts.map +1 -1
  8. package/dist/adapters/annotations.js +37 -2
  9. package/dist/adapters/annotations.js.map +1 -1
  10. package/dist/adapters/errors.d.ts +17 -0
  11. package/dist/adapters/errors.d.ts.map +1 -1
  12. package/dist/adapters/errors.js +192 -2
  13. package/dist/adapters/errors.js.map +1 -1
  14. package/dist/adapters/id-normalizer.d.ts +40 -0
  15. package/dist/adapters/id-normalizer.d.ts.map +1 -0
  16. package/dist/adapters/id-normalizer.js +59 -0
  17. package/dist/adapters/id-normalizer.js.map +1 -0
  18. package/dist/adapters/index.d.ts +2 -2
  19. package/dist/adapters/index.d.ts.map +1 -1
  20. package/dist/adapters/index.js +2 -2
  21. package/dist/adapters/index.js.map +1 -1
  22. package/dist/adapters/{mcpErrorFormatter.d.ts → mcp-error-formatter.d.ts} +5 -7
  23. package/dist/adapters/mcp-error-formatter.d.ts.map +1 -0
  24. package/dist/adapters/mcp-error-formatter.js +30 -0
  25. package/dist/adapters/mcp-error-formatter.js.map +1 -0
  26. package/dist/adapters/schema.d.ts +21 -4
  27. package/dist/adapters/schema.d.ts.map +1 -1
  28. package/dist/adapters/schema.js +147 -13
  29. package/dist/adapters/schema.js.map +1 -1
  30. package/dist/apcore-mcp.d.ts +24 -2
  31. package/dist/apcore-mcp.d.ts.map +1 -1
  32. package/dist/apcore-mcp.js +8 -0
  33. package/dist/apcore-mcp.js.map +1 -1
  34. package/dist/auth/hooks.d.ts +1 -1
  35. package/dist/auth/hooks.d.ts.map +1 -1
  36. package/dist/auth/hooks.js +10 -3
  37. package/dist/auth/hooks.js.map +1 -1
  38. package/dist/auth/jwt.d.ts +1 -2
  39. package/dist/auth/jwt.d.ts.map +1 -1
  40. package/dist/auth/jwt.js +18 -10
  41. package/dist/auth/jwt.js.map +1 -1
  42. package/dist/auth/types.d.ts +6 -3
  43. package/dist/auth/types.d.ts.map +1 -1
  44. package/dist/cli.d.ts.map +1 -1
  45. package/dist/cli.js +23 -1
  46. package/dist/cli.js.map +1 -1
  47. package/dist/config.d.ts.map +1 -1
  48. package/dist/config.js +15 -6
  49. package/dist/config.js.map +1 -1
  50. package/dist/converters/openai.d.ts +10 -0
  51. package/dist/converters/openai.d.ts.map +1 -1
  52. package/dist/converters/openai.js +100 -5
  53. package/dist/converters/openai.js.map +1 -1
  54. package/dist/explorer/index.d.ts +2 -0
  55. package/dist/explorer/index.d.ts.map +1 -0
  56. package/dist/explorer/index.js +2 -0
  57. package/dist/explorer/index.js.map +1 -0
  58. package/dist/index.d.ts +68 -5
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +346 -60
  61. package/dist/index.js.map +1 -1
  62. package/dist/inspector/index.d.ts +2 -0
  63. package/dist/inspector/index.d.ts.map +1 -0
  64. package/dist/inspector/index.js +2 -0
  65. package/dist/inspector/index.js.map +1 -0
  66. package/dist/middleware-builder.d.ts +41 -0
  67. package/dist/middleware-builder.d.ts.map +1 -0
  68. package/dist/middleware-builder.js +129 -0
  69. package/dist/middleware-builder.js.map +1 -0
  70. package/dist/server/async-task-bridge.d.ts +190 -0
  71. package/dist/server/async-task-bridge.d.ts.map +1 -0
  72. package/dist/server/async-task-bridge.js +393 -0
  73. package/dist/server/async-task-bridge.js.map +1 -0
  74. package/dist/server/context.d.ts +9 -2
  75. package/dist/server/context.d.ts.map +1 -1
  76. package/dist/server/context.js +14 -6
  77. package/dist/server/context.js.map +1 -1
  78. package/dist/server/factory.d.ts +25 -2
  79. package/dist/server/factory.d.ts.map +1 -1
  80. package/dist/server/factory.js +127 -7
  81. package/dist/server/factory.js.map +1 -1
  82. package/dist/server/listener.d.ts +3 -0
  83. package/dist/server/listener.d.ts.map +1 -1
  84. package/dist/server/listener.js +13 -2
  85. package/dist/server/listener.js.map +1 -1
  86. package/dist/server/observability.d.ts +51 -0
  87. package/dist/server/observability.d.ts.map +1 -0
  88. package/dist/server/observability.js +96 -0
  89. package/dist/server/observability.js.map +1 -0
  90. package/dist/server/router.d.ts +114 -0
  91. package/dist/server/router.d.ts.map +1 -1
  92. package/dist/server/router.js +360 -18
  93. package/dist/server/router.js.map +1 -1
  94. package/dist/server/trace-context.d.ts +40 -0
  95. package/dist/server/trace-context.d.ts.map +1 -0
  96. package/dist/server/trace-context.js +67 -0
  97. package/dist/server/trace-context.js.map +1 -0
  98. package/dist/server/transport.d.ts +39 -0
  99. package/dist/server/transport.d.ts.map +1 -1
  100. package/dist/server/transport.js +134 -4
  101. package/dist/server/transport.js.map +1 -1
  102. package/dist/types.d.ts +18 -4
  103. package/dist/types.d.ts.map +1 -1
  104. package/dist/types.js +11 -0
  105. package/dist/types.js.map +1 -1
  106. package/package.json +12 -6
  107. package/dist/adapters/idNormalizer.d.ts +0 -22
  108. package/dist/adapters/idNormalizer.d.ts.map +0 -1
  109. package/dist/adapters/idNormalizer.js +0 -30
  110. package/dist/adapters/idNormalizer.js.map +0 -1
  111. package/dist/adapters/mcpErrorFormatter.d.ts.map +0 -1
  112. package/dist/adapters/mcpErrorFormatter.js +0 -24
  113. package/dist/adapters/mcpErrorFormatter.js.map +0 -1
@@ -8,10 +8,12 @@
8
8
  * chunks are forwarded as MCP notifications/progress before returning the
9
9
  * accumulated result.
10
10
  */
11
+ import * as crypto from "node:crypto";
11
12
  import { ErrorMapper } from "../adapters/errors.js";
12
13
  import { createBridgeContext } from "./context.js";
13
14
  import { MCP_PROGRESS_KEY, MCP_ELICIT_KEY } from "../helpers.js";
14
15
  import { getCurrentIdentity } from "../auth/storage.js";
16
+ import { parseTraceparent } from "./trace-context.js";
15
17
  /** Maximum recursion depth for deep merge to prevent stack overflow. */
16
18
  const DEEP_MERGE_MAX_DEPTH = 32;
17
19
  /**
@@ -38,11 +40,42 @@ function deepMerge(base, overlay, depth = 0) {
38
40
  }
39
41
  return merged;
40
42
  }
43
+ /**
44
+ * Cooperative cancellation token. Mirrors apcore-py's CancelToken and
45
+ * Rust's apcore::CancelToken. [B-002]
46
+ */
47
+ export class CancelToken {
48
+ _cancelled = false;
49
+ get isCancelled() {
50
+ return this._cancelled;
51
+ }
52
+ cancel() {
53
+ this._cancelled = true;
54
+ }
55
+ }
56
+ /**
57
+ * [B-002] Maximum number of cancel-token entries (active + tombstones)
58
+ * kept in the per-router map. When exceeded, oldest entries are evicted
59
+ * in insertion order. Without this cap, tombstones from cancels on
60
+ * unknown call_ids would accumulate unboundedly.
61
+ */
62
+ const CANCEL_TOKENS_MAX = 4096;
41
63
  export class ExecutionRouter {
42
64
  _executor;
43
65
  _errorMapper;
44
66
  _validateInputs;
45
67
  _outputFormatter;
68
+ _redactOutput;
69
+ _outputSchemaMap;
70
+ _trace;
71
+ _asyncTaskBridge;
72
+ /**
73
+ * [B-002] Per-server `call_id → CancelToken` map. Populated on
74
+ * tool-call entry by handleCall(); consulted by cancel(callId).
75
+ * Transport layer should forward inbound MCP `notifications/cancelled`
76
+ * to `router.cancel(callId, reason)`.
77
+ */
78
+ _cancelTokens = new Map();
46
79
  /**
47
80
  * Create an ExecutionRouter.
48
81
  *
@@ -54,6 +87,106 @@ export class ExecutionRouter {
54
87
  this._errorMapper = new ErrorMapper();
55
88
  this._validateInputs = options?.validateInputs ?? false;
56
89
  this._outputFormatter = options?.outputFormatter;
90
+ this._redactOutput = options?.redactOutput ?? true;
91
+ this._outputSchemaMap = options?.outputSchemaMap ?? {};
92
+ this._trace = options?.trace ?? false;
93
+ this._asyncTaskBridge = options?.asyncTaskBridge;
94
+ }
95
+ /** Expose the async task bridge (for factory tool-list merging). */
96
+ get asyncTaskBridge() {
97
+ return this._asyncTaskBridge;
98
+ }
99
+ /**
100
+ * Cooperatively cancel an in-flight tool call. [B-002]
101
+ *
102
+ * Looks up the CancelToken registered for `callId` in handleCall and
103
+ * calls `token.cancel()`. Subsequent checks (e.g., from inside the
104
+ * executing module via `context.cancelToken?.isCancelled`) will see
105
+ * the cancellation. When `callId` is unknown (cancel arrived before
106
+ * submit, or after the call completed), records a tombstone so a
107
+ * subsequent same-id submit immediately sees the cancellation.
108
+ *
109
+ * Returns true when a token was found and cancelled; false when the
110
+ * callId was unknown (tombstone recorded). Wired by transport-level
111
+ * handlers parsing inbound MCP `notifications/cancelled` messages.
112
+ */
113
+ cancel(callId, reason) {
114
+ const existing = this._cancelTokens.get(callId);
115
+ if (existing) {
116
+ // Re-insert to refresh insertion order (Map preserves it).
117
+ this._cancelTokens.delete(callId);
118
+ this._cancelTokens.set(callId, existing);
119
+ existing.cancel();
120
+ this._evictCancelTokens();
121
+ return true;
122
+ }
123
+ const tombstone = new CancelToken();
124
+ tombstone.cancel();
125
+ this._cancelTokens.set(callId, tombstone);
126
+ this._evictCancelTokens();
127
+ void reason; // referenced for API symmetry; reserved for future logging
128
+ return false;
129
+ }
130
+ /**
131
+ * Internal: register a CancelToken for the duration of a tool call.
132
+ * Returns the token (already cancelled if a tombstone was recorded
133
+ * before the call landed).
134
+ */
135
+ _registerCancelToken(callId) {
136
+ const existing = this._cancelTokens.get(callId);
137
+ const token = new CancelToken();
138
+ if (existing && existing.isCancelled) {
139
+ // Tombstone race: cancel arrived before submit.
140
+ token.cancel();
141
+ }
142
+ // Re-insert to refresh ordering (Map preserves insertion order).
143
+ this._cancelTokens.delete(callId);
144
+ this._cancelTokens.set(callId, token);
145
+ this._evictCancelTokens();
146
+ return token;
147
+ }
148
+ /** Internal: release a token slot after the call completes. */
149
+ _releaseCancelToken(callId) {
150
+ this._cancelTokens.delete(callId);
151
+ }
152
+ /**
153
+ * [B-002] Cap the cancel-tokens map at CANCEL_TOKENS_MAX. Map preserves
154
+ * insertion order, so iterator gives oldest first.
155
+ */
156
+ _evictCancelTokens() {
157
+ while (this._cancelTokens.size > CANCEL_TOKENS_MAX) {
158
+ const oldest = this._cancelTokens.keys().next().value;
159
+ if (oldest === undefined)
160
+ break;
161
+ this._cancelTokens.delete(oldest);
162
+ }
163
+ }
164
+ /**
165
+ * Attempt to redact sensitive fields from the result using apcore's redactSensitive().
166
+ *
167
+ * Returns the original result if apcore-js is not available, redactSensitive is not
168
+ * exported, or if an error occurs during redaction.
169
+ */
170
+ async _maybeRedact(toolName, result) {
171
+ if (!this._redactOutput)
172
+ return result;
173
+ const outputSchema = this._outputSchemaMap[toolName];
174
+ if (!outputSchema)
175
+ return result;
176
+ try {
177
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
178
+ const apcore = await import("apcore-js");
179
+ const redactSensitive = apcore.redactSensitive ?? apcore.default?.redactSensitive;
180
+ if (typeof redactSensitive !== "function") {
181
+ console.debug(`redactSensitive not available in apcore-js, skipping redaction for "${toolName}"`);
182
+ return result;
183
+ }
184
+ return redactSensitive(result, outputSchema);
185
+ }
186
+ catch (err) {
187
+ console.warn(`redactSensitive failed for "${toolName}", returning unredacted result: ${err instanceof Error ? err.message : String(err)}`);
188
+ return result;
189
+ }
57
190
  }
58
191
  /**
59
192
  * Format an execution result into text for LLM consumption.
@@ -114,11 +247,39 @@ export class ExecutionRouter {
114
247
  * @returns Tuple of [content, isError, traceId] where content is an array of text content dicts
115
248
  */
116
249
  async handleCall(toolName, args, extra) {
250
+ // [B-002] Register a CancelToken for this call so that an inbound
251
+ // MCP `notifications/cancelled` (forwarded by the transport into
252
+ // `router.cancel(callId, reason)`) cooperatively cancels in-flight
253
+ // work. The callId is sourced from `extra.callId`,
254
+ // `_meta.progressToken`, or generated. Released in `finally`.
255
+ const rawCallId = extra?.callId ??
256
+ extra?._meta?.progressToken;
257
+ const callId = typeof rawCallId === "string" || typeof rawCallId === "number"
258
+ ? String(rawCallId)
259
+ : crypto.randomUUID();
260
+ const cancelToken = this._registerCancelToken(callId);
261
+ try {
262
+ return await this._handleCallInner(toolName, args, extra, cancelToken);
263
+ }
264
+ finally {
265
+ this._releaseCancelToken(callId);
266
+ }
267
+ }
268
+ async _handleCallInner(toolName, args, extra, cancelToken) {
117
269
  try {
118
270
  // ── Build context with MCP callbacks ──────────────────────────────
119
271
  const progressToken = extra?._meta?.progressToken;
120
272
  const sendNotification = extra?.sendNotification;
121
273
  const sendRequest = extra?.sendRequest;
274
+ const traceparentRaw = extra?._meta?.traceparent;
275
+ // Parse incoming W3C traceparent so the downstream trace chain continues.
276
+ let inboundTraceId;
277
+ if (typeof traceparentRaw === "string" && traceparentRaw.length > 0) {
278
+ const parsed = await parseTraceparent(traceparentRaw);
279
+ if (parsed) {
280
+ inboundTraceId = parsed.traceId;
281
+ }
282
+ }
122
283
  const contextData = {};
123
284
  let hasCallbacks = false;
124
285
  // Inject progress callback if progressToken + sendNotification available
@@ -151,9 +312,73 @@ export class ExecutionRouter {
151
312
  };
152
313
  }
153
314
  const identity = getCurrentIdentity();
154
- const context = (hasCallbacks || identity)
155
- ? createBridgeContext(contextData, identity)
156
- : undefined;
315
+ // [A-D-001] Always create a context so the cancelToken is threaded
316
+ // into the executor pipeline. Without this, modules cannot observe
317
+ // inbound MCP `notifications/cancelled` via `context.cancelToken?.isCancelled`
318
+ // and cooperative cancellation is silently broken — the router-level
319
+ // cancel API works but the cancel signal never reaches the running module.
320
+ // Mirrors Python's `context.cancel_token = cancel_token` (router.py:379).
321
+ const context = createBridgeContext(contextData, identity, inboundTraceId, cancelToken);
322
+ // Preserve the pre-fix traceId return contract: return the context's
323
+ // trace_id only when the call carried "meaningful" trace context
324
+ // (callbacks, identity, or inbound traceparent). Otherwise the returned
325
+ // traceId is undefined so vanilla calls don't leak a freshly-generated
326
+ // UUID. The internal context still has a UUID for child() chains.
327
+ const effectiveTraceId = hasCallbacks || identity || inboundTraceId ? context.traceId : undefined;
328
+ // ── F-043: Async Task Bridge meta-tool dispatch ────────────────────
329
+ if (this._asyncTaskBridge && this._asyncTaskBridge.isMetaTool(toolName)) {
330
+ try {
331
+ const metaResult = await this._asyncTaskBridge.handleMetaTool(toolName, args, context);
332
+ const content = [
333
+ { type: "text", text: this._formatResult(metaResult) },
334
+ ];
335
+ return [content, false, effectiveTraceId];
336
+ }
337
+ catch (err) {
338
+ const errorInfo = this._errorMapper.toMcpError(err);
339
+ const content = [
340
+ { type: "text", text: ExecutionRouter._buildErrorText(errorInfo) },
341
+ ];
342
+ return [content, true, effectiveTraceId];
343
+ }
344
+ }
345
+ // ── F-043: Async-hinted module → AsyncTaskManager.submit() ─────────
346
+ if (this._asyncTaskBridge && this._asyncTaskBridge.enabled) {
347
+ let descriptor = null;
348
+ try {
349
+ descriptor = this._executor.registry?.getDefinition?.(toolName) ?? null;
350
+ }
351
+ catch {
352
+ // registry lookup is best-effort — leave descriptor null
353
+ }
354
+ if (this._asyncTaskBridge.isAsyncModule(descriptor)) {
355
+ try {
356
+ // [A-D-018] Forward progressToken AND sessionKey so the bridge
357
+ // records both for terminal-state fan-out (progressToken) and
358
+ // transport-disconnect cancellation (sessionKey via
359
+ // cancelSessionTasks).
360
+ const submitProgressToken = extra?._meta?.progressToken;
361
+ const envelope = await this._asyncTaskBridge.submit(toolName, args, context, {
362
+ progressToken: typeof submitProgressToken === "string" ||
363
+ typeof submitProgressToken === "number"
364
+ ? submitProgressToken
365
+ : undefined,
366
+ sessionKey: extra?.sessionId,
367
+ });
368
+ const content = [
369
+ { type: "text", text: this._formatResult(envelope) },
370
+ ];
371
+ return [content, false, effectiveTraceId];
372
+ }
373
+ catch (err) {
374
+ const errorInfo = this._errorMapper.toMcpError(err);
375
+ const content = [
376
+ { type: "text", text: ExecutionRouter._buildErrorText(errorInfo) },
377
+ ];
378
+ return [content, true, effectiveTraceId];
379
+ }
380
+ }
381
+ }
157
382
  // ── Pre-execution validation ────────────────────────────────────
158
383
  if (this._validateInputs && this._executor.validate) {
159
384
  try {
@@ -196,52 +421,102 @@ export class ExecutionRouter {
196
421
  return [content, true, undefined];
197
422
  }
198
423
  }
424
+ // ── Resolve versionHint from request metadata or descriptor ──────
425
+ let versionHint = extra?.versionHint
426
+ ?? extra?._meta?.apcore?.version;
427
+ if (!versionHint) {
428
+ try {
429
+ const descriptor = this._executor.registry?.getDefinition?.(toolName);
430
+ const metaHint = descriptor?.metadata?.versionHint;
431
+ if (typeof metaHint === "string") {
432
+ versionHint = metaHint;
433
+ }
434
+ }
435
+ catch {
436
+ // ignore — registry lookup is best-effort
437
+ }
438
+ }
199
439
  // ── Streaming path ────────────────────────────────────────────────
200
440
  if (this._executor.stream &&
201
441
  progressToken !== undefined &&
202
442
  sendNotification) {
203
443
  let accumulated = {};
204
444
  let chunkIndex = 0;
205
- for await (const chunk of this._executor.stream(toolName, args, context)) {
445
+ // TODO(apcore>=0.19): streaming traces via streamWithTrace
446
+ for await (const chunk of this._executor.stream(toolName, args, context, versionHint)) {
206
447
  // Deep-merge each chunk into the accumulated result
207
448
  accumulated = deepMerge(accumulated, chunk);
208
- // Send progress notification for each chunk
449
+ // Per-chunk redaction MUST happen before the chunk is serialized
450
+ // into the progress notification — otherwise an x-sensitive
451
+ // credential emitted mid-stream leaks to the MCP client even
452
+ // though the final accumulated result is later redacted.
453
+ // Mirrors Python's _handle_stream invariant. [A-D-003]
454
+ const safeChunk = await this._maybeRedact(toolName, chunk);
455
+ // Send progress notification for each chunk (redacted)
209
456
  await sendNotification({
210
457
  method: "notifications/progress",
211
458
  params: {
212
459
  progressToken,
213
460
  progress: chunkIndex + 1,
214
- message: JSON.stringify(chunk),
461
+ message: JSON.stringify(safeChunk),
215
462
  },
216
463
  });
217
464
  chunkIndex++;
218
465
  }
466
+ const redacted = await this._maybeRedact(toolName, accumulated);
219
467
  const content = [
220
468
  {
221
469
  type: "text",
222
- text: this._formatResult(accumulated),
470
+ text: this._formatResult(redacted),
223
471
  },
224
472
  ];
225
- const traceId = context?.traceId;
473
+ const traceId = effectiveTraceId;
226
474
  return [content, false, traceId];
227
475
  }
228
476
  // ── Non-streaming path ────────────────────────────────────────────
229
- const callFn = typeof this._executor.call === 'function'
230
- ? this._executor.call.bind(this._executor)
231
- : typeof this._executor.callAsync === 'function'
232
- ? this._executor.callAsync.bind(this._executor)
233
- : null;
234
- if (!callFn) {
235
- throw new Error('Executor must implement call() or callAsync()');
477
+ let result;
478
+ let traceMeta;
479
+ if (this._trace && typeof this._executor.callWithTrace === 'function') {
480
+ const [traceResult, pipelineTrace] = await this._executor.callWithTrace(toolName, args, context, versionHint);
481
+ result = traceResult;
482
+ // Convert pipeline trace to a serialisable dict
483
+ if (pipelineTrace && typeof pipelineTrace === 'object') {
484
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
485
+ const pt = pipelineTrace;
486
+ traceMeta = {
487
+ strategyName: pt.strategyName ?? pt.strategy_name ?? undefined,
488
+ totalDurationMs: pt.totalDurationMs ?? pt.total_duration_ms ?? undefined,
489
+ steps: Array.isArray(pt.steps)
490
+ ? pt.steps.map((s) => ({
491
+ name: s.name,
492
+ durationMs: s.durationMs ?? s.duration_ms,
493
+ skipped: s.skipped ?? false,
494
+ skipReason: s.skipReason ?? s.skip_reason ?? undefined,
495
+ }))
496
+ : [],
497
+ };
498
+ }
499
+ }
500
+ else {
501
+ const callFn = typeof this._executor.call === 'function'
502
+ ? this._executor.call.bind(this._executor)
503
+ : typeof this._executor.callAsync === 'function'
504
+ ? this._executor.callAsync.bind(this._executor)
505
+ : null;
506
+ if (!callFn) {
507
+ throw new Error('Executor must implement call() or callAsync()');
508
+ }
509
+ result = await callFn(toolName, args, context, versionHint);
236
510
  }
237
- const result = await callFn(toolName, args, context);
511
+ const redacted = await this._maybeRedact(toolName, result);
238
512
  const content = [
239
513
  {
240
514
  type: "text",
241
- text: this._formatResult(result),
515
+ text: this._formatResult(redacted),
516
+ ...(traceMeta ? { _meta: { trace: traceMeta } } : {}),
242
517
  },
243
518
  ];
244
- const traceId = context?.traceId;
519
+ const traceId = effectiveTraceId;
245
520
  return [content, false, traceId];
246
521
  }
247
522
  catch (error) {
@@ -256,5 +531,72 @@ export class ExecutionRouter {
256
531
  return [content, true, undefined];
257
532
  }
258
533
  }
534
+ /**
535
+ * Preflight validation for a tool call without executing it.
536
+ *
537
+ * Delegates to `executor.validate()` if the executor supports it, and
538
+ * returns a structured validation result.
539
+ *
540
+ * @param toolName - The MCP tool name (maps to apcore moduleId)
541
+ * @param arguments_ - The tool call arguments to validate
542
+ * @returns Structured validation result with checks array
543
+ */
544
+ async validateTool(toolName, arguments_) {
545
+ try {
546
+ if (typeof this._executor.validate !== 'function') {
547
+ return {
548
+ valid: true,
549
+ checks: [],
550
+ requiresApproval: false,
551
+ };
552
+ }
553
+ const rawResult = await this._executor.validate(toolName, arguments_);
554
+ // Normalise result into {valid, checks, requiresApproval}
555
+ if (rawResult && typeof rawResult === 'object' && 'valid' in rawResult) {
556
+ const vr = rawResult;
557
+ return {
558
+ valid: vr.valid ?? true,
559
+ checks: Array.isArray(vr.checks) ? vr.checks : [],
560
+ requiresApproval: vr.requiresApproval ?? vr.requires_approval ?? false,
561
+ };
562
+ }
563
+ // Array of errors → convert to checks format
564
+ if (Array.isArray(rawResult)) {
565
+ if (rawResult.length === 0) {
566
+ return { valid: true, checks: [], requiresApproval: false };
567
+ }
568
+ const checks = rawResult.map((e) => {
569
+ const msg = typeof e === 'string' ? e
570
+ : (typeof e === 'object' && e !== null)
571
+ ? e.message ?? String(e)
572
+ : String(e);
573
+ return {
574
+ check: typeof e === 'object' && e !== null ? (e.field ?? 'validation') : 'validation',
575
+ passed: false,
576
+ error: { message: msg },
577
+ warnings: [],
578
+ };
579
+ });
580
+ return { valid: false, checks, requiresApproval: false };
581
+ }
582
+ // Unexpected shape — treat as valid
583
+ return { valid: true, checks: [], requiresApproval: false };
584
+ }
585
+ catch (error) {
586
+ const message = error instanceof Error ? error.message : String(error);
587
+ return {
588
+ valid: false,
589
+ checks: [
590
+ {
591
+ check: "unexpected",
592
+ passed: false,
593
+ error: { message },
594
+ warnings: [],
595
+ },
596
+ ],
597
+ requiresApproval: false,
598
+ };
599
+ }
600
+ }
259
601
  }
260
602
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/server/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * W3C Trace Context ↔ MCP `_meta.traceparent` bridging.
3
+ *
4
+ * Inbound (parse): when an MCP `tools/call` request carries
5
+ * `_meta.traceparent`, we dynamically import apcore-js's `TraceContext`
6
+ * utility to validate and extract the 32-hex trace_id, which is then used
7
+ * as the BridgeContext's traceId so downstream middleware (including apcore
8
+ * tracing middleware) continues the same trace.
9
+ *
10
+ * Outbound (inject): after a successful tool execution the bridge attaches
11
+ * `_meta.traceparent` to the response carrying the current trace_id plus a
12
+ * freshly generated parent-id. Mirrors apcore's `TraceContext.inject()` shape
13
+ * (`00-<traceId>-<parentId>-01`) without requiring apcore-js to be installed.
14
+ *
15
+ * We rely on apcore-js's built-in traceparent validation when available —
16
+ * this module never duplicates the regex; falls back to a minimal
17
+ * structural check if apcore-js is absent.
18
+ */
19
+ /** Parsed W3C traceparent header. */
20
+ export interface ParsedTraceParent {
21
+ readonly version: string;
22
+ readonly traceId: string;
23
+ readonly parentId: string;
24
+ readonly traceFlags: string;
25
+ }
26
+ /**
27
+ * Parse a W3C traceparent header value. Returns `null` for malformed or
28
+ * W3C-reserved (version=ff, all-zero trace_id/parent_id) headers.
29
+ *
30
+ * Prefers apcore-js `TraceContext.fromTraceparent()` when available so the
31
+ * cross-language contract stays identical. Falls back to an inline regex
32
+ * that matches the apcore spec.
33
+ */
34
+ export declare function parseTraceparent(raw: string): Promise<ParsedTraceParent | null>;
35
+ /**
36
+ * Build a W3C traceparent string from a trace_id. Generates a fresh parent_id
37
+ * and sets the sampled flag.
38
+ */
39
+ export declare function buildTraceparent(traceId: string): string;
40
+ //# sourceMappingURL=trace-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-context.d.ts","sourceRoot":"","sources":["../../src/server/trace-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAyBrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * W3C Trace Context ↔ MCP `_meta.traceparent` bridging.
3
+ *
4
+ * Inbound (parse): when an MCP `tools/call` request carries
5
+ * `_meta.traceparent`, we dynamically import apcore-js's `TraceContext`
6
+ * utility to validate and extract the 32-hex trace_id, which is then used
7
+ * as the BridgeContext's traceId so downstream middleware (including apcore
8
+ * tracing middleware) continues the same trace.
9
+ *
10
+ * Outbound (inject): after a successful tool execution the bridge attaches
11
+ * `_meta.traceparent` to the response carrying the current trace_id plus a
12
+ * freshly generated parent-id. Mirrors apcore's `TraceContext.inject()` shape
13
+ * (`00-<traceId>-<parentId>-01`) without requiring apcore-js to be installed.
14
+ *
15
+ * We rely on apcore-js's built-in traceparent validation when available —
16
+ * this module never duplicates the regex; falls back to a minimal
17
+ * structural check if apcore-js is absent.
18
+ */
19
+ import { randomBytes } from "node:crypto";
20
+ const TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;
21
+ /**
22
+ * Parse a W3C traceparent header value. Returns `null` for malformed or
23
+ * W3C-reserved (version=ff, all-zero trace_id/parent_id) headers.
24
+ *
25
+ * Prefers apcore-js `TraceContext.fromTraceparent()` when available so the
26
+ * cross-language contract stays identical. Falls back to an inline regex
27
+ * that matches the apcore spec.
28
+ */
29
+ export async function parseTraceparent(raw) {
30
+ if (typeof raw !== "string" || raw.length === 0)
31
+ return null;
32
+ // Prefer apcore-js's validator to stay in sync with the core SDK.
33
+ try {
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ const apcore = (await import("apcore-js"));
36
+ const TraceContext = apcore.TraceContext ?? apcore.default?.TraceContext;
37
+ if (TraceContext && typeof TraceContext.fromTraceparent === "function") {
38
+ try {
39
+ return TraceContext.fromTraceparent(raw);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ }
46
+ catch {
47
+ // apcore-js unavailable — fall through to local parse
48
+ }
49
+ const match = TRACEPARENT_RE.exec(raw.trim().toLowerCase());
50
+ if (match === null)
51
+ return null;
52
+ const [, version, traceId, parentId, traceFlags] = match;
53
+ if (version === "ff")
54
+ return null;
55
+ if (traceId === "0".repeat(32) || parentId === "0".repeat(16))
56
+ return null;
57
+ return { version, traceId, parentId, traceFlags };
58
+ }
59
+ /**
60
+ * Build a W3C traceparent string from a trace_id. Generates a fresh parent_id
61
+ * and sets the sampled flag.
62
+ */
63
+ export function buildTraceparent(traceId) {
64
+ const parentId = randomBytes(8).toString("hex");
65
+ return `00-${traceId}-${parentId}-01`;
66
+ }
67
+ //# sourceMappingURL=trace-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-context.js","sourceRoot":"","sources":["../../src/server/trace-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,cAAc,GAAG,6DAA6D,CAAC;AAUrF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE7D,kEAAkE;IAClE,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAQ,CAAC;QAClD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC;QACzE,IAAI,YAAY,IAAI,OAAO,YAAY,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;YACvE,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,eAAe,CAAC,GAAG,CAAsB,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;IACzD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,OAAO,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,MAAM,OAAO,IAAI,QAAQ,KAAK,CAAC;AACxC,CAAC"}