MCP server for full-text search and retrieval of Discord conversation threads from an exported SQLite database. Supports FTS5 search with BM25 ranking, thread-level queries, channel browsing, and message retrieval.
melty-discord demonstrates solid tool design with clear naming, comprehensive parameter schemas using Zod, and good descriptions. All 6 tools follow verb_noun convention (search, get_thread, list_channels). Schemas are well-structured with type constraints, defaults, and ranges. However, output schemas are not explicitly documented, responses are JSON-stringified without formal schema declarations. Error handling is present but generic in places. No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only. Parameter descriptions are generally good (60-100 chars) but could be more prescriptive about format/constraints.
Search threads within a specific channel. Same FTS5 syntax as search. Useful for drilling into a known channel.
Get raw messages from a specific channel, ordered newest-first. Use when thread-level search isn't granular enough. Supports pagination via 'before' timestamp.
Get the full text of a conversation thread by ID. Use after search to read complete discussions. Returns structured message array.
List all channels with message counts, grouped by category. Useful for discovering what topics exist.
Full-text search across conversation threads using FTS5 with BM25 ranking and porter stemming. Returns ranked threads with snippets. Query syntax: word - matches any thread containing "word" "exact phrase" - matches the exact phrase search* - prefix match apple AND banana - both terms required apple OR banana - either term apple NOT banana - exclude term Use get_thread to read the full conversation of a result.
Output schemas not formally documented. Tools return JSON-stringified data without explicit schema declarations. LLMs cannot reliably parse response structure or plan downstream calls.
No tool annotations despite all tools being read-only. Missing readOnlyHint would help agents understand safety and retry semantics.
Error messages are generic ('Search failed: <error>') without recovery guidance. Should suggest next steps like 'Try simplifying query syntax' or 'Check channel name with list_channels()'.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Get aggregate statistics: total messages, threads, channels, unique authors, and date range.
Parameter descriptions lack format constraints. E.g., 'after' and 'before' accept ISO-8601 but don't specify format (YYYY-MM-DD vs YYYY-MM-DDTHH:MM:SSZ). LLMs may pass invalid timestamps.
stats() tool has empty input schema but no description of what aggregate fields are returned. LLMs cannot infer response structure.