slack-cli について
slack-cliは、`slack`コマンドラインツールとSlack APIでワークスペースを操作するスキルです。メッセージ、チャンネルやユーザーの検索、ファイル、リマインダーなどを扱います。
主な機能
- 01メッセージの送信と管理
- 02履歴の閲覧と検索
- 03チャンネルとユーザーの一覧表示
- 04ファイルのアップロードとリマインダー管理
- 05Slack APIの直接呼び出し
活用シーン
- 01ワークスペース内のメッセージ検索
- 02チャンネルへのファイルアップロード
- 03端末からのリマインダーやプレゼンス管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ michaelliv/ dotskills --skill slack-cliインストール後、Claude Code で/slack-cliを入力して読み込まれたか確認します。
同梱ファイルreferences/INSTALLATION.md
詳細
Slack CLI
slack-cli と Slack API の直接呼び出しを使用して、コマンドラインから Slack ワークスペースを操作します。
slack-cliはすでにインストールおよび設定されているものとします。slackコマンドが見つからない場合やnot_initedが返される場合は、セットアップ手順について references/INSTALLATION.md を参照してください。
使用する場面
- Slack メッセージの送信、更新、削除を行いたい場合
- チャンネルの履歴を読んだり、メッセージを検索したりしたい場合
- チャンネル、ユーザー、会話を一覧表示したい場合
- Slack にファイルをアップロードしたい場合
- リマインダー、おやすみモード、プレゼンスを管理したい場合
- Slack のワークフローを自動化したい場合
セットアップ
slack が利用できない、または設定されていない場合は、詳しいセットアップ手順について references/INSTALLATION.md を参照してください。
トークンは、slack バイナリの etcdir 変数で設定されたパスに保存されます(macOS では通常 /opt/homebrew/etc/slack-cli/.slack)。SLACK_CLI_TOKEN 環境変数も使用できます。
psst による認証情報の管理
Slack トークンを psst のグローバル保管庫に保存します。
psst --global set SLACK_CLI_TOKEN --tag slack
組み込みコマンドでは、psst 経由でトークンを渡します。
psst --global SLACK_CLI_TOKEN -- slack chat send 'Hello!' '#channel'
直接 API を呼び出す場合は、インラインの psst get を使用します。
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" "https://slack.com/api/..."
組み込みコマンド
slack CLI では、次のコマンドをネイティブに利用できます。
チャット
# Send a message
slack chat send 'Hello world!' '#channel'
# Send with rich formatting
slack chat send --text 'text' --channel '#channel' --color good --title 'Title' --pretext 'Pretext'
# Pipe content as a message
echo "some output" | slack chat send --channel '#channel'
# Update a message (requires timestamp and channel)
slack chat update 'Updated text' 1405894322.002768 '#channel'
# Delete a message
slack chat delete 1405894322.002768 '#channel'
# Chain: send, capture ts+channel, then update
slack chat send 'hello' '#general' --filter '.ts + "\n" + .channel' | \
xargs -n2 slack chat update 'goodbye'
ファイル
# Upload a file
slack file upload README.md '#channel'
# Upload with metadata
slack file upload README.md '#channel' --comment 'See attached' --title 'README'
# Create a Slack post from markdown
slack file upload --file post.md --filetype post --title 'Post Title' --channels '#channel'
# List files
slack file list
slack file list --filter '[.files[] | {id, name, size}]'
# File info / delete
slack file info F2147483862
slack file delete F2147483862
リマインダー
# Add a reminder
slack reminder add 'lunch' $(date -v +30M "+%s")
# List / complete / delete
slack reminder list
slack reminder complete Rm7MGABKT6
slack reminder delete Rm7MGABKT6
おやすみモード(通知を停止)
slack snooze start 60 # Start snooze for 60 minutes
slack snooze info # Check your snooze status
slack snooze end # End snooze
プレゼンス
slack presence active
slack presence away
グローバルオプション
すべてのコマンドで次のオプションを使用できます。
--filter|-f <jq-filter>— JSON レスポンスに jq フィルターを適用します--compact|-cp— JSON 出力をコンパクトにします--monochrome|-m— jq の出力をカラーなしにします--trace|-x— デバッグ用に bash トレースを有効にします
既知の制限事項
- 組み込み CLI からの DM は安定して動作しません。
slack chat send 'msg' '@user'はchannel_not_foundで失敗することがよくあります。代わりに、以下の直接 API 呼び出しのパターンを使用してください。 chat:write経由で送信したメッセージは、ユーザーではなく Slack アプリとして表示されます。 これは Slack API の制限です。ユーザートークンを使用しても、アプリの ID が使われます。
API の直接呼び出し
slack CLI は、すべての Slack API メソッドを網羅しているわけではありません。組み込みコマンド以外の操作は、curl を使用して Slack API を直接呼び出してください。トークンは CLI の設定ファイルから読み取ります。
ダイレクトメッセージの送信
組み込みの slack chat send は DM をうまく処理できません。API を直接使用してください。
# Step 1: Open (or find) the DM channel with a user
DM_CHANNEL=$(curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"users":"USER_ID"}' \
"https://slack.com/api/conversations.open" | jq -r '.channel.id')
# Step 2: Send the message
curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d "{\"channel\":\"${DM_CHANNEL}\",\"text\":\"Hello!\"}" \
"https://slack.com/api/chat.postMessage"
im:writeスコープが必要です。 これがないと、conversations.openは失敗します。im:writeがない場合は、既存の DM チャンネルを見つけて代用できます。DM_CHANNEL=$(curl -s \ -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \ "https://slack.com/api/conversations.list?types=im&limit=200" | \ jq -r '.channels[] | select(.user == "USER_ID") | .id')
チャンネルの一覧表示
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.list?types=public_channel,private_channel&limit=200" | \
jq '[.channels[] | {name, id, is_private}]'
チャンネル履歴の読み込み
# Get recent messages from a channel (use channel ID)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.history?channel=CHANNEL_ID&limit=20" | \
jq '[.messages[] | {user, text, ts}]'
# Get messages from last 7 days
OLDEST=$(date -v -7d +%s)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.history?channel=CHANNEL_ID&oldest=${OLDEST}&limit=100" | \
jq '[.messages[] | {user, text, ts}]'
# Get messages within a specific date range (oldest and latest are unix timestamps)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.history?channel=CHANNEL_ID&oldest=${START_TS}&latest=${END_TS}&limit=100" | \
jq '[.messages[] | {user, text, ts}]'
ユーザーの一覧表示
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/users.list" | \
jq '[.members[] | {name, id, real_name}]'
# Resolve multiple user IDs (no batch endpoint — fetch all and filter)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/users.list" | \
jq '[.members[] | select(.id == "U1234" or .id == "U5678") | {id, name: .real_name}]'
ワークスペース情報
# Use auth.test (not team.info — team.info requires a scope we don't have)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/auth.test" | \
jq '{team, team_id, url}'
メッセージの検索
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/search.messages?query=keyword&count=10" | \
jq '[.messages.matches[] | {channel: .channel.name, text, ts}]'
リアクション
# Add a reaction
curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"channel":"CHANNEL_ID","timestamp":"1234567890.123456","name":"thumbsup"}' \
"https://slack.com/api/reactions.add"
# Get reactions on a message
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/reactions.get?channel=CHANNEL_ID×tamp=1234567890.123456"
スレッドの返信
# Get replies in a thread (use the parent message ts)
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
"https://slack.com/api/conversations.replies?channel=CHANNEL_ID&ts=1234567890.123456" | \
jq '[.messages[] | {user, text, ts}]'
スレッドへの投稿
curl -s -X POST \
-H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"channel":"CHANNEL_ID","text":"reply text","thread_ts":"1234567890.123456"}' \
"https://slack.com/api/chat.postMessage"
ヒント
- 組み込みコマンドのチャンネル引数では
#name形式を使用できますが、直接 API を呼び出す場合はチャンネル ID(例:CHANNEL_ID)が必要です - 組み込みコマンドで
--filterを使用すると、jq 経由で特定のフィールドを抽出できます --filter '.ts + "\n" + .channel'を使ってコマンドをパイプでつなぎ、送信、更新、削除を連続して実行できます- API を直接呼び出す場合は、シェルによるグロブ展開を防ぐため、URL を必ず引用符で囲んでください
- ページネーション:多くの一覧エンドポイントでは
cursorとlimitパラメーターをサポートしています。レスポンス内のresponse_metadata.next_cursorを確認してください - 名前からユーザー ID を調べるには、次のコマンドを使用します:
curl -s -H "Authorization: Bearer $(psst --global get SLACK_CLI_TOKEN)" "https://slack.com/api/users.list" | jq -r '.members[] | select(.real_name | test("Name"; "i")) | {name, id, real_name}' - メッセージのパーマリンク:
https://<workspace>.slack.com/archives/<channel_id>/p<ts_without_dot>— メッセージのタイムスタンプからピリオドを削除します(例:ts1769935497.539749はp1769935497539749になります)