LSP plugins not registering servers - LSP Manager initializes before plugins load
Bug Description
LSP servers from plugins are not being registered. The LSP Manager initializes with 0 servers before the plugins are loaded, so the .lsp.json configurations from LSP plugins are never picked up.
Environment
- Claude Code Version: 2.0.76
- OS: macOS (Darwin 24.6.0)
- Plugin:
vtsls@claude-code-lspsfromboostvolt/claude-code-lspsmarketplace
Steps to Reproduce
- Install vtsls globally:
npm install -g vtsls - Add the claude-code-lsps marketplace to settings.json:
``json``
"extraKnownMarketplaces": {
"claude-code-lsps": {
"source": {
"source": "github",
"repo": "boostvolt/claude-code-lsps"
}
}
}
- Enable the plugin:
"vtsls@claude-code-lsps": trueinenabledPlugins - Restart Claude Code
- Try using the LSP tool on a TypeScript file
Expected Behavior
The LSP tool should work with TypeScript files using the vtsls language server.
Actual Behavior
LSP tool returns: No LSP server available for file type: .ts
Debug Log Evidence
The debug log shows the timing issue:
2025-12-27T16:09:35.099Z [DEBUG] [LSP MANAGER] Starting async initialization (generation 1)
2025-12-27T16:09:35.104Z [DEBUG] LSP server manager initialized successfully
2025-12-27T16:09:35.104Z [DEBUG] LSP notification handlers registered successfully for all 0 server(s)
2025-12-27T16:09:35.110Z [DEBUG] Plugin vtsls@claude-code-lsps version 1.0.0 already cached
2025-12-27T16:09:35.110Z [DEBUG] Loaded hooks from standard location for plugin vtsls
The LSP Manager completes initialization with 0 servers at 16:09:35.104, but the vtsls plugin doesn't finish loading until 16:09:35.110.
Plugin Configuration
The plugin's .lsp.json file at ~/.claude/plugins/cache/claude-code-lsps/vtsls/1.0.0/.lsp.json:
{
"typescript": {
"command": "vtsls",
"args": ["--stdio"],
"extensionToLanguage": {
".ts": "typescript",
".tsx": "typescriptreact",
".js": "javascript",
".jsx": "javascriptreact"
}
}
}
Additional Context
- Plugin validates successfully:
claude plugin validatereturns "✔ Validation passed" - vtsls binary is installed and accessible:
/usr/local/bin/vtsls(v0.3.0) - Multiple restarts of Claude Code don't resolve the issue
- The same issue occurs with
pyright@claude-code-lsps
Suggested Fix
The LSP Manager should either:
- Wait for plugins to load before initializing
- Re-scan for LSP configurations after plugins finish loading
- Support lazy initialization of LSP servers when first needed
8 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Having same issue using the Intelephense plugin for PHP.
Any update on fixing this issue please?
Confirming this issue also affects the
elixir-lsp@claude-code-elixirplugin (from georgeguimaraes/claude-code-elixir) on Linux.Environment:
elixir-lsp@claude-code-elixir(v1.0.1)What I tested:
lspServersinplugin.json— plugin shows "Enabled" with no errors, but no "Components:" section and no LSP tools registeredlspServerspointing to a.lsp.jsonfile — same result--plugin-dirloading — fails with "Error: Marketplace 'inline' not found in configuration"The official LSP plugins (typescript-lsp, pyright-lsp) work because they appear to be hardcoded/built-in — their cached plugin directories contain only a README and LICENSE, no
plugin.jsonor.lsp.json.This blocks all third-party LSP plugins regardless of configuration format.
Confirming on Linux + official marketplace plugin (v2.1.63)
Same race condition confirmed. The LSP Manager completes initialization ~6 seconds before the versioned plugin system finishes loading.
Environment:
pyright-lsp@claude-plugins-officialv1.0.0 (project scope)pyright-langserverinstalled via bun, confirmed in PATHENABLE_LSP_TOOL: "1"set in~/.claude/settings.jsonDebug log evidence (timestamps tell the story):
The LSP Manager queries plugins at t+32ms, but the versioned plugin system doesn't finish until t+5477ms. The marketplace manifest (
marketplace.json) correctly defines thelspServersconfiguration for pyright, but it's never read because the LSP Manager has already given up.What I verified:
/pluginUImarketplace.jsonhas correctlspServersentry withpyright-langserver --stdiocommand.claude/settings.jsonhas"pyright-lsp@claude-plugins-official": trueTotal LSP servers loaded: 0patternThis is consistent across multiple restarts and sessions. The race condition appears deterministic, not intermittent.
Confirming for third-party marketplace plugin (verible-lsp) on Linux v2.1.63
Same root cause confirmed — third-party LSP plugins with valid
.lsp.jsonare silently ignored.Environment:
verible-lspfrom custom GitHub-hosted marketplaceverible-verilog-lsv0.0-4007-g98bdb38a, installed and in PATHAdditional evidence — official plugins are hardcoded, not loaded from config:
Official LSP plugin cache directories (e.g.
pyright-lsp) contain only a README and LICENSE — no.lsp.json, noplugin.json. Their LSP server definitions appear to be baked into the Claude Code binary. Third-party plugins that provide properly structured.lsp.jsonandplugin.jsonwithlspServersfields are never read.LSP tool result:
Language server works correctly when tested directly via stdin:
This blocks all SystemVerilog/Verilog code intelligence in Claude Code. The plugin validates successfully, shows as enabled, but the LSP Manager never picks up its server definition.
Hey everyone! Thanks for your patience on this! I put in what I hope is the final fix for this issue yesterday, and it should be in today's release (2.1.76). Please let us know if you're still seeing this in 2.1.76 or later!
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.