v2.1.19 Regression: 'tool_use ids must be unique' error on ANY tool use

Resolved 💬 4 comments Opened Jan 26, 2026 by tradesdontlie Closed Feb 28, 2026

Bug Description

Claude Code v2.1.19 has a critical regression that causes all tool usage to fail with an API error about duplicate tool IDs. This completely breaks the CLI for any task requiring file operations, bash commands, or any other tool.

Environment

  • Claude Code Version: 2.1.19 (broken) / 2.1.17 (working)
  • Platform: macOS Darwin 23.6.0
  • Shell: zsh

Error Message

API Error: 400 {"type":"error","error":{"type":"invalid_request_error","message":"messages.1.content.1: `tool_use` ids must be unique"},"request_id":"req_..."}

The sanitized version shown to users is:

API Error: 400 due to tool use concurrency issues.

Reproduction Steps

  1. Install Claude Code v2.1.19
  2. Run ANY command that requires tool use:

``bash
echo "List files in the current directory" | claude --dangerously-skip-permissions
``

  1. Observe the error

What Works vs What Fails

| Command | Result |
|---------|--------|
| echo "Hello" \| claude | ✅ Works (no tools needed) |
| echo "What is 2+2?" \| claude | ✅ Works (no tools needed) |
| echo "List files" \| claude | ❌ Fails (requires Bash/LS tool) |
| echo "Read file.txt" \| claude | ❌ Fails (requires Read tool) |

Key finding: Simple queries that don't require tools work perfectly. ANY query that triggers tool use fails.

Debug Log Analysis

From ~/.claude/debug/latest:

2026-01-26T20:35:25.742Z [DEBUG] Stream started - received first chunk
2026-01-26T20:35:26.443Z [DEBUG] executePreToolHooks called for tool: Bash
...
2026-01-26T20:35:26.751Z [DEBUG] Getting matching hook commands for PostToolUse with query: Bash
...
2026-01-26T20:35:26.929Z [ERROR] Error in non-streaming fallback: 400 {"type":"error","error":{"type":"invalid_request_error","message":"messages.1.content.1: `tool_use` ids must be unique"},"request_id":"req_..."}

The sequence shows:

  1. API request succeeds, Claude decides to use Bash tool
  2. Tool executes successfully
  3. CLI constructs next API request with tool result
  4. API rejects request because messages[1].content[1] has a duplicate tool_use ID

Root Cause Hypothesis

The CLI is generating duplicate tool_use IDs when constructing the messages array after a tool execution completes. This happens in the "non-streaming fallback" code path (visible in debug logs).

The error messages.1.content.1 indicates the duplicate ID is in:

  • Message index 1 (second message, likely the assistant response)
  • Content block index 1 (second content block)

Workaround

Downgrade to v2.1.17:

cp ~/.local/share/claude/versions/2.1.17 ~/.local/share/claude/versions/2.1.19

Tested Isolation

To confirm this is a core CLI bug, I tested:

| Test | Result |
|------|--------|
| Disable all plugins | ❌ Still fails |
| Disable MCP servers | ❌ Still fails |
| Clear history.jsonl | ❌ Still fails |
| Different directory (/tmp) | ❌ Still fails |
| Different model (haiku) | ❌ Still fails |
| Run with v2.1.17 | ✅ Works |
| Run with v2.1.16 | ✅ Works (not explicitly tested but likely) |

Impact

This bug completely breaks Claude Code for any practical use case. Users cannot:

  • Read files
  • Edit files
  • Run bash commands
  • Search code
  • Do any development work

The only working use case is asking questions that don't require tools (essentially turning Claude Code into a basic chat interface).

Version Diff

The regression was introduced between:

  • v2.1.17 (Jan 22, 2025) - Working
  • v2.1.19 (Jan 26, 2025) - Broken

v2.1.18 was not available on my system to test.

Additional Context

  • This was discovered when running an automated loop (ralph.sh) that pipes prompts to claude --dangerously-skip-permissions
  • The issue affects both piped input and interactive use
  • Multiple independent users may be affected as 2.1.19 auto-updates

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