A security-conscious Discord MCP server for text, attachments, stickers, reactions, DMs, and ElevenLabs voice messages.
Server has 16 well-named tools with complete input schemas and descriptions. Naming follows verb_noun convention (send_message, read_messages, list_servers). Descriptions are present and actionable (avg ~120 chars). However, parameter descriptions are sparse or missing for many fields (e.g., 'server' param lacks guidance on format/resolution), and output schemas are not documented. Error handling is minimal, no recovery guidance or actionable error messages visible in code. Missing tool annotations (readOnlyHint, destructiveHint). Some tools accept ambiguous parameters (e.g., 'server' can be name or ID but no guidance on resolution strategy).
Delete a message by ID.
Edit a message previously sent by the bot.
List channels in a server.
List custom emojis available in a server.
List every server the bot is a member of.
List stickers available in a server.
Add a reaction to a message. Use a Unicode emoji or server emoji in `<:name:id>` form.
Parameter descriptions missing or incomplete. 'server' param appears in 14 tools but lacks guidance on format (name vs ID, resolution strategy). 'limit' in read_messages states '1-100, default 50' but no description of what is being limited. LLMs cannot infer parameter semantics from names alone.
Output schemas not documented. No tool specifies what fields are returned, their types, or structure. LLMs cannot plan downstream tool calls or extract required data (e.g., what does read_messages return? message IDs? timestamps? user info?). Violates pattern:tool and mxe:response-field-naming.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | <=2025-11-25 | v2 |
Read recent messages from a channel. Includes attachments, embeds, stickers, reactions, and reply references.
Send a direct message (DM) to a Discord user by their user ID.
Send any file (path or URL) as an attachment.
Send an image (path or URL) with an optional caption.
Send a text message to a Discord channel. Supports `:emoji_name:` shortcuts (resolved against the server's custom emojis) and optional reply-to.
Send a server sticker by ID. Use list_stickers to discover IDs.
Send a Discord voice message generated from text via ElevenLabs TTS. Renders as a real waveform-bar voice note in Discord. Requires ELEVENLABS_API_KEY and a voiceId in config.json.
Update the bot's presence (online/idle/dnd/invisible) and optional activity text.
Trigger the bot's typing indicator in a channel for ~10 seconds.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). delete_message and send_* tools are destructive/write operations but lack annotations. LLMs cannot distinguish safe-to-retry tools from irreversible ones, risking duplicate messages or deletions on retry.
Ambiguous parameter resolution. 'server' and 'channel' accept names or IDs but no guidance on how resolution works. Does 'general' match the first channel named 'general'? What if multiple servers have a 'general' channel? LLMs will guess wrong, causing silent failures or wrong-channel sends.
No error handling guidance. Code does not show error responses with recovery hints (e.g., 'Channel not found. Try list_channels() first.'). Agents cannot self-correct on failures, they will retry blindly or give up.