Slack¶
Slack connects over Socket Mode: the bot dials out, and events and block actions arrive on that socket. No request URL, no public ingress.
Create the app¶
In api.slack.com/apps, create an app and:
- Socket Mode: enable it and create an app-level token with
connections:write. That isapp_token, anxapp-value. - Agents: turn on the agent experience, so people message the bot as an agent in its DM.
- OAuth & Permissions, bot token scopes, from what the bot calls:
chat:write,users:read,im:write,im:history,channels:history,groups:history,mpim:history,files:write,files:read,assistant:write, andchannels:readandgroups:readfor channel names and listing the channels a conversation can move into. Install the app to the workspace; the bot token isbot_token, anxoxb-value. - Event Subscriptions: subscribe the bot to
message.channels,message.groups,message.imandmessage.mpim. - Interactivity & Shortcuts: on. With Socket Mode no URL is needed.
The app id from Basic Information is app_id. If Slack refuses a call, its
error names the missing scope.
Configure¶
Name agents you have already enabled and set enabled: true if this channel was
generated disabled. Check the configuration, restart Octomate, invite the bot to a
channel and @-mention it, or send it a direct message. Verify a reply.
Where things land¶
| Slack surface | In Octomate | The reply |
|---|---|---|
| A channel message that mentions the bot | A thread that message starts | In a thread under it |
| Any other channel message | The channel's chat room | None, with mention_only |
| A reply in a thread | That thread | In the same thread |
| A message at the top of the bot's DM | A private thread that message starts | In a thread under your message |
The channel's chat room follows its Slack name, refreshed on incoming root messages. Agent work threads keep their own names.
Each message you send at the top of the bot's DM, or that mentions it at the top of a channel, starts a new conversation. To continue one, reply in its thread. Opening the app's Home or Messages tab is silent and does not start an agent turn.
Slack's streaming API takes a thread and nothing else, so the bot never streams into a channel root. When it opens a sub-thread it posts the hint as a message and that message becomes the thread. A private hand-off opens a thread inside your DM the same way. A teleport into a new DM thread posts one opener at the DM root and continues in that thread.
Teleport uses the current group or DM as the parent for a new sub-thread.
It does not offer nested sub-threads inside an existing thread. Entry from another
platform uses the linked account's DM, or a channel you and the bot are both in:
browsing Slack lists those channels, public and private, and a thread opened in
one is read by its members. Without channels:read and groups:read the listing
is refused with the scope Slack names, and the DM still works.
Text over Slack's limit is uploaded as a Markdown file with a one-line note.
Rendering¶
Artifact overviews appear as compact native cards with a sparkle icon, the saved title, a provider subtitle and an Open button, between the surrounding tool or answer messages. The button opens the authenticated web viewer, where the app runs.
A run alternates between a plan stream and answer text. Thinking blocks and tool calls become tasks in the plan, expanded while they run and folded when done, with arguments and results inside. Todos are tasks in the same plan; Slack has no "blocked" state, so a blocked todo shows as pending. Each answer text part is its own streamed message, and the assistant status line reads "Thinking", "Writing the response" or "Input requested" as the turn moves.
Approvals arrive as one paged message per batch with Approve and Deny buttons. Questions are one message holding the whole batch: radio buttons for choices, or checkboxes when the question takes several picks, a free-text field, and one Submit. Nothing reaches Octomate until Submit is pressed. A card shows its submitted summary after Octomate handles the response; a rejected response leaves the card unchanged. Submit keeps the batch across a restart, but a live request still needs its running agent to receive the reply. See Requests after a restart for the difference between live requests and saved, suspended runs.
Approvals and questions flush buffered output without closing the current plan or answer message. The agent can continue working while prompts remain open; "Input requested" does not mean the whole run has paused. Tool results update their original plan entries, and continuing answer text stays in the same message.
MCP tools acting as the person¶
Slack's channel tentacle is also an MCP connector. With mcp: true, agents on any
channel can search Slack, read channels, threads and profiles, and draft canvases
as the person who asked, once that person has connected. Nothing posts as them:
to say something in Slack, the agent uses gateway_send.
That needs the app as an OAuth client:
tentacles:
slack:
type: slack
mcp: true
oauth:
client_id: "123.456"
callback_base_uri: https://octomate.example.com
In the app's settings, switch on the Slack Model Context Protocol (MCP) Server
feature under Agents, register <callback_base_uri>/oauth/slack/callback as a
redirect URL, and list the user token scopes Octomate asks for under User Token
Scopes. The default set is the eighteen the forwarded tools need, searches and
reads plus canvases, deliberately without chat:write. Widening the list later
means every connected user reconnects.
Each user connects once, from a chat, by asking the agent to connect Slack, or from Trunkline. See MCP setup.
Profile linking¶
With the oauth block configured, a user can also link their Slack identity to
their account from Trunkline's Profile page, which verifies the workspace matches
this channel's. Without it, linking works from the chat as on every channel.
Limits¶
- A stream is rotated after about four and a half minutes, Slack's limit, so a very long answer becomes several messages.
- Slash commands are not registered.
- A reply to one of the bot's messages does not count as addressing it; mention it.