{
  "markdown": "# Roslyn CodeLens MCP Server\n\n[![MCP Toplist](https://mcptoplist.com/badge/io.github.MarcelRoozekrans%2Froslyn-codelens.svg)](https://mcptoplist.com/server/io.github.MarcelRoozekrans%2Froslyn-codelens)\n\n[![NuGet](https://img.shields.io/nuget/v/RoslynCodeLens.Mcp?style=flat-square&logo=nuget&color=blue)](https://www.nuget.org/packages/RoslynCodeLens.Mcp)\n[![NuGet Downloads](https://img.shields.io/nuget/dt/RoslynCodeLens.Mcp?style=flat-square&color=green)](https://www.nuget.org/packages/RoslynCodeLens.Mcp)\n[![npm](https://img.shields.io/npm/v/roslyn-codelens-mcp?style=flat-square&logo=npm&color=cb3837)](https://www.npmjs.com/package/roslyn-codelens-mcp)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/MarcelRoozekrans/roslyn-codelens-mcp/ci.yml?branch=main&style=flat-square&logo=github)](https://github.com/MarcelRoozekrans/roslyn-codelens-mcp/actions)\n[![License](https://img.shields.io/github/license/MarcelRoozekrans/roslyn-codelens-mcp?style=flat-square)](https://github.com/MarcelRoozekrans/roslyn-codelens-mcp/blob/main/LICENSE)\n[![Docs](https://img.shields.io/badge/docs-GitHub%20Pages-blue?style=flat-square)](https://marcelroozekrans.github.io/roslyn-codelens-mcp/)\n[![GitHub Sponsors](https://img.shields.io/github/sponsors/MarcelRoozekrans?style=flat&logo=githubsponsors&color=ea4aaa&label=Sponsor)](https://github.com/sponsors/MarcelRoozekrans)\n\nA Roslyn-based MCP server that gives AI agents deep semantic understanding of .NET codebases — type hierarchies, call graphs, DI registrations, diagnostics, refactoring, and more.\n\n<a href=\"https://glama.ai/mcp/servers/MarcelRoozekrans/roslyn-codelens-mcp\">\n  <img width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/MarcelRoozekrans/roslyn-codelens-mcp/badge\" alt=\"roslyn-codelens-mcp MCP server\" />\n</a>\n\n<!-- mcp-name: io.github.MarcelRoozekrans/roslyn-codelens -->\n\n---\n\n## Hosted deployment\n\nA hosted deployment is available on [Fronteir AI](https://fronteir.ai/mcp/marcelroozekrans-roslyn-codelens-mcp).\n\n## Features\n\n- **find_implementations** — Find all classes/structs implementing an interface or extending a class\n- **find_callers** — Find every call site for a method, property, or constructor\n- **find_event_subscribers** — Every += / -= site for an event symbol, with resolved handler and subscribe/unsubscribe tag\n- **find_tests_for_symbol** — List xUnit/NUnit/MSTest methods that exercise a production symbol; opt-in transitive walk through helpers\n- **get_test_summary** — Per-project inventory of test methods with framework, attribute kind, data-row count, location, and production symbols referenced\n- **find_uncovered_symbols** — Public methods and properties no test transitively reaches; sorted by cyclomatic complexity for prioritization\n- **generate_test_skeleton** — Emit a compilable test-class skeleton (as text) for a method or type. Auto-detects xUnit/NUnit/MSTest; surfaces constructor dependencies as TodoNotes; returns a suggested file path. Closes the loop with `find_uncovered_symbols`\n- **get_type_hierarchy** — Walk base classes, interfaces, and derived types\n- **get_di_registrations** — Scan for DI service registrations. Reads generic (`AddSingleton<IFoo, Foo>()`), single-generic, `typeof` pair and factory-lambda forms\n- **get_instantiation_options** — \"How do I construct this type?\" in one call: constructors with full parameter detail, static factory methods declared anywhere in the solution (including on a separate factory type), DI registrations, and `required` members. Pass `fromProject` to learn whether *that* project can actually reach each option — it honours `InternalsVisibleTo`, so it answers \"can my test project call this internal constructor?\"\n- **get_project_dependencies** — Get the project reference graph\n- **get_symbol_context** — One-shot context dump for any type\n- **get_public_api_surface** — Enumerate every public/protected type and member in production projects; flat, deterministically-sorted list suitable for API review or breaking-change baselines.\n- **find_breaking_changes** — Diff the current API against a baseline JSON or DLL; report removed members, kind changes, and accessibility changes with Breaking/NonBreaking severity.\n- **find_reflection_usage** — Detect dynamic/reflection-based usage\n- **get_exception_flow** — What exceptions can escape a method: walks callees depth-bounded, propagates each throw up through every enclosing try/catch, and reports what still escapes with its propagation path; metadata callees contribute their documented exceptions\n- **find_throw_sites** — Every place an exception type is thrown, optionally including derived types; rethrows flagged\n- **find_catch_blocks** — Every catch for a type, optionally via base clauses; flags filtered, rethrowing, and empty (swallowing) handlers\n- **find_references** — Find all references to any symbol (types, methods, properties, fields, events), each tagged with a kind (`read`, `write`, `readwrite`, `invocation`, `method_group`, `object_creation`, `cast`, `type_check`, `typeof`, `base_type`, `type_constraint`, `type_argument`, `declaration`, `attribute`, `nameof`, `xml_doc`) and reported per occurrence with a column; filter server-side with `kinds` (e.g. `[\"write\",\"readwrite\"]` for mutation sites)\n- **go_to_definition** — Find the source file and line where a symbol is defined\n- **get_method_source** — Full declaration source (XML docs, attributes, signature, body — original formatting) for one or many members by name in a single call: methods (all overloads), constructors, properties, indexers, fields, events; per-item statuses (`ok`/`notFound`/`ambiguous`/`metadata`/`unsupportedKind`) so a batch never fails wholesale\n- **resolve_stack_trace** — Map a pasted .NET stack trace to file/line/symbol, undoing compiler name mangling (async/iterator state machines, lambdas, local functions, generic arity); handles inner-exception chains, log-prefixed lines, and Demystifier traces\n- **get_diagnostics** — List compiler errors, warnings, and Roslyn analyzer diagnostics\n- **get_code_fixes** — Get available code fixes with structured text edits for any diagnostic\n- **search_symbols** — Fuzzy workspace symbol search by name\n- **get_nuget_dependencies** — List NuGet package references per project\n- **find_attribute_usages** — Find types and members decorated with a specific attribute\n- **find_obsolete_usage** — Every `[Obsolete]` call site grouped by deprecation message and severity, errors first; for planning migrations\n- **find_circular_dependencies** — Detect cycles in project or namespace dependency graphs\n- **check_architecture** — Enforce layering rules you supply (`forbid` and `allowOnly`) against the real semantic type graph rather than `using` directives; violations are grouped per boundary with a reference count and example sites\n- **get_complexity_metrics** — Cyclomatic complexity, cognitive complexity and max nesting depth per member (methods, constructors, properties, indexers, operators). Cyclomatic counts paths and starts at 1; cognitive measures how hard the code is to follow and starts at 0. `metric` picks which one the threshold and sort use — cognitive is the better refactoring-priority signal, cyclomatic the better test-budget one\n- **find_naming_violations** — Check .NET naming convention compliance\n- **find_async_violations** — Sync-over-async, `async void` misuse, missing awaits, fire-and-forget tasks; per-violation report with severity\n- **find_disposable_misuse** — `IDisposable`/`IAsyncDisposable` instances not wrapped in `using`/`await using`/returned/assigned to field; severity error/warning per violation.\n- **find_large_classes** — Find oversized types by member or line count\n- **find_god_objects** — Types combining high size with high cross-namespace coupling; sharper signal than raw size for SRP violations\n- **find_unused_symbols** — Dead code detection via reference analysis. Auto-filters test methods (xUnit/NUnit/MSTest), MCP tool entry points, source-generator output, MEF-composed services, and interop-laid-out fields; filter counts surface in `summary.filteredOut`\n- **get_project_health** — Composite audit aggregating 7 quality dimensions per project (complexity, large classes, naming, unused symbols, reflection, async violations, disposable misuse) with counts and top-N hotspots inline\n- **get_source_generators** — List source generators and their output per project\n- **get_generated_code** — Inspect generated source code from source generators\n- **inspect_external_assembly** — Browse types, members, and XML docs from closed-source NuGet packages and referenced assemblies\n- **peek_il** — Decompile any method to ilasm-style IL bytecode from closed-source or generated assemblies\n- **get_code_actions** — Discover available refactorings and fixes at any position (extract method, rename, inline variable, and more)\n- **apply_code_action** — Execute any Roslyn refactoring by title, with preview mode (returns a diff before writing to disk)\n- **rename_symbol** — Solution-wide safe rename of a type or member via Roslyn's Renamer, with preview mode, conflict reporting, and a freshness check against on-disk edits\n- **change_signature** — Add, remove, and reorder a method's parameters and rewrite every call site; handles named/optional arguments, `params` and extension methods, and reports the overrides and interface implementations it cascaded to\n- **list_solutions** — List all loaded solutions and which one is currently active\n- **set_active_solution** — Switch the active solution by partial name (all subsequent tools operate on it)\n- **load_solution** — Load an additional .sln/.slnx at runtime and make it the active solution\n- **unload_solution** — Unload a loaded solution to free memory\n- **rebuild_solution** — Force a full reload of the analyzed solution\n- **start_background_task** — Queue a long-running tool (currently `rebuild_solution`) to run in the background; returns a `taskId` to poll\n- **get_task_status** — Get the current status, result, or error of a background task by its `taskId`\n- **list_running_tasks** — List background tasks running or completed within the last 5 minutes\n- **trust_solution** — Authorize a solution to run Roslyn analyzers (required before `get_diagnostics` with `includeAnalyzers: true`)\n- **list_trusted_paths** — Inspect the persistent trust store + session-trusted solutions\n- **revoke_trust** — Revoke a previously-granted trust for a solution path\n- **analyze_data_flow** — Variable read/write/capture analysis within a statement range (declared, read, written, always assigned, captured, flows in/out)\n- **analyze_control_flow** — Branch/loop reachability analysis within a statement range (start/end reachability, return statements, exit points)\n- **analyze_change_impact** — Show all files, projects, and call sites affected by changing a symbol — combines find_references and find_callers\n- **get_type_overview** — Compound tool: type context + hierarchy + file diagnostics in one call\n- **analyze_method** — Compound tool: method signature + callers + outgoing calls in one call\n- **get_overloads** — Every overload of a method/constructor (source + metadata) with full parameter and modifier detail in one call\n- **get_extension_methods** — Every extension member applicable to a type — including arrays, nullables and tuples — from the solution and referenced assemblies (so LINQ shows up), using Roslyn's own applicability rules; covers C# 14 `extension` blocks including properties and static members\n- **get_operators** — Every user-defined operator and conversion operator on a type (source + metadata) with kind, signature, parameters, and source location. Includes synthesized record equality and .NET 7+ checked variants\n- **get_call_graph** — Transitive caller/callee graph for a method, depth-bounded with cycle detection\n- **get_file_overview** — Compound tool: types defined in a file + file-scoped diagnostics in one call\n\n## Response shape\n\nAll list-returning tools wrap their results in a uniform envelope:\n\n```json\n{\n  \"items\": [ ... ],\n  \"totalCount\": 142,\n  \"truncated\": false,\n  \"limit\": 500,\n  \"summary\": { ... }\n}\n```\n\nWhen `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.\n\nTools that include a `summary` aggregate today:\n\n- `get_diagnostics` — `{ error, warning, info, hidden }` counts\n- `find_references` — `{ byProject: { name: count }, byKind: { kind: count } }`\n- `find_callers`, `find_attribute_usages` — `{ byProject: { name: count } }`\n- `search_symbols`, `find_reflection_usage` — `{ byKind: {...} }`\n- `find_unused_symbols` — `{ byKind, filteredOut: { testMethod, testContainer, mcpTool, generated, composition, interop } }`\n- `find_naming_violations` — `{ byRule: {...} }`\n- `get_complexity_metrics` — `{ max, avg, overThreshold, maxCognitive }` (the first three describe the selected `metric`)\n\nSingle-object tools (`get_type_overview`, `get_symbol_context`, `apply_code_action`, etc.) return their bespoke shape directly — the envelope only wraps list-returning tools.\n\n## Error responses\n\nWhen 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:\n\n```json\n{\n  \"code\": \"SolutionNotTrusted\",\n  \"message\": \"Solution 'Foo.sln' is not trusted for analyzer execution. ...\",\n  \"details\": { \"solutionPath\": \"C:\\\\Foo.sln\" }\n}\n```\n\nError codes (switch on `code` to handle each):\n\n- `SymbolNotFound` — type / method / property could not be resolved.\n- `SolutionNotTrusted` — `get_diagnostics` or `get_code_fixes` requested analyzers but the solution hasn't been authorized via `trust_solution`.\n- `AmbiguousMatch` — `set_active_solution` / `unload_solution` matched multiple solutions; `details.matches` lists them.\n- `FileNotFound` — file path or baseline doesn't exist (or isn't in any loaded project).\n- `ProjectNotFound` — solution name didn't match any loaded solution.\n- `InvalidArgument` — caller-supplied input was malformed, unsupported, or out of range.\n- `Internal` — unexpected error not modeled above; `message` carries the underlying exception text.\n\n**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.\n\n## External Assemblies\n\nMetadata-origin symbols (from NuGet packages and referenced assemblies) are first-class citizens:\n\n- **Tier 1 — Navigation** (`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.\n- **Tier 2 — Inspection** (`inspect_external_assembly`): Browse namespaces, types, members, and XML doc comments from any referenced assembly without decompiling.\n- **Tier 3 — IL** (`peek_il`): Decompile a specific method to annotated ilasm-style IL using ICSharpCode.Decompiler — useful for understanding the internals of NuGet libraries.\n\nLocation-returning results include an `Origin` field (`source` or `metadata`) and an `IsGenerated` flag to distinguish hand-written code from closed-source or generated output.\n\n## Runtime configuration\n\n- `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.\n\n## Security: Trust Model\n\n`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:\n\n- **Solutions passed on the CLI at startup** are auto-trusted for the current session.\n- **Other solutions** must be explicitly trusted via the `trust_solution` MCP tool.\n- **Analyzer DLLs** must come from the user's NuGet global packages folder, the dotnet SDK install dir, or the solution's own `bin`/`obj`. Other paths are skipped.\n\nUse the `list_trusted_paths` and `revoke_trust` tools to inspect and manage trust state. Persistent trust is stored at `%APPDATA%\\roslyn-codelens\\trust.json`.\n\nSee [SECURITY.md](SECURITY.md) for the full threat model.\n\n## Quick Start\n\n### npx (any MCP client)\n\n```json\n{\n  \"mcpServers\": {\n    \"roslyn-codelens\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"roslyn-codelens-mcp\"]\n    }\n  }\n}\n```\n\nThe npm package ships no server code — it is a launcher that installs the `RoslynCodeLens.Mcp`\n.NET global tool at a matching version and execs it, so the **.NET 10 SDK must be on `PATH`**.\nSubsequent starts skip the install entirely and work offline.\n\n### VS Code / Visual Studio (via dnx)\n\nAdd to your MCP settings (`.vscode/mcp.json` or VS settings):\n\n```json\n{\n  \"servers\": {\n    \"roslyn-codelens\": {\n      \"type\": \"stdio\",\n      \"command\": \"dnx\",\n      \"args\": [\"RoslynCodeLens.Mcp\", \"--yes\"]\n    }\n  }\n}\n```\n\n### Claude Code Plugin\n\n```bash\nclaude install gh:MarcelRoozekrans/roslyn-codelens-mcp\n```\n\n### .NET Global Tool\n\n```bash\ndotnet tool install -g RoslynCodeLens.Mcp\n```\n\nThen add to your MCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"roslyn-codelens\": {\n      \"command\": \"roslyn-codelens-mcp\",\n      \"args\": [],\n      \"transport\": \"stdio\"\n    }\n  }\n}\n```\n\n### Docker\n\nRuns without a .NET SDK on the host; the solution is bind-mounted at `/workspace`.\n\n```bash\ndocker build -t roslyn-codelens-mcp .\ndocker run -i --rm -v \"$PWD:/workspace\" roslyn-codelens-mcp\n```\n\nThe mounted solution must be restored for `MSBuildWorkspace` to resolve its\nreferences, and tool output reports container paths rather than host paths — see\n[docs/site/docs/getting-started/docker.md](docs/site/docs/getting-started/docker.md).\n\n## Usage\n\nThe server automatically discovers `.sln` files by walking up from the current directory. You can also pass one or more solution paths directly:\n\n```bash\n# Single solution\nroslyn-codelens-mcp /path/to/MySolution.sln\n\n# Multiple solutions — switch between them with set_active_solution\nroslyn-codelens-mcp /path/to/A.sln /path/to/B.sln\n```\n\nWhen 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.\n\n### HTTP transport\n\nBy default the server speaks stdio. Pass `--http` to expose the same tools over\n[streamable HTTP](https://modelcontextprotocol.io/docs/concepts/transports) instead — useful for\none long-lived server (warm Roslyn workspace, no per-client startup cost) shared by several\nlocal MCP clients:\n\n```bash\nroslyn-codelens-mcp /path/to/MySolution.sln --http            # http://127.0.0.1:3001\nroslyn-codelens-mcp /path/to/MySolution.sln --http --port 8080\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"roslyn-codelens\": {\n      \"type\": \"http\",\n      \"url\": \"http://127.0.0.1:3001\"\n    }\n  }\n}\n```\n\nThe HTTP endpoint binds to `127.0.0.1` only and is intended for **single-user, local use**: all\nconnected clients share the same solution state (`set_active_solution` affects everyone), and\nthere is no authentication. `--host` can widen the binding, but the server will warn — its tools\ncan read and modify source files, so only do this on networks you fully trust.\n\n## Performance\n\nAll 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:\n\n| Tool | Latency | Memory |\n|------|--------:|-------:|\n| `go_to_definition` | 2.1 µs | 576 B |\n| `find_implementations` | 2.5 µs | 720 B |\n| `get_project_dependencies` | 2.8 µs | 1.5 KB |\n| `get_type_hierarchy` | 3.5 µs | 1.3 KB |\n| `find_circular_dependencies` | 3.7 µs | 2.7 KB |\n| `get_symbol_context` | 4.1 µs | 1.0 KB |\n| `get_source_generators` | 16 µs | 23 KB |\n| `analyze_data_flow` | 19 µs | 1.6 KB |\n| `find_attribute_usages` | 72 µs | 904 B |\n| `get_generated_code` | 78 µs | 24 KB |\n| `analyze_control_flow` | 115 µs | 14 KB |\n| `inspect_external_assembly` (summary) | 159 µs | 35 KB |\n| `find_large_classes` | 265 µs | 3.5 KB |\n| `get_di_registrations` | 478 µs | 16 KB |\n| `inspect_external_assembly` (namespace) | 564 µs | 259 KB |\n| `find_reflection_usage` | 705 µs | 19 KB |\n| `get_complexity_metrics` | 781 µs | 25 KB |\n| `get_code_actions` | 792 µs | 54 KB |\n| `get_file_overview` | 797 µs | 101 KB |\n| `get_diagnostics` | 822 µs | 99 KB |\n| `get_nuget_dependencies` | 849 µs | 48 KB |\n| `get_public_api_surface` | 885 µs | 247 KB |\n| `get_type_overview` | 1.1 ms | 104 KB |\n| `peek_il` | 1.1 ms | 34 KB |\n| `find_disposable_misuse` | 3.5 ms | 286 KB |\n| `find_uncovered_symbols` | 3.8 ms | 224 KB |\n| `search_symbols` | 3.9 ms | 557 KB |\n| `analyze_method` | 5.8 ms | 333 KB |\n| `find_async_violations` | 7.0 ms | 335 KB |\n| `find_tests_for_symbol` (direct) | 8.4 ms | 396 KB |\n| `find_callers` | 10 ms | 337 KB |\n| `find_tests_for_symbol` (transitive) | 12 ms | 399 KB |\n| `find_naming_violations` | 15 ms | 788 KB |\n| `find_unused_symbols` | 23 ms | 1.0 MB |\n| `find_references` | 28 ms | 1013 KB |\n| `analyze_change_impact` | 33 ms | 1.3 MB |\n| Solution loading (one-time) | ~4.1 s | 16 MB |\n\n## Hot Reload\n\nThe 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.\n\nLocation-returning tools include an `IsGenerated` flag to distinguish source-generator output from hand-written code.\n\n## Requirements\n\n- .NET 10 SDK\n- A .NET solution with compilable projects\n\n## Project compatibility\n\nThe server analyses every project that MSBuildWorkspace can load under the .NET SDK runtime.\n\n**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*.\n\n**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.\n\nWhen a solution contains legacy projects, the server:\n\n1. Loads every SDK-style project normally — all tools work for those.\n2. Skips each legacy project and records it in `LoadedSolution.SkippedProjects`.\n3. Surfaces the skipped list via `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.\n\n**To analyse a legacy project,** convert it to SDK-style format (see [Microsoft's migration guide](https://learn.microsoft.com/en-us/dotnet/core/porting/project-structure)) or open the solution from a Visual Studio Developer Command Prompt so the full Visual Studio MSBuild is on `PATH`.\n\n## Development\n\n```bash\ndotnet build\ndotnet test\ndotnet run --project benchmarks/RoslynCodeLens.Benchmarks -c Release\n```\n\n## Third-party licenses\n\n- [ICSharpCode.Decompiler](https://github.com/icsharpcode/ILSpy) — MIT license (v8+). Used for IL disassembly in the `peek_il` tool.\n\n## License\n\nMIT\n",
  "bytes": 23782,
  "sha": "9024b19f716128f364be3c40ed66ab0f9d473e9b10f914235b98844d70245f41",
  "repo_slug": "marcelroozekrans/roslyn-codelens-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_marcelroozekrans_roslyn_codele_0bc27f7e/readme"
}