MCP server for Discord. Send messages, moderate, manage channels, inspect servers — from Claude Code, Paperclip agents, or any MCP client.
26 tools with consistent verb_noun naming (discord_send_message, discord_list_channels, etc.). All tools have descriptions (avg ~120 chars, within baseline 34-392). Input schemas present for all tools with required/optional fields clearly marked. However, parameter descriptions are sparse or missing for many fields (e.g., discord_send_message.embeds has minimal guidance on embed structure; discord_timeout_user lacks description for duration_seconds constraints). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal; no recovery guidance or actionable error messages visible in handlers. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications (READ_ONLY, WRITE, DESTRUCTIVE, REVERSIBLE). Parameter validation exists (requireSnowflake, name length checks) but error messages are generic. Missing: pagination guidance in list tools, field-level descriptions for complex objects (embeds, allowed_mentions), and output schema documentation.
Add a reaction from the bot to a message. Emoji can be a unicode glyph (e.g. "👍") or custom-emoji string ("name:id"). Requires Add Reactions + Read Message History.
Add a role to a guild member. Requires Manage Roles and the target role must be below the bot's highest role.
Bulk delete 2-100 messages from a channel. All messages must be less than 14 days old. Useful for raid cleanup. Requires Manage Messages permission.
Create a thread. If message_id is provided, creates a thread from that message; otherwise creates a standalone thread in the channel. auto_archive_duration is in minutes: 60, 1440, 4320, or 10080.
Delete a single message. Requires Manage Messages for other users' messages; bot can always delete its own.
Output schemas not documented. LLMs cannot predict response structure (message objects, user objects, role arrays, etc.). Breaks tool chaining, agent cannot know which fields to extract for downstream calls.
Complex parameter objects (embeds, allowed_mentions) lack field-level descriptions. discord_send_message.embeds is typed as array of objects but does not document embed structure (title, description, fields, color, etc.). LLMs cannot construct valid embeds without trial-and-error.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications in metadata. discord_delete_message and discord_bulk_delete_messages are DESTRUCTIVE but lack destructiveHint annotation. discord_get_message is READ_ONLY but lacks readOnlyHint. Agents cannot infer safety properties from tool definitions alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Edit a message the bot previously sent. Can edit content and embeds. Cannot edit other users' messages.
Fetch recent audit log entries. Filter by action_type (Discord AuditLogEvent enum integer) and/or user_id. Requires View Audit Log permission.
Fetch details about a single channel — name, type, permission overwrites, parent category, rate limit, etc.
Fetch details for a single guild — name, icon, owner, member count, features, etc.
Fetch a guild member — nickname, joined_at, roles, communication_disabled_until (timeout), etc.
Fetch a single message by ID. Useful for reading context before acting.
List users who reacted with a specific emoji on a message. Paginated (default 25, max 100).
Remove a user from the guild. They can rejoin via invite. Requires Kick Members permission.
List all active (non-archived) threads in a guild.
List all channels in a guild (server). Includes text, voice, category, thread channels.
List all guilds (servers) the bot is a member of. Useful for multi-server setups.
List members of a guild. Paginate with `after` cursor (last user ID). Requires the Server Members privileged intent on the bot.
Fetch recent messages from a channel. Paginate with before/after/around cursors. Default limit is 50, max 100.
List all roles in a guild. Returns role objects sorted by position (highest first).
Pin a message in a channel. Requires Manage Messages. Channels max 50 pinned messages.
Remove a reaction. Without user_id, removes the bot's own reaction. With user_id, removes a specific user's reaction (requires Manage Messages).
Remove a role from a guild member.
Send a new message to a Discord channel. Supports plain text, embeds, replies, and allowed_mentions control. Returns the created message object including its ID.
Trigger the "bot is typing…" indicator in a channel for about 10 seconds. Useful before sending a long-form response so users know the bot is working.
Timeout a user — they cannot send messages, react, or join voice. Up to 28 days. Pass duration_seconds=0 to remove an existing timeout. Requires Moderate Members permission.
Unpin a previously pinned message.
Pagination guidance missing from list tools. discord_list_messages, discord_list_members, discord_list_channels accept limit/before/after/around but descriptions do not explain cursor semantics or when to use each. No mention of result caps or total counts.
Error handling is generic. Handlers return formatResult(res) or bare error strings without recovery guidance. No actionable error messages (e.g., 'Invalid emoji format: use unicode or name:id'). Agents cannot self-correct on validation failures.