You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
On Windows, Claude Code's in-session MCP launcher cannot spawn bin/devkit because it's an extensionless POSIX shell script (#!/bin/sh). The /mcp UI shows devkit-engine as failed, even though claude mcp list (CLI) reports it as connected. The two disagree because they use different process-spawn code paths.
Open Claude Code, run /mcp → plugin:devkit:devkit-engine shows × failed.
In the same session, run claude mcp list → shows ✓ Connected.
Root cause (proven, not speculation)
bin/devkit has no file extension. Claude Code UI spawns MCP servers via Node child_process.spawnwithoutshell:true on Windows. Windows CreateProcess can't execute a shebang script directly, and CMD can't either because the file has no .exe/.cmd/.bat extension.
Reproduced both failure modes with Node:
// 1) Direct spawn (what CC UI does):spawn('…/bin/devkit',['mcp'])// → Error: spawn ENOENT// 2) Spawn via shell:true (cmd.exe):spawn('…/bin/devkit',['mcp'],{shell: true})// → stderr: "'…/bin/devkit' is not recognized as an internal or external command"
Spawning the already-downloaded engine .exe directly works perfectly — it prints devkit MCP server ready and responds to JSON-RPC over stdio:
spawn('…/bin/devkit-engine-v2.1.6-windows-amd64.exe',['mcp'])// → "devkit MCP server ready" on stderr, accepts MCP requests on stdin
claude mcp list succeeds because it uses a different probe path (likely invokes via sh.exe), which masks the UI-launcher issue from simple CLI checks.
Proposed fix
Ship a Windows-compatible launcher. Two options:
Option A — bin/devkit.cmd shim (recommended, minimal)
Add bin/devkit.cmd:
@echooff
sh "%~dp0devkit"%*
Then make plugin.json select per platform, or ship the .cmd and let Claude Code pick it up automatically (Windows spawn treats .cmd as executable).
Pros: keeps the existing download/resume wrapper logic. Requires sh.exe on PATH, but Git Bash is effectively universal on dev Windows and the current script already assumes POSIX tooling.
Option B — platform-specific command in plugin.json
Point mcpServers.devkit-engine.command at the engine .exe directly on Windows. Loses the auto-download wrapper on first run, but once the engine is downloaded (the current wrapper still handles that for other codepaths), direct launch is simpler and has no shell dependency.
Option C — bin/devkit.ps1
PowerShell equivalent that can locate and exec the engine. More portable than .cmd (no dependency on sh.exe), but more code to maintain.
Option A is the smallest diff and matches how most POSIX-first CLIs ship on Windows.
Summary
On Windows, Claude Code's in-session MCP launcher cannot spawn
bin/devkitbecause it's an extensionless POSIX shell script (#!/bin/sh). The/mcpUI showsdevkit-engineas failed, even thoughclaude mcp list(CLI) reports it as connected. The two disagree because they use different process-spawn code paths.Environment
Reproduction
bin/devkit-engine-v2.1.6-windows-amd64.exe(works fine post-bin/devkit: fix Windows first-run install (curl+schannel bug, #58) #59)./mcp→plugin:devkit:devkit-engineshows× failed.claude mcp list→ shows✓ Connected.Root cause (proven, not speculation)
bin/devkithas no file extension. Claude Code UI spawns MCP servers via Nodechild_process.spawnwithoutshell:trueon Windows. WindowsCreateProcesscan't execute a shebang script directly, and CMD can't either because the file has no.exe/.cmd/.batextension.Reproduced both failure modes with Node:
Spawning the already-downloaded engine
.exedirectly works perfectly — it printsdevkit MCP server readyand responds to JSON-RPC over stdio:claude mcp listsucceeds because it uses a different probe path (likely invokes viash.exe), which masks the UI-launcher issue from simple CLI checks.Proposed fix
Ship a Windows-compatible launcher. Two options:
Option A —
bin/devkit.cmdshim (recommended, minimal)Add
bin/devkit.cmd:Then make
plugin.jsonselect per platform, or ship the.cmdand let Claude Code pick it up automatically (Windows spawn treats.cmdas executable).Pros: keeps the existing download/resume wrapper logic. Requires
sh.exeon PATH, but Git Bash is effectively universal on dev Windows and the current script already assumes POSIX tooling.Option B — platform-specific command in
plugin.jsonPoint
mcpServers.devkit-engine.commandat the engine.exedirectly on Windows. Loses the auto-download wrapper on first run, but once the engine is downloaded (the current wrapper still handles that for other codepaths), direct launch is simpler and has no shell dependency.Option C —
bin/devkit.ps1PowerShell equivalent that can locate and exec the engine. More portable than
.cmd(no dependency onsh.exe), but more code to maintain.Option A is the smallest diff and matches how most POSIX-first CLIs ship on Windows.
Local workaround (confirmed working)
Edit
~/.claude/plugins/cache/5uck1ess-plugins/devkit/2.1.6/.claude-plugin/plugin.json:After this change,
/mcpUI showsdevkit-engineas connected. Gets clobbered on next plugin update, which is why an upstream fix is needed.Related
/mcpUI.