Denly

Connect Discord to coding agents

Want to launch a coding agent from Discord? Denly does that: a slash command turns a request into an agent task that plans, builds, and opens a pull request, replying in the channel.

Discord

Create tasks from Discord slash commands and route them by Discord user ID.

1. Create a Discord application

In the Discord Developer Portal create an application and collect three values:

  • Application ID and Public Key – both on General Information.
  • Bot token – on the Bot tab (Reset Token shows it once). It is only used to register the command in step 2; Denly never stores it.

Then invite the application to the target server with an OAuth2 URL that carries the applications.commands scope:

https://discord.com/oauth2/authorize?client_id=<APPLICATION_ID>&scope=applications.commands

2. Register the slash command

Unlike Slack, the Developer Portal has no screen for slash commands – they are registered against the Discord API with the bot token. Register /denly for one server (appears instantly; best while testing):

curl -X POST "https://discord.com/api/v10/applications/<APPLICATION_ID>/guilds/<SERVER_ID>/commands" \
  -H "Authorization: Bot <BOT_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"name":"denly","description":"Send a task to the Denly agent","options":[{"type":3,"name":"task","description":"What should the agent do?","required":true}]}'

Two details are load-bearing: the option must be named task (or text) – that is the field Denly reads the request from – and the command name must match the command alias you enter on the connection in step 3. For all servers at once, drop /guilds/<SERVER_ID> from the URL; global commands can take up to an hour to appear. Read Discord application commands.

3. Create the Denly connection

Open Workspace → Integrations → Connect → Discord. Use the server/channel ID, the application Public Key from step 1 (Discord signs every request with Ed25519 against it – Denly holds no Discord secret), a channel webhook URL for outbound notification cards (Channel settings → Integrations → Webhooks), the command alias (/denly – must match the name registered in step 2), and the channel/project mapping.

Routing is optional. Leave Default Denly assignee blank for unassigned tasks, or choose one workspace member to own everything from this connection.

For per-person routing use Route by external assignee: each row pairs one person in the provider (left) with a workspace member (right), and + adds another row. Routing follows the item's assignee in the provider, not whoever created it, and a matching row beats the default above.

The left-hand value must be the identifier the provider actually sends, which the field's placeholder names for you. Matching ignores surrounding spaces and letter case, but nothing else: a near-miss routes nothing and looks the same as a broken integration.

Map keys are Discord user IDs – the numeric ID from right-click → Copy User ID (Developer Mode), belonging to whoever runs the command.

Save, then copy the generated Webhook URL for the next step. The inbound secret Denly generates alongside it is unused for Discord – every request is verified against the Public Key instead – so you can ignore it.

4. Configure interactions

  1. Open the Discord application’s General Information → Interactions Endpoint URL.
  2. Paste Denly’s generated URL.
  3. Discord sends a signed type-1 PING; Denly answers it, and Discord accepts the endpoint. If Discord rejects it, the Public Key on the connection does not match the application.
  4. Save.

Read Discord interactions.

5. Test and troubleshoot

In a mapped channel run /denly task: fix the failing test. Processed creates the task and answers with an ephemeral acknowledgement; Skipped means the command name, channel or project mapping did not match. An empty list means the Public Key does not match the application. If Discord shows “the application did not respond”, the interactions endpoint is not reachable or not saved. Discord reactions are not supported – reactions arrive only over a persistent gateway connection, which Denly deliberately does not hold; commands are the supported path.

See also

All integrations and providers → · Connect Mattermost to coding agents · Connect Telegram to coding agents · Full documentation