代码分析服务器

DotLens是一个基于Microsoft Roslyn的代码分析服务器,为AI编程代理提供深度.NET/C#代码分析功能,包括影响分析、死代码检测、复杂度指标和数据流分析等。

  • by alphaleonis
  • C#
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 alphaleonis/dotlens-mcp

使用说明

DotLens

A. 模型上下文协议 (MCP)服务器,为AI编码代理提供深度。NET/C#代码分析功能——影响分析、死代码检测、复杂性度量、数据流分析等——基于 微软罗斯林.

使用超越标准导航的语义分析工具来补充代理的内置LSP支持。

快速开始

  1. 安装:

    dotnet tool install -g DotLens.MCP
    
  2. 添加 .mcp.json 到您的项目根目录:

    {
      "mcpServers": {
        "dotlens": {
          "type": "stdio",
          "command": "dotlens",
          "args": []
        }
      }
    }
    
  3. 重新启动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 彼得·扎卢茨基。

许可证

麻省理工学院——见 许可证 了解详情。