🐼

Goでmcpホストとmcpクライアントを書いてMCPサーバーのtoolsを呼び出せるようにしてみた

に公開

時間があるときにMCP周りのキャッチアップを進めているが、記事などを調べて出てくるものは基本MCPサーバーで、ホストとクライアントについてあまり知る機会がなかったので自分で書いてみた。実装したのはMCPサーバーの初期化部分とMCPサーバーのtoolsを呼び出す部分ぐらいしかない。STDIOしかサポートしておらず、capabilitiesの処理とかもサボってるので正直まだまだではあるが、いったん動いたので仕様把握的にはいいかなと気でいます。

https://github.com/shogo-ma/scratch-mcp-go

処理の流れはだいたい以下

  1. 実行時に指定したmcp.jsonを読み込んで、MCPサーバー一つに対してクライアントを一つ生成。生成時にサーバーに対して initializenotifications/initialized を送る
  2. それぞれのmcpサーバーに対して、tools/list を送って、使えるツールを取得
  3. ホスト側で入力を処理し、読み込んでいるmcpサーバーのtoolsと合わせて、claudeのapiを叩く
  4. tool_use が返ってきた場合に、mcpサーバーに対して tools/call を引数と合わせて送る
  5. mcpサーバーから返ってきた内容と合わせてclaudeのapiを叩く。返ってきたテキストを出力

基本はMCPのSpecification を見てもらったらよいと思う。フォーマットもわかるので、似たような感じで実装すればよさそう

https://modelcontextprotocol.io/specification/2025-03-26/basic/lifecycle

実装してわからなくなった部分は以下の方の記事とソースを参考にしつつ実装してました。

https://zenn.dev/razokulover/articles/9a0aee8ceb9f3f

感想

私の書いたものがあってるかどうかはわからないが、少なくともホストとクライアントの役割は認識できたような気がする。仕様を追っかけるには手を動かした方が早いので、実装できてない残りの部分も実装してみる予定

Discussion