agent-slack▌
stablyai/agent-slack · updated Apr 8, 2026
Slack automation CLI for reading, searching, sending, and managing messages, channels, and files.
- ›Supports message operations: fetch single messages or threads, browse channel history, send/edit/delete messages, add/remove reactions, and draft rich-text messages in a browser editor
- ›Download attachments (snippets, images, files) automatically; search messages and files across channels with date and user filters
- ›Create channels, invite users (including external), open DMs or group DMs,
Slack automation with agent-slack
agent-slack is a CLI binary on $PATH. Invoke directly (e.g. agent-slack user list).
Installation
If agent-slack is not found on $PATH, install it:
curl -fsSL https://raw.githubusercontent.com/stablyai/agent-slack/main/install.sh | sh(recommended)npm i -g agent-slack(requires Node >= 22.5)nix run github:stablyai/agent-slack -- <args>(no install needed, prefix all commands)
CRITICAL: Bash command formatting rules
Claude Code's permission checker has security heuristics that force manual approval prompts. Avoid these patterns to keep commands auto-allowed. See: https://github.com/anthropics/claude-code/issues/34379
- No
#anywhere in the command string. Treated as a comment delimiter even inside quotes. Use bare channel names (generalnot#general). No#comments in inline scripts — use the Bash tool'sdescriptionparameter instead. - No
''(consecutive single quotes) or""(consecutive double quotes). Triggers "potential obfuscation" check. Avoid Python empty string literals liked.get('key', '')— used.get('key')instead. - Only
| jqfor filtering — no python3, no other commands.python3 -cis not in the allow list and triggers prompts.jqwith single-quote-only expressions (no"inside) is safe:- WRONG:
agent-slack search ... | python3 -c "..."(not allowed) - WRONG:
agent-slack search ... | jq '.a + "x"'(mixed quotes) - RIGHT:
agent-slack search ... | jq '.a' - RIGHT:
agent-slack search ... | jq '.messages[] | .ts'
- WRONG:
- No
||or&&chains. Run multiple agent-slack commands as separate Bash tool calls. - No file redirects (
>,>>). Process JSON output directly, don't write to files.
Quick start (auth)
Authentication is automatic on macOS and Windows (Slack Desktop first, then Chrome/Firefox fallbacks on macOS).
If credentials aren’t available, run one of:
- Slack Desktop import (macOS/Windows):
agent-slack auth import-desktop
agent-slack auth test
- Chrome fallback:
agent-slack auth import-chrome
agent-slack auth test
- Firefox fallback:
agent-slack auth import-firefox
agent-slack auth test
- Or set env vars (browser tokens; avoid pasting these into chat logs):
export SLACK_TOKEN="xoxc-..."
export SLACK_COOKIE_D="xoxd-..."
agent-slack auth test
- Or set a standard token:
export SLACK_TOKEN="xoxb-..." # or xoxp-...
agent-slack auth test
Check configured workspaces:
agent-slack auth whoami
Canonical workflow (given a Slack message URL)
- Fetch a single message (plus thread summary, if any):
agent-slack message get "https://workspace.slack.com/archives/C123/p1700000000000000"
- If you need the full thread:
agent-slack message list "https://workspace.slack.com/archives/C123/p1700000000000000"
Browse recent channel messages
To see what's been posted recently in a channel (channel history):
agent-slack message list "general" --limit 20
agent-slack message list "C0123ABC" --limit 10
agent-slack message list "general" --with-reaction eyes --oldest "1770165109.000000" --limit 20
agent-slack message list "general" --without-reaction dart --oldest "1770165109.000000" --limit 20
This returns the most recent messages in chronological order. Use --limit to control how many (default 25).
When using --with-reaction or --without-reaction, you must also pass --oldest to bound scanning.
Attachments (snippets/images/files)
message get/list and search auto-download attachments and include file metadata in JSON output (typically under message.files[] / files[]), including name when available and path for the local download. Failed message attachment downloads keep the attachment entry, preserve a local .download-error.txt path, and include message.files[].error for message get/list or messages[].files[].error for search messages|all; search files skips files whose download fails.
Draft a message (browser editor)
Opens a Slack-like rich-text editor in the browser for composing messages with formatting toolbar (bold, italic, strikethrough, links, lists, quotes, code, code blocks). After sending, shows a "View in Slack" link.
agent-slack message draft "general"
agent-slack message draft "general" "initial text"
agent-slack message draft "https://workspace.slack.com/archives/C123/p1700000000000000"
Send, edit, delete, or react
agent-slack message send "https://workspace.slack.com/archives/C123/p1700000000000000" "I can take this."
agent-slack message send "alerts-staging" "here's the report" --attach ./report.md
agent-slack message edit "https://workspace.slack.com/archives/C123/p1700000000000000" "I can take this today."
agent-slack message delete "https://workspace.slack.com/archives/C123/p1700000000000000"
agent-slack message send "general" "Here's the plan:
- Step 1: do the thing
- Step 2: verify it worked
- Sub-step: check logs"
agent-slack message react add "https://workspace.slack.com/archives/C123/p1700000000000000" "eyes"
agent-slack message react remove "https://workspace.slack.com/archives/C123/p1700000000000000" "eyes"
Channel mode for edit/delete requires --ts:
agent-slack message edit "general" "Updated text" --workspace "myteam" --ts "1770165109.628379"
agent-slack message delete "general" --workspace "myteam" --ts "1770165109.628379"
Attach options for message send:
--attach <path>upload a local file (repeatable)
List channels + create/invite users
agent-slack channel list
agent-slack channel list --user "@alice" --limit 50
agent-slack channel list --all --limit 100
agent-slack channel new --name "incident-war-room"
agent-slack channel new --name "incident-leads" --private
agent-slack channel invite --channel "incident-war-room" --users "U01AAAA,@alice,bob@example.com"
agent-slack channel invite --channel "incident-war-room" --users "partner@vendor.com" --external
agent-slack channel invite --channel "incident-war-room" --users "partner@vendor.com" --external --allow-external-user-invites
For --external, invite targets must be emails. By default, invitees are external-limited; add
--allow-external-user-invites to allow them to invite other users.
Search (messages + files)
Prefer channel-scoped search for reliability:
agent-slack search all "smoke tests failed" --channel "alerts" --after 2026-01-01 --before 2026-02-01
agent-slack search messages "stably test" --user "@alice" --channel general
agent-slack search files "testing" --content-type snippet --limit 10
Multi-workspace guardrail (important)
If you have multiple workspaces configured and you use a channel name (e.g. general), pass --workspace (or set SLACK_WORKSPACE_URL) to avoid ambiguity:
agent-slack message get "general" --workspace "https://myteam.slack.com" --ts "1770165109.628379"
agent-slack message get "general" --workspace "myteam" --ts "1770165109.628379"
DM / group DM channels
Get the channel ID for a DM or group DM, useful for sending messages to a group of users:
agent-slack user dm-open @alice @bob
agent-slack user dm-open U01AAAA U02BBBB U03CCCC
Mark as read
Mark a channel, DM, or group DM as read up to a given message:
agent-slack channel mark "https://workspace.slack.com/archives/C123/p1700000000000000"
agent-slack channel mark "general" --workspace "myteam" --ts "1770165109.628379"
agent-slack channel mark "D0A04PB2QBW" --workspace "myteam" --ts "1770165109.628379"
To make a specific message appear unread, set --ts to just before it (subtract 0.000001). This moves the read cursor so that message and everything after it appear as new:
agent-slack channel mark "general" --workspace "myteam" --ts "1770165109.628378"
Workflows
Discover and run Slack workflows bookmarked in channels:
# List workflows in a channel
agent-slack workflow list "#ops"
# Preview trigger metadata (no side effects)
agent-slack workflow preview "Ft123ABC"
# Get workflow definition including form fields and steps
agent-slack workflow get "Ft123ABC"
agent-slack workflow get "Wf456DEF"
# Trip a workflow trigger
agent-slack workflow run "Ft123ABC" --channel "#ops"
Canvas + Users
agent-slack canvas get "https://workspace.slack.com/docs/T123/F456"
agent-slack user list --workspace "https://workspace.slack.com" --limit 100
agent-slack user get "@alice" --workspace "https://workspace.slack.com"
References
- references/commands.md: full command map + all flags
- references/targets.md: URL vs
#channeltargeting rules - references/output.md: JSON output shapes + download paths
Ratings
4.5★★★★★10 reviews- ★★★★★Shikha Mishra· Oct 10, 2024
agent-slack is among the better-maintained entries we tried; worth keeping pinned for repeat workflows.
- ★★★★★Piyush G· Sep 9, 2024
Keeps context tight: agent-slack is the kind of skill you can hand to a new teammate without a long onboarding doc.
- ★★★★★Chaitanya Patil· Aug 8, 2024
Registry listing for agent-slack matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Sakshi Patil· Jul 7, 2024
agent-slack reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Ganesh Mohane· Jun 6, 2024
I recommend agent-slack for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ★★★★★Oshnikdeep· May 5, 2024
Useful defaults in agent-slack — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
- ★★★★★Dhruvi Jain· Apr 4, 2024
agent-slack has been reliable in day-to-day use. Documentation quality is above average for community skills.
- ★★★★★Rahul Santra· Mar 3, 2024
Solid pick for teams standardizing on skills: agent-slack is focused, and the summary matches what you get after install.
- ★★★★★Pratham Ware· Feb 2, 2024
We added agent-slack from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Yash Thakker· Jan 1, 2024
agent-slack fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.