AI agents for Discord
Community chat with an automation-friendly API. AGNT connects to Discord so agents can read what happens there, reason about it, and act — with a receipt for every run.
Support First Responder is a ready-made agent that works in Discord — free, and it runs on your machine.
Discord and AGNT, in brief
| What it does | Lets an AGNT agent read from and act in Discord. |
|---|---|
| Connects with | An API key held in the local vault |
| AGNT node | discord-api, receive-discord-message |
| Runs when | A message posts in a channel |
| Typical build time | Two minutes |
| Where data goes | Nowhere by default — AGNT runs on your machine and credentials never leave it. |
What you can automate
Reacts when…
- a message posts in a channel
- a member joins
- a keyword appears
Agents can…
- post channel messages
- DM members
- publish digests
Teams use it for
- community questions answered from your docs
- daily digests of what mattered
- signals routed to the team
Build it: the Discord workflow
Design goal for Discord: community questions answered from your docs; daily digests of what mattered; signals routed to the team. The template below supplies configurable nodes, not the complete logic for those goals.
Use this Discord setup template to arrange the schedule, input review and API operation. Configure the account-specific fields and add your own decision and approval controls before activation.
This is a schema-checked starting point, not an end-to-end tested automation. Replace every CONFIGURE_ value, choose the operations you intend, connect credentials and map source outputs into later inputs. An edge orders steps; it does not supply a condition, an approval gate or a field mapping. Add and test those controls explicitly before any write. Cloud APIs and model providers may receive data. Keep the workflow inactive until tested with fixtures.
{
"id": "a18a5a5e-1a0f-40e0-ad9e-c28a0e7d3670",
"name": "Discord — read, decide, act",
"nodes": [
{
"id": "562bf3dc-c91a-4989-a998-80c776ad0896",
"text": "Watch Discord for activity",
"x": 512,
"y": 144,
"isEditing": false,
"type": "receive-discord-message",
"icon": "clock",
"category": "trigger",
"isSelected": false,
"parameters": {
"channelId": "CONFIGURE_CHANNELID"
},
"description": "Setup template for Receive Discord Message. Listen for incoming Discord messages in a specified channel and trigger the workflow when a new message is received. Configure credentials, inputs and output mapping before use.",
"error": null,
"isActive": false,
"output": null,
"outputs": {}
},
{
"id": "ed3d7624-87f1-403e-a53b-96a821557eb4",
"text": "Review source and draft",
"x": 512,
"y": 336,
"isEditing": false,
"type": "agnt-agent",
"icon": "agnt",
"category": "action",
"isSelected": false,
"parameters": {
"agentId": "CONFIGURE_AGENTID",
"message": "Read the Discord item and decide whether it warrants action. Explain your reasoning.\nSource input: CONFIGURE_SOURCE_INPUT. Produce a reviewable draft only; do not take external actions."
},
"description": "Setup template for Agent Chat. Chat with an AI agent from your agent library. Select an agent and send messages to interact with it within your workflow. Configure credentials, inputs and output mapping before use.",
"error": null,
"isActive": false,
"output": null,
"outputs": {}
},
{
"id": "70e17101-de14-4d03-a9f2-c2700f297a36",
"text": "Configure destination in Discord",
"x": 512,
"y": 528,
"isEditing": false,
"type": "discord-api",
"icon": "connect",
"category": "action",
"isSelected": false,
"parameters": {
"action": "SEND_MESSAGE",
"recipientType": "channel",
"channelId": "CONFIGURE_CHANNELID",
"message": "CONFIGURE_MESSAGE",
"autoSplit": false,
"splitLimit": 1,
"splitDelayMs": 1,
"numberChunks": false
},
"description": "Setup template for Discord API. Interact with Discord to perform various operations such as sending messages, managing roles, and uploading files. Long messages are automatically split into multiple chunks (Discord caps a single message at 2000 characters); splitting is code-block aware and emoji-safe. Configure credentials, inputs and output mapping before use.",
"error": null,
"isActive": false,
"output": null,
"outputs": {}
}
],
"edges": [
{
"id": "0491de8a-0785-4f14-aebf-564aafc77574",
"start": {
"id": "562bf3dc-c91a-4989-a998-80c776ad0896",
"type": "output"
},
"end": {
"id": "ed3d7624-87f1-403e-a53b-96a821557eb4",
"type": "input"
},
"startX": 800,
"startY": 168,
"endX": 512,
"endY": 360
},
{
"id": "73989002-3b2d-4b03-a0e7-03396470befe",
"start": {
"id": "ed3d7624-87f1-403e-a53b-96a821557eb4",
"type": "output"
},
"end": {
"id": "70e17101-de14-4d03-a9f2-c2700f297a36",
"type": "input"
},
"startX": 800,
"startY": 360,
"endX": 512,
"endY": 552
}
],
"zoomLevel": 1,
"canvasOffsetX": 0,
"canvasOffsetY": 0,
"isTinyNodeMode": false
}
Configure Receive Discord Message
Listen for incoming Discord messages in a specified channel and trigger the workflow when a new message is received.
- channelId — The ID of the Discord channel to monitor Current example:
CONFIGURE_CHANNELID.
Configure Discord API
Interact with Discord to perform various operations such as sending messages, managing roles, and uploading files. Long messages are automatically split into multiple chunks (Discord caps a single message at 2000 characters); splitting is code-block aware and emoji-safe.
- action — The action to perform on Discord. RESOLVE_USER = look up a user by username or ID. TEST_DM = 5-stage diagnostic that verifies the bot can DM a user. ORCHESTRATOR_CHAT = bridge a message into AGNT's full orchestrator (the same engine that powers the main Annie chat) and return the reply + any generated image refs; conversationId (or channelId) keys persistent memory. DELETE_MESSAGE = delete the bot's OWN message(s) — one by messageId, or purge all/recent bot messages from a DM or channel (deleteMode='purgeMine'/'purgeRecent'). In a DM the bot can only delete its own messages (Discord platform rule). Only use this when you actually intend to delete something: mode='single' with no messageId is a safe no-op (deletes nothing). Current example:
SEND_MESSAGE. - recipientType — Where the action targets. 'channel' = guild text channel (uses channelId). 'user' = direct message to a Discord user (uses userId; bot must share at least one guild with the user). Applies to SEND_MESSAGE, UPLOAD_FILE, and DELETE_MESSAGE. Current example:
channel. - channelId — The ID of the Discord channel (for SEND_MESSAGE, UPLOAD_FILE, and DELETE_MESSAGE when recipientType='channel'). When recipientType='user' this field is ignored (use userId instead). Current example:
CONFIGURE_CHANNELID. - message — The message text. For SEND_MESSAGE: the Discord message to send (auto-split if over the 2000-char limit unless autoSplit is disabled). For UPLOAD_FILE: optional caption sent with the attachment. For ORCHESTRATOR_CHAT: the prompt sent to Annie's full orchestrator. Current example:
CONFIGURE_MESSAGE. - autoSplit — Automatically split messages that exceed the character limit into multiple sequential messages (for SEND_MESSAGE action). Splitting avoids breaking words, preserves fenced code blocks, and never slices emoji. Default: true. Set false to send as-is (Discord will reject content over 2000 chars). Current example:
false. - splitLimit — Maximum characters per message chunk when autoSplit is on (for SEND_MESSAGE action). Capped at Discord's 2000-char hard limit. Lower it for a safety margin. Default: 2000. Current example:
1. - splitDelayMs — Delay in milliseconds between sequential chunks when a message is split (for SEND_MESSAGE action). Keeps chunks in order and avoids Discord rate limits. Default: 350. Set 0 for no delay. Current example:
1. - numberChunks — Append a (n/N) counter to the end of each chunk when a message is split (for SEND_MESSAGE action). Default: false. Current example:
false.
Install Support First Responder — it runs on Discord
Support First Responder is a working agent that uses Discord. Installing it drops the whole workflow onto your canvas — connected, editable, and yours to change.
Runs on your own machine · See what it does
Community questions are mostly documented already
Most questions in a community server have an answer somewhere in your docs. An agent that answers from that documentation with the source linked reduces load without inventing anything, and escalates the questions that genuinely are new.
Digests instead of scrollback
A busy server is impossible to read and easy to miss things in. A daily digest of what actually mattered — recurring problems, notable feedback, unanswered questions — turns a firehose into something a team can act on.
What the Discord node actually exposes
Interact with Discord to perform various operations such as sending messages, managing roles, and uploading files. Long messages are automatically split into multiple chunks (Discord caps a single message at 2000 characters); splitting is code-block aware and emoji-safe.
What it can do: SEND_MESSAGE ASSIGN_ROLE GET_MEMBERS UPLOAD_FILE BAN_MEMBER RESOLVE_USER TEST_DM ORCHESTRATOR_CHAT DELETE_MESSAGE
Full Discord API parameter reference
| Parameter | Type | What it does |
|---|---|---|
actionrequired |
string | The action to perform on Discord. RESOLVE_USER = look up a user by username or ID. TEST_DM = 5-stage diagnostic that verifies the bot can DM a user. ORCHESTRATOR_CHAT = bridge a message into AGNT's full orchestrator (the same engine that powers the main Annie chat) and return the reply + any generated image refs; conversationId (or channelId) keys persistent memory. DELETE_MESSAGE = delete the bot's OWN message(s) — one by messageId, or purge all/recent bot messages from a DM or channel (deleteMode='purgeMine'/'purgeRecent'). In a DM the bot can only delete its own messages (Discord platform rule). Only use this when you actually intend to delete something: mode='single' with no messageId is a safe no-op (deletes nothing). SEND_MESSAGE · ASSIGN_ROLE · GET_MEMBERS · UPLOAD_FILE · BAN_MEMBER · RESOLVE_USER · TEST_DM · ORCHESTRATOR_CHAT |
conversationId |
string | Stable conversation key for ORCHESTRATOR_CHAT memory. Same ID across calls = same persistent conversation. If omitted, derived from channelId (discord-dm-<channelId>) or userId. This is what gives the Discord bridge full conversation memory. only when action is ORCHESTRATOR_CHAT |
orchestratorModel |
string | Optional model override for ORCHESTRATOR_CHAT (e.g. 'claude-sonnet-4-5'). If omitted, uses the user's default provider/model. only when action is ORCHESTRATOR_CHAT |
enabledTools |
string | Strict tool whitelist for ORCHESTRATOR_CHAT turns (comma-separated tool names). Default: a lean DM set (discord_api, generate_image, analyze_image, web_search, web_scrape, file_operations, execute_javascript_code, execute_shell_command, atlas_image, atlas_video, atlas_upload, text_to_speech). Pass 'all' to disable filtering and send the full tool surface. Fewer tools = far fewer tokens per turn and fits small-context models like Grok (128k). only when action is ORCHESTRATOR_CHAT |
resolveMode |
string | How to look up the user (RESOLVE_USER action). 'byQuery' searches a guild's member list by username/display name/nickname (needs guildId + userQuery). 'byId' validates a known user ID (needs userId). byQuery · byId only when action is RESOLVE_USER |
userQuery |
string | The username, global display name, or nickname to search for (RESOLVE_USER with resolveMode='byQuery'). Case-insensitive substring match by default; set exactMatch=true for exact match. only when resolveMode is byQuery |
guildId |
string | The ID of the Discord guild (server) (for ASSIGN_ROLE and GET_MEMBERS actions) only when action is ASSIGN_ROLE or GET_MEMBERS or BAN_MEMBER |
exactMatch |
boolean | Require exact match of username / display name / nickname (RESOLVE_USER with resolveMode='byQuery'). Default: false (case-insensitive substring match). only when resolveMode is byQuery |
dryRun |
boolean | Run all TEST_DM checks WITHOUT actually sending a message. All stages up to messageSend will run, but the final send is skipped. Perfect for first-time setup verification without spamming DMs. Default: false. only when action is TEST_DM |
recipientType |
string | Where the action targets. 'channel' = guild text channel (uses channelId). 'user' = direct message to a Discord user (uses userId; bot must share at least one guild with the user). Applies to SEND_MESSAGE, UPLOAD_FILE, and DELETE_MESSAGE. channel · user only when action is SEND_MESSAGE or UPLOAD_FILE or DELETE_MESSAGE |
deleteMode |
string | DELETE_MESSAGE mode. 'single' = delete one message by messageId. 'purgeMine' = delete EVERY message the bot authored in this DM/channel (up to scanLimit). 'purgeRecent' = delete the bot's last N authored messages (set count). In a DM only the bot's own messages can be deleted. single · purgeMine · purgeRecent only when action is DELETE_MESSAGE |
messageId |
string | The ID of the message to delete (DELETE_MESSAGE with deleteMode='single'). Enable Developer Mode -> right-click the message -> Copy Message ID. only when deleteMode is single |
27 further parameters are available on the node itself.
Every parameter above is read from the shipped discord-api node, so it cannot drift from the product.
Connect Discord in two minutes
- Download AGNT Community Core — free, local-first, no account needed to run.
- Connect by pasting an API key into AGNT’s vault — stored encrypted on your machine, never uploaded.
- Drop the Discord node into a workflow or hand it to an agent — the first run produces a receipt you can read line by line.
Discord + AGNT — common questions
Can an agent answer in a Discord channel?
Yes, grounded in your documentation with the source linked, and escalating when the docs do not cover it.
How does AGNT connect to Discord?
With a bot token held encrypted in the local vault.
Can it summarise activity?
Yes — scheduled digests of what mattered are a common use.