Production-ready Slack MCP Server built with TypeScript, Express, and the official MCP SDK
Strong foundation with all 7 tools properly named, described, and schematized. Tool names follow verb_noun convention (list_, get_, send_, search_). Descriptions are clear and action-oriented (avg ~100 chars, within 10-1024 baseline). All parameters have type definitions and descriptions. Pagination support present (limit, cursor). However, output schemas are not explicitly documented in the source, responses are JSON-stringified without formal schema declarations. Error handling returns isError flag but lacks recovery guidance (e.g., 'Try search_users() first'). No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Parameter constraints could be more explicit (e.g., limit ranges stated in descriptions but not as JSON Schema min/max).
Fetch recent messages from a Slack channel, optionally bounded by a time range.
Fetch all replies in a Slack message thread.
Get profile details for a specific Slack user by ID.
List public and private channels in the connected Slack workspace, with pagination support.
List members of the connected Slack workspace, excluding bots and deleted users by default.
Search messages across the Slack workspace using Slack search syntax.
Output schemas not formally documented. Responses are JSON-stringified text without declared return types. LLMs cannot plan downstream tool calls or extract structured fields reliably.
Error responses lack recovery guidance. Errors return isError=true with message text only. No actionable next steps (e.g., 'User not found. Try search_users() with a partial name.').
No tool annotations despite clear risk classifications. slack_send_message is WRITE (destructive), but no destructiveHint annotation. Agents cannot distinguish safe read-only tools from state-modifying ones.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Post a message to a Slack channel, optionally as a threaded reply.
Parameter constraints stated in descriptions but not formalized in JSON Schema. E.g., 'limit' (1-200) lacks min/max in schema. LLMs cannot validate before calling.
No confirmation/dry-run pattern for destructive operations. slack_send_message has no preview or confirmation step before posting.