From 5e19b80a9f63b775ddb94355ff8e5517609cc54d Mon Sep 17 00:00:00 2001 From: jobordu Date: Fri, 20 Feb 2026 16:38:53 +0000 Subject: [PATCH] fix: prevent progress notifications from being sent after handler completion Adds a `done` flag and callback to `ToolHandlerContext` so that any in-flight progress messages are dropped once the tool handler has returned. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: jobordu --- .mcp.json | 2 +- src/server.ts | 8 ++++++-- src/types.ts | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.mcp.json b/.mcp.json index f8fb207..76938c4 100644 --- a/.mcp.json +++ b/.mcp.json @@ -4,7 +4,7 @@ "type": "stdio", "command": "node", "args": [ - "dist/index.js" + "/Users/jonathanborduas/code/codex-mcp-server/dist/index.js" ], "env": {} } diff --git a/src/server.ts b/src/server.ts index 4c9a69e..8151369 100644 --- a/src/server.ts +++ b/src/server.ts @@ -52,10 +52,12 @@ export class CodexMcpServer { // Create progress sender that uses MCP notifications const createProgressContext = (): ToolHandlerContext => { let progressCount = 0; + let done = false; return { progressToken, + done: () => { done = true; }, sendProgress: async (message: string, progress?: number, total?: number) => { - if (!progressToken) return; + if (!progressToken || done) return; progressCount++; try { @@ -83,7 +85,9 @@ export class CodexMcpServer { const handler = toolHandlers[name]; const context = createProgressContext(); - return await handler.execute(args, context); + const result = await handler.execute(args, context); + context.done?.(); + return result; } catch (error) { return { content: [ diff --git a/src/types.ts b/src/types.ts index 8a39924..6c139aa 100644 --- a/src/types.ts +++ b/src/types.ts @@ -144,4 +144,5 @@ export type ProgressToken = string | number; export interface ToolHandlerContext { progressToken?: ProgressToken; sendProgress: (message: string, progress?: number, total?: number) => Promise; + done?: () => void; }