mcpField
R
Roslyn Code Lens

Roslyn Code Lens

本地服务
github.com/MarcelRoozekrans开发工具69今天更新

关于 Roslyn Code Lens

Roslyn CodeLens 是基于 Roslyn 的 .NET/C# MCP 服务,为 AI Agent 提供类型层级、调用图、DI 注册、诊断、重构等语义级分析能力。它面向 .NET 开发者,覆盖面较广,包含测试、IL 查看等工具。

主要功能

  1. 01类型层级与实现查找
  2. 02调用方与引用分析
  3. 03DI 注册扫描
  4. 04编译器诊断与代码修复
  5. 05测试覆盖与测试骨架生成
  6. 06安全的符号重命名与签名修改

适用场景

  1. 01梳理 .NET 解决方案中的依赖与调用关系
  2. 02评估重构或破坏性 API 变更的影响范围
  3. 03排查异常堆栈并定位源代码位置

MCP 相关

该项目是 MCP 服务,向 MCP 客户端暴露大量 C# 语义分析与重构工具,例如 find_references、rename_symbol 和 get_diagnostics。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
npmroslyn-codelens-mcp2.18.2
nugetRoslynCodeLens.Mcp2.18.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Roslyn CodeLens MCP 服务

MCP Toplist

NuGet NuGet Downloads npm Build Status codecov License Docs GitHub Sponsors

一款基于 Roslyn 的 MCP 服务,为 AI Agent 提供对 .NET 代码库的深度语义理解能力——包括类型层次结构、调用图、DI 注册、诊断、重构等。

roslyn-codelens-mcp MCP 服务

托管部署

可通过 Fronteir AI 使用托管部署。

