claude-code - 💡(How to fix) Fix [FEATURE] Implement SEP-1686 (Tasks) client support to unblock long-running MCP tool calls in Cowork / Desktop [1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
anthropics/claude-code#52137Fetched 2026-04-23 07:35:40
View on GitHub
Comments
0
Participants
1
Timeline
3
Reactions
0
Participants
Timeline (top)
labeled ×3

Error Message

A concrete example of how SEP-1686 would change this: acquire_paper returns a taskId in <1s, the agent continues its turn, and a follow-up poll either returns the parsed paper or an actionable error. The 60s ceiling never interacts with the operation's runtime.

Root Cause

  1. Make the synchronous tool-call timeout user-configurable — tracked in #22542 and #424. The latest I'm aware of is that #22542 was closed by the inactivity bot with a "not planned" label (auto-closure, not an explicit product decision). Regardless, a configurable timeout is a weaker fix: it just moves the ceiling, doesn't eliminate it, and it hands every user a knob they have to tune per-server. SEP-1686 solves the problem categorically.
  2. Progress-notification keepalive — some MCP clients reset the request deadline on progress pings. Reports suggest this is unreliable in the TypeScript SDK path that Claude Code uses (see #3033). Even if it worked, it's a workaround layered on top of a synchronous RPC rather than a first-class async model.
  3. Server-side start_* + get_* tool pairs — this is what server authors are doing today as a workaround. It works, but pushes the async pattern into every server's public API with no standard shape, doubling the tool surface and asking every agent to re-implement the same polling loop. SEP-1686 is the standardized version of exactly this workaround; implementing it client-side would let servers retire their ad-hoc polling tools.
  4. SEP-1699 (SSE polling) — transport-level resumability. Orthogonal to the timeout problem; doesn't help because the 60s limit is enforced above the transport.

Fix Action

Fix / Workaround

  1. Make the synchronous tool-call timeout user-configurable — tracked in #22542 and #424. The latest I'm aware of is that #22542 was closed by the inactivity bot with a "not planned" label (auto-closure, not an explicit product decision). Regardless, a configurable timeout is a weaker fix: it just moves the ceiling, doesn't eliminate it, and it hands every user a knob they have to tune per-server. SEP-1686 solves the problem categorically.
  2. Progress-notification keepalive — some MCP clients reset the request deadline on progress pings. Reports suggest this is unreliable in the TypeScript SDK path that Claude Code uses (see #3033). Even if it worked, it's a workaround layered on top of a synchronous RPC rather than a first-class async model.
  3. Server-side start_* + get_* tool pairs — this is what server authors are doing today as a workaround. It works, but pushes the async pattern into every server's public API with no standard shape, doubling the tool surface and asking every agent to re-implement the same polling loop. SEP-1686 is the standardized version of exactly this workaround; implementing it client-side would let servers retire their ad-hoc polling tools.
  4. SEP-1699 (SSE polling) — transport-level resumability. Orthogonal to the timeout problem; doesn't help because the 60s limit is enforced above the transport.
RAW_BUFFERClick to expand / collapse

Preflight Checklist

  • I have searched existing requests and this feature hasn't been requested yet
  • This is a single feature request (not multiple features)

Problem Statement

Claude Code's MCP client enforces a hard 60-second timeout on tool calls (DEFAULT_REQUEST_TIMEOUT_MSEC = 60000 in the TypeScript SDK) and silently ignores user-side timeout configuration in the Desktop / Cowork path. There is also no client-side support for async / background tool calls.

Combined, these three constraints make it structurally impossible to build MCP servers whose operations can legitimately exceed 60s against Cowork. The affected class of operations is broad: publisher API fetches, PDF download and parsing, model inference, bulk data pulls, long-running analyses, and anything with variable upstream latency. From the user's perspective, this surfaces as opaque "tool timed out after 60s" errors with no recovery path other than retry-and-hope.

This is not a server-side performance problem. No amount of server optimization fixes it when the ceiling is on the client. The MCP community's standardized answer to this class of problem — SEP-1686 (Tasks), accepted into the MCP spec in November 2025 — is not implemented in Claude Code's client.

Proposed Solution

Implement SEP-1686 (Tasks) in Claude Code's MCP client:

  1. Recognize a server's declaration that a tool returns a taskId rather than a synchronous result.
  2. Poll (or subscribe to) task status per the SEP.
  3. Surface task progress to the agent loop in a way the agent can reason about (e.g., as a tool result that carries status: running until completion and the final payload when the task finishes).
  4. Apply the 60s timeout to the underlying RPC call, not to the task. Tasks are expected to run beyond the RPC timeout — that's the whole point.

This is a strictly additive change to the client. Existing synchronous tools continue to work unchanged; servers opt in per-tool. It does not require changing the default synchronous tool-call timeout and is independent of whether that timeout ever becomes configurable.

Alternative Solutions

  1. Make the synchronous tool-call timeout user-configurable — tracked in #22542 and #424. The latest I'm aware of is that #22542 was closed by the inactivity bot with a "not planned" label (auto-closure, not an explicit product decision). Regardless, a configurable timeout is a weaker fix: it just moves the ceiling, doesn't eliminate it, and it hands every user a knob they have to tune per-server. SEP-1686 solves the problem categorically.
  2. Progress-notification keepalive — some MCP clients reset the request deadline on progress pings. Reports suggest this is unreliable in the TypeScript SDK path that Claude Code uses (see #3033). Even if it worked, it's a workaround layered on top of a synchronous RPC rather than a first-class async model.
  3. Server-side start_* + get_* tool pairs — this is what server authors are doing today as a workaround. It works, but pushes the async pattern into every server's public API with no standard shape, doubling the tool surface and asking every agent to re-implement the same polling loop. SEP-1686 is the standardized version of exactly this workaround; implementing it client-side would let servers retire their ad-hoc polling tools.
  4. SEP-1699 (SSE polling) — transport-level resumability. Orthogonal to the timeout problem; doesn't help because the 60s limit is enforced above the transport.

Priority

High - Significant impact on productivity

Feature Category

MCP server integration

Use Case Example

Building an MCP server for literature search and paper acquisition, exercising it from Cowork:

  • acquire_paper calls against Nature-family DOIs (publisher-hosted PDFs) reliably time out at 60s. Success depends on whether the publisher CDN happens to return the full PDF inside the 60s window, which is nondeterministic — one retry succeeded, four others timed out in the same session.
  • acquire_paper against arXiv abstract URLs (e.g. https://arxiv.org/abs/2604.02511) also timed out at 60s in the same session.
  • The failure mode the user sees is MCP server "…" tool "acquire_paper" timed out after 60s with no partial result, no progress indicator, and no way to tell whether the work was nearly complete, deeply stuck, or failed upstream.

A concrete example of how SEP-1686 would change this: acquire_paper returns a taskId in <1s, the agent continues its turn, and a follow-up poll either returns the parsed paper or an actionable error. The 60s ceiling never interacts with the operation's runtime.

This pattern generalizes directly to any MCP server that wraps a publisher API, a model inference endpoint, a long-running analysis, or a bulk data pull — i.e., a large fraction of useful MCP servers.

Additional Context

Environment:

  • Product: Cowork mode, Claude desktop app
  • MCP client: inherited from Claude Code / Claude Agent SDK (TypeScript)
  • Observed timeout: 60,000 ms (default DEFAULT_REQUEST_TIMEOUT_MSEC)
  • Timeout configuration attempts via settings had no observable effect on tool-call timeout in Cowork

Related issues (none track SEP-1686 client adoption specifically):

  • #22542 — Make MCP Tool Execution Timeout Configurable — closed by inactivity bot, "not planned" label. Adjacent ask (raise the synchronous ceiling) rather than the spec-aligned async fix proposed here.
  • #3033 — MCP Server Timeout Configuration Ignored in SSE Connections — overlapping symptom, different root cause.
  • #424 — MCP Timeout needs to be configurable — older duplicate of #22542.
  • #31427 — Async/background mode for MCP tool calls — closed as duplicate. Predates the SEP-1686 spec merge, so the spec-aligned fix wasn't available when it was filed. This issue is effectively the post-SEP-1686 version of that ask.

References:

extent analysis

TL;DR

Implementing SEP-1686 (Tasks) in Claude Code's MCP client is the most likely fix to address the 60-second timeout issue for tool calls.

Guidance

  1. Understand the current limitation: The current implementation of the MCP client in Claude Code has a hard 60-second timeout for tool calls, which cannot be configured by the user.
  2. Review the proposed solution: Implementing SEP-1686 (Tasks) would allow the client to recognize and handle asynchronous tool calls, enabling tasks to run beyond the 60-second timeout.
  3. Assess the impact: This change would enable a wide range of operations, such as publisher API fetches, PDF downloads, and model inference, to complete without being limited by the 60-second timeout.
  4. Evaluate alternative solutions: Other proposed solutions, such as making the synchronous tool-call timeout user-configurable or using progress-notification keepalives, may not fully address the issue or have their own limitations.

Example

No code example is provided, as the issue description focuses on the high-level problem and proposed solution rather than specific implementation details.

Notes

The implementation of SEP-1686 (Tasks) would require changes to the Claude Code MCP client, but it is a standardized solution that would provide a more robust and flexible way to handle asynchronous tool calls.

Recommendation

Apply the workaround by implementing SEP-1686 (Tasks) in the Claude Code MCP client, as it provides a standardized and categorical solution to the problem, allowing for more flexibility and reliability in handling tool calls.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

claude-code - 💡(How to fix) Fix [FEATURE] Implement SEP-1686 (Tasks) client support to unblock long-running MCP tool calls in Cowork / Desktop [1 participants]