Help us improve
Share bugs, ideas, or general feedback.
From claudeclaw
Adds Discord bot channel integration to ClaudeClaw with code changes, tests, and interactive bot setup.
npx claudepluginhub sbusso/claudeclawHow this skill is triggered — by the user, by Claude, or both
Slash command
/claudeclaw:add-discordThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill adds Discord support to ClaudeClaw, then walks through interactive setup.
Adds Discord bot channel integration to NanoClaw via git merge from dedicated repo, interactive bot setup, env configuration, build, and service restart. Use to enable Discord support in NanoClaw.
Provides production-ready TypeScript starters for Claude Code channel servers: CI webhook receiver for GitHub Actions, mobile approval relay, Discord/Telegram bridge, local fakechat dev profile. Includes sender allowlists and security hardening.
Claude Channels(텔레그램/디스코드) 자동 셋업. 폰에서 메시지로 Claude Code에 작업 지시 가능. --auto 플래그와 FORGE_OUTPUT=json 프로토콜 공유.
Share bugs, ideas, or general feedback.
This skill adds Discord support to ClaudeClaw, 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/claudeclaw-discord.git
git fetch discord main
git merge discord/main || {
git checkout --theirs package-lock.json
git add package-lock.json
git merge --continue
}
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.
Service name: Derived from the directory name:
com.claudeclaw.<dirname>(macOS) /claudeclaw-<dirname>(Linux). For example, if cwd ismy-assistant, the service iscom.claudeclaw.my-assistant. Determine the correct service name before running service commands below.
npm run build
launchctl kickstart -k gui/$(id -u)/com.claudeclaw
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).
The channel ID, name, and folder name are needed. Use npx tsx setup/index.ts --step register with the appropriate flags.
For a main channel (responds to all messages):
npx tsx setup/index.ts --step register -- --jid "dc:<channel-id>" --name "<server-name> #<channel-name>" --folder "discord_main" --trigger "@${ASSISTANT_NAME}" --channel discord --no-trigger-required --is-main
For additional channels (trigger-only):
npx tsx setup/index.ts --step register -- --jid "dc:<channel-id>" --name "<server-name> #<channel-name>" --folder "discord_<channel-name>" --trigger "@${ASSISTANT_NAME}" --channel discord
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/claudeclaw.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 claudeclawThis 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> → ClaudeClaw trigger format)