SlackCLI
v0.16.0macOS · Linux · WindowsMIT licensedNo Slack app required

The Slack CLI, without the tab.

SlackCLI is a single binary that reads, sends, searches and replies across one or many Slack workspaces, straight from your terminal. It signs in with the session you already have, so there is no Slack app to register and nothing to get approved. Every command speaks JSON, which is what makes it usable by a script or an AI agent as easily as by you.

Install in a minute →Read the docsOne binary. No runtime. No account.
0
Slack apps to register
1
Binary, no runtime
11
Command groups
--json
On every command
zsh · slackcli
$ slackcli auth login-autoOpening your browser. Sign in to Slack as you normally would.✓ 3 workspaces enrolled · default: acme$ slackcli conversations unread#incidents 4 unread last 14:24#engineering 2 unread last 13:58@ada 1 unread last 13:41$ slackcli search messages "deploy failed" --in=incidentsada 14:22 deploy failed on prod-eu, rolling back nowmarcus 14:24 same signature as the incident on the 4th$ slackcli messages send --permalink="$LINK" --message="On it, taking a look"✓ replied in #incidents ts 1741356241.004500$ slackcli conversations unread --json | jq '.unread_channels[].name'"incidents""engineering"
A real session. No Slack app, no admin approval, no webhook server.

Three reasons this exists.

The problem
01

The tab that eats the day

You are in the terminal. The answer is in Slack. So you switch, get pulled into three other threads, and come back having forgotten what you were doing. The cost is not the reading, it is the re-entry.

slackcli conversations unread
02

The app you are not allowed to create

Every other route into Slack starts with registering an app, picking OAuth scopes, and waiting for a workspace admin who has better things to do. Most useful automation dies right there, unbuilt.

slackcli auth login-auto
03

The agent that cannot reach your team

Your AI agent can read the whole repository and still miss the thread that explains why the code is that way. Slack is where the context lives, and most tooling cannot get at it without a webhook server.

slackcli search messages … --json

What do you want to do?

Every command

Alsofiles·custom emoji·user groups·team info·paste a Slack link anywhere an ID goes

Built to be piped.

Scripts and agents
For your shellScripting guide ↗

One object on stdout, every time

--json is not bolted onto the read commands alone. send, edit and draft echo back what they wrote, so a later step can edit or react to the exact message. Exit codes are meaningful, so a pipeline can branch on failure instead of grepping stderr.

# post, then keep the handle for a later step
sent=$(slackcli messages send --recipient-id=C123 \
  --message="Deploying now" --json)

slackcli messages react --permalink="$(jq -r .permalink <<<"$sent")" \
  --emoji=eyes

Slack as a tool an agent can hold

SlackCLI ships a Claude Code plugin with a /slackcli skill, so an agent can catch up on a channel, pull the thread behind an incident, and post the summary back, without you writing a single command for it.

It works the same for anything that can run a binary and parse JSON: a cron job, a CI step, a Makefile target. No webhook server, no callback URL, no public endpoint.

# turn today's unreads into a digest
slackcli conversations unread --json \
  | jq '[.unread_channels[] | {name, unread_count}]'

Two ways in. Neither needs an admin.

Authentication
Recommended

Your own session

A browser window opens, you sign in the way you always do, and SlackCLI keeps the session tokens for every workspace on that account. It acts as you, so it can do exactly what you can do, and nothing you could not.

slackcli auth login-auto
  • Nothing to install beyond a Chrome, Edge, Chromium or Brave you already have.
  • Sign in once. The profile persists, so later refreshes run headless.
  • Unlocks drafts and Slack's native unread and saved endpoints.
For automation

A Slack app token

If you already have an xoxb or xoxp token, hand it over. It is validated against Slack before anything is written to disk, so a bad token fails at sign-in rather than at three in the morning.

slackcli auth login --token="xoxb-..." \
  --workspace-name="My Team"
  • Stable. Survives a browser logout, which is what CI needs.
  • Scoped. The token can do only what you granted it.
  • Mixable. Keep both kinds side by side and pick with --workspace.

Stored at~/.config/slackcli/workspaces.jsonmode 0600, never printed back

Installed in about a minute.

Install
The one-linerFull guide ↗

Homebrew, on macOS and Linux

One formula, and brew upgrade slackcli keeps it current. There is no runtime to install alongside it: SlackCLI ships as a single self-contained binary.

brew tap shaharia-lab/tap && brew install slackcli
macOS2 binaries
  1. Download, mark it executable, and put it on your PATH:
    curl -L https://github.com/shaharia-lab/slackcli/releases/download/v0.16.0/slackcli-macos-arm64 -o slackcli
    chmod +x slackcli
    mkdir -p ~/.local/bin && mv slackcli ~/.local/bin/
  2. If Gatekeeper blocks it, clear the quarantine flag. Release binaries are ad-hoc signed rather than notarised:
    xattr -d com.apple.quarantine ~/.local/bin/slackcli

Apple menu, About This Mac, tells you which chip you have. Homebrew above picks for you.

Linux2 binaries
  1. Download, mark it executable, and put it on your PATH:
    curl -L https://github.com/shaharia-lab/slackcli/releases/download/v0.16.0/slackcli-linux -o slackcli
    chmod +x slackcli
    mkdir -p ~/.local/bin && mv slackcli ~/.local/bin/
  2. If the shell cannot find it afterwards, ~/.local/bin is not on your PATH:
    echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && exec $SHELL

Works on any distribution. The binary bundles its own runtime, so there is no Node.js or Bun to install.

Windows1 binary
  1. Download slackcli-windows.exe and put it in a folder that is on your PATH.
  2. SmartScreen may warn that the publisher is unknown. Choose More info, then Run anyway. These builds are unsigned rather than backed by an EV certificate.

Homebrew is not an option here, so the binary is the route. WSL users want the Linux build instead.

Thenslackcli auth login-auto·Verify with checksums.txt ↗·Build from source

Frequently askedAll documentation ↗
Do I need to create a Slack app to use SlackCLI?

No, and that is the point. Run slackcli auth login-auto, sign in to Slack in the browser window that opens, and SlackCLI captures the session tokens for every workspace on that account. No app to register, no OAuth scopes to justify, no admin approval to wait for. If you would rather use a real Slack app token (xoxb or xoxp), that works too and is the better choice for CI and service accounts.

Authentication ↗
Is this the official Slack CLI?

No. SlackCLI is an unofficial, MIT-licensed project and is not affiliated with, endorsed by, or supported by Slack Technologies. Slack ships its own CLI, and it is a different tool for a different job: theirs is for building and deploying Slack apps, this one is for driving a workspace you already belong to.

Documentation ↗
Where are my Slack tokens stored, and does anything leave my machine?

Credentials live in ~/.config/slackcli/workspaces.json, in a directory created with mode 0700 and a file with mode 0600. SlackCLI never prints a token value, and it talks to exactly two hosts: Slack, and GitHub for the daily update check, which you can ignore. There is no account, no telemetry and no server in the middle. Treat that config directory as sensitive, because anything that can read it can act as you in Slack.

Where credentials live ↗
Can an AI agent or a shell script drive it?

Yes, that is a first-class use case rather than an afterthought. Every command that returns data speaks --json, and so do the commands that write: send, edit and draft echo back what they just wrote, so a later step can edit or react to it. Exit codes are meaningful, so a pipeline can branch on failure. SlackCLI also ships a Claude Code plugin whose /slackcli skill lets an agent read, post and search a workspace without you writing the commands.

Scripting and JSON ↗
Can I use several workspaces, or several identities in one workspace?

Both. Every workspace you authenticate is stored under its own profile key, the first one becomes the default, and every command that talks to Slack accepts --workspace <id|name>. That means one machine can hold your own account, a bot token for automation, and a second company's workspace side by side, and each command picks the one it needs.

Workspaces and profiles ↗
What can it actually do?

Eleven command groups: list channels and DMs, read history and threads, see what is unread, send and reply and edit and react, upload files, post Block Kit, search messages and channels and people, read your saved-for-later list, read a Canvas as Markdown, inspect and download files, list custom emoji, manage user groups, and update itself. Anywhere a command wants a channel ID or a timestamp, you can paste a Slack permalink instead.

Every command ↗
One click, and it helps more than you would think

Star the repo

Stars are how the next person drowning in Slack finds this. It is the whole of the distribution: no ad budget, no launch post, nothing tracking you here.

Star on GitHub 240

The terminal is already open.

One command to install, one to sign in, and the next time somebody asks what happened in #incidents you can answer without leaving the shell.