per my agent's suggested description: Bot sees slash commands (INTERACTION_CREATE events) but plain guild messages are silently dropped — no log entry at all. Message Content Intent is enabled in Developer Portal, requireMention: false, groupPolicy: open. Log always shows 'Discord Message Content Intent is limited' on startup.
#OpenClaw agent not able to see discord messages
1 messages · Page 1 of 1 (latest)
That symptom set (INTERACTION_CREATE works, but no MESSAGE_CREATE ever hits your logs) almost always comes down to one of these three things:
- OpenClaw is still effectively in
groupPolicy: "allowlist"mode (so it drops guild messages before they reach the agent) - Discord is not actually granting Message Content intent (so OpenClaw won’t see normal message text; depending on your mention gating it can look like “nothing arrives”)
- The bot can’t “View Channel” in the channel you’re testing (channel overrides)
A tight way to disambiguate is:
1) Run a probe that tells us what Discord + OpenClaw think is true
On the gateway host:
openclaw --version
openclaw channels status --probe
Paste the Discord section output (it should explicitly call out things like “Message Content Intent is disabled” and also list any channels with missing permissions).
Docs: https://docs.openclaw.ai/channels/troubleshooting#discord and https://docs.openclaw.ai/channels/discord#troubleshooting
2) Double-check you’re not hitting the “env-only token” gotcha
From the docs (this one bites people a lot):
If you only set
DISCORD_BOT_TOKENand do not create achannels.discordblock, runtime fallback isgroupPolicy="allowlist"(even ifchannels.defaults.groupPolicyisopen).
So confirm what OpenClaw is actually running with:
openclaw config get channels.discord --json
(redact the token before pasting)
Docs section: https://docs.openclaw.ai/channels/discord#guild-policy
3) If the log says “Message Content Intent is limited/disabled” even though it’s enabled in the portal
Two common causes:
- Gateway wasn’t restarted after changing intents (Discord intent flags are negotiated at connect time).
- The token you’re running is not the token for the application where you enabled the intent (sounds obvious, but it happens when people have multiple apps/bots).
After confirming the toggle in Developer Portal, do:
openclaw gateway restart
and re-run openclaw channels status --probe.
If you paste the channels status --probe Discord output + your channels.discord config (token redacted), I can tell you which branch you’re in within one message.
- Discord default: enabled, configured, running, connected, in:54m ago, bot:@CleoClawBot, token:config, intents:content=limited, works, audit ok
{
"enabled": true,
"token": "OPENCLAW_REDACTED",
"groupPolicy": "open",
"streaming": "off",
"allowFrom": [
"317510684306964481"
],
"guilds": {
"924743875174735921": {
"requireMention": false,
"users": [
"317510684306964481"
],
"channels": {
"1482825554423185558": {
"allow": true
}
}
}
}
}
Your OpenClaw-side config actually looks sane for routing (you do have a channels.discord block, groupPolicy: "open", and that guild has requireMention: false).
The big red flag is still this part:
startup says
Discord Message Content Intent is limited
When OpenClaw reports content=limited, Discord is not granting full message text for normal guild messages. In that state, it’s totally normal to see slash commands (interactions don’t need message text) while “plain” messages appear to vanish (OpenClaw gets events with no usable content and won’t run the agent).
Quick proof (takes 30 seconds)
-
Run on the gateway host:
openclaw channels status --probeIf you see
intents:content=limited(or warnings about Message Content Intent), that’s the cause. -
Send a message that explicitly mentions the bot in the guild channel.
- If mention-messages start working (or at least start showing up in logs), that confirms Discord is only providing content for mentions/DMs.
What fixes content=limited
This is Discord-side, not OpenClaw-side:
- Re-check Developer Portal → Bot → Privileged Gateway Intents → Message Content Intent is enabled for the same application whose token you’re running.
- Restart the gateway after flipping intents (intent bits are negotiated on connect):
openclaw gateway restart - If your bot is in 100+ servers / is verified, Discord may require an approval request for privileged intents. In that case the toggle can be “on” but the API still effectively treats it as limited until approved.
Workaround if you can’t get full intent approved
Set guild/channel back to mention-only operation (since Discord still provides content for mentions), i.e. requireMention: true for that guild/channel.
If you paste the openclaw channels status --probe Discord section (no secrets in there), I can tell you immediately whether you’re blocked by (a) intent limitation vs (b) channel permission audit issues.
Gateway reachable.
- Discord default: enabled, configured, running, connected, in:1h ago, bot:@CleoClawBot, token:config, intents:content=limited, works, audit ok
Perfect, that channels status line basically closes the case:
intents:content=limited
OpenClaw is reading that straight from Discord’s /oauth2/applications/@me application flags. “Limited” means Discord will deliver MESSAGE_CREATE events, but the message payload fields are emptied for most guild messages (including content, attachments, etc.). The only times you reliably get content in that mode are DMs and messages that mention the bot (and your own bot’s messages).
So with requireMention: false + “plain” messages, OpenClaw receives “empty” messages and effectively has nothing to pass to the agent → it looks like “silently dropped”.
Discord’s own explanation (what fields get blanked + what still works):
https://support-dev.discord.com/hc/en-us/articles/4404772028055-Message-Content-Privileged-Intent-FAQ
What to do next
A) Fast workaround (works immediately):
- Operate mention-only in guilds: set
requireMention: true(at least in the guild/channel you care about), and mention the bot to talk to it. - Or just use slash commands.
B) Real fix (to make requireMention: false viable):
You need Discord to report intents:content=enabled (not limited). That typically requires one of:
- If this is a verified bot in 100+ servers: you must request/obtain Message Content Intent approval in the Developer Portal (toggle alone won’t fully grant it).
- If you don’t need a public/verified bot: create a fresh private bot for your personal server (unverified, <100 servers). That path usually gets full message content without any review.
After any portal change, restart the gateway (intents are negotiated on connect):
openclaw gateway restart
openclaw channels status --probe
If you tell me whether your Discord application is verified and roughly how many servers it’s installed in, I can tell you which of the two “real fix” paths is actually available in the portal UI.
the application is not verified and is only installed on one server
@zealous ravine any follow ups?
Yep — at this point the “why” is pinned down: your gateway is connected and healthy, but Discord is telling us message content is limited for that bot (intents:content=limited). In that mode Discord will often deliver message events with empty content/attachments/etc except for DMs + mentions, so OpenClaw has nothing to hand to the agent for “plain” guild chatter.
The only remaining question is why Discord still reports “limited” even though you flipped the toggle. Two quick follow-ups will decide the path:
- Is this Discord application verified (blue check / went through verification)?
- Roughly how many servers is the bot installed in?
Why I’m asking: per Discord’s policy, verified bots in 100+ servers need privileged intent approval to get full message content; otherwise you stay in the “limited” state even if the toggle is on. (Interactions/slash commands keep working either way.) Reference: https://support-dev.discord.com/hc/en-us/articles/4404772028055-Message-Content-Privileged-Intent-FAQ
Fast sanity check to rule out “wrong app / didn’t save”
Run and paste the JSON (no secrets in it):
openclaw channels status --probe --json
Look for the Discord application.id / application.flags / application.intents. Then confirm the application ID matches the one you’re editing in the Developer Portal, and that you hit Save Changes after enabling the intent.
Workaround if you just want it working today
Use mention-only in the guild (set requireMention: true, or just mention the bot) — Discord still provides message content for mention messages even when content is limited.
If you reply with “verified? yes/no” + “server count approx” (and/or the --json snippet for Discord), I’ll tell you the exact next step (request approval vs. create a fresh private bot vs. portal mismatch).
The discord application is not verified, and it is only installed in one server
{
"ts": 1773618998216,
"channelOrder": [
"discord"
],
"channelLabels": {
"discord": "Discord"
},
"channelDetailLabels": {
"discord": "Discord Bot"
},
"channelSystemImages": {
"discord": "bubble.left.and.bubble.right"
},
"channelMeta": [
{
"id": "discord",
"label": "Discord",
"detailLabel": "Discord Bot",
"systemImage": "bubble.left.and.bubble.right"
}
],
"channels": {
"discord": {
"configured": true,
"running": true,
"lastStartAt": 1773618861757,
"lastStopAt": 1773618861757,
"lastError": null,
"tokenSource": "config",
"probe": {
"ok": true,
"status": null,
"error": null,
"elapsedMs": 1199,
"bot": {
"id": "1482824305724231812",
"username": "CleoClawBot"
},
"application": {
"id": "1482824305724231812",
"flags": 8953856,
"intents": {
"presence": "limited",
"guildMembers": "limited",
"messageContent": "limited"
}
}
},
"lastProbeAt": 1773618999415
}
},
"channelAccounts": {
"discord": [
{
"accountId": "default",
"enabled": true,
"configured": true,
"running": true,
"lastStartAt": 1773618861757,
"lastStopAt": 1773618861757,
"lastError": null,
"probe": {
"ok": true,
"status": null,
"error": null,
"elapsedMs": 1199,
"bot": {
"id": "1482824305724231812",
"username": "CleoClawBot"
},
"application": {
"id": "1482824305724231812",
"flags": 8953856,
"intents": {
"presence": "limited",
"guildMembers": "limited",
"messageContent": "limited"
}
}
},
"lastInboundAt": 1773615544515,
"lastOutboundAt": null,
"tokenSource": "config",
"tokenStatus": "available",
"connected": false,
"reconnectAttempts": 0,
"lastConnectedAt": 1773616162783,
"lastDisconnect": null,
"lastEventAt": 1773618861757,
"application": {
"id": "1482824305724231812",
"flags": 8953856,
"intents": {
"presence": "limited",
"guildMembers": "limited",
"messageContent": "limited"
}
},
"bot": {
"id": "1482824305724231812",
"username": "CleoClawBot"
},
"audit": {
"ok": true,
"checkedChannels": 1,
"unresolvedChannels": 0,
"channels": [
{
"channelId": "1482825554423185558",
"ok": true,
"error": null,
"matchKey": "1482825554423185558",
"matchSource": "id"
}
],
"elapsedMs": 904
},
"lastProbeAt": 1773618999415
}
]
},
"channelDefaultAccountId": {
"discord": "default"
}
}
Good, that JSON is super informative.
1) This is not an OpenClaw config problem — Discord is explicitly flagging your app as “limited”
Your probe is hitting GET /oauth2/applications/@me and getting:
flags: 8953856intents.messageContent: "limited"- and also
presence: "limited",guildMembers: "limited"
So Discord itself is saying: “this app does not have the privileged intents fully enabled; you only get the limited subset (DMs/mentions/own messages).”
That exactly matches: slash commands work, but normal guild messages show up as “empty” and OpenClaw won’t run.
What’s weird (as you noticed): unverified + 1 server should normally be able to have these intents fully enabled. So the next step is to treat this as a Discord-side state/UI mismatch and verify it ruthlessly.
Do this checklist in the Developer Portal for application id 1482824305724231812:
- Go to Bot → Privileged Gateway Intents
- Toggle Message Content Intent OFF → Save Changes
- Toggle it ON → Save Changes
- (Optional but recommended) also toggle Server Members Intent ON and Save
- Wait ~1 minute, then on the gateway:
openclaw gateway restart openclaw channels status --probe --json
You’re looking for messageContent: "enabled" (not limited).
If it still stays limited after a clean OFF→SAVE→ON→SAVE cycle, then Discord is not granting it to this app for some reason (account restriction, legacy verified state despite what the UI says, or Discord-side bug). At that point your only practical paths are:
- operate mention-only / slash-command-only, or
- create a brand new application/bot and try again (often faster than fighting Discord state).
(Discord’s “limited” semantics are exactly this: message objects arrive but content/attachments/embeds are blank except DMs/mentions/own messages: https://support-dev.discord.com/hc/en-us/articles/4404772028055-Message-Content-Privileged-Intent-FAQ)
2) Separate issue: your channel snapshot shows you’re currently not connected
In the JSON you pasted, under the running account:
"connected": falselastConnectedAtis oldlastEventAtequals the start time
If you’re not connected to the Discord gateway, you won’t see any events (messages or interactions). So if you still believe you’re seeing INTERACTION_CREATE, that may have been earlier.
Can you paste the last ~50 lines of Discord/gateway logs around the disconnect/reconnect?
openclaw logs --follow
(or if you already have a log snippet with a close code / reason, paste that)