Discord MCP server using user tokens. No bot setup required.
This Discord user token MCP server has 16 tools with consistent naming (verb-first: discord_list, discord_send, discord_read, etc.) and reasonable descriptions. All tools have input schemas with types and descriptions. However, output schemas are completely undocumented, the code does not show what fields are returned, forcing LLMs to infer structure. Parameter descriptions are present but often generic (e.g., 'Server ID' without format hints). Several tools conflate related operations (search vs find_message both do similar work), and no tool documentation includes recovery guidance for errors. Error handling exists in the client but is not surfaced in tool descriptions, so LLMs cannot know which errors are retryable. Descriptions average ~120 chars, adequate but lean on context for less common tools like discord_get_replies and discord_list_threads.
Delete one of your own messages. This action is permanent and cannot be undone.
Edit one of your own messages. You can only edit messages you sent.
Find messages in a Discord server by author, content, or date range. Tries guild search first; if the server blocks search (403), falls back to scanning the channel directly (requires channel_id).
Get all replies to a specific message. Fetches messages after the target and filters for those that reference it. Shows the original message followed by its replies in chronological order.
Get detailed information about a Discord server: name, description, member count, roles, and features.
List channels in a Discord server, grouped by category. Use DISCORD_DEFAULT_GUILD env var to set a default server, or pass guild_id explicitly.
Output schemas completely undocumented. No indication what fields each tool returns (e.g., does discord_list_channels return 'id', 'name', 'category'? What does a Message object contain?). This forces LLMs to guess structure and risks failed field extraction on downstream tool calls.
discord_find_message and discord_search both search messages. They have overlapping parameters (author, content, date range) and similar descriptions ('Find messages', 'Search messages'). LLMs cannot easily distinguish which to use. Recommend consolidating into a single search_messages tool with clear selection logic.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 50 | - | v1 |
List your recent DM conversations. Returns the other user's name and the channel ID needed to read or send messages.
List Discord servers you're a member of. Returns server names and IDs. Use a server ID with other tools to specify which server to interact with.
List threads in a server by scanning its text channels for archived threads. Works with user accounts (does not require bot privileges).
Get pinned messages from a channel. Pinned messages often contain important information, rules, or links.
Add a reaction emoji to a message. Use standard unicode emoji or custom emoji in name:id format.
Read recent messages from a Discord channel. Returns messages in chronological order (oldest first). Use 'before' for pagination to read further back in history.
Search messages in a Discord server. The most powerful tool — find specific conversations, messages from particular users, or content matching keywords. Supports combining multiple filters. Results are ordered by relevance.
Send a direct message to a user. Provide user_id to open a new DM, or channel_id if you already have the DM channel from discord_list_dms.
Send a message to a Discord channel. Supports plain text and Discord markdown (bold, italic, code blocks). Returns the sent message ID.
Get information about a user in a server: username, display name, when they joined, and their roles.
Error handling guidance absent from tool descriptions. The DiscordClient catches DiscordAPIError with status and body, but tools do not document what errors are possible, which are retryable, or what the LLM should do. E.g., discord_find_message mentions a '403 fallback' but provides no error description to guide recovery.
Result limits not consistently applied or documented. discord_search and discord_find_message have a 'limit' param (1-25) and mention it in description, but discord_list_channels, discord_list_dms, and discord_read_messages do not state upper bounds. Without explicit caps, LLMs may request excessive results.
Destructive operations (discord_delete_message) lack confirmation or dry-run capability. No mention of whether this is idempotent, what happens if the message is already deleted, or how to undo.
Parameters accept opaque IDs (user_id, channel_id, guild_id, message_id) with no mention of how to obtain them. Users say 'find messages from Jack' but tools require user_id. Descriptions do not guide the LLM to call a lookup tool first (e.g., searchGuildMembers).
discord_send_dm allows both 'user_id' and 'channel_id' (both optional, but content is required). No description clarifies: are these mutually exclusive? What happens if both are provided? What if neither is provided?
discord_react emoji parameter description provides examples ('👍', '❤️', 'custom_emoji:123456') but no formal constraint or validation guidance. Agents may pass invalid emoji and encounter silent failures.