Skip to content

C# LSP for Claude Code: pick the server, then get it working on Windows #3536

Description

@kyle-sexton

Child of #3535. Highest upside of the four: C# is this fleet's primary ecosystem and it currently has no language server at all, so every C# edit Claude makes goes without diagnostics or navigation.

Current state

csharp-lsp@claude-plugins-official is installable but inert. Claude Code's LSP client returns -32601 "Unhandled method" to three server→client requests csharp-ls sends at initialization:

  • client/registerCapability
  • workspace/configuration
  • window/workDoneProgress/createthis one aborts solution loading

Result: the Roslyn workspace never initializes, so no symbols, hover, go-to-definition, references or diagnostics ever become available. anthropics/claude-plugins-official#1359, open since 2026-04-11. No fix in the Claude Code changelog through 2.1.252 (grepped for csharp, C#, and all three handler names: zero hits).

This is not a csharp-ls defect — it shipped 0.27.0 on 2026-08-24 and is actively maintained.

We deliberately did not add csharp-lsp to the dotfiles seed for this reason.

Open question this issue must answer first

Which C# language server? Do not assume csharp-ls just because Anthropic's plugin uses it. At minimum compare:

  • csharp-ls (razzmatazz) — what the official plugin targets. Actively maintained. Known to need the three handlers above.
  • Microsoft.CodeAnalysis.LanguageServer (Roslyn) — the server behind the official VS Code C# extension, published as a standalone NuGet package and consumed by non-Microsoft editors. Research its licensing terms for use outside VS Code, its handler expectations, and whether it needs fewer client capabilities than csharp-ls or more.
  • Anything else current. Check what the neovim and Zed C# communities actually run in 2026, since they hit the same "LSP client that isn't VS Code" constraint we do.

The answer may make the shim unnecessary, or may make it mandatory. Decide on evidence.

Then: does a proxying shim work?

If the chosen server needs handlers Claude Code does not implement, a shim that sits between them and answers those three requests itself is the candidate fix (see #3535). The upstream issue proposes the exact responses:

  • client/registerCapability{ result: null }
  • workspace/configuration{ result: params.items.map(() => null) }
  • window/workDoneProgress/create{ result: null }

Confirm those are sufficient — the issue reports them as a working local patch, which is evidence but not proof for a proxy sitting outside the client.

Acceptance

  • A named server, with the reasoning recorded and the rejected alternatives named.
  • On Windows: the LSP tool appears, and documentSymbol, hover, goToDefinition and findReferences return correct results in a real multi-project solution — not a toy one, since solution loading is exactly what fails today.
  • The same on WSL/Linux, or an explicit recorded decision that Windows-only is acceptable for now.
  • No cli.js patching (EPIC: make Claude Code language servers work on Windows — one broken language, not four #3535 non-goal).
  • Whatever the operator must install by hand is documented in one place.

Explicitly out of scope

Making this work in Claude Code cloud sessions. Language servers do not start there.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: highSignificant impact, or blocks an imminent release; staff this cycle.work-class: structuralRefactors, migrations, contract changes; cross-cutting and hard to reverse.

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions