Koog を使った Google Maps MCP:Kotlin Notebook でゼロから標高を取得するまで
この短いブログ形式のウォークスルーでは、Koog を Google Maps の Model Context Protocol (MCP) サーバーに接続します。Docker でサーバーを起動し、利用可能なツールを検出し、AI エージェントに住所のジオコーディングと標高の取得を行わせます。これらすべてを Kotlin Notebook 上で完結させます。
読み終える頃には、自身のワークフローやドキュメントにそのまま組み込める、再現可能なエンドツーエンドの例が手に入ります。
%useLatestDescriptors
%use koog前提条件
以下のセルを実行する前に、以下が準備されていることを確認してください:
- Docker がインストールされ、実行されていること
- 有効な Google Maps API キーが環境変数
GOOGLE_MAPS_API_KEYとしてエクスポートされていること - OpenAI API キーが
OPENAI_API_KEYとしてエクスポートされていること
シェルで次のように設定できます(macOS/Linux の例):
export GOOGLE_MAPS_API_KEY="<your-key>"
export OPENAI_API_KEY="<your-openai-key>"// 環境変数から API キーを取得
val googleMapsApiKey = System.getenv("GOOGLE_MAPS_API_KEY") ?: error("GOOGLE_MAPS_API_KEY environment variable not set")
val openAIApiToken = System.getenv("OPENAI_API_KEY") ?: error("OPENAI_API_KEY environment variable not set")Google Maps MCP サーバーの起動 (Docker)
公式の mcp/google-maps イメージを使用します。このコンテナは MCP を介して maps_geocode や maps_elevation などのツールを公開します。環境変数を介して API キーを渡し、ノートブックが標準入出力(stdio)を介して通信できるように、アタッチされた状態で起動します。
// Google Maps MCP サーバーを Docker コンテナで起動
val process = ProcessBuilder(
"docker",
"run",
"-i",
"-e",
"GOOGLE_MAPS_API_KEY=$googleMapsApiKey",
"mcp/google-maps"
).start()McpToolRegistry によるツールの検出
Koog は標準入出力を介して MCP サーバーに接続できます。ここでは、実行中のプロセスからツールレジストリを作成し、検出されたツールとそのデスクリプタを表示します。
val toolRegistry = McpToolRegistryProvider.fromTransport(
transport = McpToolRegistryProvider.defaultStdioTransport(process)
)
toolRegistry.tools.forEach {
println(it.name)
println(it.descriptor)
}OpenAI を使用した AI エージェントの構築
次に、OpenAI のエグゼキューターとモデルをベースにしたシンプルなエージェントを組み立てます。このエージェントは、先ほど作成したレジストリを通じて、MCP サーバーによって公開されたツールを呼び出すことができます。
val agent = AIAgent(
executor = simpleOpenAIExecutor(openAIApiToken),
llmModel = OpenAIModels.Chat.GPT4o,
toolRegistry = toolRegistry,
)標高の問い合わせ:最初にジオコーディング、次に標高
ミュンヘンにある JetBrains オフィスの標高を調べるようエージェントに促します。指示の中で、利用可能なツールのみを使用すること、およびこのタスクにどのツールを優先すべきかを明示的に伝えます。
import kotlinx.coroutines.runBlocking
val request = "Get elevation of the Jetbrains Office in Munich, Germany?"
runBlocking {
agent.run(
request +
"You can only call tools. Get it by calling maps_geocode and maps_elevation tools."
)
}クリーンアップ
完了したら、バックグラウンドで実行されたままにならないよう、Docker プロセスを停止します。
process.destroy()トラブルシューティングと次のステップ
- コンテナの起動に失敗した場合は、Docker が実行されているか、および
GOOGLE_MAPS_API_KEYが有効かを確認してください。 - エージェントがツールを呼び出せない場合は、ツール検出のセルを再実行して、ツールレジストリにデータが入っていることを確認してください。
- 利用可能な Google Maps ツールを使用して、ルート計画や場所の検索など、他のプロンプトを試してみてください。
次は、複数の MCP サーバー(例:Web オートメーション用の Playwright + Google Maps)を組み合わせ、Koog にツールの使用をオーケストレーションさせて、より高度なタスクを実行させることを検討してみてください。
