CLAUDE LABJP
OPUS48 — Claude Opus 4.8 is generally available, improving on 4.7 across coding, agentic skills, reasoning, and knowledge workAUTO — Claude Code now defaults to auto mode on Bedrock, Vertex AI, and Foundry, and updates Bedrock to Opus 4.8GUARD — Auto mode now blocks tampering with session transcripts and asks before running rm -rf on an unresolved variableIDP — Admins can provision MCP connectors org-wide via their IdP (starting with Okta), granting access on first loginTIMEOUT — Fixed per-server request_timeout_ms being ignored, which timed out long MCP tool calls at the 60s defaultFAST — Fast mode for Opus 4.7 is deprecated and will be removed on July 24; migrate to fast mode for Opus 4.8OPUS48 — Claude Opus 4.8 is generally available, improving on 4.7 across coding, agentic skills, reasoning, and knowledge workAUTO — Claude Code now defaults to auto mode on Bedrock, Vertex AI, and Foundry, and updates Bedrock to Opus 4.8GUARD — Auto mode now blocks tampering with session transcripts and asks before running rm -rf on an unresolved variableIDP — Admins can provision MCP connectors org-wide via their IdP (starting with Okta), granting access on first loginTIMEOUT — Fixed per-server request_timeout_ms being ignored, which timed out long MCP tool calls at the 60s defaultFAST — Fast mode for Opus 4.7 is deprecated and will be removed on July 24; migrate to fast mode for Opus 4.8
Articles/Claude Code
Claude Code/2026-07-14Advanced

My MCP Timeout Was Being Ignored, and Every Call Died at Exactly 60 Seconds — Reclaiming Per-Server request_timeout_ms

A longer MCP tool call kept dying at exactly 60 seconds, ignoring the wait I had set. The cause: a per-server request_timeout_ms in .mcp.json that was never read, silently falling back to the default. Here is the correct placement after the fix, how to back the value out from a tool's response profile, and how to verify the cutoff yourself — with working code.

claude-code127mcp15timeout9configuration6reliability17

Premium Article

A nightly scheduled run was failing on one step with mechanical regularity. When I lined up the elapsed times from the log — 59.8s, 60.1s, 59.9s — the payload was different every time, but the moment of the cutoff was pinned to exactly 60 seconds. I was certain I had set a longer wait for that MCP server. No matter how many times I reread my config, the number was right. Yet what was actually in effect was not the value I wrote, but a default of 60 seconds living somewhere else.

The July 14 update explained the unease. A per-server request_timeout_ms written in --mcp-config or .mcp.json was not being read, and it quietly fell back to the global default. The fix landed. But what the fix gives you is only the premise that "the value you wrote will finally take effect" — not a decision about which value belongs where, or whether it is genuinely working. Today is my record of redesigning exactly that, anchored to how I run things at night as a personal developer.

The question of not making a run wait on a non-responding call at all, I covered in the day a non-responding MCP call swallowed an unattended run. This piece stays one layer earlier: whether the wait value itself takes effect as configured.

An exact 60 seconds was not "the value I set" but "a default that got picked up"

Timeout incidents are treacherous because the cutoff itself looks like normal behavior. A heavy tool can exceed its wait, and being cut off then is arguably by design. So it is easy to shrug it off as "the tool just happened to be slow today."

But when the cutoff time clusters at nearly the same value every run, the story changes. Tool load varies day to day, so if only the cutoff stays constant, that is evidence of a fixed ceiling rather than load. In my case, that ceiling was not the value I had written — it was the default 60 seconds.

Some background. The wait time for an MCP tool call has several layers. One is the time to wait for the server to start; another is the time to wait for an individual tool to execute. The latter has a global default, which you can raise wholesale through the MCP_TOOL_TIMEOUT environment variable, and override per server with request_timeout_ms inside the server's definition in .mcp.json. The bug was that this per-server override was skipped, always falling back to the global default.

"Silently falling back to the default" is the hardest thing to catch

If a misconfiguration surfaced as an error, it would be easier. If startup told me "that value is invalid," I would notice on the spot. What made this case hard was that the ignored setting produced no warning at all — it simply ran on the default value as if nothing were wrong.

In unattended runs, that silence bites especially hard. Interactively you feel it — "huh, that cut off sooner than I expected" — but a scheduled log is read after the fact, and only the bare fact of the cutoff remains. Unless you deliberately record elapsed time, you cannot tell whether it was a configured cutoff or an unread default.

So the first move was not to fix the value, but to make the cutoff distribution visible. Line up the cutoff times for the same step across several runs and see whether they collapse to a single point. If they do, that is a sign the ceiling, not the load, is in charge. Whether or not you take this one small step changes how quickly you can self-diagnose whether a setting is working.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Recognize the bug where a per-server request_timeout_ms is ignored and falls back to the 60-second default, and confirm from your own log distribution whether the configured value is actually taking effect
Place per-server timeouts correctly in .mcp.json and understand their precedence over global defaults like MCP_TOOL_TIMEOUT, so long-running tool calls stay stable
Back timeout values out from each tool's response profile with a decision table, and drop in a lightweight checker that flags cutoffs pinned to the default — ready for unattended nightly runs
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-06-25
The Day a Non-Responding MCP Call Swallowed an Entire Unattended Run — Owning the Stop With Your Own Deadline
When a remote MCP tool call stops responding, an unattended scheduled run just keeps waiting. Instead of leaving the cutoff entirely to the platform, here is how I designed my own deadline and a per-connector circuit breaker to own the stop — with working code.
Claude Code2026-07-14
One Day My Push Had an Extra Destination — Guarding Against /commit-push-pr Pushing to Remotes Beyond origin
The July 14 update made /commit-push-pr push to configured push remotes in addition to origin. Convenient, but if you keep a mirror or backup as a second remote, unintended pushes quietly multiply. Here is how to inventory which remotes you can push to, block anything off the allowlist with a pre-push hook, and keep unattended runs safe — with working code.
Claude Code2026-07-03
Five Minutes of Silence, and Something Retries on Your Behalf — Rethinking Retry Ownership After the Streaming Idle Watchdog Became a Default
Claude Code's streaming idle watchdog is now on by default, quietly adding another retrying layer to your stack. This article inventories the four layers (SDK, wrapper, watchdog, scheduler), computes worst-case attempt amplification, and shows how to collapse retry ownership into a single layer.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →