Model Context ProtocolとAPI
2024年11月にAnthropicが公開したModel Context Protocol (MCP)は、生成AIが外部システムと接続する方法を標準化したものです。MCPは、外部システムがどんなデータがどこに持っているか、どんな処理を実行できるか、などを伝える手段を提供していて、生成AIはそれを通じて適切に外部システムを操作することにより回答の質を高めることができます。
世の中のシステムにはApplication Programming Interface (API)を提供しているものも数多くあります。APIは人が画面を通して操作するのではなく、プログラムを使って機械的にシステムとやり取りする手段を提供するものですが、APIをすでに提供しているシステムはMCPを使うと簡単に生成AIに使わせることができます。システムのAPIを直したりすることなく、その使い方をMCPを通して生成AIに教えるだけでよいからです。GitHubやSlackなど多くの既存のサービスについて、その仕組みにより生成AIと接続するMCPサーバがすでに作られています。MCPが生成AIと外部システムをつなぐものと説明されるのはこのような状況によるものです。
政府統計の総合窓口(e-Stat)のMCPサーバ
政府統計の総合窓口(e-Stat)は日本の公的統計にアクセスできるポータルサイトですが、APIについては早くも2014年から提供されていました。私はせっかくあるAPIを何かに活用したいと考えて以前にAPIを通して得たメタ情報を使った表検索システムを作ったこともありましたが、最近のMCPサーバの流行に乗ってe-StatのMCPサーバを作ってみようと思いました。e-StatのAPIはそもそも仕様を理解するのがなかなか大変でAPIから返される情報を理解する知識も必要ですので、その複雑さを吸収しながら生成AIに使い方を教えることができれば生成AIがうまくe-Statを使ってくれるようになるだろうと思って作ることにしました。
MCPサーバの開発
AnthropicがMCPサーバの開発に関する情報をまとめてくれていて、サンプルプログラムも豊富に用意されているので着手しやすい環境が整っています。ちょうどKotlin言語のSDK(標準開発キット)も用意されていたのでKotlinで作ってみました。完成したものはこちらで公開しています。
MCPサーバは最初はローカルPC上で動かす設計から始まっていて、多くのサンプルプログラムもそうなっています。ローカルではなくリモートにMCPサーバを立てる技術もすでに考えられていてCloudflareが実装法を提案してくれていたりしますが、私の作ったMCPサーバはローカルで動かすものになっています。
Javaの実行環境
Kotlinで開発したため、これを動かすにはJavaをインストールする必要があるのですが、Javaのライセンスは複雑な経緯をたどっていてどれをインストールすればよいのか迷うところがあります。ローカルPCにJavaを直接インストールしなくても済むように、Java実行環境とMCPサーバをセットにしてコンテナ化したものも作ってありますのでDockerを使ってMCPサーバを動かすこともできます。その設定方法は上のGithubのREADMEに書いてありますが、Dockerもまたライセンスに気を遣うところがありWindowsマシンで動かす際にはWSL(Windows Subsystem on Linux)上にDocker CLIをインストールして使っているという方ももしかしたらいらっしゃるかも知れません。WSL上のDockerで動かすには環境変数WSLENV
を追加しないといけないようですのでここに載せておきます(VS code用の設定です)。
{
"mcp": {
"servers": {
"eStatMCP_wsl": {
"type": "stdio",
"command": "wsl",
"args": ["-e", "docker", "run", "-i", "--rm", "-e", "ESTAT_API_KEY", "-e", "RESPONSE_SIZE", "ichiro21/estat-mcp"],
"env": {
"ESTAT_API_KEY": "${env:ESTAT_API_KEY}",
"WSLENV": "ESTAT_API_KEY/u"
}
}
}
}
}
AIに統計表の検索を任せられるようになった
試しにe-StatのMCPサーバを作ってみたところ、統計表の検索はけっこううまくAIがこなしてくれる印象を受けました。まだコンテキストを使いすぎる問題などに対処する必要がありそうですが、AIに渡すプロンプト次第である程度の仕事はできるように思います。
このように書くと非常にうまくいったように見えますが、開発の途中で直面した様々な問題も面白いので、改めて書きたいと思います。