powered by TechFeed
表示モード
ハウツー

KotlinでAIエージェントを作る — PythonもTypeScriptも不要、JVMエコシステムのままGeminiとつなげるADKの実力

7月29日、Googleクラウド関連の技術発信で知られるエンジニアのxbill氏が「Building AI Agents with the Kotlin Agent Development Kit (ADK)」と題した記事を公開した。この記事では、KotlinネイティブのAgent Development Kit(ADK)を使ってAIエージェントを実装するチュートリアルについて詳しく紹介されている。

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ツールセット、対話型ReplRunner
  • servergreetツールを公開する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点に整理されている。

  1. 型付きエージェント設定LlmAgent、Gemini、指示をKotlinで記述
  2. MCPツール統合:別プロセスのKtorサービスからツールを発見・呼び出し
  3. 決定論的テスト:モデル呼び出しなしでツール動作を検証
  4. ローカル開発:Gradleから直接サーバーと対話型エージェントを起動
  5. クラウドデプロイ:MCPサーバーをコンテナ化してCloud Runへ展開

JVM上のエージェント開発に本格的に取り組みたいエンジニアにとって、既存のJavaエコシステムやAndroid開発の知識をそのまま活かせる点は大きい。PythonやTypeScriptに慣れていなくてもエージェント開発に参入できる間口の広さは、Kotlin ADKの実質的な差別化要因といえる。ADKはまだ活発に開発中のプロジェクトであり、今後のバージョンアップでAPIや機能が変わる可能性もある点は念頭に置いておきたい。

詳細はBuilding AI Agents with the Kotlin Agent Development Kit (ADK)を参照していただきたい。