TypeScript LSP plugin fails silently on Windows — uv_spawn cannot find npm-installed executables

Resolved 💬 3 comments Opened Mar 8, 2026 by andybak Closed Mar 9, 2026

Summary

The typescript-lsp plugin fails silently on Windows when typescript-language-server is installed via npm.

Environment

  • Platform: Windows 10
  • Claude Code: latest
  • Plugin: typescript-lsp@claude-plugins-official (enabled in settings)

Steps to Reproduce

  1. Enable typescript-lsp@claude-plugins-official in Claude Code settings
  2. Install the language server: npm install -g typescript-language-server typescript
  3. Attempt any LSP operation on a .ts file

Error

Error performing hover: ENOENT: no such file or directory, uv_spawn 'typescript-language-server'

Root Cause

uv_spawn (libuv, used by Node.js) on Windows only resolves executables with .exe extensions when searching PATH. npm install -g on Windows creates:

  • typescript-language-server (bash shell script)
  • typescript-language-server.cmd (Windows CMD script)
  • typescript-language-server.ps1 (PowerShell script)

...but no .exe. So uv_spawn fails with ENOENT even though the tool is correctly installed and on PATH.

Workaround

Install via Scoop instead, which creates proper .exe shim binaries:

scoop install typescript-language-server

Scoop's shim system wraps the CMD script in a real PE32 executable, which uv_spawn can find.

Expected Behaviour

The plugin should either:

  • Document that npm-installed tools don't work on Windows and recommend Scoop, or
  • Spawn language servers via cmd.exe /c (i.e. shell: true) so .cmd files are resolved correctly, or
  • Detect the .cmd variant and use it explicitly on Windows

Notes

This was diagnosed using Claude Code's own LSP tool — so this bug report was generated by Claude Code investigating why its own LSP plugin wasn't working. If Anthropic objects to AI-generated GitHub issues, that would be, as the user who filed this put it, "deliciously ironic."

View original on GitHub ↗

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