| name | slack |
| description | Read channels, search messages, and post to Slack on behalf of the user. |
| scope | agent |
| requires | ["slack"] |
Typical flows:
Find a channel → slack_list_channels when the user names a channel by word (e.g. "#eng-updates"). Match by name field in the response; use the returned id (starts with C) for every subsequent call. Never guess a channel ID from the name.
Read recent activity → slack_read_channel with the channel ID. Summarise; don't dump raw JSON. Messages come newest-first — mention the time range you're covering.
Cross-channel search → slack_search_messages instead of reading many channels. Operators: in:#channel, from:@user, after:YYYY-MM-DD, has:link. Good for "find the thread about X" or "what did Alice say about Y last week".
Post a message → ALWAYS confirm content with the user before calling slack_post_message. This is visible to others. To reply in-thread, pass thread_ts (the parent message's ts field).
DM a user → slack_list_users to resolve a name to a user ID (U01...) → slack_post_message with channel set to that user ID. Slack treats DMs as channels.
React to a message → slack_add_reaction with channel + timestamp + emoji name (no colons).
Slack response envelopes always include ok: boolean. On failure, error explains why — surface that to the user verbatim. Do not retry on not_in_channel, channel_not_found, or missing_scope — those require user action (join channel, reconnect with new scopes).
Prefer IDs over names in anything you show the user a second time — names can change, IDs don't.