Discord MCP Server — access Discord conversations through MCP tools
GuildBridge demonstrates solid tool definition quality with consistent naming patterns, complete parameter schemas, and good descriptions. All 8 tools are properly registered with the MCP SDK using Zod schemas. Naming follows verb_noun convention (list_*, get_*, send_*, reply_*, search_*). Parameters are well-described with type constraints (enums for channel types, numeric bounds for limits). However, there are gaps in output schema documentation (responses are JSON stringified text, not structured objects), and error handling lacks recovery guidance. The server implements permission checks and audit logging, which are strong security practices. Most tools follow single-responsibility principle, though some descriptions could be more prescriptive about when to use them vs similar tools.
Get details about a specific Discord channel
Get information about a Discord user
List channels in a Discord server, optionally filtered by type
List Discord servers you are in
Read messages from a Discord channel
Reply to a specific message in a Discord channel
Search messages in a Discord server
Output responses are JSON-stringified text, not structured MCP response objects. Tools return {type: 'text', text: JSON.stringify(...)} instead of typed response schemas. This forces LLMs to parse unstructured text rather than working with structured fields.
Error responses lack recovery guidance. When access is denied or auth expires, errors state the problem but don't suggest which tool to call next (e.g., 'Your authorization has expired' should suggest 're-authenticate' or point to an auth flow).
Missing output schema documentation. The server does not document what fields each tool returns. LLMs must infer structure from stringified JSON, increasing parsing errors and wasted context tokens.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | 2026-07-28+ | v2 |
| 2026-03-09 | C | 68 | - | v1 |
Send a message to a Discord channel
send_message and reply_to_message parameters 'content' and 'embed' are marked 'required unless embeds provided' in description, but the schema does not enforce this mutual exclusion. A tool must not require agent reasoning about parameter interdependencies.
get_user description is vague ('Get information about a Discord user'). Does it return username, roles, permissions, avatar, presence? LLMs need explicit field hints to plan subsequent calls.
No tool annotation hints (readOnlyHint, destructiveHint, idempotentHint). send_message and reply_to_message should be annotated as destructive; list_* and get_* should be readOnly. This helps LLMs avoid unintended side effects.
search_messages accepts sort_by enum ('relevance' or 'recent') but does not declare it as an enum constraint in the schema, it's just a string description. This invites hallucinated values.