A Rust-based MCP server for Slack integration with intelligent caching
The Slack MCP server has 8 tools with mixed definition quality. All tools have names starting with action verbs (search_, send_, list_, get_, read_, refresh_), which is positive. However, descriptions are inconsistent, some are bare minimal (read_thread: no description provided in handler), and parameter descriptions lack detail on formats, constraints, and expected values. Input schemas are visible for most tools but lack type validation details (e.g., no min/max for limit parameters, no enum constraints for channel parameter formats). Output schemas are not documented at all, forcing LLMs to guess what fields responses contain. Error handling guidance is minimal. The tool composition is reasonable (8 focused tools), but several tools mix concerns or lack sufficient context to be effective in agent workflows.
Get messages from a Slack channel
List members of a Slack channel
Read messages from a Slack thread
Refresh the local cache of Slack users and channels
Search query for channel name
Search query for messages
Search query for user name or email
read_thread tool has no description, violating the critical requirement that every tool must have a non-empty description for LLM selection. This tool cannot be effectively discovered or used by agents.
Output schemas are not documented for any tool. LLMs cannot determine what fields to expect (e.g., does search_users return user_id or user.id? does send_message return message_ts?), forcing agents to guess and breaking downstream tool chaining.
Parameter descriptions lack format specifications and constraints. 'query' and 'channel' parameters offer no guidance on valid formats, length limits, or examples. Description baseline is 72 chars per param; these average ~20-30 chars.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 46 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 43 | 2.0+ | v1 |
Send a message to a Slack channel or user
Numeric parameters (limit, default 10-100) have no min/max bounds declared. An LLM could pass limit=999999 or limit=-1 without constraint guidance.
send_message tool description does not explicitly state it modifies state (is destructive/irreversible). Agents need to know this call has consequences and cannot be safely retried without deduplication logic.
Tools return IDs that downstream tools may require, but response structure is undocumented. E.g., send_message must return a thread_ts or message_ts for read_thread to work, but this is not specified.
get_channel_messages and search_messages accept optional 'cursor' parameter for pagination, but no guidance on what format it expects or what the response includes (total_count? next_cursor?). Pagination is broken without documented structure.
No error handling guidance in descriptions. LLMs don't know what to do on 'channel not found', 'user not found', or rate limit errors, should they retry, call search_*, ask the user?