Claude Code 2.1.128

💡

`--channels` now works with console (API key) authentication, and `/mcp` shows per-server tool counts and flags zero-tool servers. `OTEL_*` environment variables no longer leak into subprocesses, and `EnterWorktree` branches from local HEAD as documented. Plus fixes for falsely-blocked 1M-context sessions, parallel shell tool regressions, sub-agent cache misses, and more.

🔗 Official announcement →

This article is a summary based on official documentation.

What changed

Claude Code 2.1.128 (May 4, 2026) — --channels is now usable with console API-key authentication, MCP and plugin operability gets several visibility improvements, and OTEL environment-variable leakage into subprocesses is closed off. EnterWorktree now branches from local HEAD as documented, and a wide range of stability issues — falsely-blocked 1M-context prompts, parallel shell tool regressions, sub-agent cache misses — are fixed.

New features

  • --channels works with console (API key) authentication

    --channels previously only worked with OAuth-based workspaces, leaving organizations on console API keys without access. This release extends it to console authentication. Console orgs with managed settings must set channelsEnabled: true to enable.

  • /mcp surfaces tool counts and unhealthy servers

    A flat list of connected MCP servers made it hard to tell which servers were actually exposing tools. /mcp now shows the tool count for each connected server and flags servers that connected with 0 tools, making it easier to spot misconfiguration or auth failures at a glance.

  • --plugin-dir accepts .zip plugin archives

    Trying out a local plugin used to require unpacking the directory first. --plugin-dir now takes a path to a .zip archive directly, so plugins can be loaded without extracting.

  • /model picker cleanup — Opus 4.7 duplicates collapsed

    Duplicate Opus 4.7 entries in the /model picker have been collapsed, and the current Opus now shows as “Opus” instead of “Opus 4.7”.

  • EnterWorktree branches from local HEAD (was origin/<default-branch>)

    Despite the documented behavior, EnterWorktree was creating new branches from the remote default branch, dropping any unpushed local commits. It now branches from local HEAD, so unpushed commits are preserved.

  • MCP: workspace is reserved as a server name

    Existing MCP servers registered under the name workspace are now skipped with a warning. The name is reserved for system use going forward, so rename any conflicting server.

  • MCP reconnects no longer flood the conversation with tool names

    When an MCP server reconnected, the full tool-name list was re-announced into the conversation on every reconnect. Re-announced tools are now summarized by server prefix.

  • SDK hosts get a persistent localSettings suggestion

    When a user picks “Always allow” on a Bash permission prompt, SDK hosts now receive a persistent localSettings suggestion so the choice can be written to .claude/settings.local.json.

  • Auto mode: classifier errors include a recovery hint

    When the auto-mode classifier can’t evaluate an action, it used to fail without telling you what to try next. The error message now includes a hint pointing at retry, /compact, or running with --debug.

  • Bare /color picks a random session color

    Running /color with no arguments now picks a random session color — useful as a quick visual marker when juggling multiple sessions.

Improvements

  • Subprocesses no longer inherit OTEL_* env vars

    When Claude Code ran with its own OTLP endpoint configured, subprocesses (Bash, hooks, MCP, LSP) inherited those OTEL_* variables. OTEL-instrumented apps launched via the Bash tool would unintentionally send their telemetry to the CLI’s endpoint. Subprocesses now run without those variables, so user apps emit telemetry only to their own configured destination.

  • Sub-agent progress summaries use the prompt cache

    Sub-agent progress summaries previously bypassed the prompt cache, generating unnecessary cache_creation tokens — roughly a 3× reduction has been reported with this fix. Summaries also no longer fire repeatedly while a sub-agent’s transcript is static, capping the worst-case token cost on idle sub-agents.

Notable fixes

Sessions and UI

  • Focus mode briefly dimming the previous response when submitting a new prompt — fixed.
  • Stray “4;0;” desktop notification on every /exit in Kitty and other terminals that interpret OSC 9 as a notification — fixed.
  • Remote Control showing an empty “Opening your options…” message on rate limit — now shows actionable upsell options instead.
  • Drag-and-drop image upload hanging on “Pasting text…” when the image read fails — fixed.
  • Long URLs not being individually clickable on every wrapped row in fullscreen mode — fixed.
  • Markdown link labels lost on terminals without OSC 8 hyperlink support — links now render as label (url) instead of just the URL.
  • Terminal progress indicator (OSC 9;4) flickering off between tool calls — now stays visible across the full turn.
  • Stale “remote-control is active” status lines from prior sessions appearing after --resume / --continue — fixed.

MCP and plugins

  • /plugin Components panel showing “Marketplace ‘inline’ not found” for plugins loaded via --plugin-dir — fixed.
  • MCP tool results dropping images when the server returns both structured content and content blocks — fixed.
  • /plugin update never detecting new versions of npm-sourced plugins — fixed.
  • MCP stdio servers receiving corrupted arguments when CLAUDE_CODE_SHELL_PREFIX is set and an argument contains spaces or shell metacharacters — fixed.
  • Stale installed_plugins.json entries pointing at deleted cache directories polluting PATH — fixed.
  • Headless --output-format stream-jsoninit.plugin_errors now includes --plugin-dir load failures in addition to dependency demotions.

Input and text

  • Fenced code blocks inside list items carrying leading whitespace into the clipboard on copy-paste — fixed.
  • Tab navigation in /config stranding focus — the tab header now stays focused so arrows and Esc keep working.
  • vim mode: Space in NORMAL mode now moves the cursor right, matching standard vi/vim behavior — fixed.

Model and assistant behavior

  • Sessions on 1M-context models with a smaller autocompact window being falsely blocked with “Prompt is too long” before reaching the actual API limit — fixed.
  • Parallel shell tool calls: a failing read-only command (grep, git diff, ls) no longer cancels sibling calls — fixed.
  • Banner showing “with X effort” on models that don’t support effort — fixed.
  • /fast on 3P providers fuzzy-matching to an unrelated skill — now shows “not available” instead.
  • Bedrock default model resolving to global.* instead of the region-appropriate prefix — fixed.

Resume and headless

  • /rename without args failing on resumed sessions whose last entry is a compact boundary — fixed.
  • Crash loop when piping very large input (>10 MB) to claude -p via stdin — fixed.

Notes

  • --channels on console orgs with managed settings requires channelsEnabled: true — console orgs without managed settings can use it without extra configuration.
  • Rename any MCP server called workspace — the name is reserved going forward and conflicting servers are skipped with a warning.
  • Direct impact for OTEL operators — environments that configured Claude Code with its own OTLP endpoint will no longer leak those settings to subprocess apps started via the Bash tool. If you were intentionally relying on inheritance, set the variables explicitly for those subprocesses.
  • /model label change — automation that matched the exact string “Opus 4.7” in the picker should be updated to match “Opus”.
  • EnterWorktree behavior change — new branches now come from local HEAD rather than origin/<default-branch>. If you specifically need the remote default branch as the starting point, handle it explicitly.