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.
Source
Section titled “Source”- Repo:
bookedsolidtech/discord-ops - Package:
discord-ops(v0.23.0 at cutoff, MIT) - Tool count (cutoff 2026-05-01): ~49 across 10 categories (messaging, channels, guilds, members, roles, threads, moderation, webhooks, audit, system).
- Adapter source:
packages/mcp-server/src/lib/migrate-adapters/discord-ops.ts
Why migrate to discord-mcp
Section titled “Why migrate to discord-mcp”- 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_sendandcomponents_v2_edittools validateflags = 32768layouts. See the Components V2 announcement recipe. - Pipeline sequencing -
mcp_pipelinechains multiple tool calls in a single round-trip, replacing discord-ops’s client-side templates. See Architecture: pipeline.
Architectural mismatches
Section titled “Architectural mismatches”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:
1. Multi-guild project routing
Section titled “1. Multi-guild project routing”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.
3. Dry-run mode
Section titled “3. Dry-run mode”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.
4. Saved templates
Section titled “4. Saved templates”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.
Step-by-step migration
Section titled “Step-by-step migration”-
Clone discord-ops locally.
Terminal window git clone https://github.com/bookedsolidtech/discord-ops.git ~/discord-ops-clone -
Run the migration report.
Terminal window discord-mcp migrate --from discord-ops --source ~/discord-ops-cloneThe report includes three architectural-mismatch warnings (multi-guild, profiles, dry-run) regardless of NAME_MAP coverage. Read them every time.
-
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. -
Generate a client config for each process.
Terminal window discord-mcp init --client claude-desktopinitprints a snippet; it does not append to your client config and it has no--nameflag. For multiple projects, merge copies under distinctmcpServerskeys (for examplediscord-mcp-app1anddiscord-mcp-app2), set each process’sDISCORD_TOKEN, then restart your MCP client. -
Update agent prompts.
Drop the
project:argument from every call. Swap tool names per the mapped table. Formediumandlowconfidence entries, adjust argument shapes per the per-entry notes. -
Rebuild the safety boundary. Set
MCP_DRY_RUN=truefor confirm-gated tools, then separately constrain ordinary writes with Discord permissions, category exposure, and a test guild. The discord-opsDISCORD_OPS_DRY_RUNvariable is no longer consulted.
Top 20 mappings
Section titled “Top 20 mappings”The most common mapped operations are:
| discord-ops tool | discord-mcp tool | Confidence | Notes |
|---|---|---|---|
send_message | messages_send | high | - |
get_messages | messages_read | high | - |
edit_message | messages_edit | high | - |
delete_message | messages_delete | high | - |
add_reaction | reactions_create | high | - |
pin_message | messages_pin | high | - |
unpin_message | messages_unpin | high | - |
search_messages | messages_search_recent | high | - |
list_channels | channels_list | high | - |
get_channel | channels_get | high | - |
create_channel | channels_create_guild_channel | high | - |
edit_channel | channels_modify | high | - |
delete_channel | channels_delete | high | - |
set_permissions | channels_modify_permissions | high | - |
list_guilds | users_list_current_user_guilds | high | - |
get_guild | guild_get | high | - |
create_invite | invites_create_channel | high | - |
list_members | members_list | high | - |
kick_member | members_kick | high | - |
ban_member | members_ban | high | - |
query_audit_log | audit_log_get | high | - |
The medium-confidence collapse table:
| discord-ops tool | discord-mcp tool | Confidence | Notes |
|---|---|---|---|
send_embed | messages_send | medium | Pass embeds[] in the payload. |
set_slowmode | channels_modify | medium | Pass rate_limit_per_user. |
move_channel | channels_modify | medium | Pass parent_id and/or position. |
archive_thread | channels_modify | medium | Pass archived: true. |
timeout_member | members_modify | medium | Pass communication_disabled_until. |
get_invites | invites_list_channel | medium | discord-mcp invites are channel-scoped - iterate channels for guild-wide listing. |
messages_lite | messages_send | medium | Profile-variant; collapses onto the full messages_send. |
messages_full | messages_send | medium | Profile-variant; collapses onto the full messages_send. |
The low-confidence entries you should always re-read:
| discord-ops tool | discord-mcp tool | Confidence | Notes |
|---|---|---|---|
notify_owners | messages_send | low | Resolve owner snowflake via users_create_dm first to get a DM channel ID. |
purge_messages | messages_bulk_delete | low | Compose: messages_search_recent (or messages_read) + messages_bulk_delete. |
Gap analysis
Section titled “Gap analysis”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.
See also
Section titled “See also”- Adapter authoring guide
- discord-mcp tools (192)
- CLI reference:
migrate - Operations: audit - dry-run audit-log shape.
- Architecture: pipeline - replaces discord-ops client-side templates with fail-fast multi-call chains. Earlier Discord side effects remain if a later step fails.