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.
- package/LICENSE +190 -0
- package/README.md +165 -19
- package/dist/acl-builder.d.ts +43 -0
- package/dist/acl-builder.d.ts.map +1 -0
- package/dist/acl-builder.js +115 -0
- package/dist/acl-builder.js.map +1 -0
- package/dist/adapters/annotations.d.ts.map +1 -1
- package/dist/adapters/annotations.js +37 -2
- package/dist/adapters/annotations.js.map +1 -1
- package/dist/adapters/errors.d.ts +17 -0
- package/dist/adapters/errors.d.ts.map +1 -1
- package/dist/adapters/errors.js +192 -2
- package/dist/adapters/errors.js.map +1 -1
- package/dist/adapters/id-normalizer.d.ts +40 -0
- package/dist/adapters/id-normalizer.d.ts.map +1 -0
- package/dist/adapters/id-normalizer.js +59 -0
- package/dist/adapters/id-normalizer.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +2 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/{mcpErrorFormatter.d.ts → mcp-error-formatter.d.ts} +5 -7
- package/dist/adapters/mcp-error-formatter.d.ts.map +1 -0
- package/dist/adapters/mcp-error-formatter.js +30 -0
- package/dist/adapters/mcp-error-formatter.js.map +1 -0
- package/dist/adapters/schema.d.ts +21 -4
- package/dist/adapters/schema.d.ts.map +1 -1
- package/dist/adapters/schema.js +147 -13
- package/dist/adapters/schema.js.map +1 -1
- package/dist/apcore-mcp.d.ts +24 -2
- package/dist/apcore-mcp.d.ts.map +1 -1
- package/dist/apcore-mcp.js +8 -0
- package/dist/apcore-mcp.js.map +1 -1
- package/dist/auth/hooks.d.ts +1 -1
- package/dist/auth/hooks.d.ts.map +1 -1
- package/dist/auth/hooks.js +10 -3
- package/dist/auth/hooks.js.map +1 -1
- package/dist/auth/jwt.d.ts +1 -2
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +18 -10
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/types.d.ts +6 -3
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +23 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -6
- package/dist/config.js.map +1 -1
- package/dist/converters/openai.d.ts +10 -0
- package/dist/converters/openai.d.ts.map +1 -1
- package/dist/converters/openai.js +100 -5
- package/dist/converters/openai.js.map +1 -1
- package/dist/explorer/index.d.ts +2 -0
- package/dist/explorer/index.d.ts.map +1 -0
- package/dist/explorer/index.js +2 -0
- package/dist/explorer/index.js.map +1 -0
- package/dist/index.d.ts +68 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +346 -60
- package/dist/index.js.map +1 -1
- package/dist/inspector/index.d.ts +2 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/inspector/index.js +2 -0
- package/dist/inspector/index.js.map +1 -0
- package/dist/middleware-builder.d.ts +41 -0
- package/dist/middleware-builder.d.ts.map +1 -0
- package/dist/middleware-builder.js +129 -0
- package/dist/middleware-builder.js.map +1 -0
- package/dist/server/async-task-bridge.d.ts +190 -0
- package/dist/server/async-task-bridge.d.ts.map +1 -0
- package/dist/server/async-task-bridge.js +393 -0
- package/dist/server/async-task-bridge.js.map +1 -0
- package/dist/server/context.d.ts +9 -2
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +14 -6
- package/dist/server/context.js.map +1 -1
- package/dist/server/factory.d.ts +25 -2
- package/dist/server/factory.d.ts.map +1 -1
- package/dist/server/factory.js +127 -7
- package/dist/server/factory.js.map +1 -1
- package/dist/server/listener.d.ts +3 -0
- package/dist/server/listener.d.ts.map +1 -1
- package/dist/server/listener.js +13 -2
- package/dist/server/listener.js.map +1 -1
- package/dist/server/observability.d.ts +51 -0
- package/dist/server/observability.d.ts.map +1 -0
- package/dist/server/observability.js +96 -0
- package/dist/server/observability.js.map +1 -0
- package/dist/server/router.d.ts +114 -0
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +360 -18
- package/dist/server/router.js.map +1 -1
- package/dist/server/trace-context.d.ts +40 -0
- package/dist/server/trace-context.d.ts.map +1 -0
- package/dist/server/trace-context.js +67 -0
- package/dist/server/trace-context.js.map +1 -0
- package/dist/server/transport.d.ts +39 -0
- package/dist/server/transport.d.ts.map +1 -1
- package/dist/server/transport.js +134 -4
- package/dist/server/transport.js.map +1 -1
- package/dist/types.d.ts +18 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -1
- package/package.json +12 -6
- package/dist/adapters/idNormalizer.d.ts +0 -22
- package/dist/adapters/idNormalizer.d.ts.map +0 -1
- package/dist/adapters/idNormalizer.js +0 -30
- package/dist/adapters/idNormalizer.js.map +0 -1
- package/dist/adapters/mcpErrorFormatter.d.ts.map +0 -1
- package/dist/adapters/mcpErrorFormatter.js +0 -24
- package/dist/adapters/mcpErrorFormatter.js.map +0 -1
package/dist/server/router.js
CHANGED
|
@@ -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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
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(
|
|
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(
|
|
470
|
+
text: this._formatResult(redacted),
|
|
223
471
|
},
|
|
224
472
|
];
|
|
225
|
-
const traceId =
|
|
473
|
+
const traceId = effectiveTraceId;
|
|
226
474
|
return [content, false, traceId];
|
|
227
475
|
}
|
|
228
476
|
// ── Non-streaming path ────────────────────────────────────────────
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
|
511
|
+
const redacted = await this._maybeRedact(toolName, result);
|
|
238
512
|
const content = [
|
|
239
513
|
{
|
|
240
514
|
type: "text",
|
|
241
|
-
text: this._formatResult(
|
|
515
|
+
text: this._formatResult(redacted),
|
|
516
|
+
...(traceMeta ? { _meta: { trace: traceMeta } } : {}),
|
|
242
517
|
},
|
|
243
518
|
];
|
|
244
|
-
const 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"}
|