with one click
add-discord
Add Discord bot channel integration to NanoClaw.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Add Discord bot channel integration to NanoClaw.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Add Gmail integration to NanoClaw. Can be configured as a tool (agent reads/sends emails when triggered from WhatsApp) or as a full channel (emails can trigger the agent, schedule tasks, and receive replies). Guides through GCP OAuth setup and implements the integration.
Add image vision to NanoClaw agents. Resizes and processes WhatsApp image attachments, then sends them to Claude as multimodal content blocks.
Add Ollama MCP server so the container agent can call local models for cheaper/faster tasks like summarization, translation, or general queries.
Add PDF reading to NanoClaw agents. Extracts text from PDFs via pdftotext CLI. Handles WhatsApp attachments, URLs, and local files.
Add WhatsApp emoji reaction support — receive, send, store, and search reactions.
Add Slack as a channel. Can replace WhatsApp entirely or run alongside it. Uses Socket Mode (no public URL needed).
| name | add-discord |
| description | Add Discord bot channel integration to NanoClaw. |
This skill adds Discord support to NanoClaw, then walks through interactive setup.
Check if src/channels/discord.ts exists. If it does, skip to Phase 3 (Setup). The code changes are already in place.
Use AskUserQuestion to collect configuration:
AskUserQuestion: Do you have a Discord bot token, or do you need to create one?
If they have one, collect it now. If not, we'll create one in Phase 3.
git remote -v
If discord is missing, add it:
git remote add discord https://github.com/qwibitai/nanoclaw-discord.git
git fetch discord main
git merge discord/main
This merges in:
src/channels/discord.ts (DiscordChannel class with self-registration via registerChannel)src/channels/discord.test.ts (unit tests with discord.js mock)import './discord.js' appended to the channel barrel file src/channels/index.tsdiscord.js npm dependency in package.jsonDISCORD_BOT_TOKEN in .env.exampleIf the merge reports conflicts, resolve them by reading the conflicted files and understanding the intent of both sides.
npm install
npm run build
npx vitest run src/channels/discord.test.ts
All tests must pass (including the new Discord tests) and build must be clean before proceeding.
If the user doesn't have a bot token, tell them:
I need you to create a Discord bot:
- Go to the Discord Developer Portal
- Click New Application and give it a name (e.g., "Andy Assistant")
- Go to the Bot tab on the left sidebar
- Click Reset Token to generate a new bot token — copy it immediately (you can only see it once)
- Under Privileged Gateway Intents, enable:
- Message Content Intent (required to read message text)
- Server Members Intent (optional, for member display names)
- Go to OAuth2 > URL Generator:
- Scopes: select
bot- Bot Permissions: select
Send Messages,Read Message History,View Channels- Copy the generated URL and open it in your browser to invite the bot to your server
Wait for the user to provide the token.
Add to .env:
DISCORD_BOT_TOKEN=<their-token>
Channels auto-enable when their credentials are present — no extra configuration needed.
Sync to container environment:
mkdir -p data/env && cp .env data/env/env
The container reads environment from data/env/env, not .env directly.
npm run build
launchctl kickstart -k gui/$(id -u)/com.nanoclaw
Tell the user:
To get the channel ID for registration:
- In Discord, go to User Settings > Advanced > Enable Developer Mode
- Right-click the text channel you want the bot to respond in
- Click Copy Channel ID
The channel ID will be a long number like
1234567890123456.
Wait for the user to provide the channel ID (format: dc:1234567890123456).
Use the IPC register flow or register directly. The channel ID, name, and folder name are needed.
For a main channel (responds to all messages):
registerGroup("dc:<channel-id>", {
name: "<server-name> #<channel-name>",
folder: "discord_main",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: false,
isMain: true,
});
For additional channels (trigger-only):
registerGroup("dc:<channel-id>", {
name: "<server-name> #<channel-name>",
folder: "discord_<channel-name>",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: true,
});
Tell the user:
Send a message in your registered Discord channel:
- For main channel: Any message works
- For non-main: @mention the bot in Discord
The bot should respond within a few seconds.
tail -f logs/nanoclaw.log
DISCORD_BOT_TOKEN is set in .env AND synced to data/env/envsqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'dc:%'"launchctl list | grep nanoclawThis is the default behavior for non-main channels (requiresTrigger: true). To change:
requiresTrigger to falseIf the bot connects but can't read messages, ensure:
If you can't copy the channel ID:
The Discord bot supports:
<@botId> → NanoClaw trigger format)