docs/agents/channels/slack.mdx
Use Slack as a messaging channel for your agent. Users can DM or @mention the bot. Novu keeps thread context, shows typing and plan cards during the turn, can attach files on replies, and can post Approve / Deny cards before gated tools run.
| Capability | Support |
|---|---|
| Full context history | Yes |
| Threaded replies | Yes |
| Live typing indicator (custom status text) | Yes |
| React with eyes on inbound messages | Yes |
| Plan card (native) | Yes |
| Rich text / Block Kit | Yes |
| Tap-to-respond buttons | Yes |
| Emoji reactions (both directions) | Yes |
| Message edits in place | Yes |
| Action / MCP tool approval | Yes |
| MCP connect card | Yes |
| Resolve conversation | Yes |
| File sharing | Yes |
| Streaming word-by-word | Not yet |
Full matrix: Channels overview.
A user @mentions the agent in a thread. Novu adds an eyes reaction, shows typing and a plan card while the agent runs tools, then replies in the same thread with optional action buttons.
When a tool is gated, Slack shows a native approval block (Deny, Approve once, Always allow this tool). The handler resumes after the user selects an option.
When the dashboard or CLI asks for a Slack App Configuration Token:
xoxe.xoxp-) and paste it into Novu or the CLI.The configuration token is used once to create the Slack app. Novu does not store it.
| Framework / Platform | Guide |
|---|---|
| AI SDK | Connect AI SDK to Slack |
| LangChain | Connect LangChain to Slack |
| Mastra | Connect Mastra to Slack |
| Claude managed agent | Connect Claude managed agent |
| AWS Claude managed agent | Connect AWS Claude managed agent |
Use SlackConnectButton from @novu/react so end users can install the Slack app and link it to your agent from your product UI.
import { NovuProvider, SlackConnectButton } from '@novu/react';
export function SlackConnect() {
const subscriberId = 'subscriber-id';
const integrationIdentifier = 'slack-integration-identifier';
const agentIdentifier = 'agent-identifier';
return (
<NovuProvider
applicationIdentifier={process.env.NEXT_PUBLIC_NOVU_APPLICATION_IDENTIFIER!}
subscriberId={subscriberId}
>
<SlackConnectButton
integrationIdentifier={integrationIdentifier}
connectionIdentifier={`${subscriberId}:${integrationIdentifier}:${agentIdentifier}`}
connectionMode="subscriber"
connectLabel="Install agent ↗"
connectedLabel="Connected to Slack"
onConnectSuccess={() => {
// Workspace linked
}}
onConnectError={(error: unknown) => {
console.error(error);
}}
/>
</NovuProvider>
);
}
Props and appearance options: Connect components.