| name | slack |
| description | Interact with Slack via its Web API — read messages, post to channels, search channels, read threads, look up users, view activity/notifications, manage Slack support requests, and watch channels for new messages in real time. Supports multiple workspaces with auto-detection from the active tab. Use when the user wants to check Slack messages, post a Slack message, search Slack channels, read Slack threads, get Slack user info, view Slack notifications or activity feed, manage Slack support tickets/help requests, watch a channel for updates, or automate any Slack task. Triggers on mentions of Slack, channels, DMs, threads, messages, Slackbot, notifications, activity, support requests, help requests, or watching/monitoring. |
| allowed-tools | bash |
Slack
Direct API access to Slack via the browser session. Uses XHR from the Slack page
context (same-origin) with the user's xoxc-* token from localStorage. Supports
multiple workspaces — the active workspace is auto-detected from the Slack tab URL,
or can be specified explicitly with --workspace.
Quick start
slack workspaces
slack activity
slack --ws=E06V3987PMY activity --type=admin
slack activity --type=mentions --unread
slack activity --type=apps
slack --ws=E06V3987PMY pending
slack --ws=E06V3987PMY approve 1774846849.585479
slack --ws=E06V3987PMY deny 1770698762.931619
slack history C087NCG774J
slack --workspace=T06DUTYDQ channels --search=helix
slack --ws=T06DUTYDQ history C06ABC123
slack post C087NCG774J "Hello from SLICC!"
slack post W5BPKRLUA "Hey, quick question..."
slack channels --search=one-aem
slack thread C087NCG774J 1774539502.747989
slack user W5BPKRLUA
slack watch C087NCG774J --scoop=my-monitor
slack watch C087NCG774J --scoop=my-monitor --thread=1774539502.747989
slack watches
slack unwatch C087NCG774J
Authentication
The token is extracted automatically from localStorage key localConfig_v2 in
the Slack browser tab. The workspace ID (team or enterprise ID) determines which
token to use. The localConfig_v2.teams object maps workspace IDs to
{ name, domain, url, token } — keys are either enterprise IDs (E...) or
team IDs (T...).
Workspace resolution order:
--workspace=<ID> or --ws=<ID> flag if provided
- Auto-detected from the active Slack tab URL (
/client/<ID>/...)
All API calls execute via XHR from the Slack page context so cookies are included
automatically. Requires an open Slack tab at app.slack.com. If no Slack tab is
found, the script reports an error and asks the user to open Slack.
Global flags
--workspace=<ID>, --ws=<ID>
Specify which workspace to use by team or enterprise ID. If omitted, the workspace
is auto-detected from the currently active Slack tab URL. Run slack workspaces to
see all available IDs. The flag can appear before or after the command name:
slack --ws=E23RE8G4F history C087NCG774J
slack history C087NCG774J --workspace=E23RE8G4F
Available commands
slack workspaces
List all workspaces the user is signed into. Shows the workspace ID, name, and
domain. The currently active workspace (from the tab URL) is marked with *.
slack activity [--type=TYPE] [--unread] [--limit=N] [--cursor=CURSOR]
View the activity feed (notifications). Resolves user and channel names inline.
For app DM bundles (invite requests, Google Drive, etc.), fetches the latest
messages from the DM channel to show actual content.
Type filters:
all (default) — everything
admin — system alerts (channel archived, workspace changes)
mentions — @user, @usergroup, @channel, @everyone, unjoined channel mentions
threads — thread replies
reactions — emoji reactions on your messages
invites — channel invitations (internal and Slack Connect)
apps — bot/app DM bundles (invite requests, Google Drive, etc.)
Flags:
--unread — show only unread items
--limit=N — number of items (default 20)
--cursor=CURSOR — pagination cursor for next page
Output format:
[2026-04-15 16:19:41 UTC] ADMIN: Amol Anand archived the channel #aem-volvo-redesign *
[2026-04-15 15:54:02 UTC] App DM (5 unread): slackbot: Request to join a Slack Connect channel... *
[2026-04-13 16:24:47 UTC] @mention by Stefan Guggisberg in #mpdm-roman-...
Items marked with * are unread.
slack pending [--pages=N] [--json] [--channel=<id>]
List pending approval requests (Slack Connect invites, workspace invites) that have
live Approve/Deny action buttons. Pages through the Slackbot DM history, filters
out already-processed requests, and shows a formatted table with timestamps you can
pass directly to slack approve or slack deny.
Flags:
--pages=N — max pages to search (default 10, each page is 100 messages)
--json — output raw JSON instead of a table
--channel=<id> — override the Slackbot DM channel (auto-detected by default)
slack approve <message_ts> [--channel=<id>]
Approve an interactive message action (e.g. Slack Connect invite request, workspace
invite). The message_ts is the timestamp of the Slackbot notification message
containing the Approve/Deny buttons. Defaults to the Slackbot DM channel; use
--channel to override.
Uses the chat.attachmentAction API to programmatically click the Approve button.
slack deny <message_ts> [--channel=<id>]
Deny an interactive message action. Same as approve but clicks the Deny button.
Approve/deny workflow
Action buttons expire (often within minutes to hours) and expired clicks may
silently no-op. Always verify by re-listing pending requests after acting:
slack --ws=E06V3987PMY pending
slack --ws=E06V3987PMY approve 1774846849.585479
slack --ws=E06V3987PMY deny 1770698762.931619
slack --ws=E06V3987PMY pending
If step 3 still shows the same entry, the action button has expired. Re-trigger
the request from the original source (e.g. ask the inviter to resend) rather
than retrying the same message_ts.
slack history <channel_id> [--limit=N]
Fetch recent messages from a channel. Default limit is 20.
slack post <channel_or_user_id> <message>
Post a message to a channel, DM, or user. Accepts channel IDs (C..., D..., G...) directly,
or user IDs (U..., W...) — in which case a DM is opened automatically.
slack post C087NCG774J "Hello channel!"
slack post W5BPKRLUA "Hey, quick question..."
slack post C087NCG774J "Got it" --thread_ts=1774539502.747989
slack channels [--search=term]
Search for channels by name. Uses search.modules API (the standard
conversations.list is restricted on enterprise grids). Returns channel ID, name,
member count, and purpose.
slack thread <channel_id> <thread_ts> [--limit=N]
Read thread replies. Provide the channel ID and the thread's parent timestamp.
Default limit is 50.
slack user <user_id>
Look up user information by user ID. Returns name, display name, title, timezone,
and status.
slack info <channel_id>
Get channel metadata (name, purpose, topic, member count).
slack slackbot
Opens/finds the Slackbot DM channel and prints its ID.
slack watch <channel_id> --scoop=<name> [--thread=<ts>] [--force]
Watch a channel or thread for new messages in real time. Each new message is
delivered as a lick event to the specified scoop within seconds.
Options:
--scoop=<name> — (required) the scoop that receives lick events
--thread=<thread_ts> — watch a specific thread instead of the whole channel
--force — replace an existing watch on the same target
How it works:
- Creates a SLICC webhook routed to the target scoop
- Registers a declarative WebSocket observer on the Slack browser tab via the
sanctioned
browser.websocket runtime API (no page-context code injection,
no prototype patching)
- Slack's
wss://*.slack.com/ connections carry all real-time events
(messages, typing indicators, etc.)
- The observer filters for
type: "message" frames matching the watched
channel (and thread if specified)
- Matching frames are forwarded to the webhook → delivered as licks to the scoop
Lick payload: the raw Slack message frame that matched the filter, e.g.:
{
"type": "message",
"channel": "C087NCG774J",
"thread_ts": null,
"ts": "1776097845.451319",
"user": "W5BPKRLUA",
"text": "Hello world!",
"subtype": null
}
The watched channel/thread is implicit in the subscription, and the complete
Slack frame is delivered (any additional Slack fields are preserved).
Duplicate prevention: The watch ID is deterministic from channel + thread.
You cannot create two watches on the same target without --force.
Durability: The observer lives in the Slack tab. If the page reloads, use
slack reinject to re-register the observers for all active watches.
slack unwatch <channel_id> [--thread=<thread_ts>]
Stop watching a channel or thread. Deletes the webhook and removes the watch state.
slack watches
List all active Slack watches with their targets and scoops.
slack reinject
Re-register the WebSocket observers on the Slack tab. Use after a page reload
or if watches stop firing. This reads all active watch state files and
re-registers an observer for each.
Watch architecture
Slack servers → wss://*.slack.com/ → Browser WebSocket
↓
Runtime WebSocket observer (declarative filter: type=message + channel/thread)
↓
forward → SLICC webhook (closed-enum sink)
↓
SLICC delivers lick event to target scoop
Operational notes:
- State files:
/workspace/skills/slack/.watch-<id>.json (webhook IDs + config)
- One SLICC webhook per watch routes events to the target scoop
- After a page reload, run
slack reinject to re-register the observers
Enterprise grid notes
Some Slack workspaces use Enterprise Grid (e.g. Adobe's E23RE8G4F). Some
standard Web API methods like conversations.list and users.conversations
return enterprise_is_restricted on these workspaces. The skill uses
search.modules (module=channels) for channel discovery and conversations.open
for DM channel lookup instead.
Slack Support Portal
The slack-support script manages help requests on Adobe's Slack Support Portal
(adobe-dx-support.enterprise.slack.com). It scrapes the server-rendered portal
using playwright-cli — no REST API is available. Requires an open browser tab
at the support portal domain.
Quick start
slack-support list
slack-support list --status=open
slack-support view 6750592
slack-support reply 6750592 "Thanks, that fixed it."
slack-support create --topic=slack-connect --title="Connect issue" "Cannot invite external user"
slack-support resolve 6750592
Available commands
slack-support list [--status=open|closed|all]
List help requests. Default shows all. Displays request ID, status, title,
and last updated date.
slack-support view <id>
View a request's details and comment thread.
slack-support reply <id> <message>
Add a reply to an existing request.
slack-support create --topic=<topic> --title=<title> <message>
Create a new help request. Available topics: audio-video, billing-plans,
connection-trouble, managing-channels, managing-members, notifications,
signing-in, slack-connect, workflow-builder, workspace-migration.
slack-support resolve <id>
Mark a request as resolved.
Authentication
Uses cookie-based auth via the existing browser session at
adobe-dx-support.enterprise.slack.com. No separate token is needed — the
playwright-cli commands execute in the browser tab context.
Endpoints reference
See references/endpoints.md for the full endpoint documentation.