| | |

Spring BootでMCPサーバーを作る:Spring AI MCP Starter入門

はじめに

2025年以降、モデルコンテクストプロトコル(MCP)は、生成AIが外部ツールやデータソースとやり取りする標準規格として急速に注目を集めています。MCPはAIモデルと外部リソースの橋渡しを行い、AIがデータベースやAPI、ファイルシステムなどに標準化されたインタフェースでアクセスできるようにします。AIはこのプロトコルを通じてプライベートデータにアクセスしたり、カスタムロジックを実行したり、外部システムとやり取りできるようになり、学習データ以上の知識や機能を得られます。Spring AIはこのMCPエコシステムに早期から参加しており、Java向けMCP SDKを提供するだけでなく、Spring Bootとの密接な統合を実現しています。

本記事では、Spring BootとSpring AI MCP Starterを使ってMCPサーバーを構築する方法を解説します。最新のSpring AI 2.0 GAで導入された機能や、実際にサーバーを動かすための具体的な設定・実装も紹介します。読了後は、自分のサービスをMCPツールとしてAIエージェントに提供し、チャットボットやコーディング支援ツールから呼び出せるようになるでしょう。

MCPとSpring AI 2.0のポイント

MCPの役割

MCPはAIモデルが外部ツールを呼び出すための共通プロトコルです。AIはツールの名前や引数、戻り値のスキーマをJSON形式で宣言されたメタデータとして受け取り、必要に応じてツールを呼び出します。この仕組みにより、AI側はツールの実装や言語を意識せずに機能を利用できるようになります。

Spring AIはMCPのクライアント/サーバー両方の実装を提供しており、Spring Bootプロジェクトにスターター依存関係を追加するだけで自動構成が行われます。MCPサーバー用スターターは、ツール・リソース・プロンプトの登録やJSON Schema生成を自動で行い、通信プロトコルの設定もアプリケーションプロパティで指定するだけです。対応プロトコルにはローカル開発用のSTDIO、HTTPベースのSTREAMABLE(旧SSE)やSTATELESSなどがあり、用途に応じて選択できます。

Spring AI 2.0の改善点

2026年6月にリリースされたSpring AI 2.0 GAでは、依存ベースラインがSpring Boot 4/Spring Framework 7に更新され、Jackson 3への移行によりJSONシリアライズが改善されました。コードベース全体がJSpecifyアノテーションでnull安全化され、構成オプションはビルダー方式に統一されるなど、開発者体験が大きく向上しています。

MCP統合面では、これまでコミュニティプロジェクトだったspring-ai-community/mcp-annotationsが本体に統合され、@McpTool@McpResource@McpPromptなどのアノテーションが標準で利用できるようになりました。統一されたMcpSyncRequestContextMcpAsyncRequestContextが提供され、ログ出力や進捗通知を簡潔に実装できます。また、WebMVC/WebFlux用のMCPトランスポート実装がSpring AIに移管され、STREAMABLE HTTPがデフォルトとなっています。

プロジェクトの準備

Spring Bootプロジェクトの作成

  1. Spring Initializrで新規プロジェクトを作成します。プロジェクト設定は次の通りです。
    • プロジェクト: Gradle
    • 言語: Java
    • Spring Boot: 4.0以上
    • 依存関係: Spring AI MCP Server(Spring AI 2.0ではspring-ai-starter-mcp-server-webmvcが推奨)

これにより、build.gradleには次の依存関係が追加されます。

dependencies {
    // Spring AI MCP Server starter for WebMVC. Adjust version as needed.
    implementation("org.springframework.ai:spring-ai-starter-mcp-server-webmvc:2.0.0")
}

設定ファイル(application.yml)

MCPサーバーを構成するのに必要な設定はごくわずかです。以下はSTREAMABLE HTTPで動作するサーバーをapplication.ymlで設定した例です。

spring:
  ai:
    mcp:
      server:
        name: my-mcp-server      # サーバー名
        version: 1.0.0           # サーバーバージョン
        protocol: STREAMABLE     # プロトコル (HTTP)
        streamable-http:
          mcp-endpoint: /mcp 

STDIOトランスポートを利用する場合は Web サーバーを無効にし、バナー表示とコンソールログをオフにします。同じ application.yml の中に次のように記述します。

spring:
  main:
    web-application-type: none
    banner-mode: off
  logging:
    pattern:
      console: ""

MCPツールの実装

MCPサーバーではツール(AIが呼び出す機能)をJavaメソッドとして定義します。Spring AI 2.0では@McpToolアノテーションを使用してメソッドをマークし、引数には@McpToolParamで説明や必須項目を指定します。

以下は「注文ステータス取得」「最近の注文一覧」「注文キャンセル」の3つのツールを提供するOrderToolsクラスの例です。

package com.example.mcp.tools;

import org.springframework.ai.mcp.annotation.McpTool;
import org.springframework.ai.mcp.annotation.McpToolParam;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
public class OrderTools {

