SORACOM MCP Serverを作成してみた
この記事は
SORACOMのAPIを呼び出すMCP Serverを作成した際の記録です。
作成したものは以下のリポジトリに公開しています。
開発の経緯
MCP(Model Context Protocol)は、Anthropic社が提唱するプロトコルで、公式ドキュメントによると以下のように説明されています。
MCPは、アプリケーションがLLMにコンテキストを提供する方法を標準化するオープンプロトコルです。MCPは、AIアプリケーション向けのUSB-Cポートのようなものと考えてください。USB-Cがデバイスを様々な周辺機器やアクセサリーに接続する標準的な方法を提供するように、MCPはAIモデルを異なるデータソースやツールに接続する標準的な方法を提供します。
MCPについて勉強をしている中で、やはりここは実際に自分で作成してみるのが一番の近道だと思ったので、SORACOMのAPIを題材にして作ることにしました。
実装の流れ
実装にはGitHub Copilotのエージェントモードを活用しました。エージェントモードで使われるMCP Serverをエージェントモードで書くというのはなかなか趣深いですね。
コードベース生成
bootstrapとして、まずは以下のような指示を与えました。
SORACOMのAPIを呼び出すMCP Serverを作成してください。MCP ServerはSTDIO経由で呼び出すものとし、APIの呼び出しについては https://users.soracom.io/swagger/soracom-api.ja.yaml で公開されているOpenAPIドキュメントを参照してください。
すると、エージェントがopenapi-typescript-codegenを使って、SORACOMのAPIを呼び出すためのTypeScriptコードを生成し、それを呼び出すコードも生成してくれました。コマンドも実行して作ってくれるあたりエージェント凄いですね。
提供するツールの選定
モデルが記述できるコード量の上限からか、この時点ではAPIのうち3つほどだけがtoolとして実装されていました。Copilotに「ここにあるAPI全部toolにして」という指示だと上限があるのかうまく行きませんでした。
また、エージェントにうっかり新規のSIMの契約をしたり、逆にSIMを削除されたりすると困るので、実装するAPIはgetXX
やlistXX
などの情報取得系に限定しました。また、需要が多そうな所を中心に実装することにしました。
そして、順番に「このサービスクラスで定義されている、このAPIをtoolにして」と指示して順番に実装していきました。この辺りはプロンプトをもうちょっと工夫すると一度に実装できたかも知れません。
動作検証
VSCodeでsoracom-mcp-server
を起動し、GitHub Copilotのエージェントモードから色々聞いてみます。
動作検証(1) SIM操作
SIMの一覧を表示して
listSims
を実行し、その結果をいい感じに成形してくれます。
ちなみに公開用のキャプチャを撮るために
SIMの一覧を表示して。SIM IDとIMSI、名前は最初の3文字だけ出して後はマスクして
というようなこともできました。
この後、SIM IDを指定して
SIM ID xxxxx の詳細を表示して
と聞くと、SIMの詳細を表示してくれます。ただし、私が試したときはgetSim
ではなくgetSubscriber
が呼ばれていました。「getSim
で取得して」と指示するとgetSim
を呼んで情報を取得してくれるのですが、ここはちょっとSORACOMにおけるSIMとサブスクライバーの違いをカスタムインストラクションなどを使って知識としてモデルに与えるとうまくgetSim
とgetSubscriber
を使い分けてくれるかも知れません。
動作検証(2) 請求処理
先月のSORACOMの請求をエクスポートして
「先月」という単語を正しく解釈し、APIには'202503'という形でパラメータを渡してエクスポートし、そのURLをリンクとして表示してくれました(これを実行したのは2025年4月です)。
実際にこのリンクをクリックするとCSVがダウンロードされました。
動作検証(3) ソラカメの情報
ソラカメの一覧を出して
ソラカメ、という単語でlistSoraCamDevices
が実行され、返答も「ソラカメデバイス」と表示されています。
「ファームウェアのバージョンアップが必要そうなものを出して」なども回答してくれました。
動作検証(4) ソラカメのイベント
デバイスID xxxxxx のソラカメのイベント一覧を見せて
デバイスIDを指定したことでlistSoraCamDeviceEventsForDevice
が実行され、一覧が整形して表示されています。
リンク先は残念ながらアクセスできませんでした。
「昨日のソラカメのイベントを見せて」という問い合わせでも該当のAPIは実行しようとするのですが、期間の指定のパラメータの指定がうまくできていないのか、失敗しました。この辺りはtoolの設定でパラメータの説明を調整するともう少しうまくいくようになるかも知れません。
リファクタリング
ある程度動いたところで、新しいAPIをtoolに追加しやすいようにリファクタリングしました。今から思えば、先にリファクタリングやってからAPIを追加した方が良かったですね。
最後にlintをするGitHub Actionsを追加してひとまずリリースしました。
2025/4/18時点でまだテストは実装してないのですが、まずはテストしやすい形へのリファクタリングにしないとですね。
まとめ
今回の開発を通じて、MCPの理解が深まりました。プロトコルがどういうやり取りをしているのか、サーバ側はどういう実装が必要なのかが理解できたので、今後自分がMCP Serverを利用する場合にも利点や欠点を理解した上で利用できるようになったと思います。
皆さんの参考になれば幸いです。
Discussion