The Slack MCP server provides 8 well-named tools with proper JSON Schema definitions and consistent parameter typing. Tool names follow verb_noun convention (list_channels, post_message, get_channel_history) and are semantically clear. All tools have descriptions and input schemas with typed parameters. However, there are gaps: (1) output schemas are completely undocumented, callers cannot know what fields to expect from tool responses; (2) parameter descriptions, while present, lack detail about constraints, formats, and usage patterns; (3) no error handling guidance or recovery instructions; (4) responses are not shaped, the code shows raw Slack API responses being returned, including verbose pagination internals and metadata irrelevant to chat; (5) no mention of pagination response structure or next_cursor field format in descriptions; (6) missing guidance on when to call each tool vs. similar alternatives. Per-tool scores range from 62-75, averaging 68. This is a solid C+/B- implementation, functional but not production-polished.
Add a reaction emoji to a message
Get recent messages from a channel
Get all replies in a message thread
Get detailed profile information for a specific user
Get a list of all users in the workspace with their basic profile information
List public or pre-defined channels in the workspace with pagination
Output schemas completely undocumented for all 8 tools. Callers cannot know what fields, structure, or nested properties to expect from responses. This violates the pattern:tool requirement that output must be documented so LLMs can plan downstream tool calls and extract the right data.
Tool descriptions do not guide LLM selection. Descriptions should answer: What does it do? When should I call it instead of a similar tool? What does it return? Current descriptions lack context for disambiguation between similar tools (e.g., difference between slack_get_users and slack_get_user_profile is unclear).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 18 | - | v1 |
Post a new message to a Slack channel
Reply to a specific message thread in Slack
No error handling or recovery guidance. Tools do not describe what errors can occur (invalid channel, permission denied, user not found, rate limit, etc.) or what the LLM should do next. Current code returns raw API responses without error classification.
Parameter descriptions lack format and constraint details. Example: thread_ts format is described in prose (verbose timestamp explanation) instead of using JSON Schema pattern. limit parameters lack explicit bounds. reaction parameter does not explain valid emoji name format. These omissions force LLMs to guess valid input.
Responses are not shaped, raw Slack API responses are returned without stripping pagination metadata, internal fields, or irrelevant data. This violates mxe:strip-api-responses (APIs return verbose metadata irrelevant to chat). High token count dilutes signal and risks context window exhaustion.
Write operations (post_message, reply_to_thread, add_reaction) do not document that they modify state or have side effects. Descriptions should state WHAT changes and WHEN the LLM should be careful about retries. No confirmation or dry-run pattern exists for destructive actions.
Pagination behavior not documented. slack_list_channels and slack_get_users accept cursor and limit, but descriptions do not explain cursor format, what constitutes end-of-results, or whether a next_cursor field is returned. slack_get_channel_history has no pagination parameters despite potentially large result sets.
Missing tool composition guidance. No documentation on which tools chain together (e.g., does list_channels return channel_id in a format that post_message accepts? Do get_users and get_user_profile return consistent user_id formats?). This forces agents to guess or attempt mismatched chains.