    @McpTool(
        name        = "get_order_status",
        description = "注文の現在のステータスを返します。配送状況や追跡情報を知りたい場合に使用します。"
    )
    public OrderStatus getOrderStatus(
        @McpToolParam(description = "調べる注文ID", required = true)
        String orderId
    ) {
        // 実装例: データベースからステータスを取得
        return new OrderStatus(orderId, "SHIPPED", "2026-06-04");
    }

    @McpTool(
        name        = "list_recent_orders",
        description = "指定した顧客の最近の注文を一覧表示します。"
    )
    public List<OrderSummary> listRecentOrders(
        @McpToolParam(description = "顧客ID", required = true) String customerId,
        @McpToolParam(description = "取得件数 (1〜50)", required = false) Integer limit
    ) {
        int effectiveLimit = (limit != null && limit > 0) ? Math.min(limit, 50) : 10;
        return orderService.findRecentByCustomer(customerId, effectiveLimit);
    }

    @McpTool(
        name        = "cancel_order",
        description = "まだ発送されていない注文をキャンセルします。成功時は確認メッセージを返します。"
    )
    public String cancelOrder(
        @McpToolParam(description = "キャンセルする注文ID", required = true)  String orderId,
        @McpToolParam(description = "キャンセル理由", required = false) String reason
    ) {
        return orderService.cancel(orderId, reason);
    }

    // Jackson 3によりJavaレコードも返却可能
    public record OrderStatus(String orderId, String status, String estimatedDelivery) {}
    public record OrderSummary(String orderId, String date, double total) {}
}

このクラスでは@Componentを付けるだけで自動的にスキャン対象となり、Spring Bootの自動構成が起動時にすべてのツールを登録してくれます。各ツールは説明文(description)を持ち、AIモデルはこの説明に基づいて適切なツールを選択します。引数には必須/任意を示すrequiredフラグを付けることで、AIが引数を省略できるかどうかを判断します。

別のツール実装例(Spring AI 1.x互換)

古いバージョンでは@ToolアノテーションとMethodToolCallbackProviderを使用します。次の例はアーティストと曲の一覧を返すサーバーです。

@Service
public class ArtistService {
    private final List<Artist> artists = new ArrayList<>();

    @Tool(name = "get_artists", description = "アーティスト一覧を取得します")
    public List<Artist> getArtists() {
        return artists;
    }

    @PostConstruct
    public void init() {
        artists.addAll(List.of(new Artist("Bruce Springsteen"), new Artist("JJ Johnson")));
    }
}

@Service
public class SongService {
    private final List<Song> songs = new ArrayList<>();

    @Tool(name = "get_songs", description = "お気に入りの曲一覧を取得します")
    public List<Song> getSongs() {
        return songs;
    }

    @PostConstruct
    public void init() {
        songs.addAll(List.of(
            new Song(new Artist("Bruce Springsteen"), "My Hometown"),
            new Song(new Artist("JJ Johnson"), "Lament")
        ));
    }
}

この場合、ツールの登録は@SpringBootApplicationクラスでMethodToolCallbackProviderをBeanとして定義します。

メインアプリケーションと実行

@SpringBootApplicationを付与したメインクラスには特別な設定は不要です。MCPスターターが自動的にアノテーションを検出し、ツールを登録します。STDIOトランスポートを使用する場合はウェブサーバーを無効にするためspring.main.web-application-type=noneを設定します。STREAMABLE HTTPの場合は通常のWebアプリとして起動します。

プロジェクトをビルドするには Gradle を使用します。

gradle bootJar

実行後は、Claude CodeChatGPT Code InterpreterなどMCPクライアント対応ツールにサーバー情報(サーバー名、プロトコル、エンドポイント)を登録することで、AIが自動的にツールを検出し、必要に応じて呼び出すようになります。Spring AI 2.0ではChatClientのアドバイザー連鎖がツール呼び出しループを担当し、何百ものツールを効率的に管理できます。

実行イメージ

例えば、前述のOrderToolsサーバーを実行し、ChatClient経由で「注文ID ORD-00123のステータスを教えて」とAIに問いかけると、AIはget_order_statusツールの説明を参照してツール呼び出しが必要だと判断します。クライアントはツール呼び出しをサーバーに送信し、サーバーは該当の注文ステータスを返します。その結果、AIは最新のデータを含む回答をユーザーに返すことができます。STREAMABLE HTTPではサーバーはHTTP POST / GETエンドポイント/mcpでこのやり取りを処理し、必要に応じて複数メッセージをServer‑Sent Eventsでストリーミングします。

まとめ

MCPサーバーを構築することで、AIアシスタントが自分のサービスやデータに安全にアクセスできるようになり、より高度な自動化やエージェントの実装が可能になります。Spring AI 2.0ではアノテーションによる宣言的なツール実装と自動構成が提供され、数十行のコードと数行のプロパティ定義だけで本格的なMCPサーバーが作成できます。さらに、Spring Boot 4/Jackson 3をベースとした堅牢なアーキテクチャとnull安全化により、将来の拡張や保守も容易です。ぜひ自身のアプリケーションにMCPサーバーを組み込み、AIとの連携を強化してください。

是非フォローしてください

最新の情報をお伝えします

類似投稿