@@ -374,27 +374,28 @@ export class McpServer {
374374 const handler = tool . handler as ToolTaskHandler < ZodRawShapeCompat | undefined > ;
375375 const taskExtra = { ...extra , taskStore : extra . taskStore } ;
376376
377- const createTaskResult : CreateTaskResult = args // undefined only if tool.inputSchema is undefined
378- ? await Promise . resolve ( ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . createTask ( args , taskExtra ) )
379- : // eslint-disable-next-line @typescript-eslint/no-explicit-any
380- await Promise . resolve ( ( ( handler as ToolTaskHandler < undefined > ) . createTask as any ) ( taskExtra ) ) ;
377+ const wrappedHandler = toolTaskHandlerByArgs ( handler , args ) ;
378+
379+ const createTaskResult = await wrappedHandler . createTask ( taskExtra ) ;
381380
382381 // Poll until completion
383382 const taskId = createTaskResult . task . taskId ;
383+ const taskExtraComplete = { ...extra , taskId, taskStore : extra . taskStore } ;
384384 let task = createTaskResult . task ;
385385 const pollInterval = task . pollInterval ?? 5000 ;
386386
387387 while ( task . status !== 'completed' && task . status !== 'failed' && task . status !== 'cancelled' ) {
388388 await new Promise ( resolve => setTimeout ( resolve , pollInterval ) ) ;
389- const updatedTask = await extra . taskStore . getTask ( taskId ) ;
389+ const getTaskResult = await wrappedHandler . getTask ( taskExtraComplete ) ;
390+ const updatedTask = getTaskResult ;
390391 if ( ! updatedTask ) {
391392 throw new McpError ( ErrorCode . InternalError , `Task ${ taskId } not found during polling` ) ;
392393 }
393394 task = updatedTask ;
394395 }
395396
396397 // Return the final result
397- return ( await extra . taskStore . getTaskResult ( taskId ) ) as CallToolResult ;
398+ return await wrappedHandler . getTaskResult ( taskExtraComplete ) ;
398399 }
399400
400401 private _completionHandlerInitialized = false ;
@@ -1540,3 +1541,29 @@ const EMPTY_COMPLETION_RESULT: CompleteResult = {
15401541 hasMore : false
15411542 }
15421543} ;
1544+
1545+ /**
1546+ * Wraps a tool task handler such that it can be used without checking if it needs to be called in a one-arg manner.
1547+ * @param handler The task handler to wrap.
1548+ * @param args The tool arguments.
1549+ * @returns A wrapped task handler for a tool, which only exposes a no-args interface.
1550+ */
1551+ function toolTaskHandlerByArgs < Args extends AnySchema | ZodRawShapeCompat | undefined > (
1552+ handler : ToolTaskHandler < Args > ,
1553+ args : unknown
1554+ ) : ToolTaskHandler < undefined > {
1555+ return {
1556+ createTask : extra =>
1557+ args // undefined only if tool.inputSchema is undefined
1558+ ? Promise . resolve ( ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . createTask ( args , extra ) )
1559+ : Promise . resolve ( ( handler as ToolTaskHandler < undefined > ) . createTask ( extra ) ) ,
1560+ getTask : extra =>
1561+ args
1562+ ? ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . getTask ( args , extra )
1563+ : ( handler as ToolTaskHandler < undefined > ) . getTask ( extra ) ,
1564+ getTaskResult : extra =>
1565+ args
1566+ ? ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . getTaskResult ( args , extra )
1567+ : ( handler as ToolTaskHandler < undefined > ) . getTaskResult ( extra )
1568+ } ;
1569+ }
0 commit comments