2️⃣

MCP Host as a Slack Bot

に公開

最近、爆発的に拡がっている MCP ですが、みなさんはHostに何を使っていますか?
Claude Desktop や Cline 、あるいはclaude -p <prompt> でシェルワンライナー なんて方も少なくないと思います

今回私はいつでも、どこでも使えるMCPホスト
MCP Host as a Slack Bot を作ってみたのでその紹介をさせてください

作ったもの

https://github.com/miyamo2/slackbot-mcp-host

この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 用に置き換えました

https://github.com/mark3labs/mcphost

肝心な以下の処理

  • チャット補完
  • ツールの利用
  • Slackへのメッセージ送信

は、下記のメソッドで実現しています:

https://github.com/miyamo2/slackbot-mcp-host/blob/59d0051491608f12455770f68c6c49ad5ba53aba/internal/app/usecase.go#L73-L248

このメソッドは mcphost の runPrompt[2] という関数を元ネタとしていて
タスクが完了するまでの間、

  1. チャット補完
  2. 1のレスポンスに応じてSlackへのメッセージ送信
  3. 1のレスポンスに応じてツールの利用

を繰り返します
再帰処理になっているため、3でツール実行を行った場合は自己呼び出しを行い、再度チャット補完、追加のツール実行が求められなければそこでタスクが完了したとみなし、メッセージの送信だけ行って処理が終了します

コンテキストとしてユーザープロンプト以降の一連のメッセージを都度LLMに投げるため、複雑なタスクを実行する場合はレートリミットの超過には注意が必要です

脚注
  1. https://github.com/charmbracelet/huh ↩︎

  2. https://github.com/mark3labs/mcphost/blob/b4057a917a3ed39f710d5cae845e5a1b42a4edfc/cmd/root.go#L237-L466 ↩︎

GitHubで編集を提案

Discussion