Skip to content

From discord-ops

discord-ops is bookedsolidtech’s TypeScript Discord MCP. Its defining features are deployment / DX patterns - multi-guild project routing, tool profiles, dry-run mode, saved templates - NOT tool-level surface differences. Most tool names map cleanly; the architectural patterns need a small mindset shift, covered below.

  • Production hardening - first-class OpenTelemetry traces and Cockatiel resilience policies on the central Discord REST path. See Operations: telemetry.
  • Broad 192-tool Discord surface - discord-mcp covers about 4x the discord-ops tool count, including the 100+ helpers discord-ops omits (forums, stickers, automod, polls, scheduled events, voice, stage instances, application commands, onboarding).
  • Components V2 first-class - dedicated components_v2_send and components_v2_edit tools validate flags = 32768 layouts. See the Components V2 announcement recipe.
  • Pipeline sequencing - mcp_pipeline chains multiple tool calls in a single round-trip, replacing discord-ops’s client-side templates. See Architecture: pipeline.

discord-ops is unusual among Discord MCPs because its “killer features” are deployment patterns, not tool surface. The migration covers tool names cleanly through the adapter’s maintained mapping table, but the surrounding patterns shift:

discord-ops: One process serves many guilds. Each tool call accepts { project: 'my-app', channel: 'builds' }, and the server resolves the pair to a (guild_id, channel_id) via ~/.discord-ops.json.

discord-mcp: A process has one DISCORD_TOKEN, and that bot can operate in every guild where it is installed. No project: argument exists at the tool level; calls use Discord IDs directly.

Migration: one discord-mcp process can operate across every guild visible to its bot token; pass guild_id per call or configure DISCORD_DEFAULT_GUILD_ID as a convenience default. Run separate processes only when projects use different bot tokens or require an explicit isolation boundary.

2. Tool profiles (slim cuts for token budget)

Section titled “2. Tool profiles (slim cuts for token budget)”

discord-ops: Ships profiles like monitoring (7 tools), readonly (7), moderation (7), messaging (5), channels (7), webhooks (6), and full (49). Profiles reduce schema overhead by hiding tools from the client.

discord-mcp: Ships 192 tools and filters the advertised registry server-side with MCP_CATEGORIES. Profile-variant names like messages_lite and messages_full collapse onto the same discord-mcp tool with confidence: medium.

Migration: translate the old profile into a comma-separated MCP_CATEGORIES value in the server environment. Verify the resulting tools/list response because categories are broader than discord-ops profiles.

discord-ops: DISCORD_OPS_DRY_RUN=1 short-circuits destructive calls before they hit the Discord REST API.

discord-mcp: MCP_DRY_RUN=true protects only the 29 tools registered with confirm_required. Ordinary writes-including many send, edit, and create tools-can still execute on the first call.

Migration: do not treat the environment variables as equivalent. Inventory every write in the old profile, check the destination tool’s Confirmation required badge, and use a test guild or restricted bot permissions for writes outside the gate. See Confirmation.

discord-ops: send_template / list_templates reference named message bodies stored client-side in ~/.discord-ops.json.

discord-mcp: Five built-in Components V2 templates ship as MCP resources under discord://components-v2/templates/<name>. They are fixed layout templates, not a persistence layer for arbitrary discord-ops message bodies.

Migration: compare each saved template with the built-in announcement, release-notes, welcome-card, poll-results, and incident-status resources. Reuse a matching resource; otherwise keep the body in client-managed configuration and send it with messages_send. The two source tools remain unmapped because discord-mcp does not store arbitrary named templates.

  1. Clone discord-ops locally.

    Terminal window
    git clone https://github.com/bookedsolidtech/discord-ops.git ~/discord-ops-clone
  2. Run the migration report.

    Terminal window
    discord-mcp migrate --from discord-ops --source ~/discord-ops-clone

    The report includes three architectural-mismatch warnings (multi-guild, profiles, dry-run) regardless of NAME_MAP coverage. Read them every time.

  3. Inventory your projects.

    For every entry in ~/.discord-ops.json, decide whether projects can share one bot token and process. Keep separate processes only for different bot identities, credentials, or isolation requirements.

  4. Generate a client config for each process.

    Terminal window
    discord-mcp init --client claude-desktop

    init prints a snippet; it does not append to your client config and it has no --name flag. For multiple projects, merge copies under distinct mcpServers keys (for example discord-mcp-app1 and discord-mcp-app2), set each process’s DISCORD_TOKEN, then restart your MCP client.

  5. Update agent prompts.

    Drop the project: argument from every call. Swap tool names per the mapped table. For medium and low confidence entries, adjust argument shapes per the per-entry notes.

  6. Rebuild the safety boundary. Set MCP_DRY_RUN=true for confirm-gated tools, then separately constrain ordinary writes with Discord permissions, category exposure, and a test guild. The discord-ops DISCORD_OPS_DRY_RUN variable is no longer consulted.

The most common mapped operations are:

discord-ops tooldiscord-mcp toolConfidenceNotes
send_messagemessages_sendhigh-
get_messagesmessages_readhigh-
edit_messagemessages_edithigh-
delete_messagemessages_deletehigh-
add_reactionreactions_createhigh-
pin_messagemessages_pinhigh-
unpin_messagemessages_unpinhigh-
search_messagesmessages_search_recenthigh-
list_channelschannels_listhigh-
get_channelchannels_gethigh-
create_channelchannels_create_guild_channelhigh-
edit_channelchannels_modifyhigh-
delete_channelchannels_deletehigh-
set_permissionschannels_modify_permissionshigh-
list_guildsusers_list_current_user_guildshigh-
get_guildguild_gethigh-
create_inviteinvites_create_channelhigh-
list_membersmembers_listhigh-
kick_membermembers_kickhigh-
ban_membermembers_banhigh-
query_audit_logaudit_log_gethigh-

The medium-confidence collapse table:

discord-ops tooldiscord-mcp toolConfidenceNotes
send_embedmessages_sendmediumPass embeds[] in the payload.
set_slowmodechannels_modifymediumPass rate_limit_per_user.
move_channelchannels_modifymediumPass parent_id and/or position.
archive_threadchannels_modifymediumPass archived: true.
timeout_membermembers_modifymediumPass communication_disabled_until.
get_invitesinvites_list_channelmediumdiscord-mcp invites are channel-scoped - iterate channels for guild-wide listing.
messages_litemessages_sendmediumProfile-variant; collapses onto the full messages_send.
messages_fullmessages_sendmediumProfile-variant; collapses onto the full messages_send.

The low-confidence entries you should always re-read:

discord-ops tooldiscord-mcp toolConfidenceNotes
notify_ownersmessages_sendlowResolve owner snowflake via users_create_dm first to get a DM channel ID.
purge_messagesmessages_bulk_deletelowCompose: messages_search_recent (or messages_read) + messages_bulk_delete.

5 discord-ops tools surface in the report’s unmapped list:

  • System (3) - health_check, list_projects, list_bots. discord-ops-only introspection. discord-mcp surfaces runtime health via the gateway client + MCP capability negotiation, not via tools. Drop these calls from your agent prompts.
  • Templates (2) - send_template, list_templates. Client-side feature in discord-ops; no discord-mcp equivalent. Inline the template strings into your agent prompt’s system message.