MCP Host as a Slack Bot
最近、爆発的に拡がっている MCP ですが、みなさんはHostに何を使っていますか?
Claude Desktop や Cline 、あるいはclaude -p <prompt>
でシェルワンライナー なんて方も少なくないと思います
今回私はいつでも、どこでも使えるMCPホスト
MCP Host as a Slack Bot を作ってみたのでその紹介をさせてください
作ったもの
このbotはDockerイメージのビルドと CloudRun へのデプロイを terraform で管理しています
tfvarsからDockerイメージに同梱する stdioサーバー を設定できるようにしている点が個人的なこだわりです
{
"mcpServers": {
"mcp-restaurant-order": {
"command": "mcp-restaurant-order"
},
"fetch": {
"command": "mcp-server-fetch"
},
"server-brave-search": {
"command": "mcp-server-brave-search",
"env": {
"BRAVE_API_KEY": "<BraveApiKey>",
}
}
},
"bundle": {
"go": {
"packages": [
"github.com/miyamo2/mcp-restaurant-order@latest"
]
},
"uv": {
"packages": [
"mcp-server-fetch"
]
},
"bun": {
"packages": [
"@modelcontextprotocol/server-brave-search@latest"
]
}
}
...
}
というより、現状この方法でバンドルされたシングルバイナリ以外動きません
バンドル機能でサポートするランタイム/パッケージマネージャも go のみなので、事実上 Goで実装された stdioサーバー のみサポートというかなり割り切った仕様になっています
uv(uvx), npm(npx), Dockerイメージをなる早でサポートできるよう頑張ります
(追記: 2025/04/18)
バンドル機能で uv と bun をサポートしました!
実装について
下記OSSのexported な実装を拝借しつつ、もともと huh[1] で書かれていたTUI用の実装を Slack bot 用に置き換えました
肝心な以下の処理
- チャット補完
- ツールの利用
- Slackへのメッセージ送信
は、下記のメソッドで実現しています:
このメソッドは mcphost
の runPrompt[2] という関数を元ネタとしていて
タスクが完了するまでの間、
- チャット補完
- 1のレスポンスに応じてSlackへのメッセージ送信
- 1のレスポンスに応じてツールの利用
を繰り返します
再帰処理になっているため、3でツール実行を行った場合は自己呼び出しを行い、再度チャット補完、追加のツール実行が求められなければそこでタスクが完了したとみなし、メッセージの送信だけ行って処理が終了します
コンテキストとしてユーザープロンプト以降の一連のメッセージを都度LLMに投げるため、複雑なタスクを実行する場合はレートリミットの超過には注意が必要です
Discussion