Integrating Model Context Protocol (MCP) Tools with Semantic Kernel: A Step-by-Step Guide について
MCP サーバーを Microsoft Semantic Kernel に接続し、ツールを LLM の関数呼び出しに使う方法を示す .NET サンプルです。開発者向けに、ローカルサーバーと対話型クライアントを含みます。
主な機能
- 01設定済み MCP サーバーへの接続
- 02MCP ツールを Semantic Kernel 関数に変換
- 03ローカル .NET MCP サーバーを同梱
- 04対話型のツール一覧表示と実行
- 05設定検証とリトライ処理
活用シーン
- 01MCP と Semantic Kernel の連携方法の確認
- 02ローカルサーバーのツール呼び出しテスト
- 03Semantic Kernel 経由での LLM による MCP ツール呼び出し
MCP 対応
クライアントは stdio で MCP サーバーに接続してツールを取得し、Semantic Kernel 関数として利用できます。ローカル .NET MCP サーバーを含みますが、HTTP、WebSocket、名前付きパイプのトランスポートは未実装です。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Semantic Kernel と Model Context Protocol(MCP)ツールの統合:ステップバイステップガイド
このリポジトリでは、Model Context Protocol(MCP)ツールを Microsoft Semantic Kernel と統合する方法を紹介し、AI モデルと外部データソースやツールとのシームレスな連携を実現します。このガイドに従うと、MCP サーバーへの接続方法、MCP ツールを Semantic Kernel 関数に変換する方法、再利用可能で拡張性の高いフレームワーク内で関数呼び出しに大規模言語モデル(LLM)を活用する方法を学べます。
クイックスタート - デモの実行
前提条件
- .NET SDK(バージョン 9.0 以降 - プレビュー版の機能を使用します)
- Node.js と npm(任意 - GitHub や Everything などの外部 MCP サーバーにのみ必要です)
- OpenAI API キー(任意 - Semantic Kernel との統合にのみ必要です)
- ModelContextProtocol NuGet パッケージ(バージョン 0.1.0-preview.8 - 自動的に含まれます)
- C# と Semantic Kernel の基本的な知識
注:Node.js が必要なのは、Node.js パッケージとして公開されている外部 MCP サーバー(GitHub、Everything)だけです。デモはローカルの .NET MCP サーバーだけで問題なく動作するため、Node.js への依存を完全に避けられます。
1. クローンとビルド
git clone https://github.com/LiteObject/mcp-with-semantic-kernel.git
cd mcp-with-semantic-kernel
dotnet restore
dotnet build
2. 設定(任意)
Semantic Kernel との統合用に OpenAI API キーを設定します(任意です):
dotnet user-secrets set "OpenAI:ApiKey" "your-api-key-here" --project src/Demo.MCP.Client
3. MCP クライアントのデモを実行
dotnet run --project src/Demo.MCP.Client
アプリケーションは次の処理を行います:
- 有効な MCP サーバーに自動接続します(appsettings.json で設定)
- 接続した各サーバーの利用可能なツールを一覧表示します(「ローカル MCP サーバーのツール」セクションを参照)
- サンプル呼び出しを使ってツールの実行をデモします(Echo ツールのテスト)
- コマンドを試せる対話モードを開始します
4. ローカルサーバーのみで手軽にテスト
Node.js が不要な最もシンプルなセットアップでは、ローカルの .NET MCP サーバーのみを使用するよう、デモがあらかじめ設定されています。次を実行するだけです:
# The client (already configured to use local server)
dotnet run --project src/Demo.MCP.Client
ローカルサーバーには、包括的なテストツールが含まれています(「ローカル MCP サーバーのツール」セクションを参照)。
5. 対話型コマンド
クライアントの実行後、次のコマンドを試してください:
> servers # List connected servers
> list local # List tools for local server
> call local Add {"a": 5, "b": 3} # Test calculator tool (note: case-sensitive "Add")
> call local Echo {"name": "World"} # Test echo tool (note: case-sensitive "Echo")
> call local GetDateTime {} # Get current time (no parameters needed)
> exit # Quit the application
重要な注意事項:
- ツール名では大文字と小文字が区別されます("add" ではなく "Add" を使用してください)
- パラメーターは有効な JSON 形式である必要があります
- ツールで定義されている正確なパラメーター名を使用してください(例:Add ツールでは "a" と "b")
6. 外部サーバーを有効にする(任意)
GitHub サーバーと Everything サーバーでテストするには、src/Demo.MCP.Client/appsettings.json を編集して有効にします。重要:有効にしたい各サーバーの "Enabled" プロパティのみを true に変更してください。設定オブジェクト全体を置き換えないでください。
変更例(サーバー設定全体については「設定」セクションを参照):
{
"McpServers": {
"github": {
"Enabled": true // Change this from false to true
// Keep all other properties unchanged
},
"everything": {
"Enabled": true // Change this from false to true
// Keep all other properties unchanged
},
"local": { "Enabled": true }
}
}
その後、クライアントを再起動します。これには Node.js とインターネット接続が必要です。
Model Context Protocol(MCP)とは?
Model Context Protocol(MCP) は、アプリケーションが AI モデルにコンテキストを提供する方法を標準化するために設計されたオープン標準プロトコルです。汎用コネクターとして機能し、LLM がさまざまなデータソース(API、データベース、サービスなど)と一貫した方法でやり取りできるようにします。MCP は、AI の相互運用性、柔軟性、コンテキスト理解を高める橋渡し役と考えることができます。
このプロジェクトでは、Semantic Kernel が利用できるツールを公開するために MCP を使用し、自動化、データ取得、システム統合など、実際のアプリケーションで AI を活用したワークフローを実現します。
Semantic Kernel と MCP を組み合わせる理由
Microsoft Semantic Kernel は、AI エージェントの構築と複雑なワークフローのオーケストレーションを簡素化する強力な SDK です。MCP ツールを統合すると、次のことができます:
- MCP サーバーを介して、Semantic Kernel を外部機能で拡張できます。
- ユーザーのプロンプトに基づいて、LLM が動的に関数を呼び出せるようにできます。
- AI モデルと Semantic Kernel 以外のアプリケーションとの相互運用性を促進できます。
- ツール統合用の標準化されたプロトコルにより、開発を簡素化できます。
このリポジトリでは、これらのテクノロジーを組み合わせる実践的な例と、すぐに始められるサンプルコードを紹介します。
プロジェクト構成
src/
├── Demo.MCP.Client/ # MCP client application
│ ├── Configuration/ # Robust configuration system with validation
│ │ ├── AppConfig.cs # Main configuration class with smart loading
│ │ ├── McpServerConfig.cs # MCP server configuration with transport types
│ │ └── OpenAIConfig.cs # OpenAI/Semantic Kernel configuration
│ ├── Services/ # Business logic and MCP integration
│ │ ├── LoggingService.cs # Structured logging with Serilog
│ │ └── McpClientService.cs # MCP client with retry logic and error handling
│ ├── Program.cs # Main application with interactive demo
│ └── appsettings.json # Configuration for servers, logging, and OpenAI
└── Demo.MCP.Server/ # Local MCP server (.NET implementation)
├── Tools/ # 23 example MCP tools organized by category
│ ├── CalculatorTool.cs # Math operations (Add, Subtract, Multiply, etc.)
│ ├── EchoTool.cs # Simple echo functionality for testing
│ ├── FileSystemTool.cs # File operations (FileExists, ListFiles, etc.)
│ ├── SystemInfoTool.cs # System information and environment tools
│ └── TextProcessingTool.cs # Text manipulation (Base64, regex, etc.)
└── Program.cs # MCP server using stdio transport
ステップごとのガイド
このセクションでは、このリポジトリに実装されている方法に沿って、MCP ツールを Semantic Kernel と統合する手順を説明します。
ステップ 1:プロジェクトをセットアップする
-
このリポジトリをクローンします。
git clone https://github.com/LiteObject/mcp-with-semantic-kernel.git cd mcp-with-semantic-kernel -
依存関係を復元します。
dotnet restore -
OpenAI API キーを設定します(任意。必要になる条件については「前提条件」を参照してください)。
dotnet user-secrets set "OpenAI:ApiKey" "your-api-key" --project src/Demo.MCP.Client dotnet user-secrets set "OpenAI:ChatModelId" "gpt-4o" --project src/Demo.MCP.Client
ステップ 2:MCP サーバーに接続する
このプロジェクトには、ModelContextProtocol パッケージを使用して MCP サーバーに接続するコードが含まれています。MCP クライアントはサーバーから利用可能なツールを取得し、それらを Semantic Kernel で使用できます。
概念的な例(実際の実装は src/Demo.MCP.Client/Services/McpClientService.cs にあります)。
using ModelContextProtocol;
var mcpConfig = new McpServerConfig
{
Id = "everything",
Name = "Everything",
TransportType = TransportType.Stdio,
Command = "npx",
Arguments = ["-y", "@modelcontextprotocol/server-everything"]
};
var mcpClient = await McpClientFactory.CreateAsync(mcpConfig);
var tools = await mcpClient.ListToolsAsync();
このスニペットでは、MCP サーバー(例:「Everything」デモサーバー)への接続を確立し、利用可能なツールを取得する一般的なパターンを示しています。実際の実装には、追加のエラー処理、再試行ロジック、構成管理が含まれています。
構成
このアプリケーションでは、検証機能とスマートなパス解決を備えた高度な構成システムを使用しています。
MCP サーバーの自動管理
クライアントは相対パスを使用して、ローカル MCP サーバーを自動的に起動し、管理します。
{
"McpServers": {
"local": {
"Id": "local",
"Name": "Local Demo Server",
"TransportType": "Stdio",
"Command": "dotnet",
"Arguments": ["run", "--project", "src/Demo.MCP.Server"],
"ConnectionTimeout": "00:00:30",
"MaxRetries": 3,
"Enabled": true
}
}
}
利用可能な MCP サーバー
- ローカルサーバー:包括的な組み込みツールを備えた .NET MCP サーバー(デフォルトで有効)
- GitHub サーバー:GitHub API へのアクセスを提供(デフォルトで無効)
- Everything サーバー:さまざまなツールを備えたデモサーバー(デフォルトで無効)
構成機能
- 階層的な読み込み:appsettings.json、環境固有のファイル、ユーザーシークレット
- 検証:わかりやすいエラーメッセージを含む包括的な検証
- ログ構成:Serilog による構造化ログ、ファイルおよびコンソールへの出力
- 再試行ロジック:構成可能な接続タイムアウトと再試行回数
MCP 通信のトランスポートオプション
MCP はクライアントとサーバーの通信に、さまざまなトランスポート方式をサポートしています。これらのオプションを理解すると、ユースケースに適した構成を選択できます。
利用可能なトランスポートの種類
1. Stdio(標準入力/標準出力)
ローカル MCP サーバーで最も一般的に使用されるデフォルトのトランスポートです。
**仕組み:**クライアントがサーバーをサブプロセスとして起動し、stdin/stdout のパイプを通じて通信します。
構成例:
{
"TransportType": "Stdio",
"Command": "dotnet",
"Arguments": ["run", "--project", "src/Demo.MCP.Server"]
}
ユースケース:
- ローカルでの開発とテスト
- アプリケーション内に組み込まれたサーバー
- クライアントがサーバーのライフサイクルを制御するシナリオ
利点:
- 設定が簡単で、ネットワーク構成は不要
- セキュア(ネットワークに公開されない)
- クライアントがサーバーのライフサイクルを自動的に管理
制限事項:
- サーバーとクライアントが同じマシン上にある必要があります
- サーバーインスタンスごとにクライアントは 1 つです
2. HTTP/HTTPS(このデモでは未実装)
リモート MCP サーバー向けのネットワークベースのトランスポートです。
**仕組み:**クライアントが HTTP エンドポイント経由で公開されたサーバーに接続します。
構成例:
{
"TransportType": "Http",
"Endpoint": "https://api.example.com/mcp"
}
ユースケース:
- クラウドでホストされた MCP サーバー
- 複数クライアントのシナリオ
- マイクロサービスアーキテクチャ
利点:
- リモートサーバーへのアクセス
- 複数のクライアントが 1 つのサーバーに接続可能
- 標準的な Web インフラストラクチャ(ロードバランサー、プロキシなど)
制限事項:
- ネットワークのセットアップとセキュリティ上の考慮が必要
- ローカルのトランスポートよりもレイテンシが高い
3. WebSocket(このデモでは未実装)
リアルタイムの双方向通信です。
ユースケース:
- サーバーからクライアントへのリアルタイム更新
- 長時間にわたる接続
- プッシュ通知
4. 名前付きパイプ(このデモでは未実装)
同じマシン上でのプロセス間通信です。
ユースケース:
- 高パフォーマンスのローカル通信
- Windows サービスとの統合
適切なトランスポートの選択
| シナリオ | 推奨されるトランスポート | 理由 |
|---|---|---|
| ローカル開発 | Stdio | シンプルで、設定が不要です |
| 本番サーバー | HTTP/HTTPS | スケーラブルで、標準的なインフラストラクチャを利用できます |
| リアルタイム機能 | WebSocket | 双方向通信が可能です |
| Windows サービス | 名前付きパイプ | Windows ネイティブの IPC |
現在の実装
このデモでは、すべてのサーバーに Stdio トランスポートを使用しています。
- ローカルサーバー:サブプロセスとして
dotnet runで起動します - GitHub サーバー:
npxコマンドで起動します - Everything サーバー:
npxコマンドで起動します
Stdio トランスポートは、シンプルさとセキュリティを重視して選択されました。ネットワークエンドポイントを公開せず、プラットフォーム間で一貫して動作するためです。
リンク
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。