A high-performance Slack MCP Server written in Go. Provides MCP tools for posting messages, retrieving history, replying to threads, and managing reactions in Slack channels.
This server has solid tool definitions with consistent naming, good descriptions, and proper schema registration. All 5 tools follow verb_noun naming convention (slack_post_message, slack_get_history, etc.). Tool descriptions are well-written (140-200 chars) and explain WHAT the tool does, WHEN to use it, and prerequisites. All parameters have type declarations and descriptions. However, there are gaps: output schemas are not formally documented in the tool definitions (only inferred from handler code), error handling lacks recovery guidance and categorization, and some parameter constraints could be more explicit (e.g., limit ranges as enums rather than text descriptions).
Add a reaction (emoji) to a message in a Slack channel. Use emoji names without colons (e.g. 'thumbsup', not ':thumbsup:'). If channel is omitted, uses the configured default channel. The bot must be invited to the target channel first. Requires the 'reactions:write' OAuth scope.
Get message history from a Slack channel. Returns recent messages with user names, timestamps, and permalinks. If channel is omitted, uses the configured default channel. The bot must be invited to the target channel first.
Post a message to a Slack channel. Supports Slack mrkdwn formatting (bold, italic, links, code blocks). If channel is omitted, posts to the configured default channel. The bot must be invited to the target channel first.
Post a reply to an existing message thread in a Slack channel. Supports Slack mrkdwn formatting. If channel is omitted, uses the configured default channel. The bot must be invited to the target channel first.
Remove a reaction (emoji) from a message in a Slack channel. Use emoji names without colons (e.g. 'thumbsup', not ':thumbsup:'). Can only remove reactions that were added by the bot. If channel is omitted, uses the configured default channel. The bot must be invited to the target channel first. Requires the 'reactions:write' OAuth scope.
Output schemas not formally documented in tool definitions. The handlers return structured JSON (e.g., map[string]any with 'ok', 'channel', 'ts', 'message', 'permalink'), but these schemas are not visible in the tool registration code. LLMs cannot reliably infer the response structure without explicit documentation.
Error responses lack recovery guidance. The code returns appErr.FormatForMCP() for validation errors (e.g., empty message, missing thread_ts), but the error format is not visible. LLMs need actionable error messages like 'Message cannot be empty. Provide the message parameter.' to self-correct.
Parameter constraints described as text rather than formal schema constraints. The 'limit' parameter description says '1-100' and 'defaults to 10', but no min/max bounds are visible in the mcp.WithNumber() call. LLMs may pass invalid values (e.g., limit=500) that the API rejects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 11 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
No explicit error classification (retryable vs. user-fixable vs. fatal). The code handles errors generically via handleAppError(). LLMs cannot determine if a Slack API 429 (rate limit) is retryable or if a 'channel not found' is fatal without explicit error codes and guidance.
Emoji name constraint not enforced. The 'reaction' parameter description references a cheat sheet and says 'without colons', but there is no enum, pattern, or validation visible. LLMs could pass invalid emoji names like ':thumbsup:' or 'invalid_emoji' that Slack rejects.