Slack について
Slack MCPは、既存のブラウザーセッションを使ってSlackワークスペースを読み取り、検索し、投稿できるMCPサーバーです。関係性をオンデマンドで可視化し、送信操作には安全チェックを適用します。
主な機能
- 01受信トレイ、メッセージ、関係性の確認
- 02メッセージ、ファイル、リアクションの送信
- 03関係グラフのオンデマンド生成
- 04送信内容のスキャンと承認制御
- 05ブラウザーからのセッショントークン抽出
活用シーン
- 01未読メッセージやメンションの要約
- 02ワークスペース内のメンバー関係の把握
- 03安全チェック付きのメッセージやファイル送信
- 04人物間の関係を静的グラフで確認
MCP 対応
Slackの受信トレイ、メッセージ、関係分析、投稿、認証、ファイル操作のツールをMCPクライアントに提供します。ブラウザーのセッショントークンを使ってSlackに接続します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @aaronsb/slack-mcpSLACK_MCP_XOXC_TOKENシークレットSlack session token. Optional — the auth tool extracts it from your browser and stores it in the config file.SLACK_MCP_XOXD_TOKENシークレットSlack session cookie. Optional — the auth tool extracts it from your browser and stores it in the config file.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
11掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| value | string | いいえ | 'select' アクションの値 — ブラウザー名(例:'chrome')またはプロファイルディレクトリ名(例:'Default') |
| action | string | いいえ | アクション:'next' はフローを進め、'status' は状態を確認し、'select' はオプションを選択し、'retry' は失敗またはロック後に再試行し、'reset' は最初からやり直し、'clear' は保存済みの認証情報を削除します |
詳細
Slack MCP
セッショントークンを使って、AI エージェントが Slack ワークスペースにアクセスできるようにする MCP サーバーです。OAuth アプリも、ボットの権限も、管理者の承認も必要ありません。
メッセージの読み書きに加えて、ワークスペースの持続的な全体像を蓄積します。すべてのチャンネルとユーザーの状態を時系列で記録し、退会者は日付付きの墓標として保持します。さらに、必要に応じて関係グラフを生成します。estate view='about' person='X' を実行すると、「X について教えて」という問いに対し、その人の活動履歴、関係者、優先順位付きの閲覧プランを返します。グラフは保存データとして維持されることはなく、メッセージ本文を含まない2つの小さなローカル台帳から、クエリごとに生成されます(設計ノート)。render='graph' を追加すると、ビューを静的な HTML ページとして描画し、ローカルで開けます。
仕組み
Slack MCP は、既存のブラウザーセッショントークン(xoxc/xoxd)を使って、あなたに代わって Slack とやり取りします。デフォルトでは、他のユーザーに気づかれない形で読み取りを行います。既読通知を発生させるのは mark-read ツールだけです。それ以外の操作は、他のユーザーから見えません。
トークンの抽出機能はバイナリに組み込まれています。Chrome または Firefox で Slack にログインしていれば、セットアップ時にトークンを自動で抽出できます。DevTools からコピーして貼り付ける必要はありません。
前提条件
ブラウザーで Slack にログイン済みのセッションが必要です。セットアップを実行する前に、Chrome、Chromium、Edge、または Firefox で app.slack.com にアクセスし、ワークスペースにログインしてください。
インストール
Claude Code
claude mcp add slack-mcp -- npx -y @aaronsb/slack-mcp
続いて Claude に auth ツールの実行を依頼してください。ブラウザーとプロファイルの選択から、トークンの自動抽出まで案内します。
Claude Desktop
お使いのプラットフォーム用の .mcpb ファイルを最新リリースからダウンロードしてください。
| プラットフォーム | ファイル |
|---|---|
| macOS(Apple Silicon) | slack-mcp-darwin-arm64.mcpb |
| macOS(Intel) | slack-mcp-darwin-x64.mcpb |
| Linux(x64) | slack-mcp-linux-x64.mcpb |
| Linux(ARM) | slack-mcp-linux-arm64.mcpb |
| Windows(x64) | slack-mcp-windows-x64.mcpb |
ファイルを開きます(ダブルクリックするか、Claude Desktop にドラッグします)。トークンの入力を求められたら、次のいずれかを選べます。
- 空欄のままにして、接続後に
authツールを使う - すでにトークンがある場合は、貼り付ける
単体バイナリ
お使いのプラットフォーム用のバイナリをリリースからダウンロードし、次を実行します。
# Extract tokens from your browser (interactive)
./slack-mcp setup
# Run as MCP server (stdio, default)
./slack-mcp
# Run as MCP server (SSE, for remote/shared access)
./slack-mcp --transport sse
npm(グローバル)
npm install -g @aaronsb/slack-mcp
slack-mcp setup
トークンのセットアップ
Slack トークンを取得する方法は3つあります。簡単なものから順に説明します。
自動(Chrome/Edge)
auth MCP ツールまたは slack-mcp setup CLI コマンドを実行すると、次の処理が行われます。
- インストール済みのブラウザーを検出します
- Slack にログインしているブラウザーとプロファイルを選択できます
- ブラウザーを開いて Slack に移動し、Chrome DevTools Protocol 経由でトークンを抽出します
- トークンを検証して保存します
抽出を行う前に、Chrome を完全に終了しておく必要があります。再度開くと、タブは復元されます。
半自動(Firefox)
セットアップでは、一時的なブラウザー拡張機能を一時ディレクトリに書き込み、about:debugging から Firefox に読み込む手順を案内します。拡張機能はトークンを抽出し、ローカルのコールバックサーバーに送信します。Firefox を終了すると、自動的に削除されます。
手動設定
slack-mcp setup を実行するか、auth ツールを使用します。ブラウザーが検出されない場合や、自動抽出に失敗した場合は、DevTools の手順を段階的に説明する localhost のウェブページに切り替わります。
環境変数を使ってトークンを直接設定することもできます。
export SLACK_MCP_XOXC_TOKEN="xoxc-..."
export SLACK_MCP_XOXD_TOKEN="xoxd-..."
./slack-mcp
設定は、MCP クライアントの設定で指定した環境から取得されます。作業ディレクトリにある .env ファイルで設定できるのは SLACK_MCP_PERSONALITY と SLACK_MCP_NO_BROWSER のみで、環境ですでに設定されている変数が上書きされることはありません。.env で、環境には設定されていないほかのキーを設定すると、サーバーは起動を拒否し、そのキー名を表示します。その場合は、クライアントの設定で指定してください。
ライフサイクル
stdio では、クライアントが終了するとサーバーも正常に終了します。具体的には、stdin が閉じられたとき、終了シグナル(SIGTERM、SIGINT、SIGHUP)を受信したとき、または親プロセスが終了したときです。終了のたびにキャッシュがフラッシュされ、台帳のロックが解放されるため、次のインスタンスが読み取り専用のままになることはありません。Windows では、npm ラッパーの child.kill がサーバーを強制終了するため、この正常終了処理は実行されません。
リモートデプロイ(実験的)
リモートデプロイは実験的な機能であり、実際の SSH セッションでテストされていません。サーバーがリモート利用に対応しているかどうか、また対応している場合にどのような形になるかは、まだ未確定です(#102 を参照)。以下は、SLACK_MCP_DEPLOYMENT=remote を設定した場合にのみ適用されます。
半開きの SSH セッションなどで接続が応答しなくなると、誰も読み取っていない状態でパイプが開いたままになります。この状態を検出できるのはアイドルタイムアウトだけです。また、アイドルタイムアウトが有効なのは、その状態が起こり得る環境に限られるため、サーバーはデプロイ方法に応じてタイムアウトを設定します。
| デプロイ方法 | SLACK_MCP_IDLE_TIMEOUT |
|---|---|
| stdio、ローカル | 設定できません。stdio クライアントは終了したサーバーを再起動しないため、アイドル状態でも正常なセッションが切断されてしまいます。 |
| stdio、リモート(SSH 経由) | デフォルトは 2h です。期間(90m)を設定して変更するか、off にして無効にしてください。 |
| SSE | 設定できません。各セッションは接続が終了するとクリーンアップされます。 |
デプロイ方法は、明示的に指定しない限り local です。サーバーがこれを検出することはありません。SSH_CONNECTION が示すのは、祖先プロセスのいずれかが SSH 経由でログインしたということ(SSH セッションで claude を実行している場合や、VS Code Remote-SSH を使用している場合など)であり、MCP パイプが SSH を経由しているということではありません。サーバーを起動する MCP クライアントの設定だけがデプロイ方法を把握しているため、SSH 経由でサーバーを起動するエントリで remote を指定してください。ssh は環境を転送しないため、リモートコマンドラインで env を使って変数を渡してください。
{
"mcpServers": {
"slack": {
"command": "ssh",
"args": ["host", "env", "SLACK_MCP_DEPLOYMENT=remote", "slack-mcp"]
}
}
}
(ssh は引数を 1 つのリモートコマンドラインにまとめるため、ホスト上で env SLACK_MCP_DEPLOYMENT=remote slack-mcp が実行されます。クライアントの env ブロックに設定しても、ローカルの ssh プロセスにしか渡されないため機能しません。)設定できない場所でタイムアウトを指定した場合や、値を解析できない場合、サーバーは理由を stderr に表示して起動を停止します。
ツール
| ツール | 種別 | 内容 |
|---|---|---|
inbox | 名詞 | 対応が必要な項目:view='new'(最後に非表示にしてからの項目)、'unreads'、'mentions' |
messages | 名詞 | 会話の内容:target= で全体を読み取り、+around= で前後のコンテキスト、+since= で期間を指定し、query= には Slack の生の検索構文(記述どおりに渡されます)と、解決済みフィルター in、from、after、before、has(リンク、ピン、:emoji:)、thread を指定します。scheduled=true では、保留中の予約済みメッセージが予定時刻の早い順に一覧表示され、未送信の作成途中メッセージは表示されません(ADR-016) |
estate | 名詞 | ワークスペースの構造と関係:view='about'|'families'|'person'|'initiatives'|'convergence'|'people'|'channels'。about/person では render='graph' を指定すると、静的な HTML グラフページも書き出されます(batch では不可) |
batch | 実行ツール | 保留中の読み取りプランを 1 回の呼び出しで実行します:commands=[{tool, params}...]。プレイブックは save=/run=/list=/delete= で操作します |
say | 動詞 | コンテンツを投稿します(Slack 上に表示されます):メッセージ(スレッドへの返信は broadcast=true でチャンネルにも投稿可能)、交換用ディレクトリ内のファイル(files=['report.pdf']、名前のみ、最大 10 個。text をコメントとして、1 件のメッセージで共有)、または絵文字リアクション。at= では Slack から後で送信するメッセージを予約します(2 分後から 120 日後まで。オフセットのない時刻は Slack プロフィールのタイムゾーンとして読み取られ、このマシンのタイムゾーンと一致しない場合は拒否されます)。cancel=<handle> では予約を取り消します(ADR-016)。送信または予約の前にシークレットをスキャンし、承認ゲートを適用します。承認の対象には送信時刻も含まれます(ADR-013) |
dismiss | 動詞 | 受信トレイの項目を対応済みにします。非公開のウォーターマークであり、Slack からは見えません |
mark-read | 動詞 | 既読通知を送信します。唯一、他者にも見える公開の既読シグナルです。隔離された宛先では拒否され、DM を開くことはありません |
auth | 動詞 | 対話形式でトークンを設定します(localhost のみ) |
download | 動詞 | 共有ファイルを交換用ディレクトリにダウンロードします(filename= はパスではなく名前のみを指定します。名前が使用済みの場合は name (n).ext として保存され、その旨が結果に表示されます) |
put | 動詞 | クライアントのファイルツールからサーバーのファイルシステムにアクセスできない場合に、say files= で添付する新しいファイルを交換用ディレクトリに書き込みます:name=(名前のみ)と、content=(テキスト)または base64=(標準の文字セット。パディングは任意)のいずれか一方のみを指定します。最大 5 MiB。上書きは行いません(名前が使用済みの場合は name (n).ext として保存されます)。読み取り、一覧表示、削除は行いません(ADR-012) |
unlock | 動詞 | ブラウザーでローカルページを開き、隔離とストライクロックを確認して解除します。ページ上で解除され、ツールはリンクを返さず、何が解除されたかも報告しません(ADR-013) |
動詞は効果を、名詞は対象領域を、パラメーターは範囲を表します(ADR-009)。batch 実行ツールが表すのは構成であり、効果ではありません。また、読み取り専用の名詞のみを受け付けます(ADR-010)。各名詞は有効なパラメーターをすべて返し、上限のあるリストはすべてページ分割して表示します。
送信時の安全性
このサーバーが投稿するすべての内容はあなたのアカウントに帰属し、エージェントはワークスペース内の誰もが書き込めるテキストを読み取ります。そのため、say はすべて、コンテンツが Slack に届く前、または DM が開かれる前に、以下の固定順序でチェックされます(ADR-013)。
- ストライクロック — ブロックが多すぎると、ロックを解除するまで(CLI または
unlockページで)すべてのsayとmark-readが拒否されます。 - 交換用ディレクトリ — ファイル名はその中で使う名前のみです(ADR-012)。
- 隔離 — ブロックによって閉鎖された宛先では
sayとmark-readが拒否されます。読み取りは引き続き可能です。 - シークレットスキャナー — 送信するテキスト、リアクションの絵文字、各ファイルの名前とバイト列をスキャンします。base64、hex、URL エンコード、gzip、zlib の内容も対象です。一致があればブロックされ、何も送信されません。エージェントには値ではなく、該当するクラスとフィールドが通知されます。
- 承認ゲート — 組織外の宛先への送信、または(
strictの場合)別の会話からdownloadしたファイルは、保留中のリクエストとしてあなたの承認を待ちます。承認されるまで何も送信されません。
MCP クライアントの設定にある 2 つの項目がこの動作を調整します(ADR-014)。.env では設定できません。
| 設定 | 値 | デフォルト | 効果 |
|---|---|---|---|
SLACK_MCP_IDENTITY | human、agent | human | アカウントの使用者を指定します。エージェントがあなたの代理として投稿するか、エージェント自身として投稿します。say の説明、サーバーの指示、およびブロック時に投稿する通知を設定します。「[automated] A message from this account was blocked by a safety filter.」または「I can't share that.」 |
SLACK_MCP_SAFETY | strict、soft | strict | strict では、最初のブロックで隔離し、2 回目の違反でロックします。soft では、最初の違反で警告し、2 回目から隔離、3 回目でロックします。また、警告を表示したうえで、ダウンロードしたファイルを会話間で移動できます。 |
ブロックが発生すると、隔離された会話に通知を投稿します。組織外の宛先や、DM のない相手には決して通知しません。ブロック、保留中のリクエスト、許可された送信は、outbound-safety: BLOCKED、PENDING、TRUSTED の行としてログに記録されます(宛先、ID、分類、件数。内容は記録されません)。状態に対応が必要な場合、inbox、messages、estate、batch の結果はバナーから始まります。
ブロックを隔離ファイルに書き込めない場合、そのサーバープロセス内のすべての say と mark-read が(メモリ上で)保留され、解除リクエスト(lift=strikes)が発行されます。ファイルを修復してから、リクエストを承認するか、slack-mcp quarantine clear strikes を実行してください。どちらの場合も、記録されているすべての違反がクリアされます。クリアによって保留が解除されるのは、保留の開始時にファイルを読み取り可能で、その後置き換えも編集もされていない場合に限られます。それ以外の場合は、リクエストを承認してください。サーバーを再起動しても保留は解除されますが、記録されていない違反は失われます。ダウンロードの来歴を記録できない場合、ダウンロードは失敗し、ファイルは削除されます(削除にも失敗した場合は、その旨が結果に表示されます)。来歴を読み取れない場合や不正な形式の行がある場合、記録のない添付ファイルは strict では承認が必要になります。また、リクエスト(および PENDING のログ行にある provenance=…)には、provenance.jsonl を修復するよう表示されます。リアクション名には絵文字名([a-z0-9_+'-]、必要に応じて ::skin-tone-2~6 を付加)を指定してください。
ターミナルから回答します:
slack-mcp approve # list pending requests
slack-mcp approve p7k2 # let the next matching call through once
slack-mcp deny p7k2
slack-mcp quarantine list
slack-mcp quarantine clear '#general' # or @handle, or strikes
slack-mcp trust add '#partner' --case external --for 30d
slack-mcp trust list
slack-mcp trust remove '#partner'
MCP プロトコル 2026-07-28 以降を使い、呼び出し時にエリシテーションを宣言するクライアントには、インバンドでも一度だけ承認するか、拒否するか(soft の場合は、承認して信頼するか)を尋ねます。それ以外のクライアントと、すべての SSE セッションでは、CLI を使用します。エリシテーションでは隔離もロックも解除されません。
ターミナルを使えない場合(Claude Desktop などのデスクトップクライアント)は、エージェントにロックの解除を依頼してください。エージェントが unlock を呼び出すと、ブラウザーで 127.0.0.1 のページが開き、隔離された相手または会話ごとに、違反のロックとスキャナーが検出した内容(シークレットの種類、フィールド、送信先、発生日時。値は表示されません)が一覧表示されます。クリアする項目を確認して Clear を押すか、クリアせずにページを閉じるには Done を押してください。どちらの場合もページが閉じ、リンクは使用できなくなります。ページを読み込んだ後にロックの状態が変わった場合、Clear を押しても何も適用されず、ロックが再表示されます。誰もページを読み込んだり操作したりしない場合、15 分後に閉じます。ページからのクリアは by=web として記録され、CLI からのクリアは by=cli として記録されます。エージェントにページのリンクが表示されることはありません。ブラウザーを開けない場合(または SLACK_MCP_NO_BROWSER が設定されている場合)、unlock は拒否され、CLI を使うよう案内します。また、SLACK_MCP_DEPLOYMENT=remote の場合と SSE 経由の場合も利用できません。ページが、あなたのものとは限らないホスト上で開かれるためです。
このページはひと手間を加えるものであり、障壁ではありません。ブラウザーを操作できるエージェントなら、Clear をクリックできます。無人で動作するエージェントには、クライアントの権限で unlock ツールとブラウザー自動化の両方を許可しないでください。そうすれば、CLI からのみクリアできます。
状態はエステート台帳と同じ場所、$XDG_DATA_HOME/slack-mcp/ledger/<team>/(quarantine.jsonl、pending.jsonl、trust.jsonl、provenance.jsonl。それぞれ 0600)に保存されます。これらは追記専用の JSON 行ファイルです。実行中のサーバーは、ゲート付きの呼び出しごとにファイルを読み直すため、行を編集または削除すると、すぐに反映されます。履歴が保持される CLI の使用をおすすめします。
プライバシー
- デフォルトでステルス — 読み取りによって既読通知が送信されることはなく、送信するのは
mark-readのみです - ID ではなくチャンネル名 — AI に内部 Slack 識別子が表示されることはありません
- トークンはローカルに保存 —
0600の権限で~/.config/slack-mcp/config.jsonに保存されます - ログは非公開で、認証情報を含みません — stdio では
$XDG_STATE_HOME/slack-mcp/slack-mcp.log(デフォルトは~/.local/state/slack-mcp/)に出力されます。ディレクトリの権限は0700、ファイルの権限は0600です。移動するには、MCP クライアント設定でSLACK_MCP_LOG_FILEを設定します。ワークスペース名とユーザー名は記録されますが、トークンや Cookie は記録されず、トークンまたは Cookie のような形式の情報は書き込む前にすべて伏せられます - 台帳にメッセージの内容は含まれません — 永続的なエステート台帳にはエンティティの事実(名前、ライフサイクル、削除済みの記録)が保存されます。アテンション台帳には
{user, conversation, day}の遭遇記録が90日間保存されます。どちらも XDG 配下に0600の権限で保存され、削除するとグラフも削除されます - 時間単位のアクティビティが記録されるのはあなたのみ — 同僚については、設計上、日単位で集計されます
- グラフレポートはローカルの非公開ファイルです —
estate render='graph'は、自己完結型の HTML ページを$XDG_DATA_HOME/slack-mcp/reports/(デフォルトは~/.local/share/slack-mcp/reports/)に書き込みます。ディレクトリの権限は0700、ファイルの権限は0600で、ビューと人物ごとに1つ作成され、レンダリングのたびに置き換えられます。レポートには関係データが含まれます。つまり、ビューに表示されるのと同じ名前と件数が含まれ、ID や同僚の時間情報は含まれません。そのため、台帳と同様に扱ってください。ディレクトリを削除するとレポートも削除されます。ページはネットワークから何も読み込みません(Cytoscape.js を同梱し、厳格な Content-Security-Policy を設定)。また、ページが配信されたり、あなたに代わって開かれたりすることはありません - ファイルの受け渡しは交換ディレクトリ経由のみ —
say files=はこのディレクトリからのみ読み込み、downloadとputは$XDG_DATA_HOME/slack-mcp/exchange/(デフォルトは~/.local/share/slack-mcp/exchange/。または MCP クライアント設定でSLACK_MCP_EXCHANGE_DIRを設定)にのみ書き込みます。ディレクトリの権限は0700、ファイルの権限は0600で、上書きは行われません。ファイルパラメーターにはパスではなく名前のみを指定するため、注入されたテキストによってツールが~/.sshや自動起動フォルダーを参照することはありません。ファイルを添付するには、独自のツールでファイルをコピーして入れ、ダウンロード後にコピーして取り出してください。ツールからディレクトリにアクセスできないクライアント(別のマシン上のサンドボックスなど)は、putでファイルを書き込みます。putは上書き、読み取り、一覧表示、削除を行いません(ADR-012) - Slack 以外へのネットワーク通信はありません — バイナリが接続するのは Slack ホスト(
slack.comと*.slack.com)のみです。別のホストへのアップロード先やリダイレクトは、1バイトも送信される前に拒否されます - ブラウザー経由のダウンロードはありません — インストール済みのブラウザーを使用し、CDN からバイナリを取得することはありません
開発
make build # Build for current platform
make test # Run tests
make build-all-platforms # Cross-compile (6 platforms)
make release TAG=v2.1.1 # Tag and push (CI handles the rest)
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。