公開日

なぜ作ったか:Slack の DM から手元の Claude Code を動かす

手元の PC で動いている Claude Code のセッションに、Slack から話しかけるための MCP channel サーバーを作った。最初の実装からチャンネル対応、ホームタブ、複数セッションまでの 4 日間と、自分の困りごとから生まれた経緯を書く。

はじめに

claude-slack-channel は、Slack のメッセージを手元の PC で動いている Claude Code のセッションに中継する小さなサーバー。Claude の返信も、ファイル書き込みなどの実行許可への回答も、Slack の中で済む。Windows 専用で、MIT ライセンスで公開している。

このシリーズは、このリポジトリを題材に、設計で迷ったことや泥臭い問題解決を書いていく。初回は、なぜ作ったかと、最初の 4 日間で何をしたかをまとめる。

開発は AI(Claude Code)と壁打ちしながら進めている。コードの多くは AI が書いたが、何を作るか、どこまで許すかは自分で決めている。

困りごと

Claude Code に長めの作業を頼むと、途中で実行許可の確認が出て止まる。席に戻るまで、その先が進まない。確認に答えるためだけに PC の前にいるのは流石に無駄すぎる。

スマートフォンから手元のセッションに話しかけ、確認にも答えられれば、この待ち時間は消える。普段から使っている Slack を入口にすれば、新しいアプリを入れずに済む。

ちょうど Claude Code に experimental の channels 機能があった。MCP サーバーがセッションにメッセージを流し込める仕組みで、実行許可の確認も channel 経由で受けられる。これを使えば作れるんじゃないか。

最初の実装(9 月 28 日)

初日に DM 専用の版を動かした。構成は次のとおり。

  • Slack 側は Socket Mode。サーバー側から WebSocket を張るので、ポート開放やトンネルは要らない
  • 受信したメッセージは、ワークスペース ID とユーザー ID の許可リストで絞ってから Claude に渡す
  • Claude は reply / react / edit_message の 3 つのツールで Slack に返す
  • 実行許可は、ボタン付きのメッセージか yes xxxxx / no xxxxx の返信で答える
  • 二重起動を防ぐロック、トークンを伏せるログ、deny を優先する権限設定

最初から決めていたのは、Slack からの指示に普段の緩い許可を効かせないこと。Slack のセッションは専用の設定ファイルで起動し、ユーザー設定は読まない。この話は次回に書く。

同じ日に、起動時にプロジェクトを選べるようにし、この PC 固有の設定をリポジトリの外へ出した。公開を前提にしたのは、他の人が clone してそのまま使える形にしておかないと、自分でも環境を作り直せなくなるから。

チャンネル、ホームタブ、複数セッション(9 月 30 日)

2 日目はレビューと修正に充てた。期限切れの実行許可を自動で deny する、どの DM にも配信できなければ deny する、終了時に保留中の確認をすべて deny するなど、安全側に倒す修正が中心。

3 日目に機能を足した。

  • チャンネル対応。許可したチャンネルで、ボットへのメンションと、ボットが関わるスレッドへの返信にだけ反応する。最初はチャンネルにいるだけで許可ユーザーの発言すべてに反応していたので、流石にすぐ絞った
  • ターミナル側の選択画面を Slack から解除する !screen。Slack に中継されない画面で止まると、手元に行くしかなかったんだよな
  • 「今後も許可」ボタン。同じ種類の操作を次回から確認なしで通す。ルールは確認の中身から機械的に作り、自由入力は受け付けない
  • アプリのホームタブ。稼働中か、どのフォルダーで動いているかを出す
  • 複数セッション。状態ディレクトリと設定ファイルを分けて、プロジェクトごとに別の Slack アプリで並べて起動できる

複数セッションは、2 つ目のアプリを動かしてみて初めて必要になった。起動スクリプトの一時ファイルの置き場が共通で、2 つ目が 1 つ目を上書き。同じ Slack アプリで接続を 2 本張るとイベントが片方にしか届かないのも、このとき知った。

今日まで(10 月 1 日)

今日は hook で Claude Code 側の出来事を Slack に知らせる仕組みと、!status / !restart / !compact を入れた。使用量の上限に達したことや、ターミナル側で入力待ちになっていることに、Slack から気付けるようにするため。

4 日間でコミットは 70 超え。急いで作った分、形だけのテストや、AI の説明を確かめずに書いた README が残っている。直していく過程も、このシリーズで書く。

次回は、実行許可を Slack のボタンで返す設計と、迷ったら deny に倒すという方針について書く。