codereach-mcp について
CodeReachは、Roslynで呼び出しグラフを構築し、コードからエンドポイントやジョブへの経路を追跡する、ASP.NET CoreおよびC#向けのMCPサーバーです。開発者はエージェントやシェルから、ルート、依存関係、シンボル参照、変更の影響を調べられます。
主な機能
- 01Roslynのセマンティックモデルによる呼び出しグラフ
- 02シンボルからエンドポイントやジョブへの追跡
- 03Git差分から影響を受ける入口を特定
- 04ルートと認可情報の確認
- 05依存性注入の登録状況を分析
- 06ディスク上のインデックスと差分更新
活用シーン
- 01メソッドを呼び出すAPIルートの特定
- 02差分が影響するエンドポイントやジョブの確認
- 03認可のないルートの監査
- 04サービスやリポジトリの呼び出し追跡
MCP 対応
呼び出し追跡、ルート一覧、参照検索、変更影響レポートなどの分析ツールと定型プロンプトをMCPクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
CodeReach
このコードに到達するエンドポイントやジョブと、差分が影響する範囲を確認できます。
CodeReach は、ASP.NET Core および C# ソリューション向けの MCP サーバーです。Roslyn でソリューションを読み込み、コンパイラー独自のセマンティックモデルから呼び出しグラフを構築してディスクに保存します。そして、エージェント(またはシェルを使うユーザー)が grep と推測で答えていたような質問に答えます。
- このメソッドを呼び出しているのは何ですか。インターフェイス経由で、コントローラーのアクション、最小 API のハンドラー、バックグラウンドサービスまでたどれますか?
- 完全なルートと認可情報を含めて、どのエンドポイントがありますか。独自の権限属性も含めて確認できますか?
- これらの行を変更しました。どのエンドポイントやジョブに影響しますか?
ステータス:0.1.0。NuGet にはまだ公開されていません。以下の dnx を使うコマンドは、公開後に動作します。
grep や tree-sitter インデックスでは不十分な理由
テキストや構文を扱うツールでは、コンパイラーが認識する情報を参照できません。レイヤー構造のアプリケーション(コントローラー、サービスインターフェイス、サービス、リポジトリーインターフェイス、リポジトリー)では、最初のインターフェイスで追跡が止まり、コメントや文字列まで数えられ、誤ったオーバーロードに呼び出しが結び付けられ、共通のジェネリック基底メソッドがすべてのリポジトリーのホットスポットとして報告されます。CodeReach は Roslyn で各名前を解決するため、次のことができます。
IOrderService経由の呼び出しはOrderServiceに到達し、そのことも示されます。PermissionKeys.Orders.DeleteとPermissionKeys.Products.Deleteは別々のシンボルとして扱われます。OrderRepository.GetByIdAsyncは、メソッドがRepository<T>に定義されていても、OrderRepositoryが受け取る可能性のある呼び出しだけを数えます。- テストは名前ではなく、テストフレームワークを参照しているプロジェクトに基づいて除外されます。
- すべてのツールが同じグラフを参照するため、呼び出し元の数、使用箇所の数、トレースの結果が食い違うことはありません。
実行する
.NET 10 SDK と、ビルド可能なソリューションが必要です。
{
"mcpServers": {
"codereach": {
"command": "dnx",
"args": ["CodeReach.Mcp", "--yes"]
}
}
}
サーバーは、作業ディレクトリにある単一の .slnx、.sln、または .csproj をインデックス化します。別の場所を指定するには、args に "--", "--solution", "path/to/App.slnx" を追加します。
このリポジトリーをクローンして実行する場合:
dotnet run --project src/CodeReach.Mcp -- call trace_to_entrypoints '{"symbol":"OrderRepository.HardDeleteAsync"}' --solution samples/SampleShop
entry points that reach OrderRepository.HardDeleteAsync(Guid)
4 entry points (3 endpoint, 1 hosted-service), 1 unrooted tops; 10 symbols visited. Hidden: 2 call sites in test projects (include_tests=true shows them).
[endpoint] DELETE /api/Orders/{id:guid} auth: HasPermission(PermissionKeys.Orders.Delete = "orders.delete") [action]; Authorize [base ShopControllerBase]
OrdersController.Delete(Guid) src/Shop.Api/Controllers/OrdersController.cs:17
-> OrderPurger.PurgeAsync(Guid) called at src/Shop.Api/Controllers/OrdersController.cs:19 (bound to IOrderPurger.PurgeAsync(Guid))
-> OrderRepository.HardDeleteAsync(Guid) called at src/Shop.Application/Orders/OrderService.cs:47 (bound to IOrderRepository.HardDeleteAsync(Guid))
[hosted-service] OrderPurgeService
OrderPurgeService.ExecuteAsync(CancellationToken) src/Shop.Infrastructure/Jobs/OrderPurgeService.cs:9
-> OrderPurgeService.PurgeExpiredAsync() called at src/Shop.Infrastructure/Jobs/OrderPurgeService.cs:13
...
質問するより、見て確認したい場合はローカルページを利用できます
codereach ui --solution path/to/App.slnx
ブラウザーでページが開きます。そこには、コマンドバー(メソッド、ルート、impact、di を入力できます)と、ヘルスレポートが表示されます。レポートには、認可のないエンドポイント、キャプティブ依存関係、未登録のサービス、未コミットの変更が到達する範囲が含まれます。このページはツール自体が 127.0.0.1 上で一度限りのトークンを使って提供し、上記と同じツールから回答します。Ctrl+C で停止します。どこにもホストされません。
CodeReach は、すべてをユーザーのマシン上で実行するシンプルな MCP サーバーです。アカウントもホストされたサービスも不要で、情報が外部に送信されることもありません。フック、スキル、エージェントプロファイルはインストールせず、クライアント設定を変更することもなく、解析対象のソリューションに何も書き込みません。インデックスはユーザーキャッシュディレクトリに保存されます。
ツール
| ツール | 内容 |
|---|---|
trace_to_entrypoints | シンボルに到達するすべてのエンドポイント、ホストされたサービス、その他のルートと、それぞれにつながる1つの呼び出しパス |
impact | git diff(未コミットの変更、ベース参照、または差分テキスト)を、影響を受けるエンドポイントとジョブに対応付けます |
routes | 動詞、完全なルートテンプレート、ハンドラー、認可情報を含むエンドポイント。auth=noneを指定すると、保護されていないエンドポイントを一覧表示します |
callers / callees | インターフェースと仮想ディスパッチを解決した呼び出し関係を、指定した深さまで表示します |
find_usages | 種類(呼び出し、読み取り、書き込み、nameof、属性)ごとに、シンボルにバインドされたすべての参照を表示します。フレームワークのメンバーにも対応しています |
find_symbol | 名前で宣言を検索します |
entrypoints | トレースが終了するすべてのルート |
architecture | プロジェクト、それぞれが他のプロジェクトをどの程度利用しているか、最も多く呼び出されるメソッド、最も多く実装されているインターフェース |
type_hierarchy | 型が継承・実装するもの、その型を直接または間接的に継承するすべての型、そのメンバー、および各メンバーが実装またはオーバーライドする対象 |
di_registrations | すべてのAddScoped/AddSingleton/AddTransient/TryAdd/キー付き/ホストされた/AddHttpClient/AddDbContextの登録と、各コンストラクターが要求する依存関係を表示します。キャプティブ依存関係、注入されているが未登録のサービス、二重登録も報告します |
status / reindex | インデックスの状態と鮮度を表示します。更新を強制します |
プロンプト
エージェントに呼び出すツールと順序を指示する、すぐに使えるリクエストです。すべてのMCPクライアントに表示されます。Claude Codeでは/mcp__codereach__<name>として表示されます。
| プロンプト | 内容 |
|---|---|
review-diff | 変更による影響を確認します。認可付きエンドポイント、ジョブ、変更も必要な実装、DIの問題が対象です |
before-change | 1つのシンボルを変更した場合の影響範囲と、それをカバーするテストを確認します |
add-feature | ここで類似機能がどのように構築されているかを調べ、同じレイヤー構造に従って追加するファイルを計画します |
audit-auth | 認可がない、または匿名アクセス可能なエンドポイントを、リスク順に表示します |
explain-endpoint | ルートからすべてのレイヤーを経てデータアクセスに至る、1つのエンドポイントを説明します |
シンボルはType.Member、path/File.cs:line、または以前の回答にあるIDで指定します。曖昧な名前は、候補を一覧表示して拒否されます。すべてのツールはシェルコマンドとしても実行できます。codereach call <tool> '{json}'を実行すると、回答が得られた場合は0、検出事項がある場合は1、実行できなかった場合は2で終了します。
すべての回答に含まれる情報
- デフォルトのフィルターで除外された情報量。「非表示:テストプロジェクト内の呼び出し箇所7件。」
- 分析が完了したかどうか。 最終行は
analysis: complete、または読み込みやバインドに失敗したプロジェクトやドキュメントを示すPARTIALです。0件と表示されるのは、分析が完了した場合のみです。 - インデックスが最新かどうか。 先頭行が
STALEで始まる場合は、ファイルが変更され、更新処理が実行中です。 - 検出できなかったもの。 呼び出し元がない箇所で終了する呼び出しチェーンは、黙って除外されず、ルートなし(依存性注入、リフレクション、またはデッドコード)として報告されます。
最新の状態を保つ
大規模なソリューションの初回インデックス作成には、ビルドとほぼ同じ時間がかかります。その後、インデックスはファイルとして保存されます。ソースに変更がなければ、サーバーはミリ秒単位で応答し、Roslynを読み込むことはありません。ファイルが変更されると、本文のみの編集ではそのドキュメントだけを再抽出し、宣言の変更ではそのプロジェクトと、それに依存するプロジェクトを再抽出します。鮮度は呼び出しのたびに確認され、ファイル監視には依存しません。
設定
ソリューションと同じ場所に置く省略可能なcodereach.json:
{
// Attributes that mean authorization but implement no framework contract.
"authAttributes": ["HasPermission"],
// Fluent endpoint methods that mean authorization, besides RequireAuthorization.
"authEndpointMethods": ["RequirePermission"],
// Source that should not be indexed.
"exclude": ["**/Migrations/**"],
// Extra entry points: a method that implements an interface member, derives from a base type, or carries an attribute.
"entryPoints": [
{ "kind": "command-handler", "implements": "MyApp.ICommandHandler`1", "method": "HandleAsync" }
]
}
フレームワーク独自の認可コントラクトを実装する属性は、設定なしで認識されます。また、MediatRのハンドラー、MassTransitのコンシューマー、Quartzのジョブ、ミドルウェア、SignalRのハブ、Azure Functionsも認識されます。
モデル化の対象外
- 暗黙的なユーザー定義変換、および
foreach、using、await、分解、コレクション初期化子の内部で行われる呼び出し。 - リフレクション、および依存関係注入コンテナーによって呼び出されるコンストラクター(登録自体は
di_registrationsで読み取りますが、アセンブリスキャンによる登録やライブラリ内で行われる登録は除きます)。 - 複数の実装があるインターフェイス経由の呼び出しは、レシーバーの静的型で許可されるすべての実装について報告され、各ホップには候補数が示されます。
- グローバルな認可(フォールバックポリシー、グローバルな認可フィルター)は検出され、個々のエンドポイントには適用されず、ルート一覧の隣に報告されます。
- 規約ベース(属性を使用しない)の MVC ルートは
(conventional)として一覧表示されます。 - C# のみです。Razor Pages、gRPC、SignalR はエントリーポイントのルールから到達できますが、ルートとしては一覧表示されません。
開発
dotnet build
dotnet test --project tests/CodeReach.Tests
テストでは、上記のあらゆる落とし穴を含む小規模な架空の階層型アプリケーション samples/SampleShop をインデックス化し、Roslyn 独自の参照検索、すべて手作業で監査した完全なルートテーブル、および各種の増分編集後に一から作成したインデックスと結果を比較します。設計と計画については、docs/ARCHITECTURE.md および docs/PLAN.md をご覧ください。
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。