Spring AI integration with MCP (Model Context Protocol) について
Spring AI MCPはMCP Java SDKをSpring Bootに統合し、JavaのAIアプリ向けにクライアントとサーバーのスターターを提供します。サンプルではPostgreSQLを接続し、LLMがアカウント検索用のツールを選択します。
主な機能
- 01Spring Bootのクライアント/サーバースターター
- 02同期・非同期通信
- 03stdioとSSEのトランスポート
- 04ツール経由のPostgreSQL検索
活用シーン
- 01Spring BootのAIアプリにMCP対応を追加
- 02PostgreSQLのアカウント検索用MCPサーバーを構築
- 03MCPサーバーに接続してツールを呼び出す
MCP 対応
MCP Java SDKを拡張し、MCPクライアントとサーバーの機能を提供します。サーバーはstdioまたはSSEで、クライアントにツールやリソースを公開できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP(Model Context Protocol)との Spring AI 統合
Model Context Protocol(MCP)は、AI モデルが外部ツールやリソースと構造化された方法でやり取りできるようにする標準化されたプロトコルです。さまざまな環境で柔軟に利用できるよう、複数のトランスポートメカニズムをサポートしています。
MCP Java SDK は Model Context Protocol の Java 実装を提供し、同期および非同期の両方の通信パターンを通じて、AI モデルやツールとの標準化されたやり取りを可能にします。
Spring AI MCP は、Spring Boot との統合により MCP Java SDK を拡張し、クライアントとサーバーの両方のスターターを提供します。Spring Initializer を使用して、MCP をサポートする AI アプリケーションをすぐに構築できます。
MCP Java SDK のアーキテクチャ
Java MCP 実装は、次の 3 層アーキテクチャに従います。
-
クライアント/サーバー層:McpClient がクライアント側の操作を処理し、McpServer がサーバー側のプロトコル操作を管理します。どちらも通信管理に McpSession を使用します。
-
セッション層(McpSession):DefaultMcpSession 実装を通じて、通信パターンと状態を管理します。
-
トランスポート層(McpTransport):複数のトランスポート実装をサポートし、JSON-RPC メッセージのシリアライズとデシリアライズを処理します。
MCP クライアント
MCP クライアントは Model Context Protocol(MCP)アーキテクチャの主要なコンポーネントであり、MCP サーバーとの接続の確立と管理を担います。
MCP クライアント
MCP サーバーは Model Context Protocol(MCP)アーキテクチャの基盤となるコンポーネントであり、クライアントにツール、リソース、機能を提供します。
MCP とは?
MCP は、次の主要なコンポーネントを中心としたクライアント/サーバーアーキテクチャに従います。
MCP ホスト: LLM と統合され、外部データソースへの接続を必要とするメインアプリケーションです。
MCP クライアント: MCP サーバーとの 1 対 1 の接続を確立し、維持するコンポーネントです。
MCP サーバー: 外部データソースと統合され、それらとやり取りする機能を公開するコンポーネントです。
ツール:MCP サーバーがクライアントから呼び出せるように公開する、実行可能な関数/メソッドを指します。 さらに、クライアントとサーバー間の通信を処理するために、MCP は 2 つのトランスポートチャネルを提供します。
ローカルプロセスやコマンドラインツールと標準入力/出力ストリームを介して通信できるように、標準入力/出力(stdio)トランスポートタイプを提供します。また、クライアントとサーバー間の HTTP ベースの通信には、Server-Sent Events(SSE)トランスポートタイプを提供します。
この例では何を行うのでしょうか?
このチュートリアルでは、MCP サーバーが Postgresql DB に接続してデータを取得し、2 つのツールも公開しています。MCP クライアントが MCP サーバーに接続すると、プロンプトに基づいて LLM が接続するツールを決定します。
ステップ 1 Postgresql DB の作成
docker-compose.yml ファイルを実行し、table.sql を実行してテーブルを作成します。
ステップ 2 ollama をローカルで実行
ollama をダウンロードし、お使いのマシンの性能に応じて任意のモデルを実行します。
ステップ 3 MCP サーバーの作成
mcp-server プロジェクトをダウンロードして実行します。
確認すべき重要なクラス - SellerAccountTools
@Service
public class SellerAccountTools {
private final SellerAccountRepository sellerAccountRepository;
public SellerAccountTools(SellerAccountRepository sellerAccountRepository) {
this.sellerAccountRepository = sellerAccountRepository;
}
@Tool(name = "Search Seller account by name", description = "Find all Seller Accounts by name")
public String getAccountByName(
@ToolParam(description = "Seller Account Name") String name) {
List<SellerAccount> accountList = sellerAccountRepository.findByName(name);
StringBuilder result = new StringBuilder();
for (SellerAccount account : accountList) {
result.append(account.toString()).append("\n");
}
return result.toString();
}
@Tool(description = "Find all Seller Accounts by owner")
public String getAccountByOwner(
@ToolParam(description = "Seller Account owner") String owner) {
List<SellerAccount> accountList = sellerAccountRepository.findByOwner(owner);
StringBuilder result = new StringBuilder();
for (SellerAccount account : accountList) {
result.append(account.toString()).append("\n");
}
return result.toString();
}
}
説明
- ツールを使用すると、サーバーは LLM が呼び出せるツールを公開できます。この例では、Name と Owner で account テーブルを検索する 2 つのツールを作成しました。
- プロンプトに基づいて AI LLM が適切なメソッドを自動的に選択しますが、名前と説明は適切に記述する必要があります。
ステップ 4 MCP クライアントの作成
mcp-client プロジェクトをダウンロードして実行します。
ステップ 5 テスト
DB テーブルのデータ
Promts を使用したテスト
ここでは、プロンプトに基づいて LLM が適切なツールを自動的に選択し、結果を返して整形する様子を確認できます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。