[BUG] C# LSP (csharp-ls) not working - missing workspace/configuration and other request handlers
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
The built-in LSP support doesn't work with csharp-ls (C# language server). The LSP client is missing handlers for several standard LSP requests that csharp-ls requires during initialization:
workspace/configuration- Server requests configuration settings (specifically the solution path)client/registerCapability- Server dynamically registers capabilitieswindow/workDoneProgress/create- Server creates progress tokens for indexing feedback
Additionally, the workspace configuration capability is disabled (configuration:!1 in cli.js).
Without these, the server fails to initialize properly and returns empty results for operations like documentSymbol, hover, etc.
What Should Happen?
The LSP client should handle these standard LSP protocol requests so that csharp-ls (and other language servers that use these features) work out of the box.
After manually patching cli.js to add these handlers, all LSP operations work correctly (documentSymbol, hover, goToDefinition, findReferences).
Error Messages/Logs
Steps to Reproduce
- Configure csharp-ls plugin in
~/.claude/plugins/csharp-lsp/config.json - Open a C# project with a .sln file
- Try any LSP operation on a .cs file, e.g.:
LSP documentSymbol - Operation returns empty results or fails
Debug logs show:
- Server sends
workspace/configurationrequest → no handler - Server sends
client/registerCapabilityrequest → no handler - Server sends
window/workDoneProgress/createrequest → no handler
Claude Model
None
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
2.0.76
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
Note: This issue persists even after applying the LSP initialize() fix from:
https://gist.github.com/Zamua/f7ca58ce5dd9ba61279ea195a01b190c
That fix addresses the empty initialize() function (issue #13952), but csharp-ls
still fails because it requires these additional LSP protocol handlers that the
client doesn't implement:
workspace/configuration- needs to return solution pathclient/registerCapability- dynamic capability registrationwindow/workDoneProgress/create- progress token creation
The gist fix enables LSP servers to load, but csharp-ls specifically needs these
request handlers to function. Other LSP servers (like typescript-lsp) may work
without them, but csharp-ls requires all three during initialization.
Workaround: Patch cli.js to:
- Enable
capabilities.workspace.configuration: true - Add handlers:
```javascript
B.onRequest("workspace/configuration", (P) => {
return P.items.map((b) => {
if (b.section === "csharp") return { solution: "path/to/Solution.sln" };
return {};
});
});
B.onRequest("client/registerCapability", () => null);
B.onRequest("window/workDoneProgress/create", () => null);
Suggested fix: The LSP plugin config already has a solution field - this could be read by the workspace/configuration handler instead of requiring manual patching.
csharp-ls version: 0.19.0
53 Comments
So this means that even with the fixes from 2.1.1 the csharp-lsp is still broken and not functional, correct?
@b-straub Yes, still broken in 2.1.1 — confirmed 2026-01-08.
I have a working patch.
---
### Root Cause
Claude Code's LSP client needs three handlers that csharp-ls requires:
| Missing Handler | Purpose |
|-----------------|---------|
|
workspace/configuration| Provide.slnpath ||
client/registerCapability| Dynamic capability registration ||
window/workDoneProgress/create| Progress tokens |And
capabilities.workspace.configurationis disabled.---
### The Fix
File:
~/.claude/local/node_modules/@anthropic-ai/claude-code/cli.js1. Enable configuration capability:
```bash
sed -i '' 's/configuration:!1/configuration:!0/g' cli.js
L.onRequest("workspace/configuration", (P) => {
return P.items.map((b) => {
if (b.section === "csharp") {
try {
const sln = require("fs")
.readdirSync(process.cwd())
.find(f => f.endsWith(".sln"));
if (sln) return { solution: sln };
} catch (e) {}
}
return {};
});
});
L.onRequest("client/registerCapability", () => null);
L.onRequest("window/workDoneProgress/create", () => null);
sed -i '' 's/W\.length=0,v(
LSP client started for \${A})/W.length=0,L.onRequest("workspace\/configuration",(P)=>{return P.items.map((b)=>{if(b.section==="csharp"){try{const sln=require("fs").readdirSync(process.cwd()).find(f=>f.endsWith(".sln"));if(sln)return{solution:sln}}catch(e){}}return{}})}),L.onRequest("client\/registerCapability",()=>null),L.onRequest("window\/workDoneProgress\/create",()=>null),v(LSP client started for ${A})/' cli.jsVariable names change per version. Find yours:
grep -oE '[A-Z]\.onRequest\("' cli.js | sort | uniq -c
grep -oE '.{20}LSP client started for' cli.js
---
Test Results (after restart)
┌────────────────────┬────────────┬─────┐
│ Operation │ TypeScript │ C# │
├────────────────────┼────────────┼─────┤
│ hover │ ✅ │ ✅ │
├────────────────────┼────────────┼─────┤
│ goToDefinition │ ✅ │ ✅ │
├────────────────────┼────────────┼─────┤
│ documentSymbol │ ✅ │ ✅ │
├────────────────────┼────────────┼─────┤
│ goToImplementation │ — │ ✅ │
├────────────────────┼────────────┼─────┤
│ findReferences │ — │ ✅ │
└────────────────────┴────────────┴─────┘
---
```
Suggested Official Fix
The solution field already exists in the plugin config schema. The LSP client just needs to:
Alternative workaround: Bun adapter (no cli.js patching)
I hit the same issue and built a different workaround - a transparent proxy that intercepts the problematic requests before they reach Claude Code.
How it works
Instead of patching
cli.js, rename the originalcsharp-lsbinary and replace it with a Bun script that:csharp-lsnulldirectly to csharp-ls:window/workDoneProgress/createwindow/workDoneProgress/cancelclient/registerCapabilityworkspace/configurationwhich Claude Code handles fine)Why this approach?
LSP_ADAPTER_DEBUG=1to see all LSP trafficSetup
Full adapter code (~150 lines of Bun/TypeScript): https://gist.github.com/icanhasjonas/4c04328b8c886277399ad23f41549571
Works great here - all LSP operations (
documentSymbol,hover,goToDefinition,findReferences, etc.) now work perfectly.Could you kindly share your file please?
I did install the BUN adapter, but I have no idea how it's supposed to work. The plugin is just a ReadME csharp-lsp and Claud complains that no fitting MCP is present.
CC: I see csharp-lsp@claude-plugins-official is enabled in your settings, but it's not showing as connected in the MCP server list.
@MagnificentS Here's the patch script: https://gist.github.com/paulditerwich/ccadc92f026f6c1bce9fbe4f8720c3f8
```bash
curl -fsSL https://gist.githubusercontent.com/paulditerwich/ccadc92f026f6c1bce9fbe4f8720c3f8/raw/csharp-lsp-fix.sh | bash
Creates a backup automatically. Restore with --restore flag.
```
Setting Up C# LSP in Claude Code (Complete Guide)
A step-by-step guide to get C# code intelligence working in Claude Code.
Prerequisites
curl -fsSL https://bun.sh/install | bash)Step 1: Install csharp-ls
Verify it's installed:
Step 2: Install the LSP Adapter
Claude Code has a bug where it doesn't handle certain LSP requests, causing csharp-ls to crash. We fix this with a transparent adapter.
2a. Rename the original binary
2b. Create the adapter
2c. Verify the adapter works
Step 3: Enable the LSP Plugin in Claude Code
Edit
~/.claude/settings.jsonand add/update theenabledPluginssection:Full example
~/.claude/settings.json:Step 4: Restart Claude Code
Exit and restart Claude Code for the plugin to load.
Step 5: Test It!
In a C# project, ask Claude to use LSP:
Or Claude will automatically use LSP for code navigation tasks like:
Troubleshooting
Enable debug logging
Check logs at
~/.claude/debug/for[ADAPTER]entries."No LSP server available"
cat ~/.claude/settings.json | grep csharpVerify adapter is being used
You should see
[ADAPTER] Starting csharp-ls adapter...What the Adapter Does
The adapter intercepts three LSP methods that Claude Code doesn't handle properly:
| Method | Issue |
|--------|-------|
|
window/workDoneProgress/create| Claude Code doesn't implement handler ||
window/workDoneProgress/cancel| Claude Code doesn't implement handler ||
client/registerCapability| Claude Code sends invalid response |Everything else passes through normally.
Project-Specific Settings (Optional)
For project-specific LSP settings, create
.claude/settings.local.jsonin your project:Available LSP Operations
Once set up, Claude can use these operations:
| Operation | What it does |
|-----------|--------------|
|
documentSymbol| List all classes, methods, fields in a file ||
hover| Get type info and documentation ||
goToDefinition| Jump to where something is defined ||
findReferences| Find all usages of a symbol ||
goToImplementation| Find interface implementations ||
workspaceSymbol| Search for symbols across the codebase |References
There are some problems
I changed the code to
const csharpLs = spawn(["dotnet", "csharp-ls"], {
stdin: "pipe",
stdout: "pipe",
stderr: "inherit",
});
And Claude debug now showing various log entries for LSP SERVER and LSP PROTOCOL
Last entry: [LSP SERVER plugin:csharp-lsp:csharp-ls] 13:52:58.409 info: Roslyn.Solution[0]
Will use MSBuild props: map [(TargetFramework, net10.0)]
When asking in Rider IDE CC something like:
LSP workspaceSymbol IMyInterface
⏺ The IDE MCP server doesn't provide workspaceSymbol functionality - only getDiagnostics is available.
@b-straub .. oups! missed the hard coded path ;-)
Your change is perfect! Nice catch.
I updated the original comment above..
I still don't have the faintest idea how this is supposed to work, whatever I try in Rider or VS Code CC mentions always that no LSP MCP is installed. For me there is something fundamentally broken with the plugin approach. This should be straightforward to install and use.
Anthropic wiped out LSP in 2.1.0+ from system prompt
https://github.com/marckrenn/claude-code-changelog/compare/v2.0.76...v2.1.1#diff-b0a16d13c25d701124251a8943c92de0ff67deacae73de1e83107722f5e5d7f1L741
So basically it means fundamentally broken?
C# Patch LSP working (again) on Claude Code 2.1.2
Patch adds the missing
workspace/configuration,client/registerCapability, andwindow/workDoneProgress/createhandlers (as sharp-lsp is still broken in version 2.1.2).```bash
curl -fsSL https://gist.githubusercontent.com/paulditerwich/77448b526e4940f27f6de41421014c02/raw/csharp-lsp-fix-2.1.2.sh | bash
Test Results After Patch
┌────────────────────┬─────┬────────────┐
│ Operation │ C# │ TypeScript │
├────────────────────┼─────┼────────────┤
│ documentSymbol │ ✅ │ ✅ │
├────────────────────┼─────┼────────────┤
│ hover │ ✅ │ ✅ │
├────────────────────┼─────┼────────────┤
│ goToDefinition │ ✅ │ ✅ │
├────────────────────┼─────┼────────────┤
│ findReferences │ ✅ │ ✅ │
├────────────────────┼─────┼────────────┤
│ goToImplementation │ ✅ │ ✅ │
└────────────────────┴─────┴────────────┘
Restore: ./csharp-lsp-fix-2.1.2.sh --restore
Gist: https://gist.github.com/paulditerwich/77448b526e4940f27f6de41421014c02
```
I managed to fix the C# LSP plugin issue on my setup. Sharing the solution for others who installed Claude Code via Homebrew Cask.
My Environment
/opt/homebrew/Caskroom/claude-code/2.1.2/claude)The Problem
The
cli.jspatch mentioned in this thread doesn't work for Homebrew Cask installations because Claude Code is installed as a compiled binary, not a Node.js application withcli.js.When I checked the installation:
No
cli.jsfile exists to patch.The Solution: Bun Adapter
Thanks to @icanhasjonas for the Bun adapter approach! This works perfectly for Homebrew Cask installations.
Step 1: Install Bun
Step 2: Rename Original csharp-ls
Step 3: Download the Adapter
Step 4: Verify the Adapter Works
Expected output:
Step 5: Restart Claude Code
Step 6: Test It!
Result
All LSP operations now work correctly:
| Operation | Status |
|-----------|--------|
| findReferences | ✅ |
| goToDefinition | ✅ |
| documentSymbol | ✅ |
| hover | ✅ |
| goToImplementation | ✅ |
Reverting Changes
Thank you, this worked for me too.
Hmm, actually... Verifying the adapter worked, but Claude Code still can't use the csharp-lsp plugin for some reason, despite it saying it's installed and running.
Any idea how to fix this?
Absolutely same for me!
I got it working. The trick is to run with
LSP_ADAPTER_DEBUG=1 claude, and then look at the~/.claude/debug/latestlog. In there, you'll see a bunch of errors. Paste them to Claude Code and have him help you fix them. For me, I needed:export DOTNET_ROOT="$(brew --prefix dotnet)/libexec"and I had Claude make some adjustments to the proxy/wrapper script for
csharp-lsat~/.dotnet/tools/csharp-ls(move the old one tocsharp-ls-originalif you haven't already) -- here's the updated script, it fixed some passthrough bugs:Also because I'm developing on WSL but writing a C# app for Windows, I also had to add this to my project root:
Filename:
Directory.Build.propsWorking perfectly for me now.
We had this issue in Windows, both running in WSL and the Claude Code for Windows version as well as in Mac and Linux. I gave CC the script @nullbio used and we wrote it in node instead of bun. It works now for everyone but windows people, they are still debugging through it.
This (csharp-lsp plugin) is not working on windows native cli in v2.1.7. dotnet 10, csharp-ls 0.21.0.0
Similar Issue with rust-analyzer (Progress Notifications)
I'm experiencing a related issue with rust-analyzer on macOS. While rust-analyzer doesn't crash like csharp-ls does, the missing
window/workDoneProgress/createhandler causes a degraded user experience.The Problem
When starting a new Claude Code session in a large Rust monorepo (~100+ crates):
This leads to confusion about whether:
Technical Analysis
I verified via debug logs that Claude Code receives various LSP notifications but no
$/progressnotifications:rust-analyzer uses
window/workDoneProgress/createto create progress tokens before sending$/progressnotifications. Without Claude Code responding to the create request, rust-analyzer can't report indexing progress.Difference from csharp-ls
| Server | Behavior without handler |
|--------|-------------------------|
| csharp-ls | Crashes - requires handler to function |
| rust-analyzer | Works - but silently fails to report progress |
rust-analyzer is more lenient and continues without progress reporting, but users get no feedback during the 30-60+ second indexing period.
Suggested Fix Scope
Adding the
window/workDoneProgress/createhandler (as described in this issue) would:Ideally, Claude Code would also surface
$/progressnotifications in the UI so users know when LSP servers are ready.Environment
Yeah very broken on Windows too. No plugin.json created by installer. Default plugin.json is broken and lines have to be deleted until it processes correctly. Missing handlers required by csharp-ls
.NET-based adapter (no Bun required)
For some reason the Bun adapter didn't work for me, so I created a native .NET adapter that solves the same problem:
CSharpLspAdapter
Easiest setup
Just ask Claude Code to do it for you:
Claude will read the instructions and configure everything automatically.
Manual install
Then configure as a Claude Code plugin (see README).
How it works
Transparent proxy that intercepts problematic LSP methods (
workspace/configuration,client/registerCapability,window/workDoneProgress/create) and responds appropriately.All LSP operations work:
documentSymbol,hover,goToDefinition,findReferences, etc.@Agasper Couldn't make your solution work either. I'm just going to use Serena to hit the LSP instead of trying to get at it directly for now.
@kmgallahan What issues do you have ?
@Agasper Thanks for the adapter. I'd love to get LSP working too.
Does your CSharpLspAdapter work with Claude Code on Windows?
Here is what Claude thinks so far:
Root Cause: Claude Code uses JavaScript string interpolation
file://${path}instead of Node.js's pathToFileURL(), producing malformed URIs on Windows.Your csharp-lsp-adapter.log logs show the exact pattern:
● I've created a plan for implementing URI normalization in the adapter. The plan outlines:
● User approved Claude's plan
⎿ Plan saved to: ~\.claude\plans\wild-prancing-whistle.md · /plan to edit
Plan: Fix C# LSP URI Normalization
Problem Summary
Claude Code's LSP client generates inconsistent file URIs on Windows:
csharp-ls doesn't recognize these as the same file, so all file-specific operations (documentSymbol, hover, goToDefinition, findReferences) return null.
This is the same root cause as https://github.com/anthropics/claude-code/issues/16729.
Recommended Approach: Adapter URI Normalization
Modify the CSharpLspAdapter to normalize all URIs to RFC 8089-compliant format before forwarding to csharp-ls.
Implementation Steps
git clone https://github.com/Agasper/CSharpLspAdapter.git
cd CSharpLspAdapter
static string NormalizeFileUri(string uri)
{
// Convert file://C:\path or file://C:/path to file:///C:/path
if (uri.StartsWith("file://") && !uri.StartsWith("file:///"))
{
var path = uri.Substring(7); // Remove "file://"
path = path.Replace("\\", "/");
return "file:///" + path;
}
return uri;
}
dotnet pack -c Release
dotnet tool update -g csharplspadapter --add-source ./nupkg
Files to Modify
┌────────────┬───────────────────────────────────────────────────────────┐
│ File │ Change │
├────────────┼───────────────────────────────────────────────────────────┤
│ Program.cs │ Add NormalizeFileUri() function, apply to client messages │
└────────────┴───────────────────────────────────────────────────────────┘
Verification
After implementation, test these LSP operations:
Check C:\Users\KS\AppData\Local\Temp\csharp-lsp-adapter.log to verify URIs are normalized.
Alternative: Patch cli.js Directly
If modifying the adapter is not preferred, the fix from Issue #16729 can be applied to ~/.claude/local/node_modules/@anthropic-ai/claude-code/cli.js:
file://${...}patternsNote: This fix will be overwritten when Claude Code updates.
@Agasper I pointed CC at the readme and used 3 sessions to try to make it work. They could never form a connection to use the LSP directly. If CC/opus 4.5 couldn't figure out how to make it work, I didn't have a chance.
Noticed above me mention Windows issues - that may be the issue here.
Please fix it. claude needs the LSP. right now Jetbrains Junie is better
I am using dotnet 10 on a fully updated win11 pc
@Agasper Claude struggled to install it. I followed the steps manually and installed .NET 8. Then, it worked. I'm on a mac.
--- CLAUDE
Yes, the LSP appears to be working now! I noticed the IDE diagnostics showing hints like "Use primary constructor" on the new files I created. Those hints are coming from the C# LSP analyzing the code.
The LSP is providing:
The csharp-ls-adapter plugin is functioning after we installed .NET 8 runtime.
---
Thanks for providing the adapter.
I just merged PR from @Kobus-Smit and updated NuGet package to version 1.0.2, so update it with
dotnet tool update --global CSharpLspAdapterand try again
PS Sorry, I don't have Windows to test it
Started this morning with updating claude and the csharp-lsp plugin, still not working
@Agasper I managed to get the adapter working. As others have said, for whatever reason Claude Code + Opus 4.5 just does not understand how to follow the instructions in the readme to get it working properly on its own.
Thank you for your work here 👍
@kmgallahan It's weird, because i tested it with my claude and it completed setup successfully. Maybe if you open an issue in CSharpLspAdapter repo with details i could fix it
The С# LSP plugin still doesn't work on version 2.1.33 (Windows 11). Workarounds don't help either, and Cloud still claims he can't access LSP.
csharp-ls had a release that was supposed to have fixed something:
https://github.com/razzmatazz/csharp-language-server/releases/tag/0.22.0
But I have not tested it and I'm unsure if the plugin uses the new version. If someone wants to investigate that'd be great.
It's called by command line so you just need to update it manually no?
@jairbubbles I'm unsure how updates work with the plugin.
I just know I spent enough time getting the adapter to work that I don't want to toss that to investigate this.
@oleg-varlamov if your claude claims it can't access LSP then you probably forgot to enable LSP support for claude with environment variable
macOS/Linux
Add this line to your ~/.bashrc or ~/.zshrc file:
export ENABLE_LSP_TOOL=1Then restart your terminal or run source ~/.zshrc.
Windows
Add ENABLE_LSP_TOOL with value 1 to your user environment variables (System Properties → Environment Variables), then restart Claude Code.
Hi this works for me - pretty much out of the box (I think, I spent a while hacking but updating this to 0.22.0 + env variable cracked it). Just had to add the env variable hint.
Thanks for everyone that's looked into this - was super excited to see this.
None of this worked for me. What ended up working for my mac was creating a symlink because the csharp-ls was in the wrong folder for me.
sudo ln -s /Users/{USER}/.dotnet/tools/csharp-ls /usr/local/bin/csharp-ls
Without applying any patches discussed here, I now get no errors in cc debug log from start, but references/goToDefinition return immediately with no results. The solution is never discovered by LSP.
This does not solve
csharp-lsspecifically, but figured I'd share as I did have some luck today with Microsoft's official .NET LSP that they started pushing to nuget as of a couple weeks ago: https://www.nuget.org/packages/roslyn-language-server. This was using Claude Code 2.1.37 on Windows.I installed via
dotnet tool install --globalper the readme and setup a local plugin marketplace for Claude Code with a custom LSP plugin. Here's myplugin.jsonfor reference:Here are some results from trying it out. As others pointed out above, I did have to prompt it to use the LSP. Otherwise, it still seems to prefer grep and other file operations:
The nuget is prerelease, so I imagine there will be some stability issues. But hopefully this helps somebody.
@ajdrobnich Hahah, I did the same thing today, but realized it wasn't going to be enough. Here is the core problem:
Anthropic devs are too busy with a million things that they don't have time to resolve the thousands of issues with Claude Code, let alone better LSP support, even further proper Roslyn LSP support. I mean, they vibe coded C# LSP support using a 3rd party repo that didn't even work for the first month...
The LSP 3.17 spec defines 30+ capabilities with many parameters and client options. Claude Code can only use 9 of them, and with a limited option set -- this is a built-in problem with how it can call its LSP tool.
The MS Roslyn LSP CLI meanwhile provides 24 capabilities, only 6 of which Claude Code can actually call via its LSP tool. One important LSP capability Roslyn doesn't provide yet (draft PR is pending), and that is call hierarchy stuff, which also impacts 2 other capabilities. Those are 3 of the 9 LSP capabilities CC can use.
So in the end, CC can only use 6 of the 24 C#/Roslyn LSP capabilities.
---
My solution - since this is 2026 and this was not that difficult, I just had Claude build a custom MCP server that exposes ALL of the Roslyn CLI LSP capabilities, using all params and client options. This completely bypasses the built-in CC limitations on LSP usage.
It basically acts like a proxy that takes CC MCP tool calls, pipes them to the Roslyn CLI LSP process, and handles the output piping it right back. Also has to take care of initialization concerns and other things that are less obvious.
One important finding - many of the capabilities exposed are based on feeding in character positions as params, and CC frequently has issues figuring out the exact right positions to use. An interesting quirk.
I tried your approach and it works — it can use goToDefinition and findReferences.
But I found an issue: after I let CC edit a C# file, the LSP starts throwing an error:
Error performing hover: Cannot send request to LSP server 'plugin:csharp-roslyn-lsp:csharp': server is runningI asked CC to analyze it, and it suggested the possible causes might be:
Have you run into this issue before?
I hadn't but did end up eventually run into it. I reverted back to the CSharpLspAdapter nuget mentioned earlier. I had more luck with that today.
Thank you for your reply. I also tried the CSharpLspAdapter, and it indeed works perfectly!
I think this is the best solution for now!
FYI, it fails to work on session restore + /resume.
https://github.com/anthropics/claude-code/issues/24171
I'm currently using this MCP server, works smooth like butter: https://marketplace.visualstudio.com/items?itemName=LadislavSopko.mcpserverforvs
I believe all of the issues reported here related to csharp-ls have been fixed in 0.24.0 and no adapter is needed anymore.
opencode swapped to use roslyn-language-server LSP over csharp-ls in this release: https://github.com/anomalyco/opencode/releases/tag/v1.14.21
For anyone landing here looking for a working setup: I shipped a small proxy that makes the Roslyn LSP (
Microsoft.CodeAnalysis.LanguageServer) work inside Claude Code by injecting thesolution/opennotification that the built-in LSP client doesn't send. With it,findReferences,goToDefinition,goToImplementation,hover,documentSymbol,workspaceSymbol, and call-hierarchy work solution-wide on.slnx/.sln/ loose.csprojworkspaces.!Solution-wide findReferences and goToImplementation in Claude Code, with the proxy active
Repo: https://github.com/unsafePtr/ClaudeCodeRoslynLspProxy
Caveats: needs
ENABLE_LSP_TOOL=1in the user's~/.claude/settings.jsonenv block (the LSP tool is gated today), and only the read-only LSP operations are surfaced by Claude Code — edit operations likerename/codeAction/formattingare implemented by Roslyn but not exposed by Claude Code's LSP tool yet.Confirmed this is working again after updating
csharp-lsto the latest version. No adapter needed.Workaround if you are on Windows with Visual Studio available: a community extension that gives Claude real C# semantics from Roslyn instead of an LSP shim: find-all-references, go-to-definition, implementations, and call/type hierarchies, resolved through interfaces and overloads, plus decompiling methods in referenced DLLs. It rides an MCP server, so the CLI picks the tools up automatically. https://github.com/firish/claude_code_vs (docs/SEMANTIC.md)
Not a fix for csharp-ls itself but might be relevant.