[BUG] Claude Desktop does not terminate MCP child processes on restart — zombie process accumulation (supplementary CPU evidence)
This supplements #36616 with independently-gathered CPU impact data from a separate diagnostic session.
Real-time CPU profiling evidence
During a system thermal investigation (unrelated to MCP — user noticed Mac overheating), ps -arcwwwxo '%cpu %mem pid command' revealed Claude Desktop consuming ~88% CPU total with two sets of MCP servers running after a restart:
%CPU PROCESS
56.1 Claude Helper (Renderer) ← main renderer
16.0 Claude Helper ← utility process
10.5 Claude (main) ← Electron main
5.5 Claude Helper (misc)
System load average: 7.19 on 16-core M4 Max — nearly half the CPU cores under constant load from a desktop chat app.
Process tree audit
Full audit of Claude Desktop process tree showed 52 total processes, including:
- 2× full sets of
disclaimerMCP wrappers (old + new after restart) - 10 instances of
serena(Trail of Bits skill, spawned by Cursor — separate but compounds the issue) - 12 instances of
code-assist-mcp(Google Maps, spawned per Cursor window)
Key finding: restart doesn't kill old MCP servers
The disclaimer wrapper processes from the pre-restart session survived Cmd+Q → reopen. The new instance spawned a complete second set. Both sets had the same PGID as the main Electron process, confirming the disclaimer binary does NOT setsid() or setpgid() — it's a well-behaved child. The issue is that the Electron app doesn't terminate the first set before spawning the second during its initialization sequence.
Workaround confirmed working
pkill -f "Claude.*disclaimer"
# Then relaunch — single set of MCP servers, CPU drops to ~20-30%
Additional note on "invalid" label
This issue was auto-labeled "invalid" likely because it's a Claude Desktop bug filed in claude-code. There is no public anthropics/claude-desktop repository. If the Desktop team has a preferred reporting channel, please redirect — the technical evidence is solid and reproducible.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