This guide walks you through setting up Discord as a channel for LettaBot.
LettaBot connects to Discord using a Bot Application with the Gateway API:
- No public URL required (uses WebSocket connection)
- Works behind firewalls
- Real-time bidirectional communication
- A Discord server where you have permission to add bots
- LettaBot installed and configured with at least
LETTA_API_KEY
- Go to https://discord.com/developers/applications
- Click "New Application"
- Enter a name (e.g.,
LettaBot) - Click "Create"
-
In the left sidebar, click "Bot"
-
Click "Reset Token" (or "Add Bot" if this is new)
-
Copy the token - this is your
DISCORD_BOT_TOKENImportant: You can only see this token once. If you lose it, you'll need to reset it.
This is required for the bot to read message content.
- Still in the "Bot" section
- Scroll down to "Privileged Gateway Intents"
- Enable "MESSAGE CONTENT INTENT"
- Click "Save Changes"
- In the left sidebar, go to "OAuth2" → "URL Generator"
- Under "Scopes", select:
bot
- Under "Bot Permissions", select:
Send MessagesRead Message HistoryView Channels
- Copy the generated URL at the bottom
Or use this URL template (replace YOUR_CLIENT_ID):
https://discord.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&permissions=68608&scope=bot
Tip: Your Client ID is in "General Information" or in the URL when viewing your app.
- Open the invite URL from Step 4 in your browser
- Select the server you want to add the bot to
- Click "Authorize"
- Complete the CAPTCHA if prompted
You should see [Bot Name] has joined the server in Discord.
Run the onboarding wizard and select Discord:
lettabot onboardOr add directly to your lettabot.yaml:
channels:
discord:
enabled: true
token: "your-bot-token-here"
dmPolicy: pairing # or 'allowlist' or 'open'lettabot serverYou should see:
Registered channel: Discord
[Discord] Connecting...
[Discord] Bot logged in as YourBot#1234
[Discord] DM policy: pairing
- Go to a text channel in your Discord server
- Type
@YourBot hello! - The bot should respond
- Right-click on the bot in the server member list
- Click "Message"
- Send a message:
Hello! - The bot should respond (may require pairing approval first)
LettaBot supports three DM policies for Discord:
dmPolicy: pairing- New users receive a pairing code
- Approve with:
lettabot pairing approve discord <CODE> - Most secure for personal use
dmPolicy: allowlist
allowedUsers:
- "123456789012345678" # Discord user IDs- Only specified users can interact
- Find user IDs: Enable Developer Mode in Discord settings, then right-click a user → "Copy User ID"
dmPolicy: open- Anyone can message the bot
- Not recommended for personal bots
LettaBot can react to messages using the lettabot-react CLI:
# React to the most recent message
lettabot-react add --emoji ":eyes:"
# React to a specific message
lettabot-react add --emoji ":thumbsup:" --channel discord --chat 123456789 --message 987654321- Make sure LettaBot is running (
lettabot server) - Check for errors in the console
- Verify your bot token is correct
-
Check MESSAGE CONTENT INTENT is enabled:
- Discord Developer Portal → Your App → Bot → Privileged Gateway Intents
- Toggle ON "MESSAGE CONTENT INTENT"
-
Check bot has permissions in the channel:
- Server Settings → Roles → Your Bot's Role
- Or check channel-specific permissions
-
Check pairing status if using pairing mode:
- New users need to be approved via
lettabot pairing list
- New users need to be approved via
The bot hasn't been invited to any servers yet. Use the invite URL from Step 4.
Discord bots can only DM users who:
- Share a server with the bot, OR
- Have previously DM'd the bot
This is a Discord limitation, not a LettaBot issue.
If the bot stops responding temporarily, it may be rate-limited by Discord. Wait a few minutes and try again. Avoid sending many messages in quick succession.
- Bot tokens should be kept secret - never commit them to git
- Use
dmPolicy: pairingorallowlistin production - The bot can only see messages in channels it has access to
- DMs are only visible between the bot and that specific user
Since LettaBot uses a single agent across all channels:
- Messages you send on Discord continue the same conversation as Telegram/Slack
- The agent remembers context from all channels
- You can start a conversation on Telegram and continue it on Discord