🚀 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文件。
貢獻
歡迎貢獻代碼!請隨時提交拉取請求或提出問題。