功能

  • find_implementations — 查找实现某个接口或继承某个类的所有类/结构体
  • find_callers — 查找调用某个方法、属性或构造函数的所有位置
  • find_event_subscribers — 查找事件符号的所有 += / -= 位置,并提供解析后的处理程序以及订阅/取消订阅标记
  • find_tests_for_symbol — 列出会测试生产代码符号的 xUnit/NUnit/MSTest 方法;可选择通过辅助方法进行传递遍历
  • get_test_summary — 按项目列出测试方法清单,包括框架、特性类型、数据行数、位置及引用的生产代码符号
  • find_uncovered_symbols — 查找没有测试通过传递调用触达的公共方法和属性;按圈复杂度排序,便于确定优先级
  • generate_test_skeleton — 为方法或类型生成可编译的测试类骨架(以文本形式)。自动检测 xUnit/NUnit/MSTest;将构造函数依赖显示为 TodoNotes;返回建议的文件路径。与 find_uncovered_symbols 配合,形成闭环
  • get_type_hierarchy — 遍历基类、接口和派生类型
  • get_di_registrations — 扫描 DI 服务注册。读取泛型(AddSingleton<IFoo, Foo>())、单泛型、typeof 配对和工厂 lambda 形式
  • get_instantiation_options — 一次调用回答“如何构造此类型?”:提供含完整参数详情的构造函数、解决方案任意位置声明的静态工厂方法(包括单独工厂类型中的方法)、DI 注册和 required 成员。传入 fromProject 可了解该项目是否确实能访问每个选项——它会考虑 InternalsVisibleTo,因此可以回答“我的测试项目能调用这个内部构造函数吗?”
  • get_project_dependencies — 获取项目引用关系图
  • get_symbol_context — 一次性转储任意类型的上下文
  • get_public_api_surface — 枚举生产项目中的所有公共/受保护类型和成员;以扁平且确定排序的列表呈现,适用于 API 审查或破坏性变更基线。
  • find_breaking_changes — 将当前 API 与基线 JSON 或 DLL 进行比较;报告已移除成员、类型变更和可访问性变更,并标注 Breaking/NonBreaking 严重性。
  • find_reflection_usage — 检测动态/反射用法
  • get_exception_flow — 查看方法可能逸出的异常:在深度限制内遍历被调用方法,将每个 throw 沿调用路径传播至所有外围 try/catch,并报告仍会逸出的异常及其传播路径;元数据中的被调用方法会贡献其已记录的异常
  • find_throw_sites — 查找抛出某异常类型的所有位置;可选择包含派生类型;标记重新抛出的异常
  • find_catch_blocks — 查找处理某类型异常的所有 catch;可选择通过基类子句匹配;标记带筛选条件、重新抛出和空(吞掉异常)的处理程序
  • find_references — 查找任意符号(类型、方法、属性、字段、事件)的所有引用;每个引用都带有类型标记(read、write、readwrite、invocation、method_group、object_creation、cast、type_check、typeof、base_type、type_constraint、type_argument、declaration、attribute、nameof、xml_doc),并按出现位置报告列号;可通过 kinds 在服务端筛选(例如,使用 ["write","readwrite"] 查找变更位置)
  • go_to_definition — 查找定义符号的源文件及行号
  • get_method_source — 一次调用即可按名称获取一个或多个成员的完整声明源代码(XML 文档、特性、签名、主体——保留原始格式):方法(所有重载)、构造函数、属性、索引器、字段、事件;每项均提供状态(ok/notFound/ambiguous/metadata/unsupportedKind),因此批量请求不会整体失败
  • resolve_stack_trace — 将粘贴的 .NET 堆栈跟踪映射到文件/行号/符号,并还原编译器名称改编(异步/迭代器状态机、lambda、本地函数、泛型元数);可处理内部异常链、日志前缀行和 Demystifier 跟踪
  • get_diagnostics — 列出编译器错误、警告和 Roslyn 分析器诊断
  • get_code_fixes — 获取适用于任意诊断的可用代码修复及结构化文本编辑
  • search_symbols — 按名称模糊搜索工作区符号
  • get_nuget_dependencies — 按项目列出 NuGet 包引用
  • find_attribute_usages — 查找带有特定特性的类型和成员
  • find_obsolete_usage — 查找所有 [Obsolete] 调用位置,按弃用消息和严重性分组,错误优先;适用于规划迁移
  • find_circular_dependencies — 检测项目或命名空间依赖关系图中的循环
  • check_architecture — 根据你提供的分层规则(forbid 和 allowOnly)检查实际的语义类型图,而不是 using 指令;违规项按边界分组,并提供引用计数和示例位置
  • get_complexity_metrics — 按成员(方法、构造函数、属性、索引器、运算符)提供圈复杂度、认知复杂度和最大嵌套深度。圈复杂度统计路径,起始值为 1;认知复杂度衡量代码的理解难度,起始值为 0。metric 决定阈值和排序使用哪项指标——认知复杂度更适合确定重构优先级,圈复杂度更适合确定测试预算
  • find_naming_violations — 检查是否符合 .NET 命名约定
  • find_async_violations — 查找同步阻塞异步、误用 async void、缺少 await、即发即弃任务;逐项报告违规及严重性
  • find_disposable_misuse — 查找未使用 using/await using 包装、未返回或未赋值给字段的 IDisposable/IAsyncDisposable 实例;逐项标注错误/警告严重性。
  • find_large_classes — 按成员数量或行数查找过大的类型
  • find_god_objects — 查找体量大且跨命名空间耦合度高的类型;相比单纯按大小筛查,这种方式更能精准识别 SRP 违规
  • find_unused_symbols — 通过引用分析检测死代码。自动过滤测试方法(xUnit/NUnit/MSTest)、MCP 工具入口、源生成器输出、由 MEF 组合的服务,以及采用互操作布局的字段;过滤计数显示在 summary.filteredOut 中
  • get_project_health — 综合审计每个项目的 7 个质量维度(复杂度、大型类、命名、未使用符号、反射、异步违规、Disposable 误用),并内联显示计数和排名靠前的热点
  • get_source_generators — 列出源生成器及其在每个项目中的输出
  • get_generated_code — 检查源生成器生成的源代码
  • inspect_external_assembly — 浏览闭源 NuGet 包和引用程序集中的类型、成员及 XML 文档
  • peek_il — 将闭源或生成的程序集中的任意方法反编译为 ilasm 风格的 IL 字节码
  • get_code_actions — 在任意位置发现可用的重构和修复(提取方法、重命名、内联变量等)
  • apply_code_action — 按标题执行任意 Roslyn 重构,并提供预览模式(写入磁盘前返回差异)
  • rename_symbol — 通过 Roslyn 的 Renamer 安全地重命名整个解决方案中的类型或成员,并提供预览模式、冲突报告,以及针对磁盘编辑内容的最新状态检查
  • change_signature — 添加、删除和重排方法参数,并重写所有调用位置;可处理命名/可选参数、params 和扩展方法,并报告因此连带修改的重写和接口实现
  • list_solutions — 列出所有已加载的解决方案以及当前活动的解决方案
  • set_active_solution — 按部分名称切换活动解决方案(后续所有工具都将对其运行)
  • load_solution — 在运行时加载其他 .sln/.slnx,并将其设为活动解决方案
  • unload_solution — 卸载已加载的解决方案以释放内存
  • rebuild_solution — 强制完整重新加载已分析的解决方案
  • start_background_task — 将长时间运行的工具(目前为 rebuild_solution)加入队列,在后台运行;返回可供轮询的 taskId
  • get_task_status — 按 taskId 获取后台任务的当前状态、结果或错误
  • list_running_tasks — 列出正在运行或最近 5 分钟内已完成的后台任务
  • trust_solution — 授权解决方案运行 Roslyn 分析器(使用 includeAnalyzers: true 调用 get_diagnostics 前必须执行)
  • list_trusted_paths — 查看持久化信任存储和会话信任的解决方案
  • revoke_trust — 撤销先前授予某个解决方案路径的信任
  • analyze_data_flow — 分析语句范围内变量的读取/写入/捕获情况(已声明、已读取、已写入、始终赋值、已捕获、流入/流出)
  • analyze_control_flow — 分析语句范围内分支/循环的可达性(起点/终点可达性、return 语句、退出点)
  • analyze_change_impact — 显示更改某个符号会影响的所有文件、项目和调用位置——结合 find_references 与 find_callers
  • get_type_overview — 复合工具:一次调用即可获取类型上下文、层次结构和文件诊断
  • analyze_method — 复合工具:一次调用即可获取方法签名、调用方和外部调用
  • get_overloads — 一次调用即可获取方法/构造函数的所有重载(源代码 + 元数据),并提供完整的参数和修饰符详情
  • get_extension_methods — 获取适用于某类型的所有扩展成员——包括数组、可空类型和元组——来源涵盖解决方案和引用程序集(因此可以找到 LINQ),并使用 Roslyn 自身的适用性规则;支持 C# 14 extension 块,包括属性和静态成员
  • get_operators — 获取某类型的所有用户定义运算符和转换运算符(源代码 + 元数据),并提供种类、签名、参数和源代码位置。包括合成的 record 相等性运算符和 .NET 7+ 的 checked 变体
  • get_call_graph — 获取某方法的传递调用方/被调用方图,设有深度限制并可检测循环
  • get_file_overview — 复合工具:一次调用即可获取文件中定义的类型和文件范围内的诊断

