🚀 SharpTools: Roslyn Powered C# Analysis & Modification MCP Server
SharpToolsは、AIエージェントにC#コードベースの理解、分析、および修正に関する高度な機能を提供する強力なサービスです。.NET Compiler Platform (Roslyn) を活用して、深い静的解析と正確なコード操作を実現し、単なるテキストベースの操作を大きく超えた機能を提供します。
SharpToolsは、人間の開発者が頼りにする洞察とツールをAIに提供するように設計されており、よりインテリジェントで信頼性の高いコード支援を実現します。事実上、AIユーザー向けのシンプルなIDEと言えます。
このツールセットは非常に包括的であるため、既存のC#ソリューションの編集にほぼ完全に単独で使用することができます。SSEサーバーを使用し、ルーターでポートフォワーディングを設定すれば、ClaudeのウェブチャットUIをこれに接続し、完全なコーディングアシスタントとして機能させることも可能だと思います。
🚀 クイックスタート
SharpToolsを使い始めるには、まず必要な前提条件を満たし、ソリューションをビルドしてサーバーを起動する必要があります。詳細は以下のセクションを参照してください。
✨ 主な機能
- 動的なプロジェクト構造マッピング:ソリューションの「マップ」を生成し、名前空間と型を詳細に記述し、複雑度に応じた解像度を持ちます。
- コンテキストナビゲーション支援:ローカルコードの理解を助けるための簡略化された呼び出しグラフと依存関係ツリーを提供します。
- トークン効率的な操作:各ステップで最も重要なコンテキストのみを提供するように設計されており、エージェントが圧倒されることなく、要約を必要とせずに長時間追跡できるようになっています。
- 返されるコードではインデントが省略され、最もスマートなモデルでのパフォーマンスに影響を与えることなく、約10%のトークンを節約できます。
- FQNベースのナビゲーションにより、エージェントは関係のないコードを読む必要がほとんどありません。
- FQNファジーマッチング:潜在的に不正確または不完全な完全修飾名 (FQN) を正確なRoslynシンボルにインテリジェントに解決します。
- 包括的なソース解決:シンボルのソースコードを以下から取得します。
- ローカルソリューションファイル。
- SourceLinkを介した外部ライブラリ。
- 埋め込まれたPDB。
- フォールバックとしての逆コンパイル (ILSpyベース)。
- 正確なRoslynベースの修正:単なるテキスト操作ではなく、外科的なコード変更 (メンバーの追加/上書き/名前変更/移動、検索/置換) を可能にします。
- 自動Git統合:
- すべての変更に対して、タイムスタンプ付きの専用の
sharptools/
ブランチを作成します。
- すべてのコード変更を説明的なメッセージとともに自動的にコミットします。
- 最後の変更をGitを使って元に戻す
Undo
機能を提供します。
- 簡潔なAIフィードバックループ:
- 完全なコードブロックではなく、正確な差分で変更を確認します。
- 変更後に即座にツール内でコンパイルエラーレポートを提供します。
- 積極的なコード品質分析:
- 高いコード複雑度 (循環的、認知的) を検出し、警告を発します。
- メンバーの追加時に意味的に類似したコードを識別し、潜在的な重複をフラグ付けします。
- 幅広いプロジェクトサポート:
- WindowsとLinux (おそらくMacも) で動作します。
- FrameworkからCore、5+まで、任意の.NETバージョンを対象とするプロジェクトを分析できます。
- 最新のSDKスタイルとレガシーのC#プロジェクト形式の両方に互換性があります。
- 一貫したコードフォーマットを維持するために
.editorconfig
設定を尊重します。
- MCPサーバーインターフェイス:Model Context Protocol (MCP) を介してツールを公開します。
- リモートクライアント用のServer-Sent Events (SSE)。
- ローカルプロセス通信用の標準入出力 (Stdio)。
📦 インストール
前提条件
- サーバーを実行するための.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
ツールを実行させることをお勧めします。なぜなら、それによっていくつかの有用な情報が返されるからです。
💻 使用例
基本的な使用法
SharpToolsを使用するには、まずサーバーを起動し、MCPを介してツールを呼び出します。以下は、SharpTool_LoadSolution
ツールを使用してソリューションを読み込む例です。
cd SharpTools.SseServer
dotnet run
📚 ドキュメント
プロンプト
含まれている Identity Prompt は、私の個人的なC#コーディングアシスタント用のプロンプトであり、このツールセットと組み合わせて使用するとうまく機能します。そのまま使用しても、好みに合わせて変更しても、または完全に省略しても構いません。
VS Codeでは、copilot-instructions.md
として設定することで、すべての対話に含めることができます。
Tool Use Prompt は、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 ファイルを参照してください。