A Discord MCP control plane for bot-powered Discord server management and automation.
Discord MCP Platform demonstrates solid foundations with 16 well-organized tools covering channels, messages, roles, and threads. All tools have descriptions (194 chars average aligns with production baseline) and explicit input schemas with type definitions. However, the server has significant gaps: (1) Output schemas are completely undocumented, no LLM-facing description of what fields are returned, breaking the tool-chaining pattern; (2) Error handling is absent from tool definitions, no guidance on retryability, recovery steps, or actionable error messages; (3) Parameters lack depth, many lack ranges, constraints, or examples of valid values; (4) No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk classification; (5) Destructive operations (delete_channel, delete_message, bulk_delete_messages, delete_role) lack confirmation/dry-run patterns. The tool composition is sound (verb_noun naming, single responsibility per tool), but output documentation and error recovery are production gaps.
Bulk delete multiple messages (2-100 at once).
Create a new channel in a Discord guild. type: 0=text, 2=voice, 4=category.
Create a new role in a Discord guild.
Create a thread in a channel.
Delete a channel or category.
Delete a specific message.
Delete a role from a Discord guild.
No output schemas documented. LLMs cannot plan downstream tool calls or extract required fields for chaining. E.g., does list_channels return channel_id, channel_name, topic? What fields does send_message return (message_id, timestamp, author)? This breaks the tool-chain pattern entirely.
Destructive operations (delete_channel, delete_message, bulk_delete_messages, delete_role) lack confirmation or dry-run patterns. Agents can permanently delete resources without any guard rails. No confirmation_required, no preview-before-execute, no undo capability.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Edit a channel's properties (name, topic, parent, etc). Only pass fields you want to change.
Edit an existing message.
Edit a role's properties (name, color, hoist, mentionable). Only pass fields you want to change.
Get info about a single Discord channel.
List all channels in a Discord guild.
List recent messages from a Discord channel.
List all roles in a Discord guild.
Reorder roles in a guild. Pass a list of {id, position} objects.
Send a message to a Discord channel. Max 2000 chars.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with risk levels (READ_ONLY, WRITE, DESTRUCTIVE) in the spec but these are not exposed in tool definitions. Clients cannot automatically route sensitive operations through approval workflows.
Error handling guidance completely absent. Tool definitions do not describe what errors are possible, whether they are retryable, what the LLM should do next, or what invalid inputs trigger. E.g., create_channel has no note that 'Invalid channel_type: 0=text, 2=voice, 4=category.' E.g., list_messages has no note on what happens if channel doesn't exist.
Parameter constraints under-specified. create_channel accepts channel_type: 0=text, 2=voice, 4=category (documented in description only, not as enum). send_message says 'Max 2000 chars' but no minLength or maxLength in schema. list_messages limit defaults to 50 but no explicit range (1-100) enforced in schema. create_role permissions accepted as string but format/constraints completely undocumented.
Missing pagination for list operations. list_channels and list_messages accept a limit but no offset/cursor for retrieving subsequent pages. If a guild has >50 channels, the LLM cannot fetch all of them. No 'total_count' or 'has_more' hint in output.
reorder_roles accepts positions as 'array of objects' but schema does not specify object structure. Should be {id: string, position: integer}. This forces the LLM to guess the exact format.
Missing parameter descriptions for some optional fields. edit_channel.parent_id says 'Move under this category' but does not clarify: is this a category channel ID? Can you move a category into another category? What happens if the category doesn't exist?
No documentation of required permissions or scope gates. delete_role could require admin privileges, but there is no 'requires_guild_admin: true' or equivalent scope declaration in the tool definition. This breaks the principle of least privilege and prevents proper audit trails.