MCPcopy Create free account
hub / github.com/adcontextprotocol/adcp / adapt

Function adapt

server/src/training-agent/framework-server.ts:229–275  ·  view source on GitHub ↗

* Convert a legacy `(args, TrainingContext)` handler into the framework's * `(params, HandlerContext) => Promise ` signature. * * - Enforces `VERSION_UNSUPPORTED` for `adcp_major_version !== 3` (legacy * dispatch behavior, not yet in the framework). * - Strips `context` from p

(toolName: string, handler: LegacyHandler)

Source from the content-addressed store, hash-verified

227 * task type. Matches legacy dispatch behavior in `task-handlers.ts`.
228 */
229function adapt(toolName: string, handler: LegacyHandler) {
230 return async (params: unknown, ctx: HandlerContext): Promise<AdaptedResponse> => {
231 const rawParams = (params as Record<string, unknown> | undefined) ?? {};
232 const { context: callerContext, ...handlerArgs } = rawParams;
233
234 const requestedVersion = (handlerArgs as { adcp_major_version?: unknown }).adcp_major_version;
235 if (
236 requestedVersion !== undefined
237 && !(SUPPORTED_MAJOR_VERSIONS as readonly number[]).includes(requestedVersion as number)
238 ) {
239 return versionUnsupported(requestedVersion, callerContext);
240 }
241
242 const trainingCtx: TrainingContext = {
243 mode: 'open',
244 principal: ctx.authInfo?.clientId ?? 'anonymous',
245 };
246
247 return runWithSessionContext(async () => {
248 let result: unknown;
249 try {
250 result = await Promise.resolve(handler(handlerArgs as ToolArgs, trainingCtx));
251 } catch (err) {
252 logger.error({ err }, 'framework handler threw');
253 return serviceUnavailable(err, callerContext);
254 }
255 try {
256 await flushDirtySessions();
257 } catch (err) {
258 logger.error({ err }, 'framework flushDirtySessions threw');
259 return serviceUnavailable(err, callerContext);
260 }
261 const response = toAdaptedResponse(result, callerContext);
262 if (!response.isError) {
263 const idk = (handlerArgs as { idempotency_key?: unknown }).idempotency_key;
264 maybeEmitCompletionWebhook({
265 toolName,
266 args: handlerArgs as Record<string, unknown>,
267 response: (result ?? {}) as Record<string, unknown>,
268 requestIdempotencyKey: typeof idk === 'string' ? idk : undefined,
269 principal: scopedWebhookPrincipal(ctx, handlerArgs as Record<string, unknown>),
270 });
271 }
272 return response;
273 });
274 };
275}
276
277// ── Resolver hooks ───────────────────────────────────────────────
278

Callers 1

Calls 8

versionUnsupportedFunction · 0.85
runWithSessionContextFunction · 0.85
handlerFunction · 0.85
serviceUnavailableFunction · 0.85
flushDirtySessionsFunction · 0.85
toAdaptedResponseFunction · 0.85
scopedWebhookPrincipalFunction · 0.85

Tested by

no test coverage detected