Preflight Checklist
What's Wrong?
Claude Code's LSP client does not respond to client/registerCapability requests sent by the server during initialization. This causes any LSP server that uses dynamic capability registration to hang indefinitely in a "server is starting" state.
Every LSP tool call fails with:
Cannot send notification to LSP server 'plugin:elixir-lsp:expert': server is starting
The server never leaves the "starting" state.
During the LSP handshake:
- Client sends
initialize → server responds
- Client sends
initialized notification
- Server sends
client/registerCapability (a server-to-client request with an id) → Claude Code never sends a response
- Server blocks waiting for the response, so all subsequent operations (
textDocument/didOpen, textDocument/hover, etc.) are never processed
Per the LSP spec, client/registerCapability is a standard server-to-client request. The client must respond with {"jsonrpc":"2.0","id":<id>,"result":null}.
This blocks any LSP server that uses dynamic capability registration, which is a standard LSP protocol mechanism. Many servers use it — for example, to register file watchers via workspace/didChangeWatchedFiles after initialization.
What Should Happen?
Claude Code's LSP client should respond to client/registerCapability requests with {"jsonrpc":"2.0","id":<id>,"result":null}, allowing the server to proceed with initialization. After that, all LSP operations (hover, go-to-definition, document symbols, etc.) work correctly.
Error Messages/Logs
Error performing hover: Failed to sync file open /workspace/projects/hello_world/lib/hello_world.ex: Cannot send notification to LSP server 'plugin:elixir-lsp:expert': server is starting
Steps to Reproduce
-
Install the elixir-lsp plugin from the claude-code-elixir marketplace:
-
Have an Elixir project with mix.exs and compiled dependencies
-
Use the LSP tool on any .ex file, e.g. hover on a module alias
-
The call fails with "server is starting" — permanently
Verification that the server itself works:
- Manually running the full LSP handshake in a Python script — including responding to
client/registerCapability with {"jsonrpc":"2.0","id":1,"result":null} — produces correct results (hover returns docs, document symbols returns module structure, etc.)
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
No response
Claude Code Version
2.1.71 (Claude Code)
Platform
Anthropic API
Operating System
Ubuntu/Debian Linux
Terminal/Shell
Xterm
Additional Information
- LSP server: Expert v0.1.0-rc.5 (the official Elixir language server)
- Plugin:
elixir-lsp@claude-code-elixir v2.0.0 (by George Guimaraes)
- The specific
client/registerCapability request Expert sends is to register file watchers for **/mix.lock and **/*.{ex,exs}
Preflight Checklist
What's Wrong?
Claude Code's LSP client does not respond to
client/registerCapabilityrequests sent by the server during initialization. This causes any LSP server that uses dynamic capability registration to hang indefinitely in a "server is starting" state.Every LSP tool call fails with:
Cannot send notification to LSP server 'plugin:elixir-lsp:expert': server is startingThe server never leaves the "starting" state.
During the LSP handshake:
initialize→ server respondsinitializednotificationclient/registerCapability(a server-to-client request with anid) → Claude Code never sends a responsetextDocument/didOpen,textDocument/hover, etc.) are never processedPer the LSP spec,
client/registerCapabilityis a standard server-to-client request. The client must respond with{"jsonrpc":"2.0","id":<id>,"result":null}.This blocks any LSP server that uses dynamic capability registration, which is a standard LSP protocol mechanism. Many servers use it — for example, to register file watchers via
workspace/didChangeWatchedFilesafter initialization.What Should Happen?
Claude Code's LSP client should respond to
client/registerCapabilityrequests with{"jsonrpc":"2.0","id":<id>,"result":null}, allowing the server to proceed with initialization. After that, all LSP operations (hover, go-to-definition, document symbols, etc.) work correctly.Error Messages/Logs
Error performing hover: Failed to sync file open /workspace/projects/hello_world/lib/hello_world.ex: Cannot send notification to LSP server 'plugin:elixir-lsp:expert': server is startingSteps to Reproduce
Install the
elixir-lspplugin from theclaude-code-elixirmarketplace:elixir-lsp@claude-code-elixirv2.0.0 (by George Guimaraes)Have an Elixir project with
mix.exsand compiled dependenciesUse the LSP tool on any
.exfile, e.g. hover on a module aliasThe call fails with "server is starting" — permanently
Verification that the server itself works:
client/registerCapabilitywith{"jsonrpc":"2.0","id":1,"result":null}— produces correct results (hover returns docs, document symbols returns module structure, etc.)Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
No response
Claude Code Version
2.1.71 (Claude Code)
Platform
Anthropic API
Operating System
Ubuntu/Debian Linux
Terminal/Shell
Xterm
Additional Information
elixir-lsp@claude-code-elixirv2.0.0 (by George Guimaraes)client/registerCapabilityrequest Expert sends is to register file watchers for**/mix.lockand**/*.{ex,exs}