Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Beschreibung vom Entwickler (englisches Original)
67 semantic C#/.NET analysis tools via Roslyn: navigation, refactoring, codegen, audit.
Diese drei werden nie zu einer Punktzahl zusammengefasst: Meinungen, Messungen und Beliebtheit sind verschiedene Dinge.
Für diesen Server haben wir noch keine Zusammenfassung in einfacher Sprache geschrieben. Unten stehen die Fakten, die wir aus der Registry gelesen haben.
Wähle die KI-App, die du nutzt, und kopiere die Einstellungen.
DOTNET_SOLUTION_PATH, ROSLYN_LOG_LEVEL, ROSLYN_TIMEOUT_SECONDSDu brauchst
Welche App nutzt du?
Wähle oben deine App. Wir merken sie uns, damit der Button beim nächsten Mal „In … installieren“ anzeigt.
Öffne Claude Desktop → Settings → Developer → Edit Config und füge dies in claude_desktop_config.json ein
{
"mcpServers": {
"sharplens": {
"command": "npx",
"args": [
"-y",
"sharplens-mcp"
],
"env": {
"DOTNET_SOLUTION_PATH": "your-value",
"ROSLYN_LOG_LEVEL": "your-value",
"ROSLYN_TIMEOUT_SECONDS": "your-value"
}
}
}
}Führe das in deinem Terminal aus
claude mcp add sharplens --env DOTNET_SOLUTION_PATH=your-value --env ROSLYN_LOG_LEVEL=your-value --env ROSLYN_TIMEOUT_SECONDS=your-value -- npx -y sharplens-mcpTrag die leeren Werte ein, bevor du ihn startest.
In .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen
{
"mcpServers": {
"sharplens": {
"command": "npx",
"args": [
"-y",
"sharplens-mcp"
],
"env": {
"DOTNET_SOLUTION_PATH": "your-value",
"ROSLYN_LOG_LEVEL": "your-value",
"ROSLYN_TIMEOUT_SECONDS": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
In .vscode/mcp.json in deinem Projekt einfügen
{
"servers": {
"sharplens": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"sharplens-mcp"
],
"env": {
"DOTNET_SOLUTION_PATH": "your-value",
"ROSLYN_LOG_LEVEL": "your-value",
"ROSLYN_TIMEOUT_SECONDS": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
Dieser Server läuft auf deinem Computer, und ChatGPT kann sich nur mit Servern im Internet verbinden. Wähle eine andere App.
Deine Auswahl bleibt in einem Cookie auf diesem Gerät; kein Konto nötig.
DOTNET_SOLUTION_PATH envROSLYN_LOG_LEVEL envROSLYN_TIMEOUT_SECONDS envDiese Einstellungen werden aus dem Registry-Eintrag des Entwicklers erzeugt. Wenn in der README etwas anderes steht, folge der README.
Läuft auf deinem Computer; die Tool-Liste erscheint nach der Installation in deiner KI-App.
Wir prüfen Informationen, die jeder sehen kann; den Code haben wir nicht gelesen. Checks, die nicht zutreffen, werden nicht mitgezählt. · Geprüft am 8. Nov. 2026
Der Registry-Name wurde mit dem GitHub-Konto pzalutski-pixel bestätigt, dem das Repo gehört
Dieses Repo haben wir noch nicht von GitHub gelesen
Dieses Repo haben wir noch nicht von GitHub gelesen
Dieser Server läuft auf deinem Computer; es gibt keinen Endpunkt im Internet
Läuft auf deinem Computer und nutzt stattdessen lokale Einstellungen
Läuft auf deinem Computer; Tool-Listen können wir nur von Endpunkten im Internet lesen
Verglichen mit allen aktiven Servern dieser Kategorie in der Registry. Sterne zählen nur, wenn dem Herausgeber das Repo gehört.
Er hat 1 von 1 zutreffenden Basischecks bestanden. Den Code haben wir nicht gelesen. Bevor du einen Schlüssel oder Token hinzufügst, sieh nach, welche Zugriffe der Server verlangt, und nutze einen Schlüssel, der nur die Berechtigungen hat, die du brauchst.
Die Registry nennt keinen erforderlichen Schlüssel, manche Server bitten dich aber bei der ersten Nutzung, dich anzumelden.
Er läuft auf deinem Computer. Deine KI-App startet ihn bei Bedarf, und die Daten laufen nicht über die Server des Entwicklers (außer der Server ruft selbst einen Onlinedienst auf).
Das GitHub-Repo wurde zuletzt – geändert, und die neueste Version (1.5.3) kam vor 6 Monaten in die Registry.
Apps, die MCP unterstützen, etwa Claude Desktop, Claude Code, Cursor und VS Code. Außerdem brauchst du Node.js, .NET auf deinem Computer.
In derselben Kategorie: Spec Driven Development, Remote Desktop Commander, Cape Winelands Visit Planner
Server derselben Kategorie von anderen Entwicklern, sortiert nach Sternen.
So liest du eine Karte:↓ Downloads pro Wochei★ GitHub-SterneiDrei Säulen: Bewertungen · Checks · NutzungiAktualisiert = neueste Version in der Registry veröffentlichti
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Cape Winelands wine farm finder and day-route planner
Unverändert aus dem Repo des Entwicklers übernommen. PopNx MCP hat den Inhalt weder geprüft noch empfiehlt es ihn. HTML, Bilder und Skripte wurden entfernt. Links führen von dieser Website weg.
A Model Context Protocol (MCP) server providing 92 AI-optimized tools for .NET/C# semantic code analysis, navigation, refactoring, and code generation using Microsoft Roslyn.
Built for AI coding agents - provides compiler-accurate code understanding that AI cannot infer from reading source files alone.
dotnet tool install -g SharpLensMcp
Then run with:
sharplens
npx -y sharplens-mcp
dotnet build -c Release
dotnet publish -c Release -o ./publish
dotnet tool install -g SharpLensMcp
npx -y sharplens-mcp
{
"mcpServers": { "sharplens": { "type": "stdio", "command": "npx", "args": ["-y", "sharplens-mcp"], "env": { "DOTNET_SOLUTION_PATH": "/path/to/your/Solution.sln (or .slnx)" } } } }
Claude Code has native LSP support for basic navigation (go-to-definition, find references). SharpLensMcp adds deep semantic analysis:
| Capability | Native LSP | SharpLensMcp |
|---|---|---|
| Go to definition | ✅ | ✅ |
| Find references | ✅ | ✅ |
| Find async methods missing CancellationToken | ❌ | ✅ |
| Impact analysis (what breaks?) | ❌ | ✅ |
| Dead code detection | ❌ | ✅ |
| Complexity metrics | ❌ | ✅ |
| Safe refactoring with preview | ❌ | ✅ |
| Batch operations | ❌ | ✅ |
| Environment Variable | Description | Default |
|---|---|---|
DOTNET_SOLUTION_PATH | Path to a .sln, .slnx or .slnf file (or a directory holding exactly one) to auto-load on startup; the load runs beside the request loop, so initialize answers immediately | None (must call load_solution) |
SHARPLENS_ABSOLUTE_PATHS | Use absolute paths instead of relative | false (relative paths save tokens) |
SHARPLENS_LOG_LEVEL | Logging verbosity: Trace, Debug, Information, Warning, Error | Information |
SHARPLENS_TIMEOUT_SECONDS | Timeout for long-running operations | 30 |
SHARPLENS_MAX_DIAGNOSTICS | Maximum diagnostics to return | 100 |
SHARPLENS_ENABLE_SEMANTIC_CACHE | Cache the file-path to document lookup | true (set to false to disable) |
The pre-1.6.0 ROSLYN_* spellings of these variables are still read as a fallback; the SHARPLENS_* spelling wins when both are set. Boolean values are case-insensitive. A number that does not parse or is below its minimum falls back to the default, and one above its maximum is capped; each case logs a warning to stderr.
A project built for several target frameworks is one project to every tool: each result is reported once, with a targetFrameworks list where it exists only under some frameworks. projectName accepts the plain name (MyLib) for all frameworks, or a framework-qualified name (MyLib(net8.0)) for one.
If DOTNET_SOLUTION_PATH is not set, you must call the load_solution tool before using other tools.
Tool names no longer carry the roslyn: prefix — the colon violates the MCP tool-name pattern (^[a-zA-Z0-9_-]{1,64}$), which some clients enforce. Every tool keeps its name minus the prefix:
| 1.5.x name | 1.6.0 name |
|---|---|
roslyn:load_solution | load_solution |
roslyn:get_diagnostics | get_diagnostics |
roslyn:rename_symbol | rename_symbol |
| ...same rule for all tools... | drop the roslyn: prefix |
tools/list publishes only the new names. Calls using the old prefixed names are still accepted as aliases for one release and will be removed in the following one.
AI models may have trained bias toward using their native tools (Grep, Read, LSP) instead of MCP server tools, even when SharpLensMcp provides better capabilities.
To ensure optimal tool usage:
CLAUDE.md: For C# code analysis, prefer SharpLensMcp tools over native tools:
search_symbols instead of Grep for finding symbolsget_method_source instead of Read for viewing methodsfind_references for semantic (not text) references
The semantic analysis from Roslyn is more accurate than text-based search, especially for overloaded methods, partial classes, and inheritance hierarchies.
Important: SharpLensMcp maintains an in-memory representation of your solution for fast queries. When files are modified externally (via Edit/Write tools), the agent is responsible for synchronizing changes.
sync_documents:| Action | Call sync_documents? |
|---|---|
| Used Edit tool to modify .cs files | ✅ Yes |
| Used Write tool to create new .cs files | ✅ Yes |
| Deleted .cs files | ✅ Yes |
| Used SharpLensMcp refactoring tools (rename, extract, etc.) | ❌ No (auto-updated) |
| Modified .csproj files | ❌ No (use load_solution instead) |
# After editing specific files
sync_documents(filePaths: ["src/MyClass.cs", "src/MyService.cs"])
sync_documents()
A full sync also picks up new .cs files the project's compile items include. SharpLensMcp's apply tools write only the files an edit changes, keep each file's encoding and line endings, and refuse with STALE_DOCUMENT when a target file changed on disk since it was read — run sync_documents, then retry. They also refuse with UNSUPPORTED_ENCODING to write a file whose bytes its encoding cannot reproduce (a BOM-less file that is not valid UTF-8 on a system whose fallback code page is UTF-8, such as Linux); save it as UTF-8 first.
This mirrors how LSP (Language Server Protocol) works - the client (editor) notifies the server of changes. This approach:
If you don't sync: Queries may return stale data (old method signatures, missing new files, etc.)
success/error/data format with suggestedNextTools| Tool | Description |
|---|---|
get_symbol_info | Semantic info at position |
go_to_definition | Jump to symbol definition |
find_references | All references; each classified read/write/invocation/cast/typeof/nameof/attribute; optional kind filter |
find_implementations | Interface/abstract implementations |
find_callers | Impact analysis - who calls this? |
get_call_graph | Multi-hop callers/callees graph with depth bound + cycle detection |
find_path_between | Reachability + the connecting call path(s) between two methods; follows dispatch, with barriers and a checkpoint |
get_type_hierarchy | Inheritance chain |
search_symbols | Glob pattern search (*Handler, Get*) |
semantic_query | Multi-filter search (async, public, etc.) |
get_type_members | All members by type name |
get_type_members_batch | Multiple types in one call |
get_method_signature | Detailed signature by name |
get_derived_types | Find all subclasses |
get_base_types | Full inheritance chain |
get_attributes | List attributes on a symbol |
get_containing_member | Enclosing symbol at position |
get_method_overloads | All overloads of a method |
find_attribute_usages | Find types/members by attribute |
get_external_type_info | Inspect NuGet/BCL/external assembly types — members + XML docs |
resolve_stack_trace | Map a pasted stack trace to file/line/symbol, mangling undone |
get_extension_methods | Extensions applying to a type — classic and C# 14 blocks |
get_documentation | Full XML docs for a symbol with expanded |
get_super_method | Navigate to the base member / interface members a member implements |
| Tool | Description |
|---|---|
get_diagnostics | Compiler errors/warnings + configured analyzer findings (StyleCop, Roslynator, NetAnalyzers); matches CI |
diff_api_surface | Public-API breaking-change report vs a git ref |
get_exception_flow | Which exceptions can escape a method, and where they're caught |
find_similar_code | Structural similarity search (token-shingle fingerprints) |
remove_unused_code | Compute dead-code removals + newly unused usings (generation-only) |
find_dead_branches | Unreachable basic blocks per method (real CFG, not heuristics) |
add_missing_imports | Compute the usings that fix CS0246/CS0103 (generation-only) |
analyze_data_flow | Variable assignments and usage |
analyze_control_flow | Branching/reachability |
analyze_change_impact | What breaks if changed? |
check_type_compatibility | Can A assign to B? |
get_outgoing_calls | What does this method call? |
find_unused_code | Dead code detection |
validate_code | Compile check without writing |
get_complexity_metrics | Cyclomatic, nesting, LOC, cognitive |
find_circular_dependencies | Project and namespace cycle detection |
get_missing_members | Unimplemented interface/abstract members |
| Tool | Description |
|---|---|
rename_symbol | Safe rename across solution |
change_signature | Add/remove/reorder parameters |
extract_method | Extract with data flow analysis |
extract_interface | Generate interface from class |
generate_constructor | From fields/properties |
move_type_to_file | Compute the contents to move a type into its own file (generation-only) |
split_type | Compute a partial-class split for selected members (generation-only) |
organize_usings | Sort and remove unused |
organize_usings_batch | Batch organize multiple files |
format_document_batch | Batch format files in project |
get_code_actions_at_position | All Roslyn refactorings at position |
apply_code_action_by_title | Apply any refactoring by title |
implement_missing_members | Generate interface stubs |
encapsulate_field | Field to property |
inline_variable | Inline temp variable |
extract_variable | Extract expression to variable |
| Tool | Description |
|---|---|
add_null_checks | Generate ArgumentNullException guards |
generate_equality_members | Equals/GetHashCode/operators |
generate_test_stub | Compilable test skeleton for a method (framework auto-detected) |
| Tool | Description |
|---|---|
get_type_overview | Full type info in one call |
| analyze_method | Signature + callers + outgoing calls
Nur der Anfang wird gezeigt; den Rest findest du im Repo