Discord Trigger

input.discord Input v0.1.0

Starts the workflow when a Discord message arrives — via the Gateway WebSocket (real-time messages) or an interactions endpoint (slash commands). Normalizes each event to a flat { content, authorId, authorName, channelId, guildId, … } shape.

Finding it in the library

Search the builder's node library for Discord Trigger (it lives under Input). A single click opens the in-editor docs panel shown here — description, ports, and every property, without leaving the canvas. Double-click (or drag) to add it to the workflow.

Library capture pending — regenerate with npm run shots:nodes.

Wired up in the builder

Discord Trigger in a real, runnable flow — captured live from the Studio editor, exactly as it looks on your canvas. This is the same workflow used for the example input & output below.

Canvas capture pending — regenerate with npm run shots:nodes.

How it’s configured

The node’s Configure panel as it opens in the builder when you select the step — every setting laid out with real values. Click any field to edit it.

Config capture pending — regenerate with npm run shots:nodes. See the full property reference below.

Ports

This is a trigger — it starts runs and takes no input wire.

Ports are the node’s contract with its neighbours. In the editor a port label renders bold when wired and italic when optional; ports accept attachment carriers rather than data wires.

DirectionPortLabelWhat flows through it
OutputoutputMessage

How data flows through it

As a trigger, Discord Trigger starts runs — it takes no input wire. What it emits is the request wrapper: the event’s body becomes the payload, and the wrapper carries the event metadata around it (for an HTTP-style trigger that’s headers.*, request.method, request.path and query). Downstream nodes consume the content — the wrapper is unwrapped at each node boundary, and expression roots like {{ headers.x }} still resolve against the wrapper when you need the metadata. See Runs & run data for the envelope model.

Expressions in the config

String-typed properties accept {{ }} expressions evaluated against the incoming item at run time — e.g. {{ $json.customer.email }}. On this node that’s token, publicKey, path, baseUrl. JSON- and code-typed fields never interpolate — they are passed through literally.

Build it with AI

Every node in this reference is reachable through Flowdrome’s AI Copilot and the MCP tools — say what you want, and the graph surgery happens server-side. Node types resolve fuzzily, so the catalog label (Discord Trigger) works as well as the exact type id (input.discord).

In the Copilot panel (or any connected AI):

create a workflow that starts with discord trigger and logs the result

As a step in a create_chain_workflow call:

{"type":"Discord Trigger","config":{}}
Raw MCP call — add this node to a workflow with add_node
curl -s -X POST http://localhost:48170/mcp -H "content-type: application/json" -d '{ "jsonrpc": "2.0", "id": "1", "method": "tools/call", "params": { "name": "add_node", "arguments": { "workflowId": "<id>", "type": "Discord Trigger" } } }'

Example input & output

Captured from a real test run of the workflow above — this is what you see in the run data panel after pressing Test workflow.

Input — what the node received

{
  "t": "MESSAGE_CREATE",
  "d": {
    "id": "m",
    "content": "hi disc",
    "channel_id": "C1",
    "author": {
      "id": "U1",
      "username": "ada"
    }
  }
}

Output — what the node produced

{
  "content": "hi disc",
  "authorId": "U1",
  "authorName": "ada",
  "channelId": "C1",
  "guildId": "",
  "messageId": "m",
  "isBot": false,
  "message": {
    "id": "m",
    "content": "hi disc",
    "channel_id": "C1",
    "author": {
      "id": "U1",
      "username": "ada"
    }
  }
}

Property reference

Every setting, with its type and default — the same fields shown configured in the panel above.

PropertyTypeDefaultDescription
Credential
credentialId
credential "" Use a stored credential for this connection — its fields are filled in at run start. Pick "None" to enter the connection details manually.
accepts credential templates: discord
Bot token
token
string "" Discord bot token — use ${credential.discord.botToken}. Gateway mode IDENTIFYs with it.
Mode
mode
select "gateway" Gateway opens a WebSocket for real-time messages; Interactions serves an Ed25519-verified HTTP endpoint for slash commands.
gatewayinteractions
Intents
intents
multiselect ["GUILD_MESSAGES","MESSAGE_CONTENT"] Gateway intents to subscribe to. Receiving message text needs GUILD_MESSAGES + MESSAGE_CONTENT.
DIRECT_MESSAGESGUILD_MESSAGESGUILDSMESSAGE_CONTENT
Shown when (mode ?? "gateway") === "gateway"
Public key
publicKey
string "" Discord application public key (Ed25519) — verifies interaction signatures (interactions mode).
Shown when mode === "interactions"
Interactions path
path
string "/discord/interactions" The local route Discord POSTs interactions to.
Shown when mode === "interactions"
Ignore bots
ignoreBots
boolean true Skip messages produced by bots (author.bot) so the bot doesn't answer itself.
Max body (bytes)
maxBodyBytes
int 1048576 Largest request body this trigger accepts — bigger requests are rejected with 413 before the workflow runs. 0 = unlimited at the trigger (the app-wide FLOWDROME_MAX_BODY_BYTES ceiling, default 32 MB, still applies).
Shown when mode === "interactions"
Rate limit (req/s)
rateLimitRps
double 0 Per-client-IP sustained request rate for this trigger. 0 = no rate limit (the default). For internet-exposed apps, prefer rate limiting at a fronting reverse proxy (docs/ingress-guards-design.md).
Shown when mode === "interactions"
Rate limit burst
rateLimitBurst
int 0 How many requests a client may send back-to-back before the per-second rate applies. 0 = automatic (2× the rate).
Shown when (showIf === undefined || showIf(c)) && Number(rateLimitRps ?? 0) > 0
Base URL
baseUrl
string "https://discord.com" Discord API base URL (override for testing).
Timeout (ms)
timeoutMs
int 15000 Abort each Gateway/API management call after this many milliseconds.

Related nodes

The rest of the Input group — the same folder you’d scan in the editor’s library.

This page is generated from the node registry by gen-node-docs.mjs on every site build — ports, properties, defaults and visibility rules cannot drift from the code. The screenshots and example data are captured from a live Flowdrome by npm run shots:nodes and npm run gen:examples.