Slack MCPサーバーの使い方 — Claude Codeへの接続とClaude Tagとの違い
SlackのリモートMCPサーバー(mcp.slack.com)をClaude Codeにつなぐ手順と、権限スコープの絞り方、Claude Tagとの役割の違いをまとめます。
SlackはAIエージェント向けに、https://mcp.slack.com/mcpというリモートMCPサーバーを提供しています。ローカルにサーバーを立てる必要はなく、Claude Codeからメッセージ・チャンネル・canvasにアクセスできます。ただし、URLを1行登録するだけでは通りません。Slackは動的クライアント登録(DCR)に対応しておらず、接続元は固定のアプリIDを持つ必要があるためです。
似た名前の製品にClaude Tagもありますが、こちらはSlackチャンネルの中で@Claudeとして動く別の仕組みです。この記事では、つながらないときの原因、Slack公式が示す接続経路、スコープの絞り方、Claude Tagとの向きの違いを順に見ます。
claude mcp addの1行でつながらないのはなぜか
Slackの公式ドキュメントには、SSE接続とDynamic Client Registrationには対応していないと書かれています。MCPクライアントは、固定のアプリIDを持つ登録済みSlackアプリに支えられ、そのIDをクライアント側に埋め込む必要があります。ワークスペース管理者が通常のアプリ承認の流れで承認・管理でき、リクエストがアプリに紐づいてログや利用制限に反映されます。
Claude Code側の公式ドキュメントも、DCR非対応のサーバーではIncompatible auth server: does not support dynamic client registrationのようなエラーになり、事前登録した認証情報が必要だと説明しています。そこでclaude mcp addの登場です。v2.1.285でclaude mcp add --helpを実行すると、次のオプションが並びます。
claude mcp add --helpOptions:
--callback-port <port> Fixed port for OAuth callback (for servers
requiring pre-registered redirect URIs)
--client-id <clientId> OAuth client ID for HTTP/SSE servers
--client-secret Prompt for OAuth client secret (or set
MCP_CLIENT_SECRET env var)--client-idと--client-secretはDCR非対応サーバー向けに、事前に登録した認証情報を渡すためのもので、v2.1.30で追加されました。Slackは接続先として例に挙げられています。ただしSlackの公式ガイドがClaude Code向けに示しているのは、この手動登録ではなくプラグイン経由です。
Claude Codeで接続する手順
Slack公式のClaude Code接続経路
- 1
ワークスペース管理者の承認を確認する
Slack側の前提条件は「MCP連携がワークスペース管理者に承認されていること」です。承認がなければ、以降の認証は進みません。
- 2
Slackプラグインを入れる
Claude Codeのセッション内で
/plugin install slack、またはシェルからclaude plugin install slackを実行します。プラグインが読み込まれるとSlack MCPサーバーが自動で設定されます。 - 3
OAuthでサインインする
プラグインの読み込み後にOAuth認証が促されます。未認証のままなら
/mcpパネルでSlackのサーバーを選びます。パネル上の名前はplugin:slack:slackのように、プラグイン名つきで表示されることがあります。ブラウザに開く認証画面で、ワークスペースへのサインインと権限の許可を済ませます。
プラグインが使う設定は、Slackの公式ガイドに次の形で載っています。clientIdはSlackが登録したアプリのIDで、callbackPortはOAuthの戻り先ポートを固定します。プラグインを使わず自分で.mcp.jsonに書く場合も、この2つが要ります。自作のSlackアプリを使うなら、MCPを使えるのはディレクトリに公開されたアプリか社内アプリだけで、未掲載のアプリは禁止されています。Slackは機密クライアントのOAuthにも対応しており、その場合は自分のアプリのclient_idとclient_secretを使います。
{
"mcpServers": {
"slack": {
"type": "http",
"url": "https://mcp.slack.com/mcp",
"oauth": {
"clientId": "1601185624273.8899143856786",
"callbackPort": 3118
}
}
}
}claude mcp addだけで登録して認証に失敗した場合の読み解き方は、「dynamic client registration」の対処にまとめています。
接続後にできること — Slackが公開しているツール
接続が済めば、あとは自然文で頼むだけです。Slackの公式ドキュメントにあるツールは、検索とメッセージだけではありません。
- 検索: メッセージ・ファイル・ユーザー・チャンネル・絵文字
- メッセージ: 送信、予定送信(スケジュール)、下書き、チャンネルやスレッドの読み込み、リアクションの追加と取得
- 作成系: 公開・非公開チャンネルやDMの作成、canvasとリスト(lists)の作成・更新、ファイルのアップロード
- ユーザー情報: プロフィール、メールアドレス、チャンネルメンバー、参加チャンネル一覧
チャンネルの新規作成やファイルのアップロードも含まれるため、「読む・送るだけ」のツールセットと見なして権限を広く渡すと、想定より多くの操作が可能になります。
先週の#engineeringチャンネルで、デプロイ障害について話していたスレッドを探してこのような依頼では検索系のツールが呼ばれ、キーワードに一致するメッセージが返ります。過去ログを調べてからコードの修正に取り掛かる流れを、Claude Codeのセッション内で完結できます。
今のバグ修正の要点を3行でまとめて、#eng-alertsチャンネルに投稿して送信はchat:writeスコープで動きます。意図しない誤送信を避けたい場合は、次の節のとおりこのスコープを要求しない構成にできます。
権限スコープをどう絞るか
Slackの公式ドキュメントでは、ツールごとに必要なユーザートークンのスコープが決まっています。使う機能から逆算すると、要求するスコープを最小にできます。
| 使う機能 | 必要なスコープ |
|---|---|
| メッセージ・ファイルの検索 | 必要なスコープsearch:read.public / search:read.private / search:read.mpim / search:read.im / search:read.files |
| チャンネルやスレッドの読み込み | 必要なスコープchannels:history / groups:history / mpim:history / im:history |
| メッセージ送信・予約送信 | 必要なスコープchat:write |
| チャンネル・DMの作成 | 必要なスコープ公開チャンネルはchannels:write、非公開はgroups:write、DMはim:write / mpim:write |
| canvasの作成・更新 | 必要なスコープcanvases:read と canvases:write |
Claude Codeは、oauth.scopesを設定しない場合、サーバーがWWW-Authenticateヘッダーや保護リソースのメタデータで示したスコープを要求します。v2.1.196以降は、サーバーが公開する全スコープの一覧を自動では要求しません。読み取り専用にしたいなら、次のように空白区切りで固定します。
{
"mcpServers": {
"slack": {
"type": "http",
"url": "https://mcp.slack.com/mcp",
"oauth": {
"clientId": "1601185624273.8899143856786",
"callbackPort": 3118,
"scopes": "search:read.public channels:history"
}
}
}
}スコープが足りない呼び出しではneeds additional permissionsが返り、必要なスコープ名が示されます。検索ツールでこれが出たら、表にある他のsearch:read.*を足します。ここで注意したいのは、再認証だけではスコープが増えない点です。Claude Codeは固定したスコープを要求するため、oauth.scopesに足してから/mcpでもう一度認証します。Claude Code側のMCP OAuth実装全般はClaude Code MCP設定ガイドで扱っています。
レート制限と他のMCPサーバーとの併用
MCPツールにも、Slack Web APIと同じレート制限がかかります。ツールごとに階層(Tier)が決まっており、Slackが載せている数値は次のとおりです。
ツールごとの制限(1分あたり)
ユーザー・チャンネル・絵文字の検索
20回以上
Tier 2
スレッド・チャンネルの読み込み
50回以上
Tier 3
プロフィール・メンバー一覧
100回以上
Tier 4
メッセージ・ファイルの検索と送信には、別途メソッドごとの制限があります。Slackは、Slack MCPサーバーと他のMCPサーバーを同時に接続するときも注意を促しています。サーバーごとにセキュリティや安定性の性質が違うため、混ぜて使うかどうかは個別に判断する前提です。アプリに許可IPアドレスを設定している場合は、MCPサーバーへのリクエストにも同じ制限がかかり、許可リストにないIPからの呼び出しは拒否されます。MCP経由の操作は、Slackの監査ログでも確認できます。
Slack MCPサーバーとClaude Tagはどう違うか
役割はほぼ正反対です。
| 仕組み | 向き | 主体 | 対象プラン |
|---|---|---|---|
| Slack MCPサーバー | 向きSlackをClaudeの外部ツールとして使う | 主体Claude Code・claude.ai等のMCPクライアント | 対象プラン制限記載なし(要ワークスペース承認) |
| Claude Tag | 向きClaudeをチームの一員としてSlackに置く | 主体Slackチャンネル内の@Claude | 対象プランTeam・Enterprise |
| 旧Claude Code in Slack | 向きSlackから個人のコーディングセッションを起動する | 主体個人のClaudeアカウント | 対象プランPro・Max(Team/EnterpriseはClaude Tagへ移行中) |
MCPサーバーは、Claude CodeのセッションがSlackの中身を読みに行く・書きに行くための接続です。Claude Tagは、チャンネルの中に組織共有の@Claudeを置く仕組みで、誰かがメンションするとタスクとして受け取ります。過去ログを検索してコンテキストに使いたいならMCPサーバー、チームの誰もがSlackから直接Claudeにタスクを振れるようにしたいならClaude Tagです。両方の併用もできます。Claude Tag側にはSlack検索の範囲を絞る管理設定があります。「Channels Claude can search」という設定で、追加済みの公開チャンネルだけに限れます(v2.1.283、2026-09-25のchangelogで追加)。
Slack接続まわりの修正履歴
Slackは、DCR非対応の代表例としてClaude CodeのOAuth実装で個別に扱われてきました。changelogで確認できた修正は次のとおりです。
Slack MCP接続に関わる修正
- v2.0.34トークン更新の無限ループを修正
OAuthを使うMCPサーバー(例としてSlack)で、トークン更新が無限に繰り返されて接続中に固まる不具合が直りました。
- v2.1.30(2026-02-03)事前登録の認証情報に対応
DCR非対応サーバー向けに、
claude mcp addで--client-idと--client-secretを指定できるようになりました。 - v2.1.74(2026-03-12)HTTP 200のエラーで再認証されない不具合を修正
リフレッシュトークンが切れても、HTTP 200でエラーを返すサーバー(例としてSlack)では再認証が促されませんでした。
- v2.1.94(2026-04-07)送信ツールの表示を簡略化
トランスクリプトの送信表示が
Slacked #channelになり、チャンネル名がリンクになりました。 - v2.1.231(2026-08-13)リダイレクトURIの不一致を修正
v2.1.229では
http://127.0.0.1:PORT/callbackを送っていたため、登録URIと完全一致で照合するサーバーでサインインに失敗しました。v2.1.231でlocalhostの形に戻っています。
認証が不安定なときは、古いバージョンを疑うのが手早い切り分けです。リモートMCPのOAuth設計全般はリモートMCPのOAuth認証で扱っています。
つまずいたときの切り分け
- 再認証を促されないままツールが失敗する: v2.1.74より前のバージョンでは、リフレッシュトークンが切れても再認証が促されない不具合がありました。
claude --versionで確認します - v2.1.229を使っている: リダイレクトURI不一致でサインインに失敗します。v2.1.231以降に上げます。自前のSlackアプリの
clientIdを使っている場合に限り、127.0.0.1の形を登録URIに加える回避もできます - 送信ツールだけ失敗する:
oauth.scopesにchat:writeを含めていない可能性があります。スコープの足し方は権限スコープの節のとおりで、追加してから/mcpで再認証します - 接続自体が通らない: 管理者がMCPクライアントを承認していないか、
clientIdとcallbackPortが未設定の可能性があります - claude.aiのSlackコネクタと二重になる: 同じSlackに2経路でつながります。
/mcpパネルで有効な方を確認し、不要な方を切ります(コネクタを無効にするとdisabledMcpServersにclaude.ai Slackとして記録されます)
まとめ
社内のSlackをClaudeに読ませたいだけなら、確認するのは管理者の承認とプラグインの導入の2点です。送信まで許すかどうかは、chat:writeをoauth.scopesに入れるかどうかで決まります。