Spring AI には MCP(Model Context Protocol)サーバー機能が用意されており、AI クライアントから外部ツールを呼び出す仕組みを簡単に構築できます。
本記事では、以下のリポジトリをベースにして、
👉 Java で stdio 接続型 MCP サーバーを構築する手順
を整理して解説します。
このサーバーは、
- MCP JSON-RPC でツールを公開
- cotogoto の SSE API へ会話リクエストを中継
- MCP クライアントから標準入出力(stdio)で接続
という構成になっています。
なお今回利用する cotogoto は以下の公式サイトです👇
👉 https://cotogoto.ai/
MCP とは
MCP(Model Context Protocol)は、
👉 AI クライアントが外部ツールを呼び出すための標準プロトコル
です。
例えば次の用途で利用されます。
- AI が外部 API を呼び出す
- AI がデータベースを検索する
- AI が別の AI サービスへメッセージを送る
MCP を利用することで、AI と外部システムの連携を JSON-RPC 形式で統一できます。
1. システム構成
[MCP Client]
↓ stdio(JSON-RPC)
[MCP Server (Spring AI)]
↓ SSE
[cotogoto API]
このプロジェクトは stdio 接続前提で動作します。
2. Maven 依存関係(必須)
Spring AI MCP サーバーを構築するために、以下の 2 つの依存関係を追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
</dependency>
spring-boot-starter-web の役割
この依存関係は、Spring Boot に以下の機能を追加します。
- Spring MVC(Web アプリケーション基盤)
- JSON シリアライズ
- DispatcherServlet
MCP Server WebMVC は Spring MVC を前提として動作するため、
👉 必須の基盤ライブラリ になります。
spring-ai-starter-mcp-server-webmvc の役割
このスターターを追加すると、Spring AI が次を自動構築します。
- MCP JSON-RPC サーバー
- Tool アノテーション解析
- MCP エンドポイント公開
- JSON-RPC メッセージ処理
つまり、
👉 Java で MCP サーバーを実装するための コアライブラリ です。
WebMVC 版を採用する理由
Spring AI MCP には複数の実装があります。
| Starter | 特徴 |
|---|---|
| webmvc | 同期処理に強い |
| webflux | Reactive 処理 |
本プロジェクトでは、
- Spring Boot 標準構成との相性が良い
- SYNC モードとの親和性が高い
ため WebMVC 版を採用しています。
stdio 接続との関係
WebMVC を利用しても、次の設定により通信方式を stdio に切り替えられます。
spring.ai.mcp.server.stdio: true
3. 前提条件
Java
Java 17 以上
cotogoto API トークン
環境変数で渡します。
4. 設定ファイル
application.yaml
spring:
ai:
mcp:
server:
type: SYNC
stdio: true
cotogoto:
upstream:
conversations-url: https://app.cotogoto.ai/webapi/api/mcp/conversations
api-token: ${COTOGOTO_API_KEY}
MCP 動作モード
SYNC
同期型ツール実行モードです。
stdio
MCP クライアントと標準入出力で通信します。
5. Tool 実装
Spring AI MCP では、以下のアノテーションでツールを公開できます。
@Tool(
name = "conversation",
description = "cotogoto へメッセージを送信"
)
public String conversation(String message) {
return relayService.send(message);
}
Spring AI が自動で行うこと
- Tool メソッドの公開
- JSON-RPC の callTool との紐付け
- 引数の自動変換
6. ビルド
./mvnw package
7. MCP サーバー起動(stdio)
stdio 接続では、
👉 MCP クライアントが Java プロセスを起動します。
手動起動例:
java -jar target/cotogoto-mcp-server.jar
8. MCP クライアント設定
stdio 接続では、mcp.json にプロセス起動を定義します。
環境によっては JVM のデフォルト文字コードが UTF-8 以外になり、ログやレスポンスが文字化けすることがあります。
その場合は mcp.json の起動コマンドに -Dfile.encoding=UTF-8 を追加して、
JVM の文字コードを明示的に UTF-8 に固定してください。
{
"mcpServers": {
"cotogoto": {
"command": "java",
"args": [
"-Dfile.encoding=UTF-8",
"-jar",
"cotogoto-mcp-server.jar"
],
"env": {
"COTOGOTO_API_KEY": "your-api-token"
}
}
}
}
注意点
ツール引数は mcp.json に書かない
ツール引数は 実行時に送信されます。
API トークンは環境変数で渡す
セキュリティ確保のためです。
9. MCP 通信フロー
① MCP クライアントがサーバープロセスを起動
② listTools を送信
③ ツール一覧を取得
④ callTool を送信
⑤ cotogoto SSE API へ転送
⑥ レスポンスを返却
10. HTTP 接続との違い(補足)
stdio 接続(本記事)
- プロセス直結通信
- MCP 標準方式
HTTP 接続
-
/mcpエンドポイント経由 - curl などで検証可能
よくあるミス
👉 stdio 設定なのに HTTP で疎通確認してしまう
→ 接続は成立しません。
まとめ
本プロジェクトは、
👉 Spring Boot + Spring AI MCP Server WebMVC
👉 stdio 接続型 MCP サーバー
の最小構成です。
特徴:
- Maven 依存を追加するだけで MCP サーバー構築可能
- Tool アノテーションで簡単に公開
- stdio 通信で MCP クライアントと連携
- SSE で cotogoto API と接続
Java で MCP を実装する際のベースとして非常に参考になります。
参考リンク
- cotogoto 公式サイト:https://cotogoto.ai/
- GitHub(本プロジェクト):https://github.com/cotogoto/cotogoto-mcp-server