Run two Claude Desktop windows in parallel, each with its own MCP server connection, enabling true concurrent AI-assisted task execution on Windows.
Claude Desktop only runs one instance by default. This repo gives you a repeatable setup for launching a second (or more) isolated Claude window using a separate --user-data-dir, each connected to a different Desktop Commander MCP server. You can then run long tasks in both windows simultaneously — proven to work with overlapping timestamps across 2+ minute parallel runs.
- Instance 1 — normal Claude Desktop (MSIX install), uses
desktop-commander - Instance 2 — launched via shortcut with
--user-data-dir, usesdesktop-commander-2 - Both instances connect to the same
claude_desktop_config.jsonschema but live in separate profile directories - Tasks run concurrently — no blocking between windows
- Windows 11
- Claude Desktop (MSIX install)
- Node.js 18+
- uv (for OfficeMCP)
- Git + GitHub CLI (optional, for pushing)
Claude MSIX installs update automatically and change version folder. Run this to find the current path:
Get-Process | Where-Object {$_.Name -like "*claude*"} | Select-Object -First 1 -ExpandProperty PathNew-Item -ItemType Directory -Path "$env:APPDATA\Claude-Instance2" -ForceCopy-Item config\claude_desktop_config.json "$env:APPDATA\Claude-Instance2\claude_desktop_config.json"Edit the config to set your correct uvx.exe path for OfficeMCP.
.\scripts\setup.ps1This will:
- Auto-detect the current Claude exe path
- Create desktop shortcuts for Instance 1 and Instance 2
- Sync the config to Instance 2
.\scripts\sync-shortcuts.ps1.\scripts\sync-config.ps1See config\claude_desktop_config.json for the full config template including:
desktop-commander— Instance 1's MCP serverdesktop-commander-2— Instance 2's MCP serverofficemcp— Office automation via uvx
| Window | MCP Server | Use For |
|---|---|---|
| Instance 1 | desktop-commander |
Primary / long-running tasks |
| Instance 2 | desktop-commander-2 |
Secondary / parallel tasks |
When prompting Instance 2, always say "use desktop-commander-2" explicitly.
To verify both instances are truly running in parallel:
Instance 1:
$out = "$env:USERPROFILE\Desktop\i1-log.txt"
1..120 | ForEach-Object { "I1-$_ - $(Get-Date -Format 'HH:mm:ss')" | Add-Content $out; Start-Sleep 1 }Instance 2 (say this in Instance 2 chat):
Use desktop-commander-2 to run:
$out = "C:\Users\YOU\Desktop\i2-log.txt"; 1..120 | ForEach-Object { "I2-$_ - $(Get-Date -Format 'HH:mm:ss')" | Add-Content $out; Start-Sleep 1 }
Check both files — you'll see interleaved timestamps proving true concurrency.
dual-claude-launcher/
├── README.md
├── config/
│ └── claude_desktop_config.json # MCP config template
└── scripts/
├── setup.ps1 # First-time setup
├── sync-shortcuts.ps1 # Fix shortcuts after Claude update
└── sync-config.ps1 # Push config changes to Instance 2
The MSIX Claude install registers itself as the handler for claude:// OAuth redirect URIs. When Instance 2 is running and any auth event fires, the OS sometimes prompts the main instance to handle it, briefly showing the onboarding/welcome screen. Just close it — it does not affect either instance. Cosmetic only, no fix currently.
MSIX auto-updates change the version folder (e.g. Claude_1.5354.0.0 → Claude_1.6608.0.0), breaking hardcoded shortcut paths. Run scripts\sync-shortcuts.ps1 after any update to auto-fix.
dual-claude-launcher/
├── README.md
├── config/
│ └── claude_desktop_config.json # MCP config template
└── scripts/
├── setup.ps1 # First-time setup
├── sync-shortcuts.ps1 # Fix shortcuts after Claude update
└── sync-config.ps1 # Push config changes to Instance 2