This Slack MCP server has 8 tools with generally clear naming (verb_noun pattern) and present descriptions. All tools show input schemas with type information. However, there are significant gaps: output schemas are completely undocumented (no documentation of what fields are returned), error handling lacks recovery guidance, parameter descriptions vary in quality (some are thorough, others minimal), and no tool annotations (readOnlyHint/destructiveHint) are present despite clear semantic differences between read and write operations. The server falls into the 'Fair/Good' range, functional but with noticeable quality gaps that would benefit agents.
Add a reaction emoji to a message
Get recent messages from a channel
Get all replies in a message thread
Get the profile information for a specific user
Get a list of all users in the workspace with their basic profile information
List public and private channels that the bot is a member of, or pre-defined channels in the workspace with pagination
Output schemas completely undocumented. Tools return JSON from Slack API (via response.json()) but there is no documentation of return structure, fields, or types. LLMs cannot plan downstream calls or extract relevant data without knowing what a successful response contains.
No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Four tools are clearly write operations (slack_post_message, slack_reply_to_thread, slack_add_reaction) but lack destructiveHint=true annotations. Four are read-only but lack readOnlyHint=true. Agents cannot distinguish safe-to-retry operations from irreversible writes without annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Post a new message to a Slack channel or direct message to user
Reply to a specific message thread in Slack
Error handling provides no recovery guidance. The source shows all tools simply return response.json() from Slack API calls with no error parsing, wrapping, or actionable guidance. If a call fails (e.g. 'user not found'), the LLM receives raw Slack error JSON with no hint about what to do next (retry, ask user, try alternative tool).
Parameter descriptions vary in quality. slack_list_channels.limit has good detail ('Maximum number...default 100, max 200'); slack_add_reaction.reaction is generic ('The name of the emoji reaction'). Some descriptions lack format guidance (e.g. thread_ts format string is documented, but timestamp in slack_add_reaction is not). Inconsistency confuses LLM parameter inference.
No input validation or constraint enforcement in tool implementations. Zod schemas are defined in index.ts but the actual validation logic is not visible in the provided source. If an LLM passes invalid values (e.g. limit=9999, malformed channel_id), the tools likely fail with raw API errors instead of returning clear 'Invalid X: must be Y' messages.