slack-cli について
slack-cliは、Slackをコマンドラインで操作するためのスキルで、既定でJSONを出力します。`korotovsky/slack-mcp-server`のエンジンを利用し、ワークスペースの閲覧や検索、制御された書き込みに対応します。
主な機能
- 01既定でJSONを出力
- 02チャンネル、メッセージ、スレッドの閲覧
- 03会話とユーザーの検索
- 04認証プロファイルの管理
- 05ワークスペース名とチャンネルのキャッシュ
- 06明示的な有効化による書き込み制限
活用シーン
- 01Slackチャンネルの結果をjqに渡す
- 02未読メッセージやメンションを確認
- 03過去のインシデントスレッドを検索
- 04書式を整えたスレッド返信を送信
MCP 対応
CLIは動作のために`korotovsky/slack-mcp-server`のエンジンを利用します。入力にはコマンドライン利用とJSON出力の説明がありますが、CLI自体がMCPサーバーに接続または管理するとは記載されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ paymog/ slack-cli --skill slack-cliインストール後、Claude Code で/slack-cliを入力して読み込まれたか確認します。
詳細
Slack CLI
slack-cli バイナリを呼び出します(brew install paymog/tap/slack-cli でインストールできます)。
信頼できるソースは paymog/slack-cli です。
動作には korotovsky/slack-mcp-server エンジンを使用しますが、デフォルトで JSON を出力します(基盤となる MCP サーバーは CSV を出力します)。そのため、出力を jq にそのまま渡せます。
出力
成功したコマンドはすべて、デフォルトで 有効な JSON を出力します。リスト/テーブルコマンド(channels、messages、users、saved items、user groups)は、オブジェクトの配列を出力します。
構造化された変更操作では、結果のフィールドが直接公開されます。conversations add は channel、省略可能な thread_ts、および ts を返します。
従来のプレーンテキストのステータスは {"message":"…"} としてラップされます。jq に直接パイプできます。
slack-cli channels list | jq -r '.[].Name'
slack-cli conversations history '#general' --limit 1d | jq -r '.[].Text'
slack-cli users search alice | jq -r '.[].DMChannelID'
slack-cli conversations add C123 --thread-ts 123.456 -t "hello" | jq -r .ts
CSV を基にしたテーブルのフィールド値は文字列です。数値の比較には jq の tonumber を使用してください。--raw を指定すると、基盤となる CSV/テキスト、または従来の人間が読みやすいコマンド出力がそのまま表示されます。
認証(すべてのコマンドの実行前に必須)
環境変数を使って、認証情報セットを1つだけ指定してください(CLI は保存済みプロファイルも読み込みます)。
export SLACK_MCP_XOXP_TOKEN=xoxp-... # user OAuth — full features (recommended)
# or
export SLACK_MCP_XOXB_TOKEN=xoxb-... # bot — context-search needs an action token
# or
export SLACK_MCP_XOXC_TOKEN=xoxc-... # browser session token + cookie below
export SLACK_MCP_XOXD_TOKEN=xoxd-... # browser cookie d (stealth mode)
機能に関する注意:
- 従来の検索(
conversations search、リアルタイムのusers_search)と 未読項目 は、xoxpまたはブラウザー(xoxc/xoxd)で最もよく動作します。ボットはconversations context-search、search:read.public、およびアクショントークンを使ってパブリックチャンネルを検索できます。 - 保存済みアイテム(
saved …)には、ブラウザートークン(xoxc/xoxd)のみが必要です。 --govslack/SLACK_MCP_GOVSLACK=trueを指定すると、slack-gov.com にルーティングされます。
保存済みプロファイル(環境変数の代替)
slack-cli auth login [name] # prompts for mode + token(s); validates before saving
slack-cli auth list # * marks default
slack-cli auth default <name>
slack-cli --profile <name> <cmd> # use a profile for one command
slack-cli auth status # show resolved source + mode
slack-cli auth logout <name> [-f]
優先順位:明示的な --xoxp/--xoxc/... フラグまたは SLACK_MCP_* 環境変数 → --profile <name> → デフォルトのプロファイル。
明示的なトークンと --profile を併用すると、曖昧な指定として拒否されます。
SLACK_CLI_PROFILE を環境変数に設定すると、プロファイルを指定できます。
キャッシュ(名前で検索する前に実行してください)
#channel-name/@username による検索と channels list には、キャッシュを最新の状態にしておく必要があります。
キャッシュはディスク上に保存され、すべての呼び出し間で共有されるため、一度だけ更新してください。
slack-cli cache refresh # fetch users + channels, write cache to disk
読み取りコマンドは、ディスク上のキャッシュを自動的に読み込みます(初回実行時は取得します)。キャッシュを使わない場合は --no-cache を指定してください。この場合、名前ではなく、生の ID(C…、U…、D…)のみが解決されます。
チャンネル/ID
<channel> には、ID(C123…)、名前(#general)、または DM(@username)を指定できます。
読み取りコマンド
# Channels (JSON array; fields: ID,Name,Topic,Purpose,MemberCount,Cursor)
slack-cli channels list [--types public_channel,private_channel,im,mpim] [--query foo] [--query-targets name,topic,purpose] [--sort popularity] [--limit 100] [--cursor C]
slack-cli channels me # channels you belong to
# Conversation history & threads
slack-cli conversations history <channel> [--limit 1d|1w|30d|<count>] [--cursor C] [--activity]
slack-cli conversations replies <channel> <thread_ts> # whole thread by default; --limit 1d|<count> narrows it
# Pagination: read the Cursor field of the last element, then pass --limit='' --cursor <value>.
# A Cursor on a default replies call means the thread was cut short (size cap or timeout).
# Unlisted Slack apps: 1 req/min and 15 msgs/page on history/replies. The CLI waits
# Retry-After and shares the slot across processes. Set SLACK_MCP_UNLISTED_HISTORY=1
# to force that cap. Default --timeout is 2m. Do not hammer these in a loop.
# Legacy search (needs xoxp or browser token; not bot)
slack-cli conversations search [query] \
[--in-channel #general] [--in-dm @user] [--with @user] [--from @user] \
[--before YYYY-MM-DD] [--after YYYY-MM-DD] [--on YYYY-MM-DD] [--during July] \
[--threads-only] [--limit 20] [--cursor C]
# A full Slack message URL as the query returns just that message.
# Real-time Search (public channels by default; bots need an action token)
SLACK_MCP_ACTION_TOKEN_FILE=/run/slack/action-token slack-cli conversations context-search "aws contract" \
[--channel-types public_channel] [--content-types messages] [--limit 20] \
[--cursor C] [--sort score|timestamp] [--after YYYY-MM-DD] [--before YYYY-MM-DD] \
[--include-context-messages]
# --action-token overrides the file; file contents are read fresh and trimmed.
# User tokens need RTS scopes but no action token. Limit is 1–20; dates are UTC.
# Treat action tokens as secrets; prefer the file over command-line arguments.
# Invalid/expired tokens or missing scopes: unavailable for this turn; do not retry.
# Cursor is on the last row. ContextMessages is JSON encoded inside the table field.
# Non-message content types (files,channels,users) are preserved in Data as JSON.
# Unreads, prioritized DMs > partner > internal (best with xoxp/browser)
slack-cli conversations unreads [--types all|dm|group_dm|partner|internal] [--mentions-only] [--max-channels 50] [--max-messages-per-channel 10] [--include-muted]
# Users (JSON array incl. DMChannelID for quick messaging)
slack-cli users search <query> [--limit 10]
# User groups
slack-cli usergroups list [--include-users] [--include-disabled]
slack-cli usergroups me <list|join|leave> [--usergroup-id S123]
# Saved items (browser tokens only)
slack-cli saved list [--filter saved|completed|archived] [--limit 50]
# Attachments (download a file by ID; always available, no env var needed).
slack-cli attachments get <file_id> [-o path] # Fxxxxxxxxxx, max 5MB
書き込み/機密性の高いコマンド(明示的な有効化が必要)
デフォルトでは無効です。誤ってエージェントが投稿や変更を行わないよう、実行のたびに環境変数を設定する必要があります。許可リスト形式(C123,D456、またはすべてを許可して指定したものを除外する !C123)を使うと、書き込み可能なチャンネルを制限できます。
SLACK_MCP_ADD_MESSAGE_TOOL=true slack-cli conversations add <channel> -t "hello" [--thread-ts 123.456] [--content-type text/mrkdwn|text/markdown|text/plain]
SLACK_MCP_ADD_MESSAGE_TOOL=true slack-cli conversations add <channel> --text-file /tmp/reply.txt --content-type text/mrkdwn
SLACK_MCP_ADD_MESSAGE_TOOL=true slack-cli conversations add <channel> --blocks '<Block Kit JSON array>'
SLACK_MCP_ADD_MESSAGE_TOOL=true slack-cli conversations edit <channel> <ts> --text-file /tmp/fix.txt --content-type text/mrkdwn # replaces a message you posted; same flags as add, no --thread-ts
SLACK_MCP_MARK_TOOL=true slack-cli conversations mark <channel> [--ts 123.456]
SLACK_MCP_REACTION_TOOL=true slack-cli reactions add <channel> <timestamp> --emoji rocket
SLACK_MCP_REACTION_TOOL=true slack-cli reactions remove <channel> <timestamp> --emoji rocket
slack-cli usergroups create --name "Eng" [--handle eng] [--description ...] [--channels C1,C2]
slack-cli usergroups update <usergroup_id> [--name ...] [--handle ...] [--channels ...]
slack-cli usergroups users-update <usergroup_id> --users U1,U2,U3
slack-cli saved update <item_id> <ts> [--mark completed] [--date-due <unix>]
slack-cli saved clear-completed
重要:複数行/書式設定された投稿
会話形式の返信では、Slack ネイティブのメッセージテキストをファイルから読み込む方法をデフォルトにします。
ファイル書き込みツールを使って、実際の改行を含む本文を UTF-8 ファイルに書き込みます。その後、シェルにはファイルのパスだけを渡します。
SLACK_MCP_ADD_MESSAGE_TOOL=C123 slack-cli conversations add C123 \
--thread-ts 123.456 --text-file /tmp/reply.txt --content-type text/mrkdwn
--text-fileは、改行、バッククォート、ドル記号、および\nを文字どおりに示す例を、シェルによる展開なしで保持します。--textとの併用はできません。text/mrkdwnは、Block Kit を使わずに通常の Slack 形式のテキストを投稿します。コードには*bold*、_italic_、<https://example.com|label>、バッククォートを使います。Markdown の表や#見出しではなく、箇条書きを使ってください。- デフォルトの
text/markdownは、GitHub 形式の Markdown を Block Kit に変換します。Slack ネイティブのテキストではありません。text/plainは書式設定を無効にします。 --blocksは、インタラクティブな UI や意図的に構造化された UI に限って使用してください。改行、箇条書き、コードだけであればブロックは不要です。- シンプルな一行のメッセージには、インラインの
-tを使用できます。シェルコマンドに複数行の本文を埋め込まないでください。-t "first\nsecond"は改行ではなく、文字どおりの\nを送信します。 - 回答は簡潔にし、長い場合は段落の区切りで分割してください。ネイティブテキストではセクションブロックが折りたたまれるのを避けられますが、Slack では長いメッセージが折りたたまれることがあります。
誤って投稿したメッセージを削除する
slack-cli に 削除コマンドはありません。解決済みの xoxp トークンを使って、Slack の Web API を使用してください。
TOKEN=$(slack-cli auth token | jq -r .SLACK_MCP_XOXP_TOKEN)
# chat.delete needs channel + message ts (e.g. 1783603079.714919 from replies)
curl -s -X POST https://slack.com/api/chat.delete \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json; charset=utf-8" \
-d '{"channel":"C061WRT6XM5","ts":"1783603079.714919"}'
トークンで削除が許可されているメッセージ(xoxp を使った自身のユーザーメッセージ、またはボットトークンを使ったボットのメッセージ)に限り、削除できます。
離れる前に確認する
複数行のコンテンツを投稿した後、スレッドを読み直して次の点を確認してください。
- 箇条書きが1行につながっていないか
- 見出しやコードフェンスの後の改行が欠けていないか
- 途中で切れた箇所やシェルエラーの断片(
command not found、途中で欠けたバッククォート)がないか
これらが見つかった場合は、ソースファイルを修正し、chat.delete で削除してから、
--text-file … --content-type text/mrkdwn を使って再投稿してください。
レシピ
# Triage unread DMs and mentions
slack-cli cache refresh
slack-cli conversations unreads --types dm
slack-cli conversations unreads --mentions-only
# Find a thread, then read its replies
slack-cli conversations search "deploy rollback" --in-channel #incidents --after 2024-06-01
slack-cli conversations replies C0123456789 1718000000.123456
# Who is someone, then DM them (needs SLACK_MCP_ADD_MESSAGE_TOOL)
slack-cli users search alice # note DMChannelID, e.g. D0123
SLACK_MCP_ADD_MESSAGE_TOOL=D0123 slack-cli conversations add D0123 -t "ping"
# Last day of a channel as JSON, extract message text with jq
slack-cli conversations history #general --limit 1d | jq -r '.[].Text'
# Download an image (or any binary) attachment to a file. -o writes the decoded
# bytes and keeps stdout to a small metadata JSON — use it for images/binaries so
# a multi-MB base64 blob doesn't flood the terminal.
slack-cli attachments get F0123ABCD -o avatar.png
# Without -o the bytes come back inline, base64-encoded under .content — decode with:
slack-cli attachments get F0123ABCD | jq -r .content | base64 --decode > avatar.png
よくある問題
no Slack credentials—SLACK_MCP_XOXP_TOKENを設定するか(xoxb、または xoxc+xoxd でも可)、slack-cli auth loginを実行してください。users cache is not ready/空のchannels list/#name not found— まずslack-cli cache refreshを実行するか、--no-cacheを指定して ID を渡してください。conversations_add_message tool is disabled/リアクション/マーク機能が無効 — 同じコマンドで該当する環境変数(SLACK_MCP_ADD_MESSAGE_TOOL、SLACK_MCP_REACTION_TOOL、SLACK_MCP_MARK_TOOL)を設定してください。(attachments getには環境変数は不要です。)- レガシー検索/保存済み項目/未読の取得結果がない、またはエラーになる — ボットはレガシー検索とエッジ API を利用できません。
ボットによるパブリックチャンネル検索にはアクショントークンを使って
context-searchを使用してください。 レガシー検索/未読の取得にはxoxpまたはブラウザートークンを使用してください。savedにはブラウザートークンが必要です。 - 初回実行が遅い — 最初の
cache refresh(またはキャッシュがない状態での初回読み取り)では ワークスペース全体をクロールします。以降の呼び出しではキャッシュされたファイルを読み取ります。 - 複数行の投稿が崩れて見える(リテラルの
\n/バッククォートが実行される) — シェルがエスケープ済み、または展開されたコンテンツを受け取りました。ファイルツールを使って 実際の改行を含むファイルに書き込み、その後--text-file … --content-type text/mrkdwnを使用してください。chat.deleteで問題のメッセージを削除してから、再投稿してください。 - メッセージを削除する必要がある — CLI のサブコマンドはありません。
slack-cli auth tokenで取得した xoxp トークンを使ってhttps://slack.com/api/chat.deleteを呼び出してください(上記のレシピを参照)。