使用说明
DotLens
A. 模型上下文协议 (MCP)服务器,为AI编码代理提供深度。NET/C#代码分析功能——影响分析、死代码检测、复杂性度量、数据流分析等——基于 微软罗斯林.
使用超越标准导航的语义分析工具来补充代理的内置LSP支持。
快速开始
-
安装:
dotnet tool install -g DotLens.MCP -
添加
.mcp.json到您的项目根目录:{ "mcpServers": { "dotlens": { "type": "stdio", "command": "dotlens", "args": [] } } } -
重新启动MCP客户端 例如Claude Code)来加载服务器。
如果你的项目根目录只包含一个 .sln 或 .slnx 文件,DotLens在启动时自动加载它——不需要额外的配置。
DotLens在本地LSP上添加了什么?
像Claude Code这样的AI代理已经内置了对C#的LSP支持(导航、诊断、引用)。DotLens和本地LSP都在幕后使用Roslyn。区别在于它们暴露了什么:
语言服务器协议 提供标准的编辑器操作——转到定义、查找引用、编辑后的诊断、重命名。这些自动运行并紧密集成。
DotLens 添加了LSP协议未定义的分析和重构工具:
| 能力 | 它做什么 |
|---|---|
| 影响分析 | 如果我更改此符号,会有什么问题? (analyze_change_impact) |
| 死代码检测 | 查找整个解决方案中未使用的类型、方法和字段(find_unused_code) |
| 复杂性度量 | 循环、认知、嵌套深度、每种方法的LOC(get_complexity_metrics) |
| 数据流分析 | 通过一种方法跟踪变量分配和使用情况(analyze_data_flow) |
| 控制流分析 | 分支路径和可达性(analyze_control_flow) |
| 依赖关系图 | 具有周期检测的项目级依赖关系可视化(dependency_graph) |
| 语义搜索 | 按可访问性、修饰符、返回类型、属性查找符号(find_symbols) |
| 复合查询 | 一次通话中的签名+呼叫者+呼出电话(analyze_method) |
| 代码生成 | 生成接口存根、空检查、应用批量修复(implement_missing_members, fix_all) |
DotLens还与LSP重叠用于导航(查找引用、转到定义、类型层次结构等)。这些重叠的工具返回 人工智能优化的结构化JSON 通过冗长控制和分页,对于大型结果,这可能比LSP响应更具令牌效率。
安装
通过NuGet(推荐)
dotnet tool install -g DotLens.MCP
然后运行:
dotlens
从源代码构建
git clone https://github.com/alphaleonis/dotlens-mcp.git
cd dotlens-mcp
dotnet build -c Release
dotnet test
dotnet publish src/DotLens/DotLens.csproj -c Release -o ./publish
配置
所有选项都使用 DOTLENS_ 环境变量的前缀:
| 环境变量 | 描述 | 默认值 | 范围 |
|---|---|---|---|
DOTLENS_SolutionPath |
解决方案文件(.sln/.slnx)或要搜索的目录 |
无 | - |
DOTLENS_AutoLoadSolution |
从工作目录自动检测解决方案 | true |
- |
DOTLENS_LogLevel |
记录冗长 | Warning |
详细、调试、信息、警告、错误 |
DOTLENS_TimeoutSeconds |
长时间运行的操作超时 | 30 |
1-600 |
DOTLENS_LoadWaitTimeoutSeconds |
在返回“加载”状态之前等待正在进行的加载的秒数 | 5 |
1-60 |
DOTLENS_MaxDiagnostics |
要返回的最大诊断值 | 100 |
1-10000 |
DOTLENS_UseAbsolutePaths |
使用绝对路径而不是相对路径 | false |
- |
DOTLENS_MaxCacheSize |
可缓存的最大文档数 | 500 |
1-10000 |
DOTLENS_CacheExpirationMinutes |
缓存滑动过期 | 30 |
1-1440 |
DOTLENS_EnableSemanticCache |
启用文档缓存 | true |
- |
也可以通过命令行参数设置选项: dotlens --LogLevel=Debug
解决方案自动加载
DotLens自动发现并加载解决方案 在后台 在启动时。MCP服务器立即开始接受连接,无需等待大型解决方案加载。
| 条件 | 行为 |
|---|---|
DOTLENS_SolutionPath 指向文件 |
直接加载该解决方案 |
DOTLENS_SolutionPath 指向一个目录 |
在该目录中搜索解决方案 |
一个 .sln/.slnx 在工作目录中 |
自动加载 |
| 工作目录中有多个解决方案 | 找到的日志;呼叫 load_solution 选择 |
| 未找到解决方案 | 致电 load_solution 手动 |
如果在加载完成之前调用工具,它将返回“未加载解决方案”错误。如果 load_solution 在自动加载过程中调用,它最多等待 DOTLENS_LoadWaitTimeoutSeconds (默认5s),如果仍在进行中,则返回“加载”状态。使用 health_check 以监控加载进度。
相对的 SolutionPath 值是相对于工作目录解析的。集 DOTLENS_AutoLoadSolution=false 禁用自动发现。
工具
导航
| 工具 | 说明 |
|---|---|
go_to_definition |
跳转到符号定义 |
find_references |
解决方案中的所有引用 |
find_implementations |
接口/抽象实现 |
find_callers |
影响分析——谁会这么说? |
find_overrides |
查找虚拟/抽象成员的所有覆盖 |
find_base_member |
查找方法重写或实现的基/接口成员 |
get_type_hierarchy |
继承链 |
get_symbol_info |
位置语义信息 |
搜索
| 工具 | 说明 |
|---|---|
search_symbols |
全球模式搜索(*Handler, Get*) |
find_symbols |
按名称和/或语义过滤器(种类、可访问性、异步等)查找符号 |
get_type_members |
按类型名称列出的所有成员 |
get_derived_types |
查找所有子类 |
get_method_info |
所有重载的方法签名 |
get_file_outline |
带有类型声明和成员签名的文件骨架 |
get_containing_member |
在某个位置获取封闭方法/属性/类型 |
get_attributes |
查找用特定属性装饰的所有符号 |
find_string_literals |
在整个解决方案中查找字符串文字 |
化合物分析
| 工具 | 说明 |
|---|---|
get_type_overview |
一次通话中提供完整的类型信息 |
analyze_method |
签名+呼叫者+呼出电话+位置 |
get_file_overview |
带有诊断的文件摘要 |
get_method_source |
按名称列出源代码(使用而不是读取整个文件) |
get_instantiation_options |
如何创建类型 |
check_type_compatibility |
A可以分配给B吗? |
get_outgoing_calls |
这个方法叫什么? |
analyze_change_impact |
如果改变,会发生什么? |
get_missing_members |
必须实现的接口/抽象成员 |
get_type_members_batch |
一次通话支持多种类型 |
分析
| 工具 | 说明 |
|---|---|
get_diagnostics |
编译器错误/警告 |
analyze_data_flow |
可变分配和使用 |
analyze_control_flow |
分支/可达性 |
get_complexity_metrics |
圈动、嵌套、LOC、认知 |
find_unused_code |
死码检测 |
get_project_structure |
解决方案结构 |
dependency_graph |
项目依赖关系 |
get_project_packages |
项目引用的NuGet包 |
fix_all |
对所有出现的诊断应用代码修复 |
重构
| 工具 | 说明 |
|---|---|
rename_symbol |
跨解决方案安全重命名 |
get_code_actions |
某个位置可用的Roslyn重构/修复 |
apply_code_action |
按标题或键应用Roslyn代码操作 |
add_null_checks |
生成ArgumentNullException保护 |
add_using |
添加使用指令(如果存在则跳过,自动排序) |
implement_missing_members |
生成接口/抽象存根 |
格式化
| 工具 | 说明 |
|---|---|
organize_usings |
排序/删除未使用的(文档/项目/解决方案范围) |
format_document_batch |
使用Roslyn的格式化工具(尊重.editorconfig)格式化文档 |
编辑
| 工具 | 说明 |
|---|---|
edit_file |
使用原子应用+诊断进行批量查找/替换 |
write_file |
使用原子应用+诊断进行完整文件替换 |
基础设施
| 工具 | 说明 |
|---|---|
health_check |
服务器状态 |
load_solution |
加载.sln/.slnx进行分析 |
unload_solution |
卸载解决方案并释放文件锁 |
reload_solution |
重新加载解决方案以获取新文件/项目更改 |
list_solutions |
列出所有已加载的解决方案以及哪个处于活动状态 |
set_active_solution |
切换活动解决方案上下文 |
sync_documents |
外部文件编辑后同步内存中的工作区 |
AI代理配置提示
即使DotLens提供了更好的选择,AI代理也倾向于默认使用其内置工具(Grep、Read、LSP)。要充分利用DotLens,请推动您的代理将其用于分析任务。
克劳德代码 --添加到您的项目 CLAUDE.md:
For C# code, prefer DotLens tools for analysis beyond basic navigation:
- Use `analyze_change_impact` before refactoring to understand blast radius
- Use `find_unused_code` instead of manual searching for dead code
- Use `get_complexity_metrics` to identify problem methods
- Use `get_method_source` instead of Read for viewing specific methods (saves tokens)
- Use `search_symbols` / `find_symbols` instead of Grep for finding C# symbols
其他MCP客户端 --在代理的系统提示中配置类似的工具优先级。
文档同步
DotLens为快速查询维护解决方案的内存表示。当文件在外部修改时(通过编辑/写入工具),代理负责同步更改。
何时打电话 sync_documents
| 操作 | 是否调用sync_documents? |
|---|---|
| 使用编辑工具修改.cs文件 | 是 |
| 使用写入工具创建新的.cs文件 | 是 |
| 已删除的.cs文件 | 是 |
| 使用DotLens重构工具(重命名、提取等) | 否(自动更新) |
| 使用的DotLens编辑工具(edit_file、write_file) | 否(自动更新+返回诊断) |
| 已修改的.csproj文件 | 否(使用 reload_solution 相反) |
# After editing specific files
sync_documents(filePaths: ["src/MyClass.cs", "src/MyService.cs"])
# After bulk changes — sync all documents
sync_documents()
这反映了LSP的工作方式——客户端(编辑器)将更改通知服务器。这种方法消除了竞争条件,避免了文件观察器的复杂性,并使代理对工作区状态有明确的控制。
如果不同步,查询可能会返回过时的数据(旧方法签名、缺少新文件等)。
建筑
DotLens使用官方 MCP C#SDK 具有用于文件锁隔离的双进程架构:
MCP Client (AI Agent)
│ stdin/stdout (MCP protocol)
▼
Server Process
├─ MCP Server: handles client requests
├─ MCP Client: forwards tool calls to worker
└─ Server-side tools: load/unload/reload/list/set_active/health
│
▼
Worker Process (--worker mode)
├─ MCP Server: receives forwarded calls
├─ MSBuildWorkspace: holds file locks
└─ Roslyn semantic analysis tools
│
▼
Microsoft.CodeAnalysis (Roslyn)
└─ MSBuildWorkspace, SemanticModel, SymbolFinder
这种架构允许杀死并重新启动工作进程以释放文件锁——这在使用源代码生成器重建项目时很重要。
需求
贡献
欢迎投稿!请在上打开问题或拉取请求 GitHub.
# Development workflow
dotnet build src/DotLens/DotLens.csproj
dotnet test tests/DotLens.Tests/DotLens.Tests.csproj
添加新工具
在中创建或更新工具类 src/DotLens/Tools/:
[McpServerToolType]
public class YourTools
{
private readonly IWorkspaceManager _workspace;
public YourTools(IWorkspaceManager workspace) => _workspace = workspace;
[McpServerTool(Name = "your_tool", ReadOnly = true, OpenWorld = false)]
[Description("Description shown to AI.")]
public async Task<string> YourTool(
[Description("Param description")] string filePath,
[Description("Optional param")] int? maxResults = 50,
CancellationToken cancellationToken = default)
{
_workspace.EnsureSolutionLoaded();
// Your logic using _workspace.Solution, etc.
return ToolResponse.Success(new { /* results */ });
}
}
不需要单独的工具定义——MCP SDK从属性生成模式。
密钥目录
| 目录 | 目的 |
|---|---|
src/DotLens/Tools/Navigation/ |
符号导航(转到定义、查找参考等) |
src/DotLens/Tools/Search/ |
符号搜索、类型成员、文件大纲 |
src/DotLens/Tools/Intelligence/ |
复合分析(类型概述、方法分析等) |
src/DotLens/Tools/Analysis/ |
诊断、数据/控制流、复杂性、项目结构 |
src/DotLens/Tools/Refactoring/ |
重命名、编码操作、空检查、实现成员 |
src/DotLens/Tools/Formatting/ |
组织使用,格式化文档 |
src/DotLens/Tools/Editing/ |
使用诊断进行文件编辑 |
src/DotLens/Tools/Server/ |
解决方案管理(加载/卸载/重新加载) |
src/DotLens/Infrastructure/ |
共享实用程序(WorkspaceManager、MultiWorkerManager等) |
tests/DotLens.Tests/ |
xUnit集成测试 |
致谢
DotLens建立在 .net罗斯林mcp Brendan Kowitz和 SharpLensMcp 彼得·扎卢茨基。
许可证
麻省理工学院——见 许可证 了解详情。
