# Slack

> Read, navigate, search, and send messages in Slack via the local desktop app. Use when the user mentions Slack, a *.slack.com URL, or a channel name.

- Skill: `inancgumus/slack` (Agent Skill, multi-file: 12 files)
- Install (CLI): `npx skillmds@latest add inancgumus/slack`
- Raw SKILL.md: https://api.skillmd.com/api/skills/inancgumus/slack/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: inancgumus (https://skillmd.com/u/inancgumus)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/inancgumus/slack

---


# Slack Desktop App Control

Connects to the Slack app via CDP (relaunch if not running with CDP). The workspace is auto-detected. Only one command can use this skill at a time. Always use `--json`. Read the raw JSON output directly. Never pipe through formatters or truncate fields (MUST). Always pass hrefs as-is. Never strip or reconstruct them — query parameters are required for Slack to work.

## Reference formats

| Format | Example | Resolves to |
|---|---|---|
| Channel ID | `C042WNMBYQM` | that channel |
| Channel name | `#k6-alert-core-team` | channel (sidebar lookup) |
| DM by name | `@Inanc Gumus` | that DM conversation |
| Message ref | `C042WNMBYQM/1773432901.662159` | specific message |
| Slack URL | `https://…/archives/C042…/p177…` | specific message |

Channel names must start with `#`, DM names with `@`.

## Common workflows

- Search → browse results: `search.py "query" --json` returns 20 truncated results per page. Check `pages` in the output, then `--page 2`, etc. Reuses existing results when the query matches. Pass `--click N` + the same flags to open a thread, which returns complete message and replies. Parse the JSON — the data is complete, no need to re-search.
- Read a message by ref: `get.py HREF --json` reads the full message. Use `--with-replies` to include thread replies.
- Check unreads: `unreads.py --json` lists unread channels with message previews. Use `get.py` with the href to read full content.
- Browse a channel by date: `collect.py "#channel" YYYY-MM-DD --json` returns message IDs for that date (includes bot messages). Use `--with-replies` for reply IDs. Compose with `get.py` to read or `emoji.py` to react.
- Send a message: `reply.py REF "text" --send`. Channel ref → new message, message ref → thread reply. Default is dry-run.
- Saved items: `later.py --json` reads your Later list.

---

### `scripts/search.py` — Search messages

Returns up to 20 truncated results per page with `channel_id`, `message_id`, `thread_id`. Use `--click N` to read the full thread of the Nth result.

```bash
python3 <skill-path>/scripts/search.py "query" --json
python3 <skill-path>/scripts/search.py "in:#channel query" --json
python3 <skill-path>/scripts/search.py "query" --click 3 --json     # click 3rd result, read full thread
python3 <skill-path>/scripts/search.py "query" --page 2 --json
```

`--click` JSON output: `{"clicked": N, "href": "...", "thread": [{"message_id": "...", "message": "..."}]}`. The `thread` array contains complete untruncated messages (parent first, then replies in order).

Pagination: `--page N` fetches a specific result page. Check the `pages` count before requesting further pages. Repeated calls with the same query reuse the existing results. Slack loads pages dynamically — navigating to the last visible page may reveal more pages. Sometimes a more specific search term is better than paging. But when thoroughness matters, paging through results is important to collect more data.

Slack search syntax: `in:#channel`, `from:@user`, `after:YYYY-MM-DD`, `before:YYYY-MM-DD`, `has:reaction`, `has:file`

### `scripts/get.py` — Get message content

```bash
python3 <skill-path>/scripts/get.py C0123456789/1234567890.123456 --json
python3 <skill-path>/scripts/get.py "https://…/archives/C…/p…" --json
python3 <skill-path>/scripts/get.py C0123456789/1234567890.123456 --with-replies --json
python3 <skill-path>/scripts/get.py C0123456789/111.1 C0123456789/222.2 --json
```

### `scripts/reply.py` — Send a message

Pass a channel/DM ref to post a new message, or a message ref to reply in its thread.

```bash
python3 <skill-path>/scripts/reply.py "#general" "hey" --send          # channel message
python3 <skill-path>/scripts/reply.py "@Inanc Gumus" "hello" --send    # DM
python3 <skill-path>/scripts/reply.py C042WNMBYQM/1773432901.662159 "reply" --send  # thread reply
```

Default is dry-run — add `--send` to actually send.

### `scripts/emoji.py` — React to a message

```bash
python3 <skill-path>/scripts/emoji.py C0123456789/1234567890.123456 thumbsup
python3 <skill-path>/scripts/emoji.py "https://…/archives/C…/p…" fire
```

### `scripts/unreads.py` — Fetch unread messages

```bash
python3 <skill-path>/scripts/unreads.py --json
python3 <skill-path>/scripts/unreads.py --channel NAME --json
```

### `scripts/later.py` — Fetch "Later" (saved) items

```bash
python3 <skill-path>/scripts/later.py --json
python3 <skill-path>/scripts/later.py --tab archived --json
python3 <skill-path>/scripts/later.py --tab completed --json
python3 <skill-path>/scripts/later.py --limit 10 --json
```

### `scripts/collect.py` — Collect message IDs for a date

Navigates the channel directly (not search), so bot and integration messages are included. Returns top-level messages only (not thread replies).

```bash
python3 <skill-path>/scripts/collect.py "#general" 2026-03-09 --json
python3 <skill-path>/scripts/collect.py "#general" 2026-03-09 --with-replies --json
python3 <skill-path>/scripts/collect.py "#general" 2026-03-09 --limit 10 --json
```

## Manual commands

For anything the scripts don't cover, use `agent-browser --cdp 9222` directly. Navigate within the app using DOM clicks — do not use `agent-browser open URL` as it disrupts the Electron app's state.

```bash
agent-browser --cdp 9222 snapshot -i                              # list interactive elements (@e1, @e2, ...)
agent-browser --cdp 9222 click @eN                                # click a button, link, or tab
agent-browser --cdp 9222 hover @eN                                # hover to reveal toolbars
agent-browser --cdp 9222 fill @eN "text"                          # type into an input
agent-browser --cdp 9222 press Enter                              # press a key
agent-browser --cdp 9222 scroll up 500                            # scroll up (older messages)
agent-browser --cdp 9222 scroll down 500                          # scroll down (newer messages)
```

To read message text (snapshots only show interactive elements):

```bash
agent-browser --cdp 9222 eval --stdin <<'EVALEOF'
(() => {
    const panel = document.querySelector('.p-flexpane') ||
                  document.querySelector('[data-qa="message_pane"]') ||
                  document.querySelector('.c-virtual_list__scroll_container');
    return panel ? panel.innerText : 'No message content found';
})()
EVALEOF
```

`.p-flexpane` is the thread side-panel. The other selectors are the main channel view.

