关于 Roslyn Code Lens
Roslyn CodeLens 是基于 Roslyn 的 .NET/C# MCP 服务,为 AI Agent 提供类型层级、调用图、DI 注册、诊断、重构等语义级分析能力。它面向 .NET 开发者,覆盖面较广,包含测试、IL 查看等工具。
主要功能
- 01类型层级与实现查找
- 02调用方与引用分析
- 03DI 注册扫描
- 04编译器诊断与代码修复
- 05测试覆盖与测试骨架生成
- 06安全的符号重命名与签名修改
适用场景
- 01梳理 .NET 解决方案中的依赖与调用关系
- 02评估重构或破坏性 API 变更的影响范围
- 03排查异常堆栈并定位源代码位置
MCP 相关
该项目是 MCP 服务,向 MCP 客户端暴露大量 C# 语义分析与重构工具,例如 find_references、rename_symbol 和 get_diagnostics。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Roslyn CodeLens MCP 服务
一款基于 Roslyn 的 MCP 服务,为 AI Agent 提供对 .NET 代码库的深度语义理解能力——包括类型层次结构、调用图、DI 注册、诊断、重构等。
托管部署
可通过 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_solutionMCP 工具显式授予信任。 - 分析器 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_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(摘要) | 159 µs | 35 KB |
find_large_classes | 265 µs | 3.5 KB |
get_di_registrations | 478 µs | 16 KB |
inspect_external_assembly(命名空间) | 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(直接) | 8.4 ms | 396 KB |
find_callers | 10 ms | 337 KB |
find_tests_for_symbol(传递) | 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 |
| 解决方案加载(一次性) | ~4.1 s | 16 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 运行时不包含该文件。
解决方案包含旧版项目时,服务会:
- 正常加载所有 SDK 风格项目——这些项目的所有工具均可使用。
- 跳过每个旧版项目,并将其记录在
LoadedSolution.SkippedProjects中。 - 通过
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
第三方许可证
- ICSharpCode.Decompiler — MIT 许可证(v8+)。用于
peek_il工具中的 IL 反汇编。
项目系列
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
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。