Skip to content

[v6.0] fix: MCP callTool hangs and leaks its response handler when an in-flight request is aborted#16794

Merged
gr2m merged 2 commits into
release-v6.0from
backport-v6.0/fix-16595
Jul 6, 2026
Merged

[v6.0] fix: MCP callTool hangs and leaks its response handler when an in-flight request is aborted#16794
gr2m merged 2 commits into
release-v6.0from
backport-v6.0/fix-16595

Conversation

@gr2m

@gr2m gr2m commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator

Backport of #16595 to release-v6.0 (clean cherry-pick). v6 mcp-client.ts has the identical pattern (abort only checked inside the response handler, no abort listener/cleanup). Includes the regression test with a hanging transport.

Part of the v6.0 backport tracking issue #16767.

…ght request is aborted (#16595)

## Background

Aborting a slow or hung MCP tool call after the JSON-RPC request was
sent left the callTool promise pending and kept its response handler
registered indefinitely.

## Summary

DefaultMCPClient.request now registers an abort listener for in-flight
requests and consistently cleans up the response handler and abort
listener when the request aborts, responds, fails to send, or fails
response parsing.

## Testing

Added a regression test with a custom hanging MCP transport that
verifies an aborted in-flight tool call rejects with MCPClientError and
clears responseHandlers.

## Related Issues

Fixes #16580

Co-authored-by: Abuhaithem
<107338221+Abuhaithem@users.noreply.github.com>

(cherry picked from commit 3e6e955)
@gr2m gr2m added the backport Admins only: add this label to a pull request in order to backport it to the prior version label Jul 6, 2026
v6's callTool takes { name, args, options: ToolExecutionOptions } and
is not declared on the public MCPClient interface, so the test uses a
structural cast and passes abortSignal instead of main's
{ arguments, options: { signal } } shape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@gr2m

gr2m commented Jul 6, 2026

Copy link
Copy Markdown
Collaborator Author

Follow-up commit: adapted the new regression test to v6's callTool signature ({ name, args, options } with options.abortSignal; the method isn't on v6's public MCPClient interface, so the test uses a structural cast). The production fix itself applied cleanly. MCP suite passes locally (228/228).

@gr2m gr2m merged commit 937d731 into release-v6.0 Jul 6, 2026
47 checks passed
@gr2m gr2m deleted the backport-v6.0/fix-16595 branch July 6, 2026 20:06
github-actions Bot added a commit that referenced this pull request Jul 6, 2026
@github-actions github-actions Bot removed the backport Admins only: add this label to a pull request in order to backport it to the prior version label Jul 6, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ Backport to release-v5.0 created but has conflicts: #16823

@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

🚀 Published in:

Package Version
ai 6.0.221 github npm
@ai-sdk/alibaba 1.0.36 github npm
@ai-sdk/amazon-bedrock 4.0.131 github npm
@ai-sdk/angular 2.0.222 github npm
@ai-sdk/anthropic 3.0.95 github npm
@ai-sdk/anthropic-aws 1.0.17 github npm
@ai-sdk/assemblyai 2.0.44 github npm
@ai-sdk/azure 3.0.86 github npm
@ai-sdk/baseten 1.0.61 github npm
@ai-sdk/black-forest-labs 1.0.45 github npm
@ai-sdk/bytedance 1.0.25 github npm
@ai-sdk/cerebras 2.0.64 github npm
@ai-sdk/cohere 3.0.46 github npm
@ai-sdk/deepgram 2.0.43 github npm
@ai-sdk/deepinfra 2.0.62 github npm
@ai-sdk/deepseek 2.0.46 github npm
@ai-sdk/elevenlabs 2.0.43 github npm
@ai-sdk/fal 2.0.44 github npm
@ai-sdk/fireworks 2.0.66 github npm
@ai-sdk/gateway 3.0.145 github npm
@ai-sdk/gladia 2.0.43 github npm
@ai-sdk/google 3.0.90 github npm
@ai-sdk/google-vertex 4.0.158 github npm
@ai-sdk/groq 3.0.49 github npm
@ai-sdk/huggingface 1.0.60 github npm
@ai-sdk/hume 2.0.43 github npm
@ai-sdk/klingai 3.0.28 github npm
@ai-sdk/langchain 2.0.229 github npm
@ai-sdk/llamaindex 2.0.221 github npm
@ai-sdk/lmnt 2.0.43 github npm
@ai-sdk/luma 2.0.43 github npm
@ai-sdk/mcp 1.0.60 github npm
@ai-sdk/mistral 3.0.47 github npm
@ai-sdk/moonshotai 2.0.34 github npm
@ai-sdk/open-responses 1.0.26 github npm
@ai-sdk/openai 3.0.82 github npm
@ai-sdk/openai-compatible 2.0.58 github npm
@ai-sdk/perplexity 3.0.44 github npm
@ai-sdk/prodia 1.0.42 github npm
@ai-sdk/provider-utils 4.0.37 github npm
@ai-sdk/quiverai 1.0.10 github npm
@ai-sdk/react 3.0.223 github npm
@ai-sdk/replicate 2.0.43 github npm
@ai-sdk/revai 2.0.43 github npm
@ai-sdk/rsc 2.0.221 github npm
@ai-sdk/svelte 4.0.221 github npm
@ai-sdk/togetherai 2.0.63 github npm
@ai-sdk/valibot 2.0.38 github npm
@ai-sdk/vercel 2.0.60 github npm
@ai-sdk/voyage 1.0.14 github npm
@ai-sdk/vue 3.0.221 github npm
@ai-sdk/xai 3.0.104 github npm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants