Skip to main content
Glama
claude-slack-channel

claude-slack-channel

by elys0912

claude-slack-channel

Slack のメッセージを、手元の PC で動いている Claude Code のセッションに中継する MCP channel サーバー(以下、ブリッジ)。 Claude の返信やリアクションを受け取るのも、実行許可に答えるのも、Slack の中で済む。Windows 専用。

初めて使うときは、「必要なもの」から「起動」までを順に進めれば動かせる。その先は、必要になったときに ドキュメント の該当するファイルを開く。動かないときは トラブルシューティング を見る。

概要

Slack (DM / 許可したチャンネル)
   │  Socket Mode(サーバー側から WebSocket を張るので、ポート開放やトンネルは不要)
   ▼
claude-slack-channel(dist/src/main.js。node で動く)
   │  MCP(標準入出力、experimental の channels 機能)
   ▼
Claude Code(claude.exe、手元のセッション)
  • 許可したユーザーからの DM と、指定したチャンネルでボットにメンションした発言が、Claude のセッションにそのまま届く。

  • Claude は reply / react / edit_message の3つのツールで Slack に返信する。.env に DOWNLOAD_DIR を書けば、添付を保存する download_file も使える。

  • ファイルの書き込みなどの実行許可には、Slack のボタンか yes xxxxx / no xxxxx の返信で答える。

  • 起動スクリプトは PowerShell で書いてある。

Related MCP server: Claude Code Slack Channel

必要なもの

  • Windows と Windows Terminal。VS Code の統合ターミナルは、動作を確かめていないので対象外。

  • Node.js 24 以上。Claude Code が node コマンドでこのサーバーを起動するので、node と npm に PATH を通しておく。

  • Claude Code。channels 機能と、channel 経由の実行許可の確認に対応した版が要る(最低バージョンは確かめていない)。claude.exe は次の順に探す。

    1. PATH 上の claude

    2. VS Code 拡張に同梱の %USERPROFILE%\.vscode\extensions\anthropic.claude-code-<版>-win32-x64\resources\native-binary\claude.exe(複数あればバージョン番号が最大のもの)

  • Claude のサブスクリプション(必要なプランは確かめていない)。

  • Slack ワークスペースの管理権限。アプリのインストールに要る。

セットアップ

0. clone してビルドする

git clone https://github.com/elys0912/claude-slack-channel.git
cd claude-slack-channel
npm install
npm run build

1. Slack アプリを作る

api.slack.com/apps で次の順に操作する。

  1. Create New App → From an app manifest でワークスペースを選び、slack-app-manifest.yaml の中身を貼り付けて作る。 DM とチャンネルに対応し、Socket Mode が有効で、次の表の8つのスコープを持つアプリになる。

  2. Basic Information → App-Level Tokens → Generate Token and Scopes で、スコープ connections:write のトークンを発行する。 この xapp- で始まるトークンが SLACK_APP_TOKEN になる。

  3. OAuth & Permissions → Install to Workspace でインストールする。 発行される xoxb- で始まるトークンが SLACK_BOT_TOKEN になる。 Scopes に次の8つがあるか確かめる。添付を保存しない(.env に DOWNLOAD_DIR を書かない)なら、files:read は外して7つにしてよい。files:read があると、ボットトークンが漏れたときにワークスペースのファイルまで読まれうる。スコープを足した・外したら、Reinstall to Workspace で入れ直す。

    スコープ

    用途

    chat:write

    返信と実行許可のメッセージの投稿

    im:history

    DM(message.im)の受信

    im:write

    許可ユーザーとの DM を開く(conversations.open)

    channels:history

    公開チャンネル(message.channels)の受信

    groups:history

    非公開チャンネル(message.groups)の受信

    reactions:write

    受信と判定のリアクション

    users:read

    npm run check で表示名を確かめる

    files:read

    download_file で添付を保存する(.env に DOWNLOAD_DIR を書くときだけ)

  4. Slack で自分のプロフィールを開き、その他 → メンバーIDをコピー で自分のユーザー ID(U で始まる)を控える。

2. .env と access.json を作る

トークンと許可リストは、状態ディレクトリ(既定は %USERPROFILE%\.claude\channels\slack。ブリッジの設定・ログ・ロックを置く場所)に置く。 次の2つのファイルをメモ帳で作り、BOM なしの UTF-8(メモ帳の「UTF-8」)で保存する。BOM 付きでも読めるが、勧めない。 場所を変えたいときは 環境変数 を参照。

.env(ひな形: config/env.example):

SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-...
# 任意。書くと download_file ツールが使える(絶対パス)
# DOWNLOAD_DIR=C:\Users\<ユーザー名>\Downloads

書式は KEY=VALUE。export の接頭辞、"..." / '...' の引用符、CRLF の改行も使える。# で始まる行はコメントになる。 値の後ろにもコメントを書ける。コメントとして無視されるのは、次の部分。

  • 引用符なしの値: 空白に続く # 以降。a#b のように前に空白の無い # は、値の一部になる。

  • 引用符付きの値: 閉じ引用符より後ろの # 以降。

access.json(ひな形: config/access.example.json):

{
  "teamId": "T00000000",
  "allowFrom": ["U00000000"],
  "channels": ["C00000000"]
}
  • teamId: ワークスペースの ID(T で始まる)。次の npm run check で確かめられる。

  • allowFrom: DM を受け付けるユーザー ID(U で始まる)。1件以上書き、重複は許さない。ここに無い相手からの DM とボタン操作は無視する。

  • channels(省略可): DM のほかに使うチャンネルの ID(C で始まる。古い非公開チャンネルは G)。重複は許さない。 ID はチャンネル名を右クリック → リンクをコピー で得られる URL の末尾にある。使う前に、そのチャンネルで /invite @<ボット名> としてボットを招待しておく。 チャンネルで Claude に届くのは、ボットへのメンション(@<ボット名>)付きの発言と、ボットが関わっているスレッドへの返信だけ。詳しくは メッセージ を参照。

この2つは Claude に作らせず、手で作る。トークンと許可リストそのものなので、Claude に扱わせるとログや会話履歴に混ざる経路が増える。起動スクリプトも、ファイルがあるかを確かめるだけで中身は読まない。

3. 疎通を確かめる

npm run check

ビルド(precheck)のあと、次を表示する。トークンそのものは出さず、xoxb-*** のように接頭辞だけを出す。

  • 状態ディレクトリの場所

  • ワークスペース名・team_id・ボットのユーザー ID

  • App-Level Token(SLACK_APP_TOKEN)で Socket Mode の接続の URL を取れるか(接続はしない)

  • access.json の teamId が実際の team_id と違うときの警告

  • allowFrom に書いた ID の表示名

access.json がまだ無いか読めないときは、その旨を表示して先へ進む。teamId の突き合わせと表示名の確認だけを省く。

4. 起動するプロジェクトを登録する

config/projects.example.json を config\projects.json にコピーし、Claude Code を起動したいプロジェクトを並べる。projects.json は git の管理外。

{
  "projects": [
    { "name": "my-app", "path": "C:\\path\\to\\my-app" }
  ]
}

起動

Windows Terminal から実行する。

コマンド

動作

scripts\start.cmd

projects.json の一覧から番号で選んで起動する(Enter で先頭、q で中止)

scripts\start.cmd my-app

projects.json の name で指定して起動する(name を先に照合する。同じ名前のフォルダーがカレントにあっても、projects.json のフォルダーで起動する)

scripts\start.cmd C:\path\to\app

パスで直接指定して起動する

scripts\start.cmd my-app -PermissionMode auto

実行許可のモードを変える(権限の設計)

scripts\start.cmd -DryRun

起動せずに、実行するコマンドラインだけを表示する。ビルドは省き、.env / access.json が無くても警告だけ出す。mcp.json などは DryRun 用の別のフォルダーに書くので、動いているセッションには影響しない

scripts\start.cmd C:\path\to\app -StateDir <dir> -SettingsFile <file>

別の Slack アプリと設定で、もう1つのセッションを起動する(セッションを並べる)

  • 起動すると experimental channels の警告ダイアログが出る。起動スクリプトが画面を見張って、「1」(I am using this for local development) を自動で選ぶ。90秒たってもダイアログが残っていたら、手で「1」を選ぶ。

  • dist が無いときだけ自動でビルドする。git pull で更新したら、古い dist のまま起動しないよう、npm run build を手で実行する。

  • 起動したら、Slack でボットに DM を送るか、channels に書いたチャンネルでボットにメンションして話しかける。

使い方の要点

詳しい挙動は docs/usage.md にまとめてある。

  • ボットに話しかけるとメッセージが手元のセッションに届き、届いた印に :eyes: が付く。Claude は元のメッセージのスレッドに返信する。

  • Slack 側の会話はすべて1つのセッションの同じ文脈を共有する。

  • 添付ファイルの中身は渡さない。Claude に届くのはファイル名・種類・サイズの要約とファイル ID だけで、中身が要るときは Claude が download_file で取りに行く。

  • 許可リストに無い操作を Claude が実行しようとすると、スレッドに確認のメッセージが届く。Allow / Deny のボタンか yes xxxxx / no xxxxx の返信で答える。30分答えなければ自動で拒否する。

  • 確認のメッセージの ♾ 今後も許可 を押すと、同じ種類の操作を次回の起動から確認なしで通せる。ボタンが出るのは、ファイルの中身を読み書きしないシェルのコマンドなど、決まった一覧に当てはまる操作だけ(docs/security.md)。

  • 5分たっても Claude から何も返ってこないと、スレッドに警告が出る。

  • / で始まる文は Slack のコマンドとして扱われ、Claude Code には届かない。代わりに ! で始まる次のコマンドを使う。これらは Claude に渡さず、ブリッジ自身が処理する。

コマンド

動作

!help

コマンドの一覧を返す

!status

ブリッジの状態(接続、返事待ち、回答待ちの実行許可、直近の hook)を返す

!screen

ターミナルの画面を見る。選択画面なら、ボタンで選択肢を選べる

!rules

「今後も許可」で足したルールを一覧し、ボタンで消せる

!compact

/compact を送り、会話を要約して縮める

!clear

/clear を送り、会話を捨てて新しい会話にする

!restart

/exit を送り、同じ会話のまま再起動する。警告ダイアログには自動で答える

!restart force

Claude Code を強制終了してから再起動する(応答しないとき用)

!lock

「このセッション中は全部許可」を解除する(有効にしたボットだけ)

!keepalive / !keepalive on / !keepalive off

キャッシュのつなぎ止めの状態を見る・切り替える

Claude Code 側の出来事(使用量の上限、ターミナル側の入力待ち、セッションの開始と終了など)は、hook を通して Slack に通知する。

セキュリティの要点

Slack から手元の PC を操作する以上、何をどこまで許すかが一番の注意点になる。詳しくは docs/security.md を参照。

  • 送信者は Slack のユーザー ID(allowFrom)とワークスペース ID(teamId)で判定する。表示名やメールアドレスは使わない。

  • Slack のセッションは、ユーザー設定(~/.claude/settings.json)を読まない設定で起動する。普段使いのために入れた緩い許可を、Slack からの指示に効かせないため。権限は config/channel-settings.json で絞る。

  • 主に次のリスクが残る(すべては 残るリスク にある)。

    • 許可ユーザーの Slack アカウントが乗っ取られると、手元の Claude をそのまま操作される。

    • 確認で許可した操作は、その内容どおりに実行される。確認の中身はよく読む。

    • Slack のメッセージ・リポジトリの中身・Web ページに仕込まれた指示(プロンプトインジェクション)を、Claude が実行しようとすることがある。最後の防御は確認での拒否になる。

  • トークンが漏れたら、まず App-Level Token を Revoke する。手順は トークンが漏れたとき にある。

ドキュメント

ファイル

内容

docs/usage.md

各機能が Slack でどう動くかを知りたいとき(実行許可、今後も許可、画面の確認、再起動、hook の通知、セッションを並べる など)

docs/security.md

Slack から実行できる範囲を変える前と、トークンが漏れたとき

docs/reference.md

期限や上限などの値、設定ファイルと環境変数を調べるとき。動かないときのトラブルシューティング

docs/development.md

このリポジトリに手を入れるとき(コマンド、テスト、ファイル構成)

CHANGELOG.md

版ごとに、設定・起動・Slack での見え方がどう変わったかを知りたいとき

SECURITY.md

脆弱性を見つけたとき(Issues ではなく非公開で報告する)

ドキュメントで解決しないときは、GitHub の Issues に書いてほしい。脆弱性だけは Issues に書かず、SECURITY.md の手順で知らせてほしい。

ライセンス

MIT

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers