🚀 SharpTools:基于Roslyn的C#代码分析与修改MCP服务器
SharpTools是一个强大的服务,旨在赋予AI智能体高级能力,使其能够理解、分析和修改C#代码库。它利用.NET编译器平台(Roslyn)进行深度静态分析和精确的代码操作,远远超越了简单的基于文本的操作。
SharpTools旨在为AI提供人类开发者所依赖的相同见解和工具,从而实现更智能、更可靠的代码辅助。实际上,它就像是一个为AI用户打造的简易集成开发环境(IDE)。
由于该套件功能全面,几乎可以完全独立用于编辑现有的C#解决方案。如果你使用SSE服务器并对路由器进行端口转发,我认为甚至可以让Claude的网页聊天界面连接到它,使其充当一个完整的编码助手。
🚀 快速开始
前提条件
- 运行服务器需要.NET 8+ SDK。
- 需要目标解决方案对应的.NET SDK。
构建项目
要构建整个解决方案,请运行以下命令:
dotnet build SharpTools.sln
这将构建所有服务和服务器应用程序。
运行服务器
SSE服务器(HTTP)
SSE服务器通过HTTP端点提供工具服务。
cd SharpTools.SseServer
dotnet run
dotnet run -- --port 3005 --log-file ./logs/mcp-sse-server.log --log-level Debug
关键选项:
--port <number>
:监听端口(默认:3001)。
--log-file <path>
:日志文件路径。
--log-level <level>
:最低日志级别(Verbose、Debug、Information、Warning、Error、Fatal)。
--load-solution <path>
:启动时要加载的.sln
文件路径。这对手动测试很有用。不过,建议让AI运行LoadSolution工具,因为它会返回一些有用的信息。
Stdio服务器
Stdio服务器通过标准输入/输出进行通信。
可以在你选择的MCP客户端中进行配置,以下是VSCode Copilot的配置示例:
"mcp": {
"servers": {
"SharpTools": {
"type": "stdio",
"command": "/path/to/repo/SharpToolsMCP/SharpTools.StdioServer/bin/Debug/net8.0/SharpTools.StdioServer",
"args": [
"--log-directory",
"/var/log/sharptools/",
"--log-level",
"Debug"
]
}
}
}
关键选项:
--log-directory <path>
:存储日志文件的目录。
--log-level <level>
:最低日志级别。
--load-solution <path>
:启动时要加载的.sln
文件路径。这对手动测试很有用。同样,建议让AI运行LoadSolution工具,因为它会返回一些有用的信息。
✨ 主要特性
- 动态项目结构映射:生成解决方案的“地图”,详细列出命名空间和类型,并根据复杂度调整分辨率。
- 上下文导航辅助:提供简化的调用图和依赖树,帮助理解本地代码。
- 高效令牌操作:在每一步只提供最有价值的上下文信息,使智能体能够持续高效工作,而不会被过多信息淹没或需要进行总结。
- 返回的代码中省略所有缩进,在不影响最智能模型性能的情况下,大约节省10%的令牌。
- 基于完全限定名称(FQN)的导航方式,使智能体很少需要读取无关代码。
- FQN模糊匹配:智能解析可能不精确或不完整的完全限定名称(FQN),以找到精确的Roslyn符号。
- 全面的源代码解析:从以下来源检索符号的源代码:
- 本地解决方案文件。
- 通过SourceLink获取的外部库。
- 嵌入式PDB文件。
- 作为备用方案的反编译(基于ILSpy)。
- 精确的、基于Roslyn的修改:支持精细的代码更改(添加/覆盖/重命名/移动成员、查找/替换),而不仅仅是简单的文本操作。
- 自动Git集成:
- 为所有修改创建专用的、带时间戳的
sharptools/
分支。
- 自动为每次代码更改提交带有描述性信息的提交记录。
- 提供基于Git的“撤销”功能,可撤销上一次修改。
- 简洁的AI反馈循环:
- 通过精确的差异对比确认更改,而不是显示完整的代码块。
- 修改后立即在工具内提供编译错误报告。
- 主动的代码质量分析:
- 检测并警告高代码复杂度(圈复杂度、认知复杂度)。
- 在添加成员时识别语义相似的代码,标记可能的重复代码。
- 广泛的项目支持:
- 可在Windows、Linux(可能也支持Mac)上运行。
- 可以分析针对任何.NET版本(从Framework到Core再到5+)的项目。
- 兼容现代SDK风格和旧版C#项目格式。
- 遵循
.editorconfig
设置,以确保代码格式一致。
- MCP服务器接口:通过模型上下文协议(MCP)提供工具服务:
- 通过服务器发送事件(SSE)为远程客户端提供服务。
- 通过标准输入/输出(Stdio)进行本地进程通信。
📦 安装指南
请参考上述“快速开始”部分的构建和运行步骤。
💻 使用示例
提示信息
身份提示
包含的身份提示是我个人的C#编码助手提示信息,它与本套件配合使用效果很好。你可以直接使用它,也可以根据自己的喜好进行修改,或者完全不使用。
在VS Code中,将其设置为copilot-instructions.md
,这样它将包含在每次交互中。
工具使用提示
工具使用提示是专门为Github Copilot的智能体模式设计的。它会覆盖Copilot智能体系统提示中的特定部分,从而避免使用其内置工具。
它也可以作为MCP提示使用,因此在Copilot中,你只需输入/mcp
,它就会作为一个选项显示出来。
对于其他编码助手,也需要类似的设置,以防止它们使用自己的默认编辑工具。
建议根据每个智能体的个别系统提示,为与之配合使用的每个智能体编写自定义的工具使用提示。
📚 详细文档
暴露的工具
SharpTools通过MCP暴露了各种“SharpTool_*”函数。以下是按各自服务文件分类的简要概述:
解决方案工具
SharpTool_LoadSolution
:使用给定的.sln
文件初始化工作区。这是主要的入口点。
SharpTool_LoadProject
:提供已加载解决方案中特定项目的详细结构概述,包括命名空间和类型,以帮助AI理解项目布局。
分析工具
SharpTool_GetMembers
:列出类型的成员(方法、属性等),包括签名和XML文档。
SharpTool_ViewDefinition
:显示符号(类、方法等)的源代码,包括调用图或类型引用等上下文信息。
SharpTool_ListImplementations
:查找接口/抽象方法的所有实现或基类的所有派生类。
SharpTool_FindReferences
:在整个解决方案中查找符号的所有使用位置,并提供上下文代码片段。
SharpTool_SearchDefinitions
:在源代码和编译后的程序集中,对符号声明和签名进行基于正则表达式的搜索。
SharpTool_ManageUsings
:读取或覆盖文档中的using
指令。
SharpTool_ManageAttributes
:读取或覆盖特定声明上的属性。
SharpTool_AnalyzeComplexity
:对方法、类或项目进行复杂度分析(圈复杂度、认知复杂度、耦合度等)。
- ~(已禁用)
SharpTool_GetAllSubtypes
:递归列出类型的所有嵌套成员。~
- ~(已禁用)
SharpTool_ViewInheritanceChain
:显示类型的继承层次结构。~
- ~(已禁用)
SharpTool_ViewCallGraph
:显示方法的传入和传出调用。~
- ~(已禁用)
SharpTool_FindPotentialDuplicates
:查找语义相似的方法或类。~
文档工具
SharpTool_ReadRawFromRoslynDocument
:读取文件的原始内容(省略缩进)。
SharpTool_CreateRoslynDocument
:使用指定内容创建新文件。
SharpTool_OverwriteRoslynDocument
:用新内容覆盖现有文件。
SharpTool_ReadTypesFromRoslynDocument
:列出特定源文件中定义的所有类型及其成员。
修改工具
SharpTool_AddMember
:向指定类型添加新成员(方法、属性、字段、嵌套类型等)。
SharpTool_OverwriteMember
:用新代码替换现有成员或类型的定义,或删除它。
SharpTool_RenameSymbol
:重命名符号,并更新整个解决方案中所有对它的引用。
SharpTool_FindAndReplace
:在指定符号的声明中或匹配全局模式的文件中执行基于正则表达式的查找和替换操作。
SharpTool_MoveMember
:将成员从一个类型/命名空间移动到另一个类型/命名空间。
SharpTool_Undo
:使用Git集成撤销上一次应用的更改。
- ~(已禁用)
SharpTool_ReplaceAllReferences
:用指定的C#代码替换符号的所有引用。~
包工具
- ~(已禁用)
SharpTool_AddOrModifyNugetPackage
:在项目文件中添加或更新NuGet包引用。~
杂项工具
SharpTool_RequestNewTool
:允许AI请求新工具或功能,并记录请求以供人工审核。
🔧 技术细节
注意事项
这是一个个人项目,在几周内拼凑而成,并且在很大程度上是使用其自身的工具构建的。目前它总体运行良好,但代码仍然比较杂乱,一些功能还存在小问题(例如,在覆盖成员前后删除换行符)。
只要我还在使用它,我就打算对其进行维护和改进,并欢迎反馈和贡献。
📄 许可证
本项目采用MIT许可证 - 详情请参阅LICENSE文件。
贡献
欢迎贡献代码!请随时提交拉取请求或提出问题。