MCP server for verifying Discord bot behavior through a test bot account
Server has 21 tools with explicit schemas and descriptions visible in src/tools.ts. Naming follows verb_noun convention (list_, get_, send_, etc.), which is good. However, descriptions are often terse (10-50 chars), parameter descriptions lack detail on constraints/formats, and output schemas are not documented. Error handling is minimal, most tools return raw JSON without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Composition is reasonable (single responsibility per tool), but many parameters lack type constraints (enums, ranges). This is a typical community server with functional definitions but significant gaps in LLM-optimization and error guidance.
Add a reaction to a message
Create a new channel in a guild
Create a scheduled event in a guild
Create a thread in a channel
Delete a channel
Delete a message
Delete a scheduled event
Descriptions are terse (10-50 chars) and lack context on WHEN to use each tool. LLMs cannot distinguish between similar tools (e.g., send_message vs edit_message intent) without richer descriptions.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Agents cannot infer safety/retry semantics without these hints.
Parameter descriptions lack constraint details (ranges, enums, formats). E.g., 'limit' in read_messages says '1-100, default 10' in description but no enum/min/max in schema. LLMs cannot validate inputs without formal constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Edit a message
Query recorded gateway events after a cursor. If none match, waits up to waitSeconds for one to occur. When since is omitted, returns only the current cursor. Every tool that performs an action also returns the cursor taken just before it; pass that cursor as since to get every event following the action without gaps
Get information about a guild member
Fetch the full structure of a single message
Get the voice state of a user
Join a voice channel
Leave a voice channel
List the channels in a guild
List the guilds the bot is a member of
List members in a guild
Fetch recent messages in a channel. Returns the full structure of each message
Remove a reaction from a message
Send a message to a channel
Update a scheduled event
Output schemas are not documented. Tools return JSON via json() helper, but LLMs have no schema to understand what fields to expect. This breaks downstream tool chaining and forces agents to guess field names.
Error handling returns raw error messages without recovery guidance. E.g., 'Channel X is not a text based channel' tells LLM nothing about what to do next. No error classification (retryable vs fatal).