v2.1.19 Regression: 'tool_use ids must be unique' error on ANY tool use
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
- Install Claude Code v2.1.19
- Run ANY command that requires tool use:
``bash``
echo "List files in the current directory" | claude --dangerously-skip-permissions
- 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:
- API request succeeds, Claude decides to use Bash tool
- Tool executes successfully
- CLI constructs next API request with tool result
- API rejects request because
messages[1].content[1]has a duplicatetool_useID
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 toclaude --dangerously-skip-permissions - The issue affects both piped input and interactive use
- Multiple independent users may be affected as 2.1.19 auto-updates
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