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
A concrete shape to start from: the workflow wakes when a message posts in a channel in Discord. The agent gathers the surrounding context, forms a view, and where it is warranted goes on to post channel messages — or to DM members. Nothing is copied blindly, and choosing to take no action is a legitimate outcome recorded in the receipt.
What follows is the whole workflow, not a sketch of it. Discord supplies the event, the agent supplies the reasoning, and the third node does the thing — or deliberately does nothing, which is a recorded outcome rather than a silent one.
{
"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": {},
"description": "Listen for incoming Discord messages in a specified channel and trigger the workflow when a new message is received.",
"error": null,
"isActive": false,
"output": null,
"outputs": {}
},
{
"id": "ed3d7624-87f1-403e-a53b-96a821557eb4",
"text": "Read it and decide",
"x": 512,
"y": 336,
"isEditing": false,
"type": "agnt-agent",
"icon": "agnt",
"category": "action",
"isSelected": false,
"parameters": {
"instructions": "Read the Discord item and decide whether it warrants action. Explain your reasoning."
},
"description": "Judges the Discord item against criteria you wrote in plain language.",
"error": null,
"isActive": false,
"output": null,
"outputs": {}
},
{
"id": "70e17101-de14-4d03-a9f2-c2700f297a36",
"text": "Act in Discord",
"x": 512,
"y": 528,
"isEditing": false,
"type": "discord-api",
"icon": "connect",
"category": "action",
"isSelected": false,
"parameters": {
"action": "SEND_MESSAGE"
},
"description": "Runs SEND_MESSAGE on your behalf.",
"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
}
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.