ContextManager について
ContextManagerは、C#ソリューションを扱うAIコーディングエージェント向けのRoslynベースのMCPサーバーです。ファイル構造と依存グラフを調べるツールを提供し、ファイル全体を読まずに関連コードや変更の影響を把握できます。
主な機能
- 01C#ファイル構造のJSON抽出
- 02.slnから依存グラフを構築
- 03名前によるファイル・メソッド検索
- 04依存関係と影響経路の確認
- 05ファイル変更時のグラフ更新
活用シーン
- 01C#ソリューション内の関連コードの特定
- 02変更前の型構造の確認
- 03コード変更による下流への影響評価
MCP 対応
MCP stdioサーバーとして動作し、接続クライアントにファイル検査とソリューショングラフのツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ContextManager
Roslyn を活用し、AI コーディングエージェントに構造化された C# のコンテキストを提供します。
読む前に、構造を把握しましょう。
インストール • ツール • 使い方 • よくある質問 • インストールガイド全文
ContextManager は、エージェントが C# ファイル全体を読まずに済むようにする MCP サーバーです。次の 2 つの機能があります。
- ファイルを調査します。
.csファイルを、型、パブリックメンバー、コンストラクターの依存関係、基底型、インターフェース、イベントを含む JSON コントラクトに変換します。メソッド本体、プライベートメンバー、XML ドキュメントは除外されます。各メソッドには行範囲が付いているため、エージェントは必要なメソッド本体だけを読めます。 - ソリューションをマッピングします。
.slnのナレッジグラフを構築し、ファイルを開く前に、どのファイルが重要か、変更のリスクがどの程度かをエージェントが把握できるようにします。
インストール
.NET 10 SDK 以降が必要です。
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/nushey/ContextManager/main/scripts/install.sh | bash
Windows(PowerShell):
irm https://raw.githubusercontent.com/nushey/ContextManager/main/scripts/install.ps1 | iex
インストーラーは ContextManager .NET グローバルツールをインストールまたは更新し、context-manager setup を実行します。このウィザードでは、選択した MCP クライアント(Claude Code、Claude Desktop、Codex、Antigravity、Kilo Code、Cursor、Devin、Opencode)にサーバーを追加します。
手動でインストールする場合:
dotnet tool install -g ContextManager
claude mcp add --scope user context-manager -- context-manager # Claude Code
その他のクライアント、フラグ、設定ファイルのパス、トラブルシューティングについては、INSTALL.md を参照してください。
.NET Framework 4.8のソリューションでのproject_scanは Windows でのみ動作し、 .NET デスクトップビルドツールのワークロードを含む Visual Studio Build Tools が必要です。それ以外の機能はすべて、どのプラットフォームでも動作します。
ツール
| ツール | 返される内容 |
|---|---|
inspect_file | 1 つの .cs ファイルの構造的なコントラクト。 |
inspect_context | 最大 15 個の .cs ファイルと、それらの間の参照をまとめたビュー。unresolved には、対象に含まれていないユーザー定義型が一覧表示されます。 |
project_scan | ソリューションのグラフを構築または更新し、そのカバレッジを報告します。 |
graph_search | 名前の候補に一致するファイルとメソッドを、名前空間とメソッドノード ID とともにファイルごとにまとめて表示します。 |
graph_get_dependencies | ノードの隣接ノードを、宣言元の型ごとに集約し、種類ごとのエッジ数とともに表示します。 |
graph_impact_analysis | ノードに直接または間接的に依存するすべての型を、それぞれのファイルとともに表示します。 |
graph_path_find | 2 つのノード間の最短依存パス。 |
グラフツールには .sln のパスを指定します。グラフは自動的に最新の状態に保たれ、回答する前に、前回のスキャン以降に変更された部分だけを再抽出します。グラフは .sln の隣にある .context-manager/<solution name>.graph.json に保存されるため、そのソリューションを使うすべてのセッションで共有されます。
使い方
ファイルから始める
ユーザーがファイルに言及したら、まずそのファイルから始めます。
inspect_file(path):型を読み取り、ノード ID をNamespace.TypeNameとして構築します。graph_get_dependencies(solutionPath, nodeId):読む価値のある隣接ノードを見つけます。- それらの隣接ノードのみを
inspect_fileで調べます。 - 変更を加える前に
graph_impact_analysis(solutionPath, nodeId)で影響範囲を確認します。
影響リストが短ければ、変更の影響は限定的です。長い場合、その型の公開コントラクトは重要な役割を担っているため、維持する必要があります。含まれるすべてのファイルをエージェントが読む必要があるという意味ではありません。
ノード ID には Roslyn の完全修飾形式を使用します。例:MyApp.Orders.OrderService、MyApp.Orders.OrderService.GetOrderAsync(System.Guid)。グラフツールが返す ID はそのまま渡してください。
// graph_impact_analysis("/abs/path/MyApp.sln", "MyApp.Orders.IOrderRepository")
{
"affectedIds": ["MyApp.Orders.OrderService", "MyApp.Api.OrdersController"],
"affectedFiles": {
"MyApp.Orders.OrderService": "/abs/path/Orders/OrderService.cs",
"MyApp.Api.OrdersController": "/abs/path/Api/OrdersController.cs"
}
}
名前でコードを探す
何のことかおおよそ分かっているものの、どのファイルにあるか分からず、ノード ID もない場合は、候補となる名前を複数指定して graph_search を呼び出します。
{"solutionPath":"/abs/path/MyApp.sln","queries":["Login","Authentication","SignIn"]}
検索対象。 用語がファイル名(.cs を除く)またはメソッド名(シグネチャを除く)のどこかに含まれている場合、一致します。照合は序数ベースで、大文字と小文字は区別されません。いずれか 1 つの用語が一致すれば十分です。グラフ内にあるすべてのメソッド(プライベートなものも含む)を検索し、コンストラクターは型名で検索します。ディレクトリパス、パラメーター型、メソッド本体、名前空間は検索しません。
有効な用語。 用語の前後の空白は取り除かれ、3 文字以上である必要があります。空のリスト、または短すぎる用語が 1 つだけ指定された場合、グラフの同期前にクエリ全体が拒否され、コード invalid_query と次のメッセージが返されます。
Provide at least one query term; each term must be at least 3 characters long after trimming whitespace.
順序と上限。 完全一致が先に表示され、その後に部分一致が続きます。各グループ内では、グラフに現れる順序が維持されます。複数の用語に一致しても、名前の順位は上がりません。検索結果は最大 50 件です。上限はファイル数ではなく一致数に適用されます。各一致ファイルは 1 件、各一致メソッド ID も 1 件として数えられ、複数の用語に一致しても同じです。ページネーションはありません。truncated が true の場合、少なくとも 1 件の一致が省略されています。検索範囲を絞るには、より具体的な名前を使用してください。
{"results":[{"file":"/abs/path/Auth/Session.cs","namespaces":["MyApp.Auth"],"fileMatched":false,"methods":[{"name":"Login","nodeId":"MyApp.Auth.Session.Login()"}]}],"truncated":false}
レスポンス。 レスポンスは、ファイルごとにグループ化された 1 行のコンパクトな JSON です。各ファイルエントリーには file、namespaces、fileMatched、methods が含まれ、空の配列は [] のままです。namespaces には、そのファイル内のすべての名前空間が含まれます。ファイル自体の名前が上限内に残った一致の 1 つである場合、fileMatched は true です。ファイル名も一致していたものの上限外となり、メソッドだけが上限内に残った場合にも、そのファイルが表示されることがあります。一致がない場合、レスポンスは {"results":[],"truncated":false} です。
ここから、返された file に対して inspect_file を呼び出すか、メソッドの nodeId を変更せずに他のグラフツールに渡します。古いバージョンで保存されたグラフは、名前と名前空間を追加するために 1 回再抽出されます。その後、変更がない限り、以降のクエリでは更新済みのグラフが再利用されます。
エージェントにこれらのワークフローを実行させるには、docs/AGENTS-template.md をプロジェクトの AGENTS.md にコピーしてください。
よくある質問
バックグラウンドサービスですか? いいえ。MCP stdio サーバーです。セッションの開始時にクライアントが起動し、セッションの終了時に停止します。
どのような状態を保持しますか? 各 .sln の隣に書き込まれるグラフファイルのみです。検査ツールは渡されたファイルを読み取るだけで、何も保持しません。
ソリューション全体を読み取りますか? 読み取るのはグラフツールのみです。inspect_file と inspect_context は、指定されたファイルだけを読み取ります。
ビルドとテスト
dotnet build
dotnet test
ライセンス
MIT © nushey
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。