Skip to content

Releases

v1.4.0: profiles, rich messages, events, emoji

Choose a tag to compare

@codependentai codependentai released this 24 Oct 13:35

Sixteen new tools, a fix that matters if you're on the Workers free plan, and rich messages that can be read back.

New tools

  • Profiles: discord_get_my_profile, discord_set_my_profile (server-only nickname, avatar, banner, bio) and discord_set_my_global_profile (username, avatar, banner). They act on the calling bot only.
  • Rich messages (Components V2): discord_send_rich_message and discord_edit_rich_message. Build from simple blocks (text, separator, gallery, section, link buttons), optionally inside an accent-coloured container.
  • Scheduled events: list, create (stage, voice or external), edit, delete, and see who's interested.
  • Emoji and stickers: guild emoji and the application's own emoji, plus guild stickers. List, create and delete.

Fixes

  • GET on the MCP endpoint now returns 405 (#13). Answering 200 made MCP clients reconnect about once a second, which on one deployment came to roughly 275k requests a day and can exhaust the free Workers quota. Thanks to @Devinvox for the report and the fix.
  • Rich messages are readable: read_messages, the server pulse and the event queue now pull the text out of Components V2 messages instead of showing them as empty.
  • Event queue: tells the agent what the bot cap held back. This shipped in package.json as 1.3.2 but was never released on its own.

Notes

  • The new tools need Create/Manage Events, Create/Manage Expressions and Change Nickname where you use them (see the README).
  • Tested live by Simon: profile read, rich post and edit, the text limit, event create and delete, and the emoji and sticker lists. Profile writes and emoji or sticker creation were checked only against mocks.
  • A "Release 1.4.0" commit appears earlier in the history and was reverted before publishing. This is the first published 1.4.0.

Drop-in over v1.3.1.

v1.3.1: honest pulse labels

Choose a tag to compare

@codependentai codependentai released this 05 Oct 07:04

One fix, by Fable: discord_server_pulse now says plainly that who-talked-to-whom counts only Discord replies and @-mentions. An answer that just uses someone's name isn't seen, so the old "no reply back" read as "unanswered" when it wasn't. Labels only; drop-in over v1.3.0.

v1.3.0: event queue

Choose a tag to compare

@codependentai codependentai released this 04 Oct 18:19

New, by Fable, designed with Ghost: an event queue that lets an agent's own running session wake when someone talks to it on Discord. Pull, not push: nothing reaches into the agent's machine.

  • Once a minute, a cron reads one configured server with each agent's own token and queues, per agent: @-mentions (of its user or its bot role), replies to its messages, and @everyone/@here.
  • The agent's session polls GET <its MCP URL>/events?after=<seq>. Its existing secret is the auth.
  • Guards: no backfill; never an agent's own messages; bots can wake a given agent at most 3 times per channel per hour; @everyone from a bot never wakes anyone; excluded channels; 7-day retention.
  • Each tick logs one line per agent, so a silent no-op shows up in npm run tail.
  • The README now has a plain-words explainer for people in the server, troubleshooting rows, and a small tested polling client.

Also: the server instructions tell a woken agent to answer with reply_to, and to answer @everyone only if it has something real.

Off unless configured (EVENTS_DB D1 binding + EVENTS_GUILD_ID + a cron trigger). Without them, nothing changes. Drop-in over v1.2.1.

v1.2.1: the real version number

Choose a tag to compare

@codependentai codependentai released this 03 Oct 18:56

One fix, by Fable: the server now tells MCP clients its real version. serverInfo.version was hard-coded as 1.0.0 from the first release onwards; it now comes from package.json, so it moves with every release.

No config changes. Drop-in over v1.2.0.

v1.2.0: server pulse

Choose a tag to compare

@codependentai codependentai released this 03 Oct 18:48

One new tool, by Fable: discord_server_pulse. discord_catch_up gives an agent the messages; this gives it the shape of a server over a time window.

  • Who's been around: messages per person, their channels, and their last message.
  • Who talked to whom: replies and mentions, marked when nobody replied back.
  • Open loops: people who were addressed and haven't spoken in that channel since.
  • Said to the room, no reply yet: messages to everyone that nobody has answered after quiet_hours (default 2). People are listed before bots.
  • Mood (optional, mood: true): a short reading of the mood and what people are working on, from a Workers AI model and labelled as a reading. It runs on Cloudflare's free daily allowance; a full-size reading measured about 30 neurons out of 10,000.

New, all optional: the [ai] binding = "AI" binding (only for mood), PULSE_MODEL, and PULSE_EXCLUDE_CHANNELS (channels a pulse never reads, e.g. sign-ups or moderation). Agents can also pass exclude_channels per call.

No breaking changes. Drop-in over v1.1.1. Without the AI binding, everything except mood works, and mood says why it's missing.

v1.1.1: mp3 fallback, indentation kept

Choose a tag to compare

@codependentai codependentai released this 03 Oct 11:45

Two follow-ups from the v1.1.0 review, by Fable:

  • Voice notes fall back to mp3 if ElevenLabs refuses Opus on your plan or voice. The result says so, and if both fail, the error names both attempts.
  • Long messages keep their indentation when split. Only the break at the cut is dropped, so code blocks split across messages rejoin identically.

No config changes. Drop-in over v1.1.0.

v1.1.0: catch-up, search, native voice, multi-agent

Choose a tag to compare

@codependentai codependentai released this 03 Oct 11:00

Four rounds of work by Fable, reviewed before merge. Existing clients keep working with no change: same /mcp/<secret> URL, same environment variable names, no tool renamed, no new required arguments.

New

  • Six new tools (59 → 65): catch_up, search_messages, send_typing, end_poll, get_poll_voters, forward_message.
  • Native voice messages. discord_send_voice_note now posts a real Discord voice bubble. Pass as_voice_message: false for the old mp3 attachment.
  • Several agents on one deployment, each with its own bot token and secret path, through an optional AGENTS setting. Single-bot setups are unchanged and become the default agent.
  • 2025–26 Discord API updates, including the new pins endpoints.
  • Tool annotations (read-only / destructive) and server instructions for agents.

Fixed

  • Audit-log reasons are now actually sent; they were being dropped.
  • Large images no longer overflow the stack, and image tools return real MCP image content.
  • Retries rebuild multipart bodies instead of resending a consumed one.
  • Non-JSON 5xx responses no longer crash a call.
  • Forum pinned keeps the channel's other flags, and require_tag no longer silently does nothing.
  • Custom-emoji reactions (<:name:id>) work.

Safer

  • Auth fails closed if the secret is unset or still CHANGE_ME. Secret paths must match exactly; the old prefix match is gone.
  • Secrets are compared in constant time.
  • Role, @everyone and @here mentions no longer ping unless allow_mass_mentions: true.
  • Messages over 2000 characters are split instead of failing.
  • MCP protocol negotiation: 2025-06-18, 2025-03-26, 2024-11-05, plus ping.

Upgrading

  • Keep your secret a Cloudflare secret. wrangler.toml still ships MCP_SECRET_PATH = "CHANGE_ME" under [vars]. If your live secret was set as a plain var, deploying this toml overwrites it, and the new fail-closed check then returns 404 for every call. Run wrangler secret put MCP_SECRET_PATH (and the same for DISCORD_PUBLIC_KEY if you use interactions), and remove those [vars] lines before you deploy.
  • read_messages output now includes message IDs and display names, so update anything that parses its text.
  • Voice messages ask ElevenLabs for opus_48000_32. Send one test voice note after upgrading.

Built by Fable, reviewed and released by Simon, for Nekyia Labs.