mcpField
S
slack-cli

slack-cli

github.com/michaelliv生产力3151 次安装33 周前更新
代码仓库

关于 slack-cli

slack-cli 是通过 `slack` 命令行工具和 Slack API 操作工作区的技能,涵盖消息、频道与用户查询、文件、提醒等操作。

主要功能

  1. 01发送和管理消息
  2. 02读取历史记录并搜索消息
  3. 03列出频道和用户
  4. 04上传文件并管理提醒
  5. 05调用 Slack API 执行操作

适用场景

  1. 01搜索工作区内的消息
  2. 02向频道上传文件
  3. 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 发送私信不可靠。 slack chat send 'msg' '@user' 经常因 channel_not_found 而失败。请改用下方的直接 API 调用方式。
  • 通过 chat:write 发送的消息会显示为 Slack App 发出,而不是由你的用户发出。这是 Slack API 的限制——即使使用用户令牌,也会使用应用身份。

直接调用 API

slack CLI 未涵盖所有 Slack API 方法。对于内置命令之外的操作,请使用 curl 直接调用 Slack API。从 CLI 的配置文件中读取令牌。

发送私信

内置的 slack chat send 不擅长处理私信。请直接调用 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_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&timestamp=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 加引号,以避免 shell 通配符展开
  • 分页:大多数列表端点都支持 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> — 移除消息时间戳中的点(例如,时间戳 1769935497.539749 会变为 p1769935497539749)

评论

支持 Markdown