响应格式

所有返回列表的工具都会将结果包装在统一的信封中:

{
  "items": [ ... ],
  "totalCount": 142,
  "truncated": false,
  "limit": 500,
  "summary": { ... }
}

当 truncated 为 true 时,条目是按工具的自然排序顺序排列的前 N 项(按严重程度优先、最严重优先、按项目等)——通常这正是你想要的结果。只有当缺失的尾部条目会影响任务时,才提高 limit。

目前包含 summary 汇总信息的工具:

  • get_diagnostics — { error, warning, info, hidden } 计数
  • find_references — { byProject: { name: count }, byKind: { kind: count } }
  • 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, maxCognitive }(前三项描述所选的 metric)

单对象工具(get_type_overview、get_symbol_context、apply_code_action 等)会直接返回各自特定的格式——信封只包装返回列表的工具。

错误响应

当工具无法继续执行时(例如,符号无法解析、解决方案不受信任、文件未找到、匹配不明确等),响应会包含一个 isError: true 内容块,其中带有结构化 JSON 正文:

{
  "code": "SolutionNotTrusted",
  "message": "Solution 'Foo.sln' is not trusted for analyzer execution. ...",
  "details": { "solutionPath": "C:\\Foo.sln" }
}

错误代码(根据 code 分别处理):

  • SymbolNotFound — 无法解析类型/方法/属性。
  • SolutionNotTrusted — get_diagnostics 或 get_code_fixes 请求了分析器,但解决方案尚未通过 trust_solution 授权。
  • AmbiguousMatch — set_active_solution/unload_solution 匹配到多个解决方案;details.matches 会列出这些解决方案。
  • FileNotFound — 文件路径或基线不存在(或不属于任何已加载的项目)。
  • ProjectNotFound — 解决方案名称与任何已加载的解决方案都不匹配。
  • InvalidArgument — 调用方提供的输入格式错误、不受支持或超出范围。
  • Internal — 上述未涵盖的意外错误;message 包含底层异常文本。

