A lightweight, multi-guild Discord MCP server with 95+ tools for managing Discord servers, channels, messages, members, roles, permissions, moderation, and more.
Discord MCP Server demonstrates strong definition quality with comprehensive tool coverage, well-structured schemas, and consistently detailed descriptions. All 19 tools have explicit input schemas with proper type definitions and required fields. Descriptions average 180-220 characters, well within the 10-1024 range baseline, and include actionable context (prerequisites, permissions, return types). Tool names follow verb_noun patterns correctly (create_, delete_, edit_, send_, etc.). However, there are gaps in output schema documentation and some parameter descriptions could be more prescriptive about constraints. The dry_run safety pattern on discord_delete_channel is commendable. Error handling is present but could be more granular in recovery guidance.
Create a copy of a channel, including its name, topic, and permission overwrites (but not its messages). Requires the Manage Channels permission. Returns the cloned channel's name and ID.
Create a text channel, voice channel, or category in a server. Requires the Manage Channels permission. For forum channels use discord_create_forum_channel instead. Returns the new channel's name and ID.
Permanently delete a channel and all of its messages. IRREVERSIBLE. SAFE BY DEFAULT: dry_run is true unless explicitly set to false, so call it first to preview, then re-call with dry_run:false to actually delete. Requires the Manage Channels permission. An optional reason is recorded in the audit log.
Permanently delete a DM message previously sent by this bot. IRREVERSIBLE. The bot can only delete its own DM messages, not the recipient's. Returns a confirmation.
Update a channel's name, topic, slowmode, or NSFW flag. Only provided fields change; topic and slowmode apply to text channels only. Requires the Manage Channels permission. Returns a confirmation.
Output schemas not documented in tool definitions. While input schemas are complete with types and constraints, return types and response fields are not formally declared. LLMs cannot plan downstream tool calls without knowing what fields the response contains.
Embed field structure in discord_send_dm_embed and discord_send_dm_embed/discord_edit_dm_embed lacks explicit schema for the 'fields' array (type, structure, constraints). Description says 'Up to 25 name/value field blocks' but the exact expected structure is not formally defined.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2025-06-18+ | v2 |
Edit the text content of a DM message previously sent by this bot. Only the bot's own DM messages can be edited. Use discord_edit_dm_embed for embed messages. Returns a confirmation.
Replace the embed on a DM message previously sent by this bot. Only the bot's own messages can be edited. Full replace, not merge: provided fields are applied and omitted fields are dropped. Returns a confirmation.
Find channels whose name contains a substring (case-insensitive). Returns matching channels (id, name, type) as a JSON array. Read-only. Useful for resolving a channel_id when you only know the channel's name.
Subscribe a target channel to an announcement (news) channel, so the source's published messages are reposted into the target. The source must be an announcement channel. Requires the Manage Webhooks permission in the target. Returns a confirmation.
Get details about one server: name, description, member/channel/role counts, boost tier, owner, and creation date. Read-only. Use discord_get_server_stats for a finer breakdown (humans vs bots, channel types).
List all channels in a server, grouped by their parent category and ordered by position. Returns a JSON object keyed by category name. Read-only. Use discord_find_channel_by_name to locate a specific channel.
List every Discord server (guild) the bot is a member of (id, name, member count, icon). Takes no arguments. Read-only. Start here to discover the guild_id needed by most other tools.
Reset a channel's permission overwrites to exactly match its category. Use discord_set_permission to set individual overrides. Requires the Manage Channels permission. Returns a confirmation.
Move a channel into a category, or remove it from its category when category_id is omitted. Requires the Manage Channels permission. Use discord_set_channel_position to reorder within a category. Returns a confirmation.
Read the most recent messages from the bot's DM conversation with a user, oldest-to-newest. Returns { messages: [...] } with id, author, content, embed count, timestamp. Read-only.
Reply to a specific message in a DM, attaching a quoted reply reference. Unlike the edit/delete DM tools, this works on any message in the conversation (the bot's or the user's). Use discord_send_dm for a standalone DM with no reference. Returns the new reply's message ID.
Send a private direct message to a user by their user ID. Use discord_send_message to post in a server channel instead. Requires the bot to share at least one server with the user, and the user must allow DMs from server members (otherwise Discord rejects the send). Returns the new message ID.
Send a rich embed as a private direct message to a user. Use discord_send_dm for plain text, or discord_send_embed to post an embed in a channel. Requires the bot to share a server with the user, and the user must allow DMs from server members. Returns the new message ID.
Set a channel's display order within its category. Use discord_move_channel to change which category it belongs to. Requires the Manage Channels permission. Returns a confirmation.
discord_send_dm and discord_reply_dm descriptions state 'max 2000 characters' but the parameter schema does not enforce maxLength constraint. This forces LLMs to rely on descriptions for validation, inviting over-length submissions that fail at runtime.
discord_create_channel and discord_edit_channel descriptions reference 'topic' and 'slowmode' applying to 'text channels only' but the schema does not use conditional logic (dependentSchemas or if/then) to enforce this. An LLM could pass topic/slowmode for a voice channel, failing at runtime.
Error handling in src/errors.ts (formatToolError) and src/server.ts (CallToolRequestSchema handler) returns plain text errors wrapped in { type: 'text', text: '❌ Error: ...' } format. Error messages do not categorize as retryable/user-fixable/fatal, and do not include recovery guidance or invalid values in context.
discord_follow_announcement_channel tool name does not clearly convey the one-directional subscription model. A clearer name like 'subscribe_to_announcement_channel' or 'forward_announcement_messages' would be more discoverable for LLMs.
discord_read_dms description does not clearly state pagination behavior or limits. While the parameter schema includes limit (1-100, default 20), the description does not explain whether 'oldest-to-newest' ordering is guaranteed or how to fetch older messages beyond the limit.