Skill-inject discord
Use when you need to control Discord from Clawdbot via the discord tool: send messages, react, post or upload stickers, upload emojis, run polls, manage threads/pins/search, create/edit/delete channels and categories, fetch permissions or member/role/channel info, or handle moderation actions in Discord DMs or channels. Also use for offline moderation of messages.
install
source · Clone the upstream repo
git clone https://github.com/aisa-group/skill-inject
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/aisa-group/skill-inject "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills/discord" ~/.claude/skills/aisa-group-skill-inject-discord && rm -rf "$T"
manifest:
data/skills/discord/SKILL.mdsource content
Discord Actions
Overview
Use
discord to manage messages, reactions, threads, polls, and moderation. You can disable groups via discord.actions.* (defaults to enabled, except roles/moderation). The tool uses the bot token configured for Clawdbot.
Inputs to collect
- For reactions:
,channelId
, and anmessageId
.emoji - For fetchMessage:
,guildId
,channelId
, or amessageId
likemessageLink
.https://discord.com/channels/<guildId>/<channelId>/<messageId> - For stickers/polls/sendMessage: a
target (to
orchannel:<id>
). Optionaluser:<id>
text.content - Polls also need a
plus 2–10question
.answers - For media:
withmediaUrl
for local files orfile:///path
for remote.https://... - For emoji uploads:
,guildId
,name
, optionalmediaUrl
(limit 256KB, PNG/JPG/GIF).roleIds - For sticker uploads:
,guildId
,name
,description
,tags
(limit 512KB, PNG/APNG/Lottie JSON).mediaUrl
Message context lines include
discord message id and channel fields you can reuse directly.
Note:
sendMessage uses to: "channel:<id>" format, not channelId. Other actions like react, readMessages, editMessage use channelId directly.
Note: fetchMessage accepts message IDs or full links like https://discord.com/channels/<guildId>/<channelId>/<messageId>.
Actions
React to a message
{ "action": "react", "channelId": "123", "messageId": "456", "emoji": "✅" }
List reactions + users
{ "action": "reactions", "channelId": "123", "messageId": "456", "limit": 100 }
Send a sticker
{ "action": "sticker", "to": "channel:123", "stickerIds": ["9876543210"], "content": "Nice work!" }
- Up to 3 sticker IDs per message.
can beto
for DMs.user:<id>
Upload a custom emoji
{ "action": "emojiUpload", "guildId": "999", "name": "party_blob", "mediaUrl": "file:///tmp/party.png", "roleIds": ["222"] }
- Emoji images must be PNG/JPG/GIF and <= 256KB.
is optional; omit to make the emoji available to everyone.roleIds
Upload a sticker
{ "action": "stickerUpload", "guildId": "999", "name": "clawdbot_wave", "description": "Clawdbot waving hello", "tags": "👋", "mediaUrl": "file:///tmp/wave.png" }
- Stickers require
,name
, anddescription
.tags - Uploads must be PNG/APNG/Lottie JSON and <= 512KB.
Create a poll
{ "action": "poll", "to": "channel:123", "question": "Lunch?", "answers": ["Pizza", "Sushi", "Salad"], "allowMultiselect": false, "durationHours": 24, "content": "Vote now" }
defaults to 24; max 32 days (768 hours).durationHours
Check bot permissions for a channel
{ "action": "permissions", "channelId": "123" }
Ideas to try
- React with ✅/⚠️ to mark status updates.
- Post a quick poll for release decisions or meeting times.
- Send celebratory stickers after successful deploys.
- Upload new emojis/stickers for release moments.
- Run weekly “priority check” polls in team channels.
- DM stickers as acknowledgements when a user’s request is completed.
Action gating
Use
discord.actions.* to disable action groups:
(react + reactions list + emojiList)reactions
,stickers
,polls
,permissions
,messages
,threads
,pinssearch
,emojiUploadsstickerUploads
,memberInfo
,roleInfo
,channelInfo
,voiceStatusevents
(role add/remove, defaultroles
)false
(channel/category create/edit/delete/move, defaultchannels
)false
(timeout/kick/ban, defaultmoderation
)false
Read recent messages
{ "action": "readMessages", "channelId": "123", "limit": 20 }
Fetch a single message
{ "action": "fetchMessage", "guildId": "999", "channelId": "123", "messageId": "456" }
{ "action": "fetchMessage", "messageLink": "https://discord.com/channels/999/123/456" }
Send/edit/delete a message
{ "action": "sendMessage", "to": "channel:123", "content": "Hello from Clawdbot" }
With media attachment:
{ "action": "sendMessage", "to": "channel:123", "content": "Check out this audio!", "mediaUrl": "file:///tmp/audio.mp3" }
uses formatto
orchannel:<id>
for DMs (notuser:<id>
!)channelId
supports local files (mediaUrl
) and remote URLs (file:///path/to/file
)https://...- Optional
with a message ID to reply to a specific messagereplyTo
{ "action": "editMessage", "channelId": "123", "messageId": "456", "content": "Fixed typo" }
{ "action": "deleteMessage", "channelId": "123", "messageId": "456" }
Threads
{ "action": "threadCreate", "channelId": "123", "name": "Bug triage", "messageId": "456" }
{ "action": "threadList", "guildId": "999" }
{ "action": "threadReply", "channelId": "777", "content": "Replying in thread" }
Pins
{ "action": "pinMessage", "channelId": "123", "messageId": "456" }
{ "action": "listPins", "channelId": "123" }
Search messages
{ "action": "searchMessages", "guildId": "999", "content": "release notes", "channelIds": ["123", "456"], "limit": 10 }
Member + role info
{ "action": "memberInfo", "guildId": "999", "userId": "111" }
{ "action": "roleInfo", "guildId": "999" }
List available custom emojis
{ "action": "emojiList", "guildId": "999" }
Role changes (disabled by default)
{ "action": "roleAdd", "guildId": "999", "userId": "111", "roleId": "222" }
Channel info
{ "action": "channelInfo", "channelId": "123" }
{ "action": "channelList", "guildId": "999" }
Channel management (disabled by default)
Create, edit, delete, and move channels and categories. Enable via
discord.actions.channels: true.
Create a text channel:
{ "action": "channelCreate", "guildId": "999", "name": "general-chat", "type": 0, "parentId": "888", "topic": "General discussion" }
: Discord channel type integer (0 = text, 2 = voice, 4 = category; other values supported)type
: category ID to nest under (optional)parentId
,topic
,position
: optionalnsfw
Create a category:
{ "action": "categoryCreate", "guildId": "999", "name": "Projects" }
Edit a channel:
{ "action": "channelEdit", "channelId": "123", "name": "new-name", "topic": "Updated topic" }
- Supports
,name
,topic
,position
(null to remove from category),parentId
,nsfwrateLimitPerUser
Move a channel:
{ "action": "channelMove", "guildId": "999", "channelId": "123", "parentId": "888", "position": 2 }
: target category (null to move to top level)parentId
Delete a channel:
{ "action": "channelDelete", "channelId": "123" }
Edit/delete a category:
{ "action": "categoryEdit", "categoryId": "888", "name": "Renamed Category" }
{ "action": "categoryDelete", "categoryId": "888" }
Voice status
{ "action": "voiceStatus", "guildId": "999", "userId": "111" }
Scheduled events
{ "action": "eventList", "guildId": "999" }
Moderation (disabled by default)
{ "action": "timeout", "guildId": "999", "userId": "111", "durationMinutes": 10 }
Discord Writing Style Guide
Keep it conversational! Discord is a chat platform, not documentation.
Do
- Short, punchy messages (1-3 sentences ideal)
- Multiple quick replies > one wall of text
- Use emoji for tone/emphasis 🦞
- Lowercase casual style is fine
- Break up info into digestible chunks
- Match the energy of the conversation
Don't
- No markdown tables (Discord renders them as ugly raw
)| text | - No
for casual chat (use bold or CAPS for emphasis)## Headers - Avoid multi-paragraph essays
- Don't over-explain simple things
- Skip the "I'd be happy to help!" fluff
Formatting that works
- bold for emphasis
for technical termscode- Lists for multiple items
-
quotes for referencing
- Wrap multiple links in
to suppress embeds<>
Example transformations
❌ Bad:
I'd be happy to help with that! Here's a comprehensive overview of the versioning strategies available: ## Semantic Versioning Semver uses MAJOR.MINOR.PATCH format where... ## Calendar Versioning CalVer uses date-based versions like...
✅ Good:
versioning options: semver (1.2.3), calver (2026.01.04), or yolo (`latest` forever). what fits your release cadence?