Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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, fetch permissions or member/role/channel info, or handle moderation actions in Discord DMs or channels.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
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.
channelId, messageId, and an emoji.to target (channel:<id> or user:<id>). Optional content text.question plus 2–10 answers.mediaUrl with file:///path for local files or https://... for remote.guildId, name, mediaUrl, optional roleIds (limit 256KB, PNG/JPG/GIF).guildId, name, description, tags, mediaUrl (limit 512KB, PNG/APNG/Lottie JSON).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.
json{ "action": "react", "channelId": "123", "messageId": "456", "emoji": "✅" }
json{ "action": "reactions", "channelId": "123", "messageId": "456", "limit": 100 }
json{ "action": "sticker", "to": "channel:123", "stickerIds": ["9876543210"], "content": "Nice work!" }
to can be user:<id> for DMs.json{ "action": "emojiUpload", "guildId": "999", "name": "party_blob", "mediaUrl": "file:///tmp/party.png", "roleIds": ["222"] }
roleIds is optional; omit to make the emoji available to everyone.json{ "action": "stickerUpload", "guildId": "999", "name": "clawdbot_wave", "description": "Clawdbot waving hello", "tags": "👋", "mediaUrl": "file:///tmp/wave.png" }
name, description, and tags.json{ "action": "poll", "to": "channel:123", "question": "Lunch?", "answers": ["Pizza", "Sushi", "Salad"], "allowMultiselect": false, "durationHours": 24, "content": "Vote now" }
durationHours defaults to 24; max 32 days (768 hours).json{ "action": "permissions", "channelId": "123" }
Use discord.actions.* to disable action groups:
reactions (react + reactions list + emojiList)stickers, polls, permissions, messages, threads, pins, searchemojiUploads, stickerUploadsmemberInfo, roleInfo, channelInfo, voiceStatus, eventsroles (role add/remove, default false)moderation (timeout/kick/ban, default false)json{ "action": "readMessages", "channelId": "123", "limit": 20 }
json{ "action": "sendMessage", "to": "channel:123", "content": "Hello from Clawdbot" }
With media attachment:
json{ "action": "sendMessage", "to": "channel:123", "content": "Check out this audio!", "mediaUrl": "file:///tmp/audio.mp3" }
to uses format channel:<id> or user:<id> for DMs (not channelId!)mediaUrl supports local files (file:///path/to/file) and remote URLs (https://...)replyTo with a message ID to reply to a specific messagejson{ "action": "editMessage", "channelId": "123", "messageId": "456", "content": "Fixed typo" }
json{ "action": "deleteMessage", "channelId": "123", "messageId": "456" }
json{ "action": "threadCreate", "channelId": "123", "name": "Bug triage", "messageId": "456" }
json{ "action": "threadList", "guildId": "999" }
json{ "action": "threadReply", "channelId": "777", "content": "Replying in thread" }
json{ "action": "pinMessage", "channelId": "123", "messageId": "456" }
json{ "action": "listPins", "channelId": "123" }
json{ "action": "searchMessages", "guildId": "999", "content": "release notes", "channelIds": ["123", "456"], "limit": 10 }
json{ "action": "memberInfo", "guildId": "999", "userId": "111" }
json{ "action": "roleInfo", "guildId": "999" }
json{ "action": "emojiList", "guildId": "999" }
json{ "action": "roleAdd", "guildId": "999", "userId": "111", "roleId": "222" }
json{ "action": "channelInfo", "channelId": "123" }
json{ "action": "channelList", "guildId": "999" }
json{ "action": "voiceStatus", "guildId": "999", "userId": "111" }
json{ "action": "eventList", "guildId": "999" }
json{ "action": "timeout", "guildId": "999", "userId": "111", "durationMinutes": 10 }
Keep it conversational! Discord is a chat platform, not documentation.
| text |)## Headers for casual chat (use bold or CAPS for emphasis)code for technical terms<> to suppress embeds❌ 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?| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 19 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.