C# Class Analyzer MCP について
CSharpAnalyserMcp は、C# ソリューションを調べる AI アシスタントや開発者向けの読み取り専用 MCP サーバーです。Roslyn を使い、ファイル全体をコンテキストに含めず、宣言、ドキュメント、継承関係、メソッドソースを個別に照会できます。
主な機能
- 01フォルダーまたは名前空間ごとの型一覧
- 02型ドキュメントとメンバーシグネチャの取得
- 03メソッドのシグネチャ、ドキュメント、本文の確認
- 04継承関係とメソッドのオーバーライドの追跡
- 05正規表現によるソース検索
- 06キャッシュしたソリューションスナップショットの更新
活用シーン
- 01大規模な C# ソリューションで型を検索
- 02ファイル全体を読み込まずにメソッドを調査
- 03実装と継承関係を追跡
- 04パターンに一致する C# ソースを検索
MCP 対応
このサーバーは stdio で通信し、Roslyn による読み取り専用クエリを MCP ツールとして公開します。MCP のハンドシェイク前に、指定されたソリューションをキャッシュ済みスナップショットに読み込みます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
English | 简体中文
CSharpAnalyserMcp
AI アシスタントが Roslyn を通じて任意の C# ソリューションを参照できる、読み取り専用の Model Context Protocol(MCP)サーバーです。
このサーバーは MSBuildWorkspace でソリューションを読み込み、Roslyn のスナップショットをキャッシュしたうえで、各型の宣言場所や XML ドキュメント、メソッドのシグネチャ、ドキュメント、ソースの場所、本文などについて構造化されたクエリに回答します。そのため、エージェントはファイル全体をコンテキストウィンドウに読み込むのではなく、必要なソースの範囲だけを取得できます。
- トランスポート:stdio(
StdioServerTransport)。プロトコルの通信は stdout のみで行い、すべてのログは stderr に出力されます。 - ソリューションのパスはコマンドラインで渡します(
--workspace <path to .sln>)。MCP ハンドシェイクの前にソリューションが読み込まれるため、パスが無効な場合は stderr にメッセージを出力し、ゼロ以外の終了コードで速やかに終了します。 - すべてのツールは MCP テキストコンテンツを返し、
structuredContentは返しません。リスト/階層/検索ツールはエントリごとに 1 つのテキストブロックを返します(クライアントから見ると文字列のリストです)。詳細ツールはpath / desc / namespace / signature / bodyのブロックを、---の行で区切って出力します。 - 配布:.NET ツール CSharpAnalyserMcp(コマンド
csharp-analyser-mcp)として NuGet で公開され、公式の MCP Registry にio.github.undy-mosq/CSharpAnalyserMcpとして登録されています。
インストール
NuGet .NET ツール(推奨)
dotnet tool install --global CSharpAnalyserMcp
csharp-analyser-mcp --workspace D:\MyProject\MySolution.sln
# upgrade / remove
dotnet tool update --global CSharpAnalyserMcp
dotnet tool uninstall --global CSharpAnalyserMcp
グローバルにインストールしてください。--local でインストールするとマニフェストエントリが書き込まれるだけで、csharp-analyser-mcp は PATH に追加されないため、MCP クライアントから起動できません。
dnx を使ったオンデマンド実行(インストール不要、.NET SDK 10 以降)
# "--" separates dnx options from the arguments forwarded to the server
dnx CSharpAnalyserMcp --yes -- --workspace D:\MyProject\MySolution.sln
ソースからのインストール
git clone https://github.com/undy-mosq/CSharpAnalyserMcp
dotnet build CSharpAnalyserMcp\CSharpAnalyserMcp.csproj
dotnet run --project CSharpAnalyserMcp -- --workspace D:\MyProject\MySolution.sln
必要条件
| 用途 | 必要条件 |
|---|---|
公開済みツールの実行(dotnet tool install --global) | PATH に .NET SDK 8.0 以降があること(パッケージのターゲットは net8.0 です) |
dnx を使ったオンデマンド実行 | .NET SDK 10.0 以降(dnx は SDK に付属しています) |
| ソースからのビルド/実行 | .NET SDK 8.0 以降(プロジェクトのターゲットは net8.0 です) |
| 解析対象ソリューションの読み込み | ソリューションを開ける MSBuild ツールチェーン。Visual Studio 2022 または VS Build Tools(Microsoft.Build.Locator がインストール済みの最新インスタンスを登録します)、あるいは SDK スタイルのプロジェクトの場合は .NET SDK 自体 |
クライアントの設定
サーバーは、ソリューションファイルを指定する単一の引数 --workspace を付けて起動します。
インストール済みの .NET ツール
グローバルツールの shim は %USERPROFILE%\.dotnet\tools にあります。MCP クライアントは自らプロセスを起動し、継承した PATH のみを参照するため、設定では shim の絶対パスを指定してください(%USERPROFILE% を展開します。例:C:\Users\you\.dotnet\tools\csharp-analyser-mcp.exe)。
Claude Desktop(claude_desktop_config.json):
{
"mcpServers": {
"csharp-analyser": {
"command": "C:\\Users\\you\\.dotnet\\tools\\csharp-analyser-mcp.exe",
"args": ["--workspace", "D:\\MyProject\\MySolution.sln"]
}
}
}
VS Code(.vscode/mcp.json):
{
"servers": {
"csharp-analyser": {
"type": "stdio",
"command": "C:\\Users\\you\\.dotnet\\tools\\csharp-analyser-mcp.exe",
"args": ["--workspace", "D:\\MyProject\\MySolution.sln"]
}
}
}
コマンド名のみの指定("command": "csharp-analyser-mcp")が機能するのは、そのディレクトリがすでにクライアントの PATH にある場合だけです。ツールをインストールする前に起動したクライアントは古い環境を保持するため、PATH を変更した後は再起動してください。
dnx を使ったオンデマンド実行(インストールなし)
{
"servers": {
"csharp-analyser": {
"type": "stdio",
"command": "dnx",
"args": ["CSharpAnalyserMcp", "--yes", "--", "--workspace", "D:\\MyProject\\MySolution.sln"]
}
}
}
バージョンを固定するには、パッケージ ID に @<version> を追加します。NuGet パッケージページの MCP Server タブから、同じ JSON をコピーできます。dnx は .cmd shim です。クライアントがこれを起動できない場合は、代わりに同等の dotnet 形式を使用してください。"command": "dotnet" と "args": ["tool", "exec", "CSharpAnalyserMcp", "--yes", "--", "--workspace", "D:\\MyProject\\MySolution.sln"] を指定します。
公開済み実行ファイル
VS Code(.vscode/mcp.json):
{
"servers": {
"csharp-analyser": {
"type": "stdio",
"command": "C:\\Tools\\csharp-analyser\\CSharpAnalyserMcp.exe",
"args": ["--workspace", "D:\\MyProject\\MySolution.sln"]
}
}
}
ソースからプロジェクトを実行する
{
"servers": {
"csharp-analyser": {
"type": "stdio",
"command": "dotnet",
"args": [
"run",
"--project",
"D:\\MyProject\\CSharpAnalyserMcp\\CSharpAnalyserMcp\\CSharpAnalyserMcp.csproj",
"--",
"--workspace",
"D:\\MyProject\\MySolution.sln"
]
}
}
}
VS Code で F5 を押すと、サーバー自体をデバッグできます。.vscode/launch.json にはすでに --workspace 引数が渡されているため、独自のソリューションを指定してください。
ツール
| ツール | MCP アノテーション | 目的 |
|---|---|---|
list_classes_in_folder | 読み取り専用 | フォルダーとそのサブフォルダー内の型宣言を一覧表示します(型ごとに1つのテキスト)。 |
list_classes_in_namespace | 読み取り専用 | 名前空間内の型宣言を一覧表示します(サブ名前空間は任意、型ごとに1つのテキスト)。 |
get_class_documentation | 読み取り専用 | 宣言行で特定した型の XML ドキュメントとメンバーシグネチャを返します。 |
get_method | 読み取り専用 | 宣言行と、それを宣言する型の宣言行で特定したメソッドのシグネチャ、XML ドキュメント、場所、本文を返します。 |
find_inheritance | 読み取り専用 | 型の派生型ツリーを一覧表示します(最初の項目は型自体です)。 |
find_method_overrides | 読み取り専用 | メソッドのオーバーライド/実装を一覧表示します(最初の項目はメソッド自体です)。 |
search_regex | 読み取り専用 | 正規表現を使ってディレクトリ/ファイルを行単位で検索します(既定では *.cs のみ)。一致ごとに1つのテキストを返します。 |
reload_solution | 冪等 | ソースファイルの変更後に Roslyn スナップショットを再構築します。 |
set_resolve_base_path | 冪等 | 相対パスの解決に使うディレクトリを変更します。 |
list_classes_in_folder
{ "folderPath": "src/Services", "kinds": ["class", "interface"] }
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
folderPath | string、必須 | — | 絶対パス、または解決ベースディレクトリ(既定ではソリューションのディレクトリ)からの相対パスです。 |
kinds | string[] | ["class"] | 含める型の種類です(型の種類と kinds を参照)。 |
bin/obj 内のファイルはスキップされます。文字列のリストを返し、型ごとに1つのテキストコンテンツが含まれます。書式は {relativePath} L{start}-{end} {namespace}: {signature} です。グローバル名前空間の場合、名前空間の部分は省略されます。partial 型の場合は、最初の宣言の場所と末尾の ...(partial xN) が示されます。
list_classes_in_namespace
{ "namespaceName": "MyApp.Services", "includeSubNamespaces": true, "kinds": ["all"] }
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
namespaceName | string | グローバル名前空間 | 名前空間名です。例:MyApp.Services。空文字列、global、global namespace、<global namespace> はすべてグローバル名前空間を意味します。 |
includeSubNamespaces | bool | true | 子名前空間で宣言された型も含めます。 |
kinds | string[] | ["class"] | 含める型の種類です。 |
get_class_documentation
{ "typeDeclaration": "public static class ItemConfig", "maxXmlChars": 2000 }
| パラメーター | 型 | 既定値 | 説明 |
|---|---|---|---|
typeDeclaration | string、必須 | — | 型の宣言行(一覧表示ツールが出力する signature 部分)です。例:public static class ItemConfig。空白は除去され、その後、正規のシグネチャまたは宣言の最初のソース行と完全に一致する必要があります。 |
namespaceName | string | 任意の名前空間 | 型の名前空間です。空文字列または global はグローバル名前空間を意味します。 |
maxXmlChars | int | 2000 | 型ごとの生の XML ドキュメント(desc フィールド)の最大文字数です。0 = 制限なし。 |
一致した場合、結果は path / desc / namespace(グローバル名前空間は global と表示)/ signature / body(メンバーシグネチャを1行ずつ表示)からなるテキストブロックです。複数の一致は、--- のみを含む行で区切られます。一致しない場合は (no match) に続けて candidates : と候補の宣言行が表示されます。
get_method
{ "methodDeclaration": "public static void SetEffect(RoleAttributes owner, int stack)", "typeDeclaration": "public class RoleAttributes", "namespaceName": "DuelModel" }
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
methodDeclaration | string, required | — | メソッドの宣言行です。例:public static string TextName(this ItemInfo.ItemType itemType)。このテキストからメソッド名とパラメーター型が解析されます。 |
typeDeclaration | string, required | — | 宣言元のクラス/インターフェイス/構造体の宣言行です。例:public static class ItemConfig。 |
namespaceName | string | any namespace | 宣言元の型の名前空間です。空または global はグローバル名前空間を意味します。 |
maxBodyChars | int | 8000 | メソッド本体の最大文字数です。0 は無制限を意味します。 |
照合ルール:
- どちらの宣言行も、空白を取り除いた後、正規シグネチャまたは宣言のソースの最初の行と完全に一致する必要があります(部分文字列での照合は行いません)。
- 型自体が宣言するメンバーのみを検索します(通常のメソッド。継承されたメンバー、コンストラクター、プロパティは対象外です)。明示的なインターフェイス実装(
IFoo.Bar)も照合されます。 - 宣言行から解析されたパラメーター型は、名前空間プレフィックスを除き、大文字と小文字、および空白を無視して比較されます。C# のエイリアスはメタデータ名に変換されます(
int→Int32、string→String、…)。比較は段階的に緩和されます:完全一致 → ジェネリック引数を無視 → パラメーターリストの先頭部分を許容。 - 一致するものがない場合は、
(no match)の後にcandidates :と候補の宣言行が出力されます(まず同じ名前のメソッド、該当しない場合はその型のすべてのメソッド)。
結果はオーバーロードごとにテキストブロックで出力されます:path / desc(未加工の XML ドキュメント、最大 2000 文字)/ namespace / class / signature / body(最外部の波括弧と共通のインデントを取り除いたソース)。オーバーロードは --- の行で区切られます。
find_inheritance
{ "typeDeclaration": "public abstract class BuffEntity", "namespaceName": "Duel" }
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
typeDeclaration | string, required | — | クラス/インターフェイス/構造体/レコードの宣言行です。 |
namespaceName | string | any namespace | 型の名前空間です。空または global はグローバル名前空間を意味します。 |
最初の項目は照会された型自身です(インデントもプレフィックスもありません)。派生型はそれぞれ独立したテキスト内容として、階層レベルごとにタブ 1 つでインデントされ、- が付加されます。クラスをルートとする場合は、そのクラスから派生するクラス/レコードが報告されます。インターフェイスをルートとする場合は、サブインターフェイスと、そのインターフェイスを直接実装するクラス/構造体/レコードが報告されます。ジェネリックな基底型は OriginalDefinition で照合されます(Base<T> と Base<int> は同じ基底型として扱われます)。各型は最も浅い階層で一度だけ表示されます。一致するものがない場合は、(no match) の後に candidates : と候補の宣言行が出力されます。
find_method_overrides
{ "methodDeclaration": "public abstract void Apply(BuffEntity buff)", "typeDeclaration": "public abstract class BuffEntity", "namespaceName": "Duel" }
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
methodDeclaration | string, required | — | メソッドの宣言行です。 |
typeDeclaration | string, required | — | 宣言元のクラス/インターフェイス/構造体の宣言行です。 |
namespaceName | string | any namespace | 宣言元の型の名前空間です。空または global はグローバル名前空間を意味します。 |
最初の項目はメソッド自身です。実装/オーバーライドはそれぞれ独立したテキスト内容として、階層レベルごとにタブ 1 つでインデントされ、- が付加されます。インターフェイスメンバーをルートとする場合は、すべての実装型における実装メソッド(明示的な IFoo.Bar 実装を含む)が報告されます。クラスメソッドをルートとする場合は、派生クラスの override が報告されます。下方向のみが報告され、基底の宣言を上方向にたどることはありません。一致するものがない場合は、(no match) の後に candidates : と候補の宣言行が出力されます。
search_regex
{ "path": "src/Services", "pattern": "public\\s+\\w+\\s+Get", "fileFilters": ["*.cs"] }
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
path | string, required | — | ディレクトリまたはファイルです。絶対パス、または解決ベースディレクトリからの相対パスを指定します。 |
pattern | string, required | — | 行ごとに照合する.NET正規表現です(デフォルトでは大文字と小文字を区別します。区別しない場合は (?i) を使用します)。 |
fileFilters | string[] | ["*.cs"] | ファイル名のグロブパターンです(* / ? を使用し、大文字と小文字を区別せず、複数のパターンは OR で照合します)。path がファイルの場合は無視されます。 |
- ディレクトリは再帰的に検索されます。
bin/obj/.gitとシンボリックリンクされたディレクトリはスキップされます。ファイルパスの場合は、そのファイルを直接検索します。 - 各一致は1つのテキストコンテンツとして返されます:
{relativePath} L{line}: {line text}(行テキストはトリミングされます)。 - 一致数は最大1000件です。結果が切り捨てられた場合、最後に
... [truncated: showing 1000 of N matches]という項目が追加されます。 - ディスク上のファイルを読み取るため、Roslyn スナップショットや
reload_solutionの影響を受けません。 - パスが存在しない場合や正規表現が無効な場合は、テキストに理由を含む
isErrorが返されます。一致がない場合は(no match)が返されます。
reload_solution
パラメーターはありません。キャッシュされたスナップショットを破棄してソリューションを再度開くため、以降のクエリではディスク上の最新ファイルが参照されます。solution / resolveBaseDirectory / projects / reloaded : true ({ms} ms) を出力します。
set_resolve_base_path
{ "basePath": "src" }
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
basePath | string | ソリューションディレクトリ | 絶対パス、または現在のベースディレクトリからの相対パスです。空または省略すると、デフォルト(ソリューションファイルのディレクトリ)に戻ります。 |
型の種類と kinds
kind は小文字で指定し、相互に排他的です:class、static class、record、struct、record struct、interface、enum、delegate。static にできるのはクラスだけなので、class と static class は別々の種類です。構造体、列挙型、インターフェース、デリゲートには static 形式はありません。
kinds フィルターでは大文字と小文字が区別されず、複数の値を指定できます(kinds を省略すると ["class"] と同じ動作になります)。
kinds の値 | 一致する型 |
|---|---|
(省略) / class | static クラスとレコードを含むすべてのクラス |
static / static class | static クラスのみ |
record | レコードとレコード構造体 |
struct | 構造体とレコード構造体 |
record struct | レコード構造体のみ |
enum / interface / delegate | その種類 |
all | すべての型 |
同じ表、宣言行プロトコル(typeDeclaration / methodDeclaration の厳密な照合と candidates による復元)、およびテキスト出力形式は、initialize ハンドシェイク時にサーバーレベルの指示としてクライアントに送信されます(Tools/ServerInstructions.cs を参照)。そのため、モデルが有効な値や出力形式を推測する必要はありません。
出力形式
すべてのツールは MCP テキストコンテンツを返し、structuredContent は返しません。一覧表示/階層/検索ツールは項目ごとに1つのテキストコンテンツを返すため、クライアントは改行で連結された単一のブロックではなく、文字列のリストを受け取ります。パスは解決ベースディレクトリ(デフォルトではソリューションのディレクトリ)からの相対パスで表示され、区切り文字には / が使われます。
一覧表示(list_classes_in_folder / list_classes_in_namespace)
各型は1つのテキストコンテンツとして返されます(ツールは文字列のリストを返します)。
{relativePath} L{start}-{end} {namespace}: {signature}
グローバル名前空間の場合、名前空間セグメントは省略され(: だけが残ります)、partial 型では最初の宣言の位置の後ろに ...(partial xN) が付加されます。一致しない場合は (no match) という項目が1つ返されます。
script/config/ItemConfig.cs L14-163: public static class ItemConfig
src/Services/UserService.cs L12-88 MyApp.Services: public class UserService : BaseService
型の詳細(get_class_documentation)
同名の型ごとに1つのブロックが返され、ブロックは --- のみを含む行で区切られます。
path : {relativePath} L{start}-{end}
desc :
{raw XML documentation, truncated to maxXmlChars; the whole section is omitted when there is none}
namespace : {namespace; the global namespace prints as global}
signature : {modifiers + kind + name + type/primary-constructor parameters + constraints + base list}
body :
{member signatures, one per line: enum members / fields / properties / methods / events / nested types; omitted when there are none}
メソッドの詳細(get_method)
オーバーロードごとに1つのブロックが返され、ブロックは --- のみを含む行で区切られます。
path : {relativePath} L{start}-{end}
desc :
{raw XML documentation, 2000-char cap}
namespace : {namespace}
class : {type name}
signature : {modifiers + return type + name + parameters (including this / ref / out / in / params)}
body :
{method source: block bodies lose their outermost braces and common indentation, expression bodies lose "=>"}
一致しない場合は (no match) の後に candidates : と候補の宣言行が出力されます(宣言パラメーターにそのままコピーできる簡潔な行形式です)。
(no match)
candidates :
script/config/ItemConfig.cs L16-39: public static string TextName(this ItemInfo.ItemType itemType)
script/config/ItemConfig.cs L40-120: public static void RegisterItem(ItemModel model)
階層(find_inheritance / find_method_overrides)
最初の項目は照会した型/メソッド自体です(インデントなし、- なし)。派生型/実装はそれぞれ独立したテキスト内容として続き、階層レベルごとにタブ1つ分インデントし、- を付けます。
script/config/BuffEntity.cs L12-40 Duel: public abstract class BuffEntity
-script/config/DamageBuff.cs L8-25 Duel: public class DamageBuff : BuffEntity
-script/config/BurnBuff.cs L6-18 Duel: public class BurnBuff : DamageBuff
-script/config/HealBuff.cs L9-20 Duel: public class HealBuff : BuffEntity
一致するものがない場合は、(no match) の項目が1つだけ返されます。一致候補がある場合は、その後に candidates : と候補の宣言行が続きます。
正規表現検索(search_regex)
一致する項目ごとに1つのテキスト内容が返されます。
src/Services/UserService.cs L42: public User GetById(int id)
一致するものがない場合は、(no match) の項目が1つだけ返されます。一致件数が1000件を超える場合は、最後に切り詰めを示す項目が追加されます。
ワークスペース(reload_solution / set_resolve_base_path)
solution : {absolute path of the solution file}
resolveBaseDirectory : {resolve base directory}
projects : {project count}
reloaded : true ({ms} ms)
出力制限
ツールの結果を小さく保つため、長いペイロードは切り詰められます。追加されるマーカーは ... [truncated: showing {n} of {m} chars] です。すべてのしきい値は Services/TextTruncator.cs にあります。
| ペイロード | 既定の上限 | 上限を解除する方法 |
|---|---|---|
desc(XML ドキュメント) | 2000 chars | get_class_documentation の maxXmlChars(get_method は2000で固定) |
メソッドの body | 8000 chars | get_method の maxBodyChars |
maxXmlChars / maxBodyChars に 0 を渡すと、その呼び出しでは切り詰めが無効になります。
一般的なワークフロー
--workspaceにソリューションを指定して、サーバーを一度起動します(MCP クライアントが起動します)。- 型を検索します。
list_classes_in_namespace { "namespaceName": "MyApp.Services" }またはlist_classes_in_folder { "folderPath": "src/Services", "kinds": ["all"] }を使用します。特定の文字列を検索するには、search_regex { "path": "src", "pattern": "..." }を使用します。 - 一覧から型の宣言行をコピーして、その型の仕様を読み取ります。
get_class_documentation { "typeDeclaration": "public class UserService : BaseService" } - 実装の正確な内容を読み取ります。
get_method { "methodDeclaration": "public User GetById(int id)", "typeDeclaration": "public class UserService : BaseService" } - 階層をたどります。
find_inheritance { "typeDeclaration": "public abstract class UserServiceBase" }またはfind_method_overrides { "methodDeclaration": "public abstract User GetById(int id)", "typeDeclaration": "public abstract class UserServiceBase" } - ソースファイルを変更した後、次のクエリの前に
reload_solutionを呼び出します。そうしないと、クエリは古いスナップショットに基づいて回答し続けます。
トラブルシューティング
- サーバーが標準エラー出力に
Solution file not found(または別の MSBuild エラー)を出してすぐ終了する →--workspaceのパスが間違っています。フォルダーではなく、ソリューションファイルを指定する必要があります。 - クライアントの MCP ログに
The command "dnx" was not foundと表示される →dnxは .NET SDK 10 以降に含まれています。.NET SDK 10 をインストールするか、インストール済みのツールまたは公開済みの実行ファイルを使用してください。 dotnet tool installで、パッケージが .NET ツールではないと報告される → 指定したバージョンはPackAsToolが有効になる前にパッケージ化されています。代わりに現行バージョンをインストールしてください(インストール済みのものはdotnet tool list --globalで確認できます)。- クライアントログに
spawn csharp-analyser-mcp ENOENTまたはMCP error -32000: Connection closedと表示される → クライアントが実行するよう指示されたコマンドを解決できませんでした。%USERPROFILE%\.dotnet\tools\csharp-analyser-mcp.exeの絶対パスを使用して、クライアントを再起動してください(--localインストールでは、そこに shim はありません)。 - リリース直後に
Cannot find package CSharpAnalyserMcp with version x.y.zと表示される → NuGet のインデックスへの反映がリリースより遅れることがあります。後でもう一度試すか、ダウンロードした.nupkgからインストールしてください。dotnet tool install -g --add-source <folder> CSharpAnalyserMcp --version x.y.z
動作に関する注意事項と制限
- スナップショットのセマンティクス。 ソリューションはディスクから一度だけ読み込まれます。ファイルの編集内容は、
reload_solutionの後にのみ反映されます。未保存のエディターバッファーは表示されません。 - 正規表現検索はディスクを読み取ります。
search_regexは Roslyn のスナップショットを介さずにファイルを直接読み取り、デフォルトでは*.csを検索します。再帰検索時にはbin/obj/.gitをスキップし、最大 1000 件の一致を返します。 - ソースのみを表示。
bin/obj内の構文ツリーはスキップされるため、ソース宣言のない型は報告されません。 - 宣言されたメンバーのみ。
get_methodは基底型、インターフェース、またはpartial型の別の部分を調べません。 - 名前の完全一致。 型名とメソッド名は完全に一致する必要があります。名前空間は完全な表示文字列で比較されます。曖昧さを避けるには、
namespaceName(または修飾されたclassName)を使用してください。 - コスト。 クエリのたびに各プロジェクトのコンパイルが求められるため、ソリューションの規模に応じて応答時間が長くなります。
- 診断。 ワークスペースの読み込みに関する問題は、
[WorkspaceFailed] {Kind}: {Message}として stderr に書き込まれます。stdout に出力されるのは JSON-RPC のみです。 - 1 プロセスにつき 1 つのソリューション。 ワークスペースのパスは起動時に固定されます。別のソリューションを解析するには、別のインスタンスを起動してください。
ライセンス
MIT — LICENSE を参照してください。
ビルド、公開、リリースプロセスについては、docs/DEVELOPMENT.zh-CN.md(中国語)を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。