$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Slack Explorer MCPをStreamable HTTPに対応しました

この記事で紹介した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対応をした。キャッシュ周りが大変だったが実現できて良かった。