A community-driven registry for the Claude Code ecosystem. Not affiliated with Anthropic.
Are you the author? Sign in to claim
Roslyn-based MCP server providing semantic code intelligence for .NET codebases — type hierarchies, call sites, DI regis
A Roslyn-based MCP server that gives AI agents deep semantic understanding of .NET codebases — type hierarchies, call graphs, DI registrations, diagnostics, refactoring, and more.
A hosted deployment is available on Fronteir AI.
find_uncovered_symbols[Obsolete] call site grouped by deprecation message and severity, errors first; for planning migrationsasync void misuse, missing awaits, fire-and-forget tasks; per-violation report with severityIDisposable/IAsyncDisposable instances not wrapped in using/await using/returned/assigned to field; severity error/warning per violation.summary.filteredOutrebuild_solution) to run in the background; returns a taskId to polltaskIdget_diagnostics with includeAnalyzers: true)All list-returning tools wrap their results in a uniform envelope:
{
"items": [ ... ],
"totalCount": 142,
"truncated": false,
"limit": 500,
"summary": { ... }
}
When truncated is true, the items are the top N by the tool's natural sort order (severity-first, worst-first, by-project, etc.) — usually that's exactly what you want. Raise limit only if the missing tail items matter for the task.
Tools that include a summary aggregate today:
get_diagnostics — { error, warning, info, hidden } countsfind_references, find_callers, find_attribute_usages — { byProject: { name: count } }search_symbols, find_reflection_usage — { byKind: {...} }find_unused_symbols — { byKind, filteredOut: { testMethod, testContainer, mcpTool, generated, composition, interop } }find_naming_violations — { byRule: {...} }get_complexity_metrics — { max, avg, overThreshold }Single-object tools (get_type_overview, get_symbol_context, apply_code_action, etc.) return their bespoke shape directly — the envelope only wraps list-returning tools.
When a tool can't proceed (symbol not resolved, solution not trusted, file not found, ambiguous match, etc.), the response is an isError: true content block carrying a structured JSON body:
{
"code": "SolutionNotTrusted",
"message": "Solution 'Foo.sln' is not trusted for analyzer execution. ...",
"details": { "solutionPath": "C:\\Foo.sln" }
}
Error codes (switch on code to handle each):
SymbolNotFound — type / method / property could not be resolved.SolutionNotTrusted — get_diagnostics or get_code_fixes requested analyzers but the solution hasn't been authorized via trust_solution.AmbiguousMatch — set_active_solution / unload_solution matched multiple solutions; details.matches lists them.FileNotFound — file path or baseline doesn't exist (or isn't in any loaded project).ProjectNotFound — solution name didn't match any loaded solution.InvalidArgument — caller-supplied input was malformed, unsupported, or out of range.Internal — unexpected error not modeled above; message carries the underlying exception text.Cancellation: the MCP framework's native cancellation is honored. Cancelling a tools/call request mid-flight terminates the operation; long-running tools (get_diagnostics with analyzers, get_code_actions, apply_code_action, get_code_fixes) check the token at hot-loop boundaries.
Metadata-origin symbols (from NuGet packages and referenced assemblies) are first-class citizens:
find_references, find_callers, find_implementations): Accepts closed-source type and member names. Resolves them from assembly metadata and reports all source-level usage sites.inspect_external_assembly): Browse namespaces, types, members, and XML doc comments from any referenced assembly without decompiling.peek_il): Decompile a specific method to annotated ilasm-style IL using ICSharpCode.Decompiler — useful for understanding the internals of NuGet libraries.Location-returning results include an Origin field (source or metadata) and an IsGenerated flag to distinguish hand-written code from closed-source or generated output.
ROSLYN_CODELENS_OPEN_PROJECT_TIMEOUT_SECONDS — per-project MSBuild load timeout (default 300). When a project exceeds this duration during workspace open, it's recorded as a SkippedProjects entry with kind: "Timeout" and the rest of the solution still loads. Useful when a legacy or malformed project wedges the BuildHost-net472 subprocess.get_diagnostics and get_code_fixes can load Roslyn analyzers — DLLs that execute in-process. To prevent untrusted analyzers from running automatically, this server uses a VS/Rider-style trust model:
trust_solution MCP tool.bin/obj. Other paths are skipped.Use the list_trusted_paths and revoke_trust tools to inspect and manage trust state. Persistent trust is stored at %APPDATA%\roslyn-codelens\trust.json.
See SECURITY.md for the full threat model.
Add to your MCP settings (.vscode/mcp.json or VS settings):
{
"servers": {
"roslyn-codelens": {
"type": "stdio",
"command": "dnx",
"args": ["RoslynCodeLens.Mcp", "--yes"]
}
}
}
claude install gh:MarcelRoozekrans/roslyn-codelens-mcp
dotnet tool install -g RoslynCodeLens.Mcp
Then add to your MCP client config:
{
"mcpServers": {
"roslyn-codelens": {
"command": "roslyn-codelens-mcp",
"args": [],
"transport": "stdio"
}
}
}
The server automatically discovers .sln files by walking up from the current directory. You can also pass one or more solution paths directly:
# Single solution
roslyn-codelens-mcp /path/to/MySolution.sln
# Multiple solutions — switch between them with set_active_solution
roslyn-codelens-mcp /path/to/A.sln /path/to/B.sln
When multiple solutions are loaded, use list_solutions to see what's available and set_active_solution("B") to switch context. The first path is active by default.
All type lookups use pre-built reverse inheritance maps, member indexes, and attribute indexes for O(1) access. Benchmarked on an i9-12900HK with .NET 10.0.7:
| Tool | Latency | Memory |
|---|---|---|
go_to_definition | 2.1 µs | 576 B |
find_implementations | 2.5 µs | 720 B |
get_project_dependencies | 2.8 µs | 1.5 KB |
get_type_hierarchy | 3.5 µs | 1.3 KB |
find_circular_dependencies | 3.7 µs | 2.7 KB |
get_symbol_context | 4.1 µs | 1.0 KB |
get_source_generators | 16 µs | 23 KB |
analyze_data_flow | 19 µs | 1.6 KB |
find_attribute_usages | 72 µs | 904 B |
get_generated_code | 78 µs | 24 KB |
analyze_control_flow | 115 µs | 14 KB |
inspect_external_assembly (summary) | 159 µs | 35 KB |
find_large_classes | 265 µs | 3.5 KB |
get_di_registrations | 478 µs | 16 KB |
inspect_external_assembly (namespace) | 564 µs | 259 KB |
find_reflection_usage | 705 µs | 19 KB |
get_complexity_metrics | 781 µs | 25 KB |
get_code_actions | 792 µs | 54 KB |
get_file_overview | 797 µs | 101 KB |
get_diagnostics | 822 µs | 99 KB |
get_nuget_dependencies | 849 µs | 48 KB |
get_public_api_surface | 885 µs | 247 KB |
get_type_overview | 1.1 ms | 104 KB |
peek_il | 1.1 ms | 34 KB |
find_disposable_misuse | 3.5 ms | 286 KB |
find_uncovered_symbols | 3.8 ms | 224 KB |
search_symbols | 3.9 ms | 557 KB |
analyze_method | 5.8 ms | 333 KB |
find_async_violations | 7.0 ms | 335 KB |
find_tests_for_symbol (direct) | 8.4 ms | 396 KB |
find_callers | 10 ms | 337 KB |
find_tests_for_symbol (transitive) | 12 ms | 399 KB |
find_naming_violations | 15 ms | 788 KB |
find_unused_symbols | 23 ms | 1.0 MB |
find_references | 28 ms | 1013 KB |
analyze_change_impact | 33 ms | 1.3 MB |
| Solution loading (one-time) | ~4.1 s | 16 MB |
The server watches .cs, .csproj, .props, and .targets files for changes. When a change is detected, affected projects are lazily re-compiled on the next tool query — only stale projects and their downstream dependents are re-compiled, not the full solution.
Location-returning tools include an IsGenerated flag to distinguish source-generator output from hand-written code.
The server analyses every project that MSBuildWorkspace can load under the .NET SDK runtime.
Supported: SDK-style projects (<Project Sdk="...">), any target framework — net48, net6.0, net8.0, net10.0, etc. .NET Framework targets work fine as long as the csproj uses the SDK-style format.
Skipped (with a warning, not a crash): legacy non-SDK-style projects (<Project ToolsVersion="..." xmlns="http://schemas.microsoft.com/developer/msbuild/2003">, typically .NET Framework projects authored in older versions of Visual Studio). These rely on Microsoft.Common.props imports from the .NET Framework MSBuild that ships with Visual Studio, which is not available in the .NET SDK MSBuild runtime.
When a solution contains legacy projects, the server:
LoadedSolution.SkippedProjects.list_solutions (the SkippedProjects array on each SolutionInfo) and in the return message of load_solution. Each entry includes the project name, kind (Legacy), and reason.To analyse a legacy project, convert it to SDK-style format (see Microsoft's migration guide) or open the solution from a Visual Studio Developer Command Prompt so the full Visual Studio MSBuild is on PATH.
dotnet build
dotnet test
dotnet run --project benchmarks/RoslynCodeLens.Benchmarks -c Release
peek_il tool.MIT
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Secure MCP server for MySQL database interaction, queries, and schema management
English-first Korean equity intelligence MCP — DART filings, foreign-holder 5%-rule flows, activist filings, KRX news. F