A dual-mode MCP server for bounded Discord operations with agent-ready tools and legacy support
Discord MCP demonstrates strong definition quality with well-structured tool manifests, clear descriptions, and explicit parameter schemas. All 18 tools are explicitly defined in tool_manifest.py with consistent naming (verb_noun pattern), detailed descriptions (100-300 chars typical), and complete JSON schemas. Tool descriptions follow the WHAT/WHEN/PREREQUISITE template, making them LLM-optimized. However, some parameter descriptions lack constraint detail (format, ranges), and output schemas are not formally documented in the visible code. Error handling guidance is present but inconsistent across tools. Security considerations (confirm parameters on destructive ops) are well-implemented. The server exhibits professional structure with canonical metadata, contract tiers, and risk level declarations.
Use this when you need OCR or visual analysis of an attached image. This reads the attachment and sends it to the configured OpenAI vision endpoint. It requires a configured Discord bot and guild with the relevant permissions.
Check Discord MCP server configuration and readiness
Create a webhook in a Discord channel for external integrations
Use this when you need to permanently remove an existing message. This deletes a message after admin and confirmation checks. It requires a configured Discord bot and guild with the relevant permissions.
Delete a Discord webhook
Use this when you need to post a short standardized acknowledgement in an allowed channel. This creates one guild message. It requires a configured Discord bot and guild with the relevant permissions.
Output schemas are not formally documented in the visible tool definitions. While the codebase contains implementation logic, the response structures are not explicitly declared in JSON Schema format for LLM consumption (e.g., what fields does get_server_info return? What types? Required vs optional?).
Parameter descriptions lack formal constraint specification (min/max ranges, regex patterns, enum values). For example, 'limit' in read_messages and search_messages lacks bounds documentation (should be 1-100?), and 'query' in search_messages lacks format guidance. Descriptions are narrative but not machine-verifiable.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Use this when you need a live permission and readiness check for the configured guild. This reads bot, guild, channel, permission, and rate-limit state. It requires a configured Discord bot and guild with the relevant permissions.
Use this when you need status or an optional result for discord_job_submit. This reads the in-memory legacy job record without changing Discord. It requires an authenticated MCP service request, but does not contact Discord.
Use this when a legacy automation must run a supported action asynchronously. This queues behavior selected through a generic action field. It requires an authenticated MCP service request, but does not contact Discord.
Use this when an operator needs an end-to-end write diagnostic. This may send, edit, read back, and delete a test message. It requires a configured Discord bot and guild with the relevant permissions.
Use this when you need to replace an existing message's content. This overwrites a message after admin and confirmation checks. It requires a configured Discord bot and guild with the relevant permissions.
Use this when you need identity and high-level statistics for the configured server. This reads guild metadata without changing state. It requires a configured Discord bot and guild with the relevant permissions.
List MCP server capabilities and tool discovery information
Use this when you need the bytes of one attachment for review, preservation, or re-upload. This downloads a size-bounded attachment and safely inspects text files inside ZIP archives without writing to disk. It requires a configured Discord bot and guild with the relevant permissions.
Use this when you need recent messages from one readable channel. This reads channel history without changing state. It requires a configured Discord bot and guild with the relevant permissions.
Use this when you need history filtered by text, author, date, link, file, or thread. This reads matching channel history without changing state. It requires a configured Discord bot and guild with the relevant permissions.
Use this when you need to send text, an embed, or one attachment to an allowed channel. This creates one or more messages and can create a continuation thread. It requires a configured Discord bot and guild with the relevant permissions.
Send a message through a Discord webhook
Webhook tools (create_webhook, delete_webhook, send_webhook_message) have minimal descriptions. 'Create a Discord webhook' (36 chars) falls below the 50-char baseline for LLM disambiguation. Descriptions do not explain WHEN to use webhooks vs direct messaging or WHY they matter.
discord_job_submit references 'action' as a generic string without enumerating supported actions or providing guidance on valid values. An LLM cannot determine what legacy actions are supported without separate discovery.
Error handling guidance is present (e.g., confirmation requirements) but not systematically documented. Tool descriptions do not consistently explain what errors can occur, how to interpret them, or what recovery steps exist. E.g., send_message does not document rate-limit handling or message length constraints.
Pagination support is not documented for read_messages and search_messages. The 'limit' parameter suggests pagination capability, but the response structure (offset handling, total count, has_more flag) is not described, leaving LLMs uncertain about multi-page iteration.