Follow Discord
Sweep 22 Oct 2026 · 04:32Z Build v2.1.308 527 read Stable v2.1.308 Latest v2.1.308 Next v2.1.308 Feeds RSS JSON llms.txt llms-full.txt Unofficial

Claude Code v2.1.299 ·

Headless and remote runs handle delivered MCP servers and --mcp-config differently

Remote runners get host-delivered MCP servers through CLAUDE_CODE_REMOTE_MCP_CONFIG, and --mcp-config sources are filtered by scope and ownership

Group of 5 Use it now Notable New Features
JSON All of v2.1.299
Use it nowTier: how much it should matter to you
4Useful: my rating, 1 to 5
4Signal: worth watching, 1 to 5
Cloud SessionsArea: what it touches
New FeaturesKind: in v2.1.299,
What probably matters to youSection of the release

What

MCP servers are outside programs that give Claude extra tools. Several changes affect how Claude Code loads them when it runs headless, meaning without the interactive screen, as with -p or the SDK, or when it runs as a remote runner.

  • CLAUDE_CODE_REMOTE_MCP_CONFIG is a new environment variable. It points to a file holding the MCP servers a host delivered to the runner. Claude Code reads that file as a --mcp-config source with the scope dynamic and a bridge session id, and only when a remote-session check passes.
  • The variable is added to the lists of variables that are passed on to child processes or protected, next to CCR_SESSION_PROFILE and CLAUDE_RUNNER_ACTIVITY_FD. When Claude Code starts the child process, it builds the variable for it.
  • A delivered server whose name matches one of the operator's own --mcp-config servers is refused as reserved_name.
  • If the variable did not reach the runner, a warning says that a later update of the delivered servers will shut down every --mcp-config server the update does not name. That includes the operator's own servers.
  • Several --mcp-config sources are now collected into a list and go through an ownership and refusal step before they are merged. Refused servers are logged as warnings. Before, the sources were simply merged together.
  • The headless MCP refresh now filters servers by scope and by strict-mcp-config, and logs how many configured servers it left out. Before, in some modes it applied every configured server except project and local ones. The same change adds a mcpConfigOwnership parameter, a joinAlwaysLoadMcp hook and a new pluginDiffScope.
  • When joinAlwaysLoadMcp is provided, headless startup waits for always-load MCP servers before it goes on, and then uses the refreshed MCP state.
  • When a Remote Control remote_tool_call request fails with status UNSPECIFIED, Claude is told not to retry and to carry on without the target.

Why

This changes which MCP servers end up loaded when Claude Code runs from scripts, the SDK or self-hosted runners. With strict-mcp-config set, a refresh should no longer pull in extra servers. A wrapper that does not pass CLAUDE_CODE_REMOTE_MCP_CONFIG on can lose its own --mcp-config servers, and the warning says so.

Read from
What the documentation says
How sure we are
Two sources agreeTwo things we can check say the same as this entry.
Anthropic's release notes agreeFixed self-hosted runner sessions shutting down MCP servers added through an --exec-path wrapper's own --mcp-config when connectors change…
The name it cites is new in this buildNew in this build: CLAUDE_CODE_REMOTE_MCP_CONFIG

See this entry in the whole of v2.1.299 →

Feedback