**取消:**支持 MCP 框架的原生取消机制。在 tools/call 请求执行期间取消请求会终止操作;长时间运行的工具(get_diagnostics(带分析器)、get_code_actions、apply_code_action、get_code_fixes)会在热循环边界处检查令牌。

外部程序集

源自元数据的符号(来自 NuGet 包和引用程序集)是一等对象:

  • 第 1 层 — 导航(find_references、find_callers、find_implementations):接受闭源类型和成员名称。从程序集元数据中解析这些名称,并报告所有源代码级别的使用位置。
  • 第 2 层 — 检查(inspect_external_assembly):浏览任何引用程序集中的命名空间、类型、成员和 XML 文档注释,无需反编译。
  • 第 3 层 — IL(peek_il):使用 ICSharpCode.Decompiler 将指定方法反编译为带注释的 ilasm 风格 IL,便于了解 NuGet 库的内部实现。

返回位置的结果包含 Origin 字段(source 或 metadata)和 IsGenerated 标志,用于区分手写代码与闭源或生成的输出。

运行时配置

  • ROSLYN_CODELENS_OPEN_PROJECT_TIMEOUT_SECONDS — 每个项目的 MSBuild 加载超时时间(默认值为 300)。当项目在打开工作区期间超出此时长时,会将其记录为 SkippedProjects 条目,且 kind: "Timeout",同时继续加载解决方案的其余部分。在旧版或格式错误的项目导致 BuildHost-net472 子进程卡住时,此设置会很有用。

安全性:信任模型

get_diagnostics 和 get_code_fixes 可以加载 Roslyn 分析器——这些 DLL 会在进程内执行。为防止自动运行不受信任的分析器,此服务采用类似 VS/Rider 的信任模型:

  • 在启动时通过 CLI 传入的解决方案会在当前会话中自动受信任。
  • 其他解决方案必须通过 trust_solution MCP 工具显式授予信任。
  • 分析器 DLL必须来自用户的 NuGet 全局包文件夹、dotnet SDK 安装目录,或解决方案自身的 bin/obj 目录。其他路径会被跳过。

使用 list_trusted_paths 和 revoke_trust 工具检查和管理信任状态。持久化的信任信息存储在 %APPDATA%\roslyn-codelens\trust.json。

完整威胁模型请参阅 SECURITY.md。

