.NET で MCP サーバー・クライアントを試してみよう その 3
基本的に前々回と前回の記事で書いたので C# の ModelContextProtocol
のライブラリがどういう感じで作られているのかを少しだけ触れていきます。
ModelContextProtocol
は色々な LLM のモデルごとのツール呼び出しやリソースやプロンプトを共通的に提供するためのプロトコルです。
これにさえ対応しておけば、様々な LLM のライブラリから共通的に使えるようになります。(現時点だと、まだ「なる予定」ですかね?)
.NET での実装だけに絞ってみると LLM の Chat Completions API を叩くための共通のライブラリとして Microsoft.Extensions.AI
というライブラリがあります。これは Chat Completions API や、それと互換性があるものや、似た雰囲気のものを共通の API で叩くための抽象化レイヤーを提供するライブラリです。まだプレビュー版なのですが、今後はこれを使ってさえいれば .NET だとコードの互換性を保ったまま、様々な LLM のモデルに対応できるようになるでしょう。
ModelContextProtocol
は、その上にのっかる形で実装されています。そのため Microsoft.Extensions.AI
を使っているアプリケーションとシームレスに連携可能なように出来ています。例えば前々回の記事で AI っぽさを足そうのセクションで書いていたコードに以下のような処理があります。
// 品川の天気を聞いてツールを呼び出してもらう
var aiResponse1 = await chatClient.GetResponseAsync(
new ChatMessage(ChatRole.User, "今日の品川の天気は?"),
new ChatOptions
{
ToolMode = ChatToolMode.Auto,
Tools = [.. mcpTools]
});
この chatClient
変数は Microsoft.Extensions.AI
に定義されている IChatClient
インターフェースです。そして、ChatOptions
の Tools
に渡している mcpTools
は ModelContextProtocol
のライブラリを使って取得した McpClientTool
のリストです。それをそのままシームレスに渡すことが出来ます。
これが出来るのは McpClientTool
が Microsoft.Extensions.AI
の AIFunction
を継承する形で定義されているためです。実際に McpClientTool
の定義を見てみると以下のようになっています。
/// <summary>Provides an AI function that calls a tool through <see cref="IMcpClient"/>.</summary>
public sealed class McpClientTool : AIFunction
{
// 以下略
}
あとは、実際に私はまだ使ったことないのでわからないのですが Model Context Protocol のサンプリング (この記事の説明がわかりやすそうです) 機能を使う場合も IChatClient
インターフェースを通して出来るようになっています。
つまり .NET に限って言うと Microsoft.Extensions.AI
を使うことでどんな LLM を使っていても、ほぼ同じコードで Model Context Protocol の機能を使うことが出来るようになっています。これが出来るのは ModelContextProtocol
が Microsoft.Extensions.AI
の上に実装されているからです。便利ですね。
Prompty
のライブラリは Microsoft.Extensions.AI
と連携可能なように作られていますし、Semantic Kernel
も Microsoft.Extensions.AI
との相互運用機能が追加されてきていますし。着々と以下のように Microsoft.Extensions.AI
を中心としたエコシステムが出来上がって来つつあります。
例えば、Semantic Kernel で定義できる Kernel Function は Microsoft.Extensions.AI
の AIFunction
に変換できるので、それを経由して Model Context Protocol のツールとして公開することが出来るようになっています。とってもいい感じに Microsoft.Extensions.AI
が色々なものを繋ぐ糊のように働いています。
まとめと感想
ということで .NET での AI 関連の機能の将来が明るそうに見えるので、このまま Python に置いて行かれないくらいのスピードで追いかけてほしいなぁと思う今日この頃でした。
正直、スピード感はもう少し欲しいなとは思うことは多々あります。新機能が追加されたときに Python だと使えるのに…!と思うことは多いです。でも、少し後発になるぶん、ちゃんとこなれた感じで整理されていたり正式リリースされた API の安定感とかはあるので、そこは良いところだなぁと思ってます。
Discussion