7月29日、Googleクラウド関連の技術発信で知られるエンジニアのxbill氏が「Building AI Agents with the Kotlin Agent Development Kit (ADK)」と題した記事を公開した。この記事では、KotlinネイティブのAgent Development Kit(ADK)を使ってAIエージェントを実装するチュートリアルについて詳しく紹介されている。
GoogleのADKといえばPythonやTypeScriptの実装が先行していたが、Kotlin版(com.google.adk:google-adk-kotlin-core)が登場し、JVM上でのAIエージェント開発が現実的な選択肢になってきた。ADKの公式ドキュメントはGoogle ADK公式サイトで参照できる。本記事はそのKotlin ADKを使った"Hello World"レベルのスターターエージェント実装チュートリアルだ。サンプルプロジェクトはGitHubで公開されている(xbill9/adk-hello-world-kotlin)。
構成:エージェントとMCPサーバーを別プロセスで分離
このサンプルが面白いのは、ツールをエージェントと別プロセスで動かし、Model Context Protocol(MCP)で接続する設計を採用している点だ。TypeScriptのサンプルでありがちな「ツールをエージェント内にベタ書き」ではなく、本番を意識した分離構成になっている。
プロジェクトは2つのGradleモジュールで構成される。
agent:Kotlin ADKエージェント本体、Geminiモデル設定、MCPツールセット、対話型ReplRunnerserver:greetツールを公開するKtor製MCPサーバー
使用技術スタックは以下のとおりだ(バージョンは元記事公開時点の記載をそのまま転記している)。
| コンポーネント | バージョン |
|---|---|
| Kotlin | 2.3.0 |
| Kotlin ADK SDK | 0.6.0 |
| MCP Kotlin SDK | 0.8.1 |
| Ktor Framework | 3.0.0 |
| JDK | Java 25 |
| Gradle | 9.2.1 (Kotlin DSL) |
エージェントのコア実装
エージェントの定義はGreetingAgent.ktに集約されている。LlmAgentにモデル、指示、MCPツールセットをまとめて渡す構成だ。
return LlmAgent(
name = "kotlin_greeting_agent",
description = "A Kotlin ADK agent that greets people through an MCP tool.",
model =
Gemini(
name = modelName,
apiKey = apiKey,
),
instruction =
Instruction(
"""
You are a concise greeting assistant.
When the user asks you to greet someone, always call the greet tool with that
person's name. Return the greeting produced by the tool.
""".trimIndent(),
),
toolsets = listOf(mcpToolset),
)
デフォルトモデルはgemini-3.1-flash-liteだ。これはGeminiシリーズの中でも軽量・低レイテンシに特化した推論モデルで、エージェントのツール呼び出しのような小規模タスクに向いている。GEMINI_MODEL環境変数を設定することで他のGeminiモデルへの切り替えも可能だ。
MCPツールセットの接続はレイジーロード
MCPツールセットの接続は以下のように設定する。接続は遅延評価で、エージェントがツールを必要としたタイミングでMCPセッションが開かれ、ツール一覧が取得される。
val mcpToolset =
McpToolset.McpToolsetConfig(
sseConnectionParams =
McpConnectionParameters.Sse(
url = mcpServerUrl,
sseEndpoint = "sse",
),
toolFilter = listOf("greet"),
).toToolset()
エージェントとサーバーはHTTP上のServer-Sent Events(SSE)で通信する。デフォルトはhttp://localhost:8080で、/sseがストリーム用、/messagesがクライアントメッセージ用のエンドポイントだ。
Geminiを呼ばずにMCP接続をテストできる
実用上のポイントとして、モデルを呼び出さずにMCP接続だけを検証できるスモークテストが用意されている。
./gradlew :agent:smokeMcp
これはGOOGLE_API_KEYなしで実行でき、エージェントがgreetツールを発見できるかだけを確認する。さらに、Pythonの直接JSON-RPCクライアントも同梱されており、
python3 test_mcp.py
でMCPセッションの初期化、ツール一覧の取得、greet呼び出し(Hello, Galaxy!の返却確認)まで完結する。
ツールロジックは純粋関数でテスト可能
Kotlinの静的型付けの恩恵として、ツールのフォーマットロジックをGemini呼び出しなしでユニットテストできる。
@Test
fun testFormatGreeting() {
val result = Tools.formatGreeting("Kotlin Developer")
assertEquals("Hello, Kotlin Developer!", result)
}
ツールの挙動をモデルから切り離してテストできる設計は、エージェント開発のデバッグコストを下げる点で実践的だ。
Cloud Runへのデプロイ
Ktor製MCPサーバーはコンテナとしてCloud Runにデプロイできる。./cloudrun.shを実行するとcloudbuild.yamlを通じてDockerイメージのビルド・プッシュ・デプロイが一括実行される。
ただし記事内で明示されている注意点がある。現実装はSSEセッションをメモリ上に保持するため、Cloud Runの設定でインスタンス数を1に制限している。本番利用には認証・認可の追加、厳格なCORSルール、セッションの共有ストレージへの移行が必要だ。
まとめ
Kotlin ADKが提供する要点は以下の5点に整理されている。
- 型付きエージェント設定:
LlmAgent、Gemini、指示をKotlinで記述 - MCPツール統合:別プロセスのKtorサービスからツールを発見・呼び出し
- 決定論的テスト:モデル呼び出しなしでツール動作を検証
- ローカル開発:Gradleから直接サーバーと対話型エージェントを起動
- クラウドデプロイ:MCPサーバーをコンテナ化してCloud Runへ展開
JVM上のエージェント開発に本格的に取り組みたいエンジニアにとって、既存のJavaエコシステムやAndroid開発の知識をそのまま活かせる点は大きい。PythonやTypeScriptに慣れていなくてもエージェント開発に参入できる間口の広さは、Kotlin ADKの実質的な差別化要因といえる。ADKはまだ活発に開発中のプロジェクトであり、今後のバージョンアップでAPIや機能が変わる可能性もある点は念頭に置いておきたい。
詳細はBuilding AI Agents with the Kotlin Agent Development Kit (ADK)を参照していただきたい。