2026-07-08 15:23:34 +08:00
|
|
|
# Build a Slack AI Agent with nanobot
|
|
|
|
|
|
|
|
|
|
This guide connects nanobot to Slack through Socket Mode. No public webhook URL
|
|
|
|
|
is required for the first working setup.
|
|
|
|
|
|
|
|
|
|
## What this guide builds
|
|
|
|
|
|
|
|
|
|
- a Slack app with Socket Mode
|
|
|
|
|
- a bot token and app-level token
|
|
|
|
|
- the `slack` channel enabled in nanobot
|
2026-07-08 15:58:43 +08:00
|
|
|
- a DM pairing flow and mention test from an approved Slack user
|
2026-07-08 15:23:34 +08:00
|
|
|
|
|
|
|
|
## Prerequisites
|
|
|
|
|
|
|
|
|
|
- A working nanobot reply:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
nanobot agent -m "Hello!"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Permission to create a Slack app in a workspace.
|
|
|
|
|
|
|
|
|
|
## Install nanobot
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
python -m pip install nanobot-ai
|
|
|
|
|
nanobot onboard --wizard
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Enable the Slack channel
|
|
|
|
|
|
|
|
|
|
Install the optional channel dependency:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
nanobot plugins enable slack
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
In Slack, create an app, enable Socket Mode, create an app-level token with
|
|
|
|
|
`connections:write`, add bot scopes, subscribe to bot events, and install the
|
|
|
|
|
app to your workspace.
|
|
|
|
|
|
|
|
|
|
Merge this snippet into `~/.nanobot/config.json`:
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
{
|
|
|
|
|
"channels": {
|
|
|
|
|
"slack": {
|
|
|
|
|
"enabled": true,
|
|
|
|
|
"botToken": "xoxb-...",
|
|
|
|
|
"appToken": "xapp-...",
|
2026-07-08 15:58:43 +08:00
|
|
|
"groupPolicy": "mention",
|
|
|
|
|
"dm": {
|
|
|
|
|
"policy": "allowlist"
|
|
|
|
|
}
|
2026-07-08 15:23:34 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2026-07-08 15:58:43 +08:00
|
|
|
Slack DMs are open by default. Setting `dm.policy` to `"allowlist"` with no
|
|
|
|
|
`dm.allowFrom` entries makes new DM senders receive a pairing code. Approve the
|
|
|
|
|
code before using the bot normally.
|
|
|
|
|
|
2026-07-08 15:23:34 +08:00
|
|
|
## Run nanobot gateway
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
nanobot channels status
|
|
|
|
|
nanobot gateway
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Test a message
|
|
|
|
|
|
2026-07-08 15:58:43 +08:00
|
|
|
DM the Slack bot directly. It should return a pairing code. Approve it from a
|
|
|
|
|
trusted local surface:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
nanobot agent -m "/pairing approve ABCD-EFGH"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Then DM the bot again, or mention it in a channel:
|
2026-07-08 15:23:34 +08:00
|
|
|
|
|
|
|
|
```text
|
|
|
|
|
@nanobot Hello from Slack
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Security notes
|
|
|
|
|
|
|
|
|
|
- Keep `groupPolicy` as `mention` unless the bot is intentionally listening to
|
|
|
|
|
every channel message.
|
2026-07-08 15:58:43 +08:00
|
|
|
- Keep `dm.policy` as `"allowlist"` when you want pairing-based approval.
|
2026-07-08 15:23:34 +08:00
|
|
|
- Use `groupAllowFrom` with allowlist mode for approved channels.
|
|
|
|
|
- Reinstall the Slack app after changing scopes.
|
|
|
|
|
- Keep bot and app tokens out of committed config files.
|
|
|
|
|
|
|
|
|
|
## Troubleshooting
|
|
|
|
|
|
|
|
|
|
- If Socket Mode fails, confirm the app-level token starts with `xapp-`.
|
|
|
|
|
- If the bot cannot send files, add `files:write`, reinstall the app, and
|
|
|
|
|
restart nanobot.
|
2026-07-08 15:58:43 +08:00
|
|
|
- If a DM responds normally without pairing, check that `dm.policy` is
|
|
|
|
|
`"allowlist"`.
|
2026-07-08 15:23:34 +08:00
|
|
|
- If channel messages are ignored, check event subscriptions and group policy.
|
|
|
|
|
|
|
|
|
|
## Next: memory, automations, MCP tools
|
|
|
|
|
|
|
|
|
|
- [Chat Apps reference](../chat-apps.md)
|
|
|
|
|
- [Configure web search](./configure-web-search.md)
|
|
|
|
|
- [Long-running AI Agent](./long-running-ai-agent.md)
|
|
|
|
|
- [Deployment](../deployment.md)
|