快速开始

npx(适用于任何 MCP 客户端)
{
  "mcpServers": {
    "roslyn-codelens": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "roslyn-codelens-mcp"]
    }
  }
}

npm 包不包含服务端代码——它只是一个启动器,会安装版本匹配的 RoslynCodeLens.Mcp .NET 全局工具并运行它,因此 .NET 10 SDK 必须位于 PATH 中。 之后启动时会跳过安装,且可离线运行。

VS Code / Visual Studio(通过 dnx)

添加到 MCP 设置中(.vscode/mcp.json 或 VS 设置):

{
  "servers": {
    "roslyn-codelens": {
      "type": "stdio",
      "command": "dnx",
      "args": ["RoslynCodeLens.Mcp", "--yes"]
    }
  }
}
Claude Code 插件
claude install gh:MarcelRoozekrans/roslyn-codelens-mcp

该插件只需要 .NET 10 SDK:它会通过 dnx 运行服务端,并固定为插件对应的版本,因此无需安装或更新全局工具。

.NET 全局工具
dotnet tool install -g RoslynCodeLens.Mcp

然后添加到 MCP 客户端配置中:

{
  "mcpServers": {
    "roslyn-codelens": {
      "command": "roslyn-codelens-mcp",
      "args": [],
      "transport": "stdio"
    }
  }
}
Docker

无需在主机上安装 .NET SDK 即可运行;解决方案会绑定挂载到 /workspace。

docker build -t roslyn-codelens-mcp .
docker run -i --rm -v "$PWD:/workspace" roslyn-codelens-mcp

必须先还原挂载的解决方案,MSBuildWorkspace 才能解析其引用;工具输出报告的是容器路径,而非主机路径——请参阅 docs/site/docs/getting-started/docker.md。

用法

服务端会从当前目录开始向上遍历,自动发现 .sln 文件。你也可以直接传入一个或多个解决方案路径:

# 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

加载多个解决方案时,使用 list_solutions 查看可用解决方案,并使用 set_active_solution("B") 切换上下文。默认情况下,第一个路径为当前活动路径。

HTTP 传输

默认情况下,服务端使用 stdio 通信。传入 --http 即可通过 streamable HTTP 提供相同工具——适用于由多个本地 MCP 客户端共享的单个长时间运行的服务(Roslyn 工作区保持预热,无需为每个客户端单独启动):

roslyn-codelens-mcp /path/to/MySolution.sln --http            # http://127.0.0.1:3001
roslyn-codelens-mcp /path/to/MySolution.sln --http --port 8080
{
  "mcpServers": {
    "roslyn-codelens": {
      "type": "http",
      "url": "http://127.0.0.1:3001"
    }
  }
}

HTTP 端点仅绑定到 127.0.0.1,设计用途为单用户本地使用:所有已连接的客户端共享同一解决方案状态(set_active_solution 会影响所有客户端),且没有身份验证。--host 可以扩大绑定范围,但服务端会发出警告——其工具可以读取和修改源文件,因此只有在完全信任的网络上才这样做。

性能

所有类型查找都使用预构建的反向继承映射、成员索引和属性索引,实现 O(1) 访问。以下基准测试结果是在配备 .NET 10.0.7 的 i9-12900HK 上测得:

