A Model Context Protocol (MCP) server for the Stoat chat platform, providing tools to interact with Stoat servers, channels, messages, users, and files.
Stoat MCP has well-structured tool definitions with consistent naming (verb_noun pattern), clear descriptions, and proper JSON schemas. All 16 tools follow the verb-first convention (list_, get_, create_, delete_, send_, search_, reply_to_). Descriptions are detailed and include risk/permission context. However, several parameter descriptions lack specificity about constraints (e.g., 'limit' parameters state defaults but not validation ranges), and output schemas are not explicitly documented in the source. Error handling guidance is minimal, tools do not describe recovery paths or actionable error messages. The server respects the chat data model by accepting IDs and providing context-aware filtering (allowlist/blocklist), but lacks batch operations and some composition optimizations.
[WRITE — disabled by default] Add an emoji reaction to a message. Requires STOAT_ENABLE_WRITE=true.
[WRITE — disabled by default] Create a new text channel in the Stoat server. Requires STOAT_ENABLE_WRITE=true.
[WRITE — disabled by default] Delete a channel from the Stoat server. Requires STOAT_ENABLE_WRITE=true. Blocked channels (STOAT_CHANNEL_BLOCKLIST) cannot be deleted.
[READ-ONLY] Get metadata for a specific Stoat channel by ID.
[READ-ONLY] Retrieve recent messages from a Stoat text channel. Returns formatted markdown with author, timestamp, and content.
[READ-ONLY] Retrieve recent direct messages with a Stoat user. Returns formatted markdown with author, timestamp, and content.
Output schemas not documented. Tools return formatted markdown or structured data, but the response schema (fields, types, pagination info) is not visible in the source code. LLMs cannot plan downstream tool calls without knowing what fields to expect.
Pagination parameters lack explicit constraints. 'limit' parameters state defaults (50, 20) and max (100) in descriptions, but no minimum is specified. Numeric ranges should be formally declared (e.g., 'integer, minimum 1, maximum 100').
No error recovery guidance. Tool descriptions do not explain what to do if a call fails (e.g., 'If channel not found, try list_channels() to find the correct ID'). Error responses are not shown in the source.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | 2026-07-28+ | v2 |
[READ-ONLY] Get replies to a specific message (thread context). Returns messages that reply to the given message ID.
[READ-ONLY] Get detailed profile information for a Stoat user by ID.
[READ-ONLY] List all text channels in the Stoat server. Respects STOAT_CHANNEL_ALLOWLIST and STOAT_CHANNEL_BLOCKLIST filters.
[READ-ONLY] List all members of the Stoat server.
[WRITE — disabled by default] Remove an emoji reaction from a message. Requires STOAT_ENABLE_WRITE=true.
[WRITE — disabled by default] Reply to a message in a Stoat channel. Requires STOAT_ENABLE_WRITE=true.
[READ-ONLY] Search messages across Stoat channels by keyword. Returns formatted markdown with channel, author, timestamp, and content.
[WRITE] Send a direct message to a Stoat user. Requires STOAT_ENABLE_WRITE=true or STOAT_ENABLE_SEND_DM=true.
[WRITE] Send a message to a Stoat text channel. Requires STOAT_ENABLE_WRITE=true or STOAT_ENABLE_SEND_MESSAGE=true.
[WRITE — disabled by default] Upload a file to a Stoat channel. Requires STOAT_ENABLE_WRITE=true. file_path must be accessible to the server process.
No batch operations. Tools like add_reaction and remove_reaction operate on single messages. Agents calling these in loops waste tokens and latency. A batch_add_reactions(message_ids, emoji) variant would improve efficiency.
Destructive operations lack confirmation step. delete_channel and reply_to_thread (which modifies state) do not offer a dry-run or confirmation mechanism. Agents can accidentally delete channels without a safety gate.