mcpField
S
Slack

Slack

ローカル
github.com/mindstoneコミュニケーション13今日更新

Slack について

Slackは、Slack Web APIを通じてワークスペースを操作するMCPサーバーで、複数のSlackワークスペースを利用するユーザー向けです。OAuthはホストアプリケーションが担い、サーバーはローカルに保存されたワークスペース別の認証情報を読み込みます。

主な機能

  1. 01メッセージの検索、投稿、編集、予約
  2. 02チャンネル、履歴、スレッドの操作
  3. 03ユーザー検索、プロフィール確認、DM開始
  4. 04リアクション、ピン留め、ブックマーク
  5. 05ファイルのアップロードとダウンロード

活用シーン

  1. 01ユーザーの最近のチャンネル投稿を見つけてリアクションする
  2. 02チャンネル履歴やスレッドの返信を確認する
  3. 03チャンネルへの投稿や予約を行う
  4. 04ユーザーを検索してダイレクトメッセージを開始する

MCP 対応

MCPサーバーとして、Slackワークスペース操作ツールをクライアントに公開します。OAuthはホストアプリケーションが開始し、サーバーはホスト管理のワークスペース別認証情報を読み込みます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"mindstone-mcp-server-slack": {
"command": "npx",
"args": [
"-y",
"@mindstone/mcp-server-slack"
],
"env": {
"SLACK_CONFIG_PATH": "<SLACK_CONFIG_PATH>",
"SLACK_TEAM_ID": "<SLACK_TEAM_ID>",
"SLACK_CLIENT_ID": "<SLACK_CLIENT_ID>",
"SLACK_CLIENT_SECRET": "<SLACK_CLIENT_SECRET>",
"SLACK_DISABLE_REFRESH": "<SLACK_DISABLE_REFRESH>",
"SLACK_REQUEST_TIMEOUT_MS": "<SLACK_REQUEST_TIMEOUT_MS>",
"SLACK_MAX_RETRIES": "<SLACK_MAX_RETRIES>",
"MCP_WORKSPACE_PATH": "<MCP_WORKSPACE_PATH>"
}
}
}
}
起動コマンドnpx -y @mindstone/mcp-server-slack
設定が必要な環境変数
SLACK_CONFIG_PATHPath to the host-managed Slack config directory
SLACK_TEAM_IDSlack workspace team ID (one process per workspace)
SLACK_CLIENT_IDSlack OAuth Connected App client ID. Only required to refresh a rotating token; saved non-rotating tokens authorize the Slack API without it.
SLACK_CLIENT_SECRETシークレットSlack OAuth Connected App client secret. Only required to refresh a rotating token; saved non-rotating tokens authorize the Slack API without it.
SLACK_DISABLE_REFRESHSet to 1 to disable token refresh on this surface (cloud surface)
SLACK_REQUEST_TIMEOUT_MSOverride the upstream timeout (max 300000ms = 5 min)
SLACK_MAX_RETRIESWebClient retries on transient failures (0-20). Lower this on cloud to avoid stacking long retry budgets into multi-minute hangs.
MCP_WORKSPACE_PATHWorkspace directory upload_slack_file reads are constrained to (defaults to the system temp dir when unset)

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@mindstone/mcp-server-slack0.3.1

ツール

39

掲載時のツール一覧 · 今日に更新

このツールにパラメーターはありません。

詳細

@mindstone/mcp-server-slack

npm version License: FSL-1.1-MIT

Slack ワークスペース用 MCP サーバー — Slack Web API を介したチャンネル、メッセージ、スレッド、リアクション、ユーザー、ファイル、ブックマーク、予約済みメッセージ。

マルチワークスペース対応の Slack MCP。ホストが OAuth を管理し、ワークスペースごとの認証情報ファイルをディスク上に保存します。また、リリースごとにセキュリティレビューを実施します。

ステータス

  • バージョン: 0.3.0 · npm
  • 認証: OAuth(ホストがオーケストレーション) (SLACK_CLIENT_SECRET)
  • ツール: 39(メッセージ、チャンネル、スレッド、ユーザー、ファイル、ピン留め)
  • サーフェス: cloud-api
  • 機械可読: STATUS.json

開発の背景

