install
source · Clone the upstream repo
git clone https://github.com/openclaw/openclaw
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/openclaw "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/discord" ~/.claude/skills/openclaw-openclaw-discord && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/openclaw "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/discord" ~/.openclaw/skills/openclaw-openclaw-discord && rm -rf "$T"
manifest:
skills/discord/SKILL.mdsource content
Discord (Via message
)
messageUse the
message tool. No provider-specific discord tool exposed to the agent.
Musts
- Always:
.channel: "discord" - Respect gating:
(some default off:channels.discord.actions.*
,roles
,moderation
,presence
).channels - Prefer explicit ids:
,guildId
,channelId
,messageId
.userId - Multi-account: optional
.accountId
Guidelines
- Avoid Markdown tables in outbound Discord messages.
- Mention users as
.<@USER_ID> - Prefer Discord components v2 (
) for rich UI; use legacycomponents
only when you must.embeds
Targets
- Send-like actions:
orto: "channel:<id>"
.to: "user:<id>" - Message-specific actions:
(orchannelId: "<id>"
) +to
.messageId: "<id>"
Common Actions (Examples)
Send message:
{ "action": "send", "channel": "discord", "to": "channel:123", "message": "hello", "silent": true }
Send with media:
{ "action": "send", "channel": "discord", "to": "channel:123", "message": "see attachment", "media": "file:///tmp/example.png" }
- Optional
to suppress Discord notifications.silent: true
Send with components v2 (recommended for rich UI):
{ "action": "send", "channel": "discord", "to": "channel:123", "message": "Status update", "components": "[Carbon v2 components]" }
expects Carbon component instances (Container, TextDisplay, etc.) from JS/TS integrations.components- Do not combine
withcomponents
(Discord rejects v2 + embeds).embeds
Legacy embeds (not recommended):
{ "action": "send", "channel": "discord", "to": "channel:123", "message": "Status update", "embeds": [{ "title": "Legacy", "description": "Embeds are legacy." }] }
are ignored when components v2 are present.embeds
React:
{ "action": "react", "channel": "discord", "channelId": "123", "messageId": "456", "emoji": "✅" }
Read:
{ "action": "read", "channel": "discord", "to": "channel:123", "limit": 20 }
Edit / delete:
{ "action": "edit", "channel": "discord", "channelId": "123", "messageId": "456", "message": "fixed typo" }
{ "action": "delete", "channel": "discord", "channelId": "123", "messageId": "456" }
Poll:
{ "action": "poll", "channel": "discord", "to": "channel:123", "pollQuestion": "Lunch?", "pollOption": ["Pizza", "Sushi", "Salad"], "pollMulti": false, "pollDurationHours": 24 }
Pins:
{ "action": "pin", "channel": "discord", "channelId": "123", "messageId": "456" }
Threads:
{ "action": "thread-create", "channel": "discord", "channelId": "123", "messageId": "456", "threadName": "bug triage" }
Search:
{ "action": "search", "channel": "discord", "guildId": "999", "query": "release notes", "channelIds": ["123", "456"], "limit": 10 }
Presence (often gated):
{ "action": "set-presence", "channel": "discord", "activityType": "playing", "activityName": "with fire", "status": "online" }
Writing Style (Discord)
- Short, conversational, low ceremony.
- No markdown tables.
- Mention users as
.<@USER_ID>