@@ -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 ;
@@ -1545,3 +1546,29 @@ const EMPTY_COMPLETION_RESULT: CompleteResult = {
15451546 hasMore : false
15461547 }
15471548} ;
1549+
1550+ /**
1551+ * Wraps a tool task handler such that it can be used without checking if it needs to be called in a one-arg manner.
1552+ * @param handler The task handler to wrap.
1553+ * @param args The tool arguments.
1554+ * @returns A wrapped task handler for a tool, which only exposes a no-args interface.
1555+ */
1556+ function toolTaskHandlerByArgs < Args extends AnySchema | ZodRawShapeCompat | undefined > (
1557+ handler : ToolTaskHandler < Args > ,
1558+ args : unknown
1559+ ) : ToolTaskHandler < undefined > {
1560+ return {
1561+ createTask : extra =>
1562+ args // undefined only if tool.inputSchema is undefined
1563+ ? Promise . resolve ( ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . createTask ( args , extra ) )
1564+ : Promise . resolve ( ( handler as ToolTaskHandler < undefined > ) . createTask ( extra ) ) ,
1565+ getTask : extra =>
1566+ args
1567+ ? ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . getTask ( args , extra )
1568+ : ( handler as ToolTaskHandler < undefined > ) . getTask ( extra ) ,
1569+ getTaskResult : extra =>
1570+ args
1571+ ? ( handler as ToolTaskHandler < ZodRawShapeCompat > ) . getTaskResult ( args , extra )
1572+ : ( handler as ToolTaskHandler < undefined > ) . getTaskResult ( extra )
1573+ } ;
1574+ }
0 commit comments