工具延迟内存
go_to_definition2.1 µs576 B
find_implementations2.5 µs720 B
get_project_dependencies2.8 µs1.5 KB
get_type_hierarchy3.5 µs1.3 KB
find_circular_dependencies3.7 µs2.7 KB
get_symbol_context4.1 µs1.0 KB
get_source_generators16 µs23 KB
analyze_data_flow19 µs1.6 KB
find_attribute_usages72 µs904 B
get_generated_code78 µs24 KB
analyze_control_flow115 µs14 KB
inspect_external_assembly(摘要)159 µs35 KB
find_large_classes265 µs3.5 KB
get_di_registrations478 µs16 KB
inspect_external_assembly(命名空间)564 µs259 KB
find_reflection_usage705 µs19 KB
get_complexity_metrics781 µs25 KB
get_code_actions792 µs54 KB
get_file_overview797 µs101 KB
get_diagnostics822 µs99 KB
get_nuget_dependencies849 µs48 KB
get_public_api_surface885 µs247 KB
get_type_overview1.1 ms104 KB
peek_il1.1 ms34 KB
find_disposable_misuse3.5 ms286 KB
find_uncovered_symbols3.8 ms224 KB
search_symbols3.9 ms557 KB
analyze_method5.8 ms333 KB
find_async_violations7.0 ms335 KB
find_tests_for_symbol(直接)8.4 ms396 KB
find_callers10 ms337 KB
find_tests_for_symbol(传递)12 ms399 KB
find_naming_violations15 ms788 KB
find_unused_symbols23 ms1.0 MB
find_references28 ms1013 KB
analyze_change_impact33 ms1.3 MB
解决方案加载(一次性)~4.1 s16 MB

热重载

服务会监视 .cs、.csproj、.props 和 .targets 文件的更改。检测到更改后,受影响的项目会在下一次工具查询时按需重新编译——只重新编译过期项目及其下游依赖项,而不是整个解决方案。

返回位置的工具会包含 IsGenerated 标志,用于区分源生成器输出与手写代码。

要求

  • .NET 10 SDK
  • 包含可编译项目的 .NET 解决方案

项目兼容性

服务会分析 .NET SDK 运行时下 MSBuildWorkspace 能够加载的所有项目。

支持: SDK 风格项目(<Project Sdk="...">),支持任意目标框架,例如 net48、net6.0、net8.0、net10.0 等。只要 csproj 使用 SDK 风格格式,.NET Framework 目标框架也能正常使用。

跳过(会发出警告,不会崩溃): 旧版非 SDK 风格项目(<Project ToolsVersion="..." xmlns="http://schemas.microsoft.com/developer/msbuild/2003">,通常是用较旧版本 Visual Studio 编写的 .NET Framework 项目)。这些项目依赖 Visual Studio 随附的 .NET Framework MSBuild 提供的 Microsoft.Common.props 导入项,而 .NET SDK MSBuild 运行时不包含该文件。

解决方案包含旧版项目时,服务会:

  1. 正常加载所有 SDK 风格项目——这些项目的所有工具均可使用。
  2. 跳过每个旧版项目,并将其记录在 LoadedSolution.SkippedProjects 中。
  3. 通过 list_solutions(每个 SolutionInfo 上的 SkippedProjects 数组)以及 load_solution 的返回消息列出跳过的项目。每个条目都包含项目名称、类型(Legacy)和原因。

若要分析旧版项目, 请将其转换为 SDK 风格格式(参见Microsoft 的迁移指南),或者从 Visual Studio Developer Command Prompt 打开解决方案,以便完整的 Visual Studio MSBuild 位于 PATH 中。

开发

dotnet build
dotnet test
dotnet run --project benchmarks/RoslynCodeLens.Benchmarks -c Release

第三方许可证

项目系列

Roslyn CodeLens MCP 是一组用于 AI 工作的 .NET 项目之一:

  • AI.Sentinel:用于 IChatClient 的安全监控中间件,可检测提示词注入、幻觉和 PII,并提供审计跟踪。
  • Minos.NET:类型化、由源代码生成的决策问题,并提供经过校准的答案。
  • Rag.NET:基于 Microsoft.Extensions.AI 的模块化检索增强生成管道。
  • MemoryLens MCP:通过 MCP 按需进行 .NET 内存分析,并提供可供 AI 采取行动的修复方案。

基于 ZeroAlloc 构建

Roslyn CodeLens MCP 使用了这些 ZeroAlloc 库。它们是源代码生成器和分析器,运行时无需反射:

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。