From 16ff78a16a55da2b2a7be8f780e2db3f7d3a237b Mon Sep 17 00:00:00 2001 From: corvid-agent <0xOpenBytes@gmail.com> Date: Mon, 9 Feb 2026 14:42:15 -0700 Subject: [PATCH] fix: pass empty args to registerToolTask createTask handler when no inputSchema When registerToolTask is used without inputSchema, the createTask handler should receive an empty object as its first argument when the handler expects two arguments (args, ctx). This fixes the case where users define a two-argument handler but omit inputSchema - previously the second argument (ctx) would be passed as the first argument instead. Uses Function.length to detect handler arity: single-arg handlers continue to receive just ctx, while two-arg handlers get ({}, ctx). Closes #1471 Co-Authored-By: Claude Opus 4.6 --- .changeset/fix-register-tool-task-args.md | 5 +++++ packages/server/src/server/mcp.ts | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/fix-register-tool-task-args.md diff --git a/.changeset/fix-register-tool-task-args.md b/.changeset/fix-register-tool-task-args.md new file mode 100644 index 000000000..40d05e654 --- /dev/null +++ b/.changeset/fix-register-tool-task-args.md @@ -0,0 +1,5 @@ +--- +'@modelcontextprotocol/server': patch +--- + +Fix `registerToolTask` to pass empty args object to `createTask` handler when no `inputSchema` is provided, allowing two-argument `(args, ctx)` handler signatures to work correctly. diff --git a/packages/server/src/server/mcp.ts b/packages/server/src/server/mcp.ts index e35871096..1d1533008 100644 --- a/packages/server/src/server/mcp.ts +++ b/packages/server/src/server/mcp.ts @@ -1042,10 +1042,10 @@ function createToolExecutor(inputSchema: AnySchema | undefined, handler: AnyTool throw new Error('No task store provided.'); } const taskCtx: CreateTaskServerContext = { ...ctx, task: { store: ctx.task.store, requestedTtl: ctx.task?.requestedTtl } }; - if (inputSchema) { - return taskHandler.createTask(args, taskCtx); + if (inputSchema || taskHandler.createTask.length > 1) { + return taskHandler.createTask(inputSchema ? args : {}, taskCtx); } - // When no inputSchema, call with just ctx (the handler expects (ctx) signature) + // When no inputSchema and handler expects single arg, call with just ctx return (taskHandler.createTask as (ctx: CreateTaskServerContext) => CreateTaskResult | Promise)(taskCtx); }; }