MCP server for Slack API integration with OAuth support, enabling conversation management, file operations, message search, and user administration
The server registers 8 tools with Slack API bindings. Tool names follow verb_noun conventions (list_conversations, fetch_history, search_messages, etc.), which is good. However, descriptions are inconsistent in depth and informativeness. Schemas are present for all tools using Zod validation, but descriptions lack actionable guidance on WHEN to use each tool versus similar ones, error recovery paths, and parameter relationships. Parameter descriptions are terse (10-30 chars typically), well below the 72-char baseline for A+ tools. Tools lack output schema documentation, making it hard for LLMs to plan downstream calls. Error handling is minimal: most failures surface as generic Slack API errors with no recovery guidance. Security is good: credentials injected via env var, no tokens in params. Most tools are read-only (low risk) except upload_file (WRITE). Overall quality is above-average for community servers but falls short of production grade.
Download a Slack-hosted file as a resource (not external GDrive/Dropbox links).
conversations.history for public/private/DM/MPIM.
files.info for a given file ID.
List channels/DMs visible to the user token.
List Slack-hosted files you can access; filter by channel/user/time/type.
Search Slack messages limited to one channel (public or private) by channel name (e.g. #general) or ID (C…/G…).
Output schemas not documented. Tool descriptions state WHAT the tool does (e.g. 'conversations.history') but not WHAT is returned. LLMs cannot plan downstream calls or extract required IDs without knowing response structure. All 8 tools return JSON but the response schema is opaque to the LLM.
Parameter descriptions are terse (avg 15-20 chars vs 72-char baseline). E.g. 'oldest' = 'Oldest message timestamp to include' lacks format guidance (is this ISO 8601? Unix timestamp? Slack message ts?). 'limit' descriptions miss actionable constraints like default=200 or explain why 1000 is the max.
No error recovery guidance. All tools throw generic Slack API errors (e.g. 'Slack search.messages error: unknown_error'). LLMs receive no actionable guidance on whether to retry, ask the user, or try a different tool. Missing pattern: recovery-guide.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 53 | - | v1 |
search.messages respecting your user visibility.
Upload a file. Provide either 'content' (text) or 'data_base64' (binary).
Tool descriptions lack disambiguation. Similar tools (search_messages vs search_in_channel vs fetch_history) are not contrasted. A description should answer: 'When should I use this instead of a similar tool?' E.g. slack_search_in_channel is constrained to one channel, but the description doesn't say 'Use this when you know the channel; use search_messages for cross-channel search.'
No input validation or actionable error messages. If an agent passes an invalid channel ID to slack_fetch_history, it gets a raw Slack API error. Should validate early and return 'Channel ID must start with C or G (e.g. C0123456789). Got: <value>.'
No tool annotations (readOnlyHint, destructiveHint). Most tools are read-only but this is not declared. The upload_file tool modifies state but is not marked destructiveHint=true. Modern MCP clients use annotations to warn before execution.
Parameter relationships undocumented. E.g. slack_list_files accepts both 'page' and 'cursor', which takes precedence? Should agents use one or the other? slack_upload_file accepts both 'content' (text) and 'data_base64' (binary), must exactly one be provided, or are they mutually exclusive? Missing dependency hints.
Pagination unclear. slack_list_conversations, slack_fetch_history, and slack_list_files all return pagination cursors, but docs don't explain the pattern: Does cursor persist across calls? What happens if you re-use an old cursor? How do you know when you've reached the end?