Unofficial MCP server + CLI that reads your own Discord DMs through the official web client. Read-only, no token, no API.
6 tools with clear action verbs and reasonable descriptions (avg 156 chars), but critical gaps in schema completeness and parameter documentation. 4 of 6 tools have empty input schemas ({}), violating the requirement that every parameter needs a description and type. discord_read_dm has a well-structured schema with 5 parameters, each typed and described; discord_list_dms and discord_catch_up have partial schemas. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Error handling is minimal, no recovery guidance or actionable error messages visible in source. Output schemas are not documented. Tool composition is reasonable (single responsibility), but parameter naming could be more explicit (e.g., 'format' enum is good, but 'limit' lacks min/max in descriptions for some tools).
"Look at my messages": walks the conversations with unread messages (up to max_channels, default 5) and returns their latest messages, with per-conversation errors if any and how many were left unprocessed. If nothing is unread, lists the recent conversations.
Closes the Discord tab in the dedicated Chrome (the owner stops appearing online from that browser). It closes by itself after a few minutes of inactivity; call only to force it. Returns closed / busy (another agent is using it) / not_open / chrome_down.
Lists the open direct conversations in the sidebar (recent-activity order) with their channel_id and whether they have unread messages. Reports whether the sidebar walk was complete.
Opens and focuses the Discord tab in the dedicated Chrome so the account owner can sign in by hand (one-time; the session persists in that profile). Only navigates to /login when the signed-out state is confirmed.
Reads the most recent messages of a direct conversation, by channel_id (preferred) or by the name shown in discord_list_dms (exactly one of the two). Returns oldest-first messages with local time, author, text, attachments and id, plus `hasMore`/`nextBefore` to page back with `before`. Opening the conversation may mark it as read.
4 of 6 tools have empty input schemas ({}), violating the requirement that every parameter needs a type and description. discord_status, discord_open_login, and discord_close_tab accept no parameters but should document this explicitly.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications in the spec (READ_ONLY, REVERSIBLE). discord_close_tab is marked REVERSIBLE but has no destructiveHint annotation.
Output schemas are not documented in tool definitions. LLMs cannot plan downstream calls or extract required fields (e.g., channel_id from discord_list_dms). discord_read_dm description mentions 'hasMore' and 'nextBefore' but schema is not formally declared.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | 2026-07-28+ | v2 |
Checks the dedicated Chrome and whether Discord is signed in (logged_in / logged_out / loading) and as which user. Call this first.
discord_read_dm accepts both 'channel_id' and 'name' as mutually exclusive parameters but does not explicitly state this in parameter descriptions. LLMs may pass both, causing ambiguous behavior.
No error handling guidance visible in tool descriptions. discord_read_dm and discord_catch_up mention errors ('per-conversation errors') but do not explain what to do next or how to recover.