Discord channel for Kimi Code CLI. Self-contained MCP server with pairing/allowlist access control for Discord DMs and guild channels. Delivers paired DMs via push (experimental.channel support) or polling via check_new_messages. Manages pairing codes, allowlists, guild-channel opt-in, and mention gating.
Server has 15 tools with complete input schemas and descriptions. Naming follows verb_noun convention (check_, reply, pair, confirm_, list_, remove_, set_, enable_, disable_). Descriptions are substantive (100-200 chars typical), explaining WHAT and WHEN. However, several critical gaps: (1) No output schemas documented for any tool, LLMs cannot plan downstream calls or extract structured data. (2) Parameters lack enum constraints where applicable (e.g., 'policy' in set_dm_policy accepts 'pairing'|'allowlist'|'disabled' but no enum declared). (3) No error handling guidance, tools return success/failure but don't guide recovery. (4) Security concern: reply tool accepts arbitrary file paths with only a weak allowlist check (assertSendable), risking unintended disclosure. (5) Composition: check_new_messages and reply are well-separated, but no pagination guidance for message polling.
Poll for new messages in paired DMs and allowed guild channels. Returns messages since the last cursor position for each chat. Supports filtering by chat_id.
Confirm a pairing code to add a user to the allowlist. User can then send DMs that will be delivered.
Disable message delivery from a guild channel.
Enable message delivery from a guild channel. Optionally restrict to specific users and/or require bot mention.
List all users in the DM allowlist.
List all enabled guild channels with their access policies.
Initiate pairing with a Discord user. Generates a pairing code and sends it to the user via DM. Code expires after 10 minutes or 2 replies.
No output schemas documented for any of the 15 tools. LLMs cannot infer what fields to expect, breaking downstream tool chaining and forcing wasteful discovery calls.
Enum constraints missing for constrained parameters. set_dm_policy accepts 'pairing'|'allowlist'|'disabled', set_reply_mode accepts 'off'|'first'|'all', set_chunk_mode accepts 'length'|'newline', none declared as enums in schema. LLMs may hallucinate invalid values.
No error handling guidance. Tools return success/failure but do not tell LLMs what to do on error (retry? ask user? fatal?). E.g., pair tool could fail if user already paired, no recovery hint provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Remove a user from the DM allowlist.
Send a message to a Discord DM or guild channel. Supports text content, file attachments, and reply threading. Automatically chunks long messages based on Discord's 2000 character limit.
Set an emoji reaction to acknowledge message receipt. Empty string disables.
Set message splitting strategy: 'length' (hard character count) or 'newline' (paragraph boundaries).
Set the DM access policy: 'pairing' (default), 'allowlist' (only pre-approved users), or 'disabled'.
Set regex patterns for alternative mention detection in guild channels (in addition to @bot mentions).
Configure how reply_to creates Discord threads: 'off' (no threading), 'first' (thread on first chunk only), or 'all' (thread on all chunks).
Set maximum characters per outbound message before splitting. Default: 2000 (Discord's hard limit).
File path validation in reply tool is weak. assertSendable() checks if path is under STATE_DIR or INBOX_DIR, but LLMs could still be tricked into sending sensitive files if they exist in INBOX_DIR. No explicit allowlist of safe file types (e.g., .txt, .md, .json only).
check_new_messages lacks pagination guidance. No limit parameter, no next_cursor, no total count. If a chat has thousands of unread messages, the response could exhaust context window.