この記事で紹介したSlack Explorer MCPをStreamable HTTPに対応した。どこかでホストしておけばChatGPTなどからRemote MCP経由で簡単に接続できるようになったので、その使い方を紹介する。
起動方法は以下の通り。
# Streamable HTTPモードで起動(デフォルトポート: 8080) docker run -i --rm --pull always \ -e TRANSPORT=http \ -p 8080:8080 \ ghcr.io/shibayu36/slack-explorer-mcp:latest # カスタムポートで起動 docker run -i --rm --pull always \ -e TRANSPORT=http \ -e HTTP_PORT=9090 \ -p 9090:9090 \ ghcr.io/shibayu36/slack-explorer-mcp:latest
デフォルト設定( http://localhost:8080 )で起動した場合、Claude CodeからはMCPサーバーをこのように追加できる。SlackトークンはX-Slack-User-Tokenヘッダー経由で渡す仕組みにした。
claude mcp add \ --transport http \ --header "X-Slack-User-Token: xoxp-..." \ -- slack-explorer-mcp http://localhost:8080/mcp
なぜStreamable HTTP対応したかったか
Streamable HTTP対応をしたかった理由は、非エンジニアでも簡単に使えるようにしたかったからだ。
今までのstdio通信だと、ローカル環境にDockerを用意してコンテナを起動して...という手順が必要だった。これは開発者には簡単だが、そうでない人にとっては少しハードルが高い。
Streamable HTTP対応によって、どこかにホスティングしておけば、ChatGPTなどから接続できるようになる。ローカル環境のセットアップが不要になる。
技術的な裏話: キャッシュとStateful実装
今回の対応では、Statefulな実装にせざるを得なかったのが大変だったので紹介しておく。
まずStreamable HTTPに対応するなら、Statelessに実装する方が楽だ。そうすればLambdaなどserverlessなところへのデプロイも簡単にできる。しかし、Slack Explorer MCPではSlackのユーザー一覧をキャッシュしているためStatelessにはできなかった。
そこで、Statefulな実装とし、session単位でin-memoryでキャッシュ管理することにした。またキャッシュにはexpiredを設け、goroutineで定期的に削除することでメモリリークを防ぐようにした。
どのように実現しているかは、キャッシュ管理をしているuser_repository.goを参考にしてほしい。
まとめ
非エンジニアでも使いやすくするため、Slack Explorer MCPのStreamable HTTP対応をした。キャッシュ周りが大変だったが実現できて良かった。