このコネクターの開発を始めた当時、Slack から公式 MCP サーバーはまだリリースされていませんでした。公式サーバーはその後(2026 年 2 月に発表され、2026 年 4 月に一般提供開始)登場しました。当時利用可能だったコミュニティ製の Slack MCP は、いずれも機能の一部では優れていましたが、小規模および中規模のワークスペースでユーザー名をすばやく検索できること、最新の Slack に適したメンション形式を使うこと(多くは非推奨の link_names=true を使っていました)、同じユーザーアカウントから複数の Slack ワークスペースを利用できること、トークンをユーザー自身のマシンに保存することを、すべて備えたものはありませんでした。Slack の公式サーバーが現在は公開されており、多くの用途に適しています。それでもこのサーバーの保守を続けているのは、ログインフローをホストアプリケーションが処理し、各ワークスペースの認証情報ファイルをユーザーの管理下でディスク上に保存できること、そしてリリースのたびに独自のセキュリティレビューを実施しているためです。

やり取りの例

「#q3-planning で Alice の最新のメッセージを探し、:eyes: でリアクションしてください。」

ホストが呼び出すツール:

  1. lookup_user_by_email — Alice のメールアドレスから Slack ユーザー ID を特定します。
  2. search_slack_messages — #q3-planning で Alice の最新のメッセージを検索し、チャンネルとタイムスタンプを返します。
  3. add_slack_reaction — そのメッセージに eyes リアクションを追加します。

レスポンス(抜粋):

{
  "match": {
    "channel": "C08X...",
    "ts": "1715953812.004200",
    "user": "U07Z...",
    "text": "Pushed the updated forecast to the doc, ready for review."
  },
  "reaction": {
    "ok": true,
    "name": "eyes"
  }
}

要件

  • Node.js 20 以降
  • npm
  • Slack OAuth フローを実行し、ワークスペースごとのトークンファイルを ${SLACK_CONFIG_PATH}/workspaces/{teamId}.json に書き込むホストアプリケーション。このサーバーはそれらのファイルを読み込みますが、OAuth 自体は開始しません。

ワンクリックインストール

Cursor に追加 VS Code に追加 VS Code Insiders に追加

ボタンをクリックすると、ホストから次の項目を入力するよう求められます:SLACK_CONFIG_PATH、SLACK_TEAM_ID、SLACK_CLIENT_SECRET、SLACK_REQUEST_TIMEOUT_MS、SLACK_MAX_RETRIES。

Claude Desktop / Claude Code / Goose / Continue.dev 用の手動設定(Slack)
{
  "mcpServers": {
    "Slack": {
      "command": "npx",
      "args": [
        "-y",
        "@mindstone/mcp-server-slack"
      ],
      "env": {
        "SLACK_CONFIG_PATH": "",
        "SLACK_TEAM_ID": "",
        "SLACK_CLIENT_SECRET": "",
        "SLACK_REQUEST_TIMEOUT_MS": "60000",
        "SLACK_MAX_RETRIES": "10"
      }
    }
  }
}

クイックスタート

インストールとビルド
cd <path-to-repo>/connectors/slack
npm install
npm run build
npx(公開後に使用)
npx -y @mindstone/mcp-server-slack
ローカル
node dist/index.js

設定

このサーバーは、Slack OAuth フローを独自に実行するホストアプリケーションと連携して動作するよう設計されています。ホストが認証情報をディスクに書き込み、このサーバーがそれを読み取ります。

必須の環境変数
  • SLACK_CONFIG_PATH — Slack 設定ディレクトリへのパス(ホストが管理)。config.json(ワークスペースのメタデータ)と workspaces/{teamId}.json(ワークスペースごとのトークン、モード 0600)が含まれます。
  • SLACK_TEAM_ID — ワークスペースのチーム ID(ワークスペースごとのインスタンス)。
任意の環境変数
  • SLACK_CLIENT_ID — OAuth Connected App のクライアント ID。ローテーションするトークンを更新する場合にのみ必要です。保存済みの非ローテーション型トークンは、これがなくても Slack API を直接認証できます。更新が必要なのにこの値が設定されていない場合、サーバーは REFRESH_NO_CLIENT_CREDENTIALS を返して明示的に失敗し、ホストに再認証を促します。
  • SLACK_CLIENT_SECRET — OAuth Connected App のクライアントシークレット。SLACK_CLIENT_ID と同じ条件で必要です。
  • SLACK_DISABLE_REFRESH — 1 に設定すると、このサーフェスでのトークン更新を無効にします。トークンの有効期限が切れた場合、oauth.v2.access による更新を試みず、構造化された auth_required レスポンスを返して安全側に失敗します。クラウドサーフェスで使用すると、デスクトップが唯一の更新権限を持つようになり、使い捨ての更新トークンを巡る競合を避けられます。
  • SLACK_REQUEST_TIMEOUT_MS — 上流タイムアウトのデフォルト値(60s)を上書きします。正の整数で、300000(5 分)以下である必要があります。
  • MCP_WORKSPACE_PATH — upload_slack_file が読み取るファイルの範囲を制限するディレクトリです。範囲外のパス(範囲外を指すシンボリックリンクを含む)は拒否されます。未設定の場合は、システムの一時ディレクトリがデフォルトになります。
