Start Debugging

MCP C# SDK 2.3: McpClient.ServerInfo が null 許容になりました。ビルドに影響する可能性があります

2026年10月20日にリリースされた ModelContextProtocol 2.3.0 では、2026-07-28 のサーバーが server/discover で自身の識別情報を省略できるため、McpClient.ServerInfo が Implementation から Implementation? に変わりました。その理由、警告をエラー扱いにしている場合に何が壊れるか、1 行で済む修正方法を解説します。

MCP C# SDK 2.3.0 が 2026年10月20日にリリースされました。マイナーバージョンとしては通常あまりない変更が 1 つ含まれています。McpClient.ServerInfo の注釈が Implementation から Implementation? に変わりました。CLR のシグネチャは同一なので、実行時やコンパイル済みの呼び出し元には影響しません。影響を受けるのは、<Nullable>enable</Nullable> と <TreatWarningsAsErrors>true</TreatWarningsAsErrors> を有効にしていて、このプロパティを直接参照しているプロジェクトです。

接続済みのサーバーに識別情報がない場合がある理由

プロトコルのリビジョン 2026-07-28 では、ハンドシェイクは従来の initialize ではなく server/discover で行われます。ディスカバリーでは、io.modelcontextprotocol/serverInfo メタデータは省略可能です。サーバーは自分が何者かを一切伝えないまま、ディスカバリーに応答し、ツールを公開し、呼び出しを処理できます。

2.3.0 より前の SDK は、この状況をモデル化していませんでした。そのようなサーバーへの接続自体は成功しますが、その後に ServerInfo を読み取ると InvalidOperationException がスローされました。これはクライアントがまったく接続されていない場合と同じ例外です。そのため、正しく動作しているサーバーが壊れた接続のように見えていました。PR #1903 は、代わりに null を返すことでこれを修正しました。

public override Implementation? ServerInfo => _serverCapabilities is null
    ? throw new InvalidOperationException("The client is not connected.")
    : _serverInfo;

この変更から、次の 3 つのルールが導かれます。

不正な形式のメタデータは、これまでどおり JsonException で接続に失敗します。したがって null は “提供されなかった” ことを意味し、“壊れたデータ” を意味しません。

クライアントコードでの修正方法

次のようなコードは、.Name へのアクセスで CS8602 が発生するようになります。

await using var client = await McpClient.CreateAsync(transport);

logger.LogInformation("Connected to {Server} {Version}",
    client.ServerInfo.Name, client.ServerInfo.Version);

null の場合を明示的に処理してください。

await using var client = await McpClient.CreateAsync(transport);

var name = client.ServerInfo?.Name ?? "Unknown server";
var version = client.ServerInfo?.Version ?? "n/a";

logger.LogInformation("Connected to {Server} {Version}", name, version);

! 演算子には頼らないでください。警告は消えますが、ディスカバリーのみに対応したサーバーにクライアントを向けた最初の瞬間に、NullReferenceException が復活します。また、リリースノートでも、この自己申告の識別情報は “セキュリティ上の判断に使ってはならない” と明言されています。ServerInfo.Name に基づいてツールへのアクセスを制御しているなら、それはもともと誤りでした。ここで null に出会ったのは、自分で管理できる設定に置き換える良い機会です。

2.3.0 のその他の変更点

このリリースは主に相互運用性と信頼性に関する改善で、どれも取り込む価値があります。

アップグレードはパッケージの更新だけです。

dotnet add package ModelContextProtocol --version 2.3.0

まだ 1.x を使っている場合は、先に 1.x から 2.x への移行を行ってください。その後、警告をエラーとして扱う設定でビルドし、ServerInfo を参照している箇所をコンパイラーにすべて洗い出させましょう。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る