認証フロー

ホストは authenticate_slack_workspace ツールを呼び出します。OSS サーバーは、次の形式の構造化された auth_required レスポンスを返します。

{
  "status": "auth_required",
  "user_action": {
    "id": "slack.connect_workspace",
    "label": "Connect Slack",
    "instruction": "Click \"Connect Slack\" in the side panel to authorise the workspace."
  },
  "agent_action": {
    "instruction": "Tell the user to click the Connect Slack button in the connector settings to authorise. Then call list_slack_workspaces to verify."
  },
  "setupToolName": "authenticate_slack_workspace"
}

ホストの MCP サービスはこの形式を認識し、登録済みの Slack OAuth オーケストレーター(デスクトップのブラウザーフロー)に処理を振り分けます。ユーザーがサインインすると、ホストはトークンを ${SLACK_CONFIG_PATH}/workspaces/{teamId}.json に書き込み、サーバーは次の呼び出し時にそれを読み込みます。

OSS サーバーが OAuth を自ら開始することはありません。

ホスト設定の例

このサーバーは、ホストが OAuth をオーケストレーションする設計です。ホストがワークスペースごとのトークンファイルをディスクに書き込み、サーバーがそれを読み取ります。以下の例は環境変数の形式を示しています。ツール呼び出しが成功する前に ${SLACK_CONFIG_PATH}/workspaces/{teamId}.json を設定する責任は、ホストアプリケーションにあります。

Claude Desktop / Cursor
{
  "mcpServers": {
    "Slack": {
      "command": "npx",
      "args": ["-y", "@mindstone/mcp-server-slack"],
      "env": {
        "SLACK_CONFIG_PATH": "/absolute/path/to/slack-config",
        "SLACK_TEAM_ID": "T0123ABCD",
        "SLACK_CLIENT_ID": "your-slack-app-client-id",
        "SLACK_CLIENT_SECRET": "your-slack-app-client-secret"
      }
    }
  }
}

ホストがそのチームの ${SLACK_CONFIG_PATH}/workspaces/T0123ABCD.json を書き込むまでは、すべてのツール呼び出しで構造化された auth_required レスポンスが返されます(上記の認証フローを参照)。

ローカル開発(npm への公開は不要)
{
  "mcpServers": {
    "Slack": {
      "command": "node",
      "args": ["<path-to-repo>/connectors/slack/dist/index.js"],
      "env": {
        "SLACK_CONFIG_PATH": "/absolute/path/to/slack-config",
        "SLACK_TEAM_ID": "T0123ABCD",
        "SLACK_CLIENT_ID": "your-slack-app-client-id",
        "SLACK_CLIENT_SECRET": "your-slack-app-client-secret"
      }
    }
  }
}

ツール(39)

認証
  • authenticate_slack_workspace — 構造化された auth_required レスポンスを返します。OAuth はホスト側で処理されます。
  • list_slack_workspaces — Slack の接続状況(接続状態、トークンの健全性、有効期限が近いかどうか)を確認します。
メッセージ
  • search_slack_messages — すべてのチャンネルを検索します(Slack の検索修飾子に対応)。to_me、after、before のいずれかが指定されている場合は query を省略できます。いずれも指定されていない呼び出しは拒否されます。接続済みアプリが詳細な search:read.* スコープを持つ場合は、Slack の Real-Time Search API(assistant.search.context)を使用します。それ以外の場合は従来の search.messages にフォールバックし、同じく完全な検索結果を返します。実行されたバックエンドは search_backend に記録されます。このフィールドは診断専用であり、Real-Time Search の経路を有効にするにはアプリの設定変更が必要で、依頼者が対応できるものではないため、ユーザーにはフォールバックについて説明しません。フォールバックがワークスペースごとにキャッシュされるのは、インストールに関する拒否(missing_scope、not_allowed_token_type、feature_not_enabled、エンドポイントの非推奨を示すコード)の場合に限られます。リソース固有の access_denied は通常のエラーとして表示され、次の呼び出しでは RTS が再試行されます。
  • get_slack_saved_messages — 後で見るために保存したメッセージを取得します(is:saved を使用)。search_slack_messages と同じ検索バックエンド情報を報告します。
  • get_slack_message_by_link — パーマリンク URL からメッセージを取得します。
  • compose_slack_message — 送信前にインライン編集可能な作成フォームを開きます。ユーザーが「送信」をクリックすると、フォームから post_slack_message を介して投稿されます。
  • post_slack_message — メッセージを投稿します。DM の宛先確認機能が組み込まれています。自分宛ての DM はブロックされ、send_myself_a_note に誘導されます(ユーザートークンによる自分宛ての DM では通知されません)。
  • reply_to_slack_thread — 既存のスレッドに返信します。
  • schedule_slack_message — 将来の日時にメッセージを送信するよう予約します。自分宛ての DM はブロックされます(予約した自分宛てのメモにはまだ対応していません)。
  • list_scheduled_slack_messages — 保留中の予約済みメッセージを一覧表示します(チャンネルごとの指定も可能)。キャンセルに必要な ID も表示します。
  • delete_scheduled_slack_message — 投稿前の予約済みメッセージをキャンセルします。
  • update_slack_message — 自分が投稿したメッセージを編集します。
  • delete_slack_message — 自分が投稿したメッセージを完全に削除します。
  • send_myself_a_note — 実際に通知が届くメモを自分に送信します(認証済みユーザーにボットから DM を投稿します)。ユーザートークンによる自分宛ての DM の代わりに、「何かを書き留める」場合やリマインダーに使用します。
チャンネル
  • list_slack_channels — チャンネルを一覧表示します(フィルタリング、ページネーションに対応)。
  • get_slack_channel_history — チャンネルの最近のメッセージを取得します。
  • create_slack_channel — 新しいチャンネル(パブリックまたはプライベート)を作成します。
  • mark_slack_channel_as_read — 指定したタイムスタンプまでのメッセージを既読にします。
  • get_slack_unread_messages — 自分の既読位置に基づいて未読メッセージを取得します。
  • invite_user_to_channel — ユーザーをチャンネルに追加します(複数ユーザーに対応)。
スレッド
  • get_slack_thread_replies — スレッド内のすべての返信を取得します。
リアクション
  • add_slack_reaction — メッセージに絵文字リアクションを追加します。
  • remove_slack_reaction — メッセージから自分のリアクションを削除します。
  • list_slack_emoji — ワークスペースのカスタム絵文字を一覧表示します(名前 → URL/エイリアス。いずれも <untrusted-content> エンベロープで囲まれます)。Slack の絵文字の名前や値に関する制約に違反する項目は除外され、その数が報告されます(omitted_invalid_entries)。転送されることはありません。
ピン留め
  • list_slack_pins — チャンネルでピン留めされたメッセージを一覧表示します。
  • pin_slack_message — メッセージをチャンネルにピン留めします。
  • unpin_slack_message — チャンネルのピン留め項目からメッセージを削除します(メッセージ自体は削除されません)。
ユーザー
  • list_slack_users — アクティブなユーザーを一覧表示します(名前フィルターを自動的にページネーションします)。
  • get_slack_user_profile — ユーザーの詳細なプロフィールを取得します。
  • lookup_user_by_email — 完全一致するメールアドレスでユーザーを検索します(優先される解決方法)。
  • open_slack_dm — ユーザーとの DM を開きます(DM チャンネルと、確認済みの受信者 ID を返します)。
ファイル
  • download_slack_file — ID または URL を指定してファイル添付をダウンロードします。
  • upload_slack_file — ローカルファイルをアップロードします(ワークスペース内に制限され、競合状態のない読み取りが行われます。上限は 50MB)。必要に応じてチャンネルまたはスレッドに共有できます。3 ステップの外部アップロードフローを使用します。
ワークスペース
  • add_slack_bookmark — チャンネルにブックマークを追加します。
  • list_slack_bookmarks — チャンネルのブックマークを一覧表示します。
  • add_slack_reminder — [EXPERIMENTAL] リマインダーを作成します(Slack API は一部非推奨のため、schedule_slack_message を推奨します)。
  • list_slack_reminders — [EXPERIMENTAL] 自分のリマインダーを一覧表示します。
  • complete_slack_reminder — [EXPERIMENTAL] リマインダーを完了済みにします。
  • delete_slack_reminder — [EXPERIMENTAL] リマインダーを完全に削除します。

セキュリティに関する注意事項

  • Slack が所有するダウンロード URL のガード — download_slack_file は、Slack から提供された url_private_download が HTTPS であり、slack.com または *.slack.com 上にあることを検証してから、ワークスペースのベアラートークンを付与します。ダウンロードヘルパーは redirect: 'manual' も設定し、リダイレクトのたびに再検証するため、侵害された Slack のエッジから攻撃者が管理するホストへの 302 リダイレクトによってベアラートークンが再送信されることはありません(slack-010 の指摘への対応として 0.1.3 で追加)。
  • 信頼できないコンテンツのエンベロープ — 外部テキストを返すすべてのツールは、AGENTS.md の不変条件 #6 に従って <untrusted-content source="…">…</untrusted-content> エンベロープで囲み、閉じタグによるブレークアウトをエスケープします。対象には、メッセージ本文、チャンネルのトピック/目的、検索結果、スレッドの返信、未読メッセージ、ダウンロードしたファイルの内容/名前が含まれます。ツールの出力をモデルに提示する際、ホストはエンベロープをそのまま保持する必要があります(slack-001..007 の指摘への対応として 0.1.3 で追加)。
  • アトミックで永続性のあるトークン保存 — トークンファイルは一時ファイルへの書き込み、fsync、rename の順に処理された後、chmod 0600 で権限が設定されるため、書き込み中にクラッシュしても Slack の使い捨てリフレッシュトークンが失われることはありません。
  • リフレッシュ失敗の区別 — 一時的なネットワークエラー、HTTP 429 のレート制限、Slack の認証拒否(invalid_grant)、不正な形式のレスポンスは、それぞれ異なるエラーコードを生成します。これによりホストは、回復不能な失敗を再試行せずに適切に対応できます。
  • ホスト内部の用語を含めない — ホスト側ブリッジの識別子と同梱された HTTP パスは、公開される成果物に明示的に含まれません(prepublishOnly 実行時に scripts/check-no-bridge-strings.sh で確認され、npm run security:internal-refs としても実行される scripts/check-internal-refs.mjs は、src/ と dist/ 内の内部イシュートラッカー参照も拒否します)。
  • 競合状態のないアップロード元の読み取り — upload_slack_file はワークスペース内のソースパスを検証してから、一度だけ開きます(シンボリックリンクをたどらず、ノンブロッキング)。開いたファイル記述子に対する fstat によって通常ファイルのみを許可し、50MB の上限を適用します。さらに、新たに制限付きで解決したパスとファイル記述子の dev+inode が一致することを再検証し、検証後の置き換え(祖先ディレクトリの差し替えを含む)を防ぎます。読み取る実データにも、ファイル記述子を通じて上限を適用します。
  • 追加パスでもエンベロープを統一 — add_slack_bookmark と add_slack_reminder は、一覧表示パスと同様に Slack から返されたタイトル/テキストをエンベロープで囲み、閉じタグによるブレークアウトをエスケープします。

実装レベルの詳細(リクエストタイムアウトの構成、MSW リクエストマニフェスト、トークンファイルのエラー状態、サーバーバージョンの不整合チェックなど)は、docs/connectors/slack-cohort-hygiene.md に記載されています。

ライブプローブ

ライブプローブゲートは test/live-probe.ts にコミットされています。自動実行はされません。手動で実行してください:

LIVE_PROBE_BOT_TOKEN=xoxb-... \
LIVE_PROBE_USER_TOKEN=xoxp-... \
LIVE_PROBE_TEAM_ID=T... \
npm run probe:live

プローブはワークスペースのソースではなく、パッケージ化された tarball に対して実行されます。initialize + tools/list + 読み取り専用の呼び出し 5 件 + 書き込みツールの呼び出し 2 件を実行し、60s のタイムアウトのデフォルト値を検証するために search.messages の P95 レイテンシを記録します。

デフォルトでは、プローブは読み取り専用です。書き込みプローブ(post_slack_message、add_slack_reaction)は、LIVE_PROBE_TEST_CHANNEL_ID が設定されている場合にのみ実行されます。設定されていない場合はスキップされますが、プローブは引き続き OK で終了します。

公開ゲートモード

公開前の認定では、次を実行してください:

LIVE_PROBE_BOT_TOKEN=xoxb-... \
LIVE_PROBE_USER_TOKEN=xoxp-... \
LIVE_PROBE_TEAM_ID=T... \
LIVE_PROBE_TEST_CHANNEL_ID=C... \
npm run probe:live:gate

probe:live:gate は LIVE_PROBE_REQUIRE_WRITES=1 を設定します。これにより、LIVE_PROBE_TEST_CHANNEL_ID が設定されていない場合、またはいずれかの書き込みプローブが正常に完了しない場合、プローブはスキップではなく失敗します。リリースを作成する前に実行してください。

ライセンス

FSL-1.1-MIT — Functional Source License, Version 1.1。MIT の将来のライセンスが付属します。このソフトウェアは 2030-04-08 に MIT ライセンスへ切り替わります。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。