slack-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SLACK_MCP_CONFIG | No | Overrides the default config path for the workspaces TOML file (default: ~/.config/slack-mcp/workspaces.toml). |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_workspacesA | List the Slack workspaces configured in workspaces.toml (names + descriptions). Call this first to discover the |
| check_accessA | Report the OAuth scopes a workspace's token has, and which tools it can use. Call this to confirm the Slack app was installed with the scopes a feature
needs — e.g. Args: workspace: configured workspace name. |
| search_messagesA | Search messages across a workspace (Slack search operators supported). Args: workspace: configured workspace name. query: Slack search query, e.g. 'in:#general from:@alice variant calling'. count: max matches to return (1-100). sort: 'score' (relevance) or 'timestamp' (newest first). |
| read_channelA | Read recent message history from a channel (by ID or #name). Args: workspace: configured workspace name. channel: channel ID (C…/G…/D…) or a name like '#general'. limit: max messages, newest first (1-200). oldest: optional lower-bound Slack ts (inclusive). latest: optional upper-bound Slack ts. |
| read_threadB | Read all replies in a thread. Args: workspace: configured workspace name. channel: channel ID (C…/G…/D…) or a name like '#general'. thread_ts: the ts of the thread's parent message. limit: max messages (1-1000). |
| list_channelsA | List channels in a workspace, optionally filtered by a name substring. Args: workspace: configured workspace name. name_filter: case-insensitive substring to match channel names (empty = all). types: comma-separated: public_channel, private_channel, mpim, im. limit: max channels to return after filtering (1-1000). |
| get_userA | Look up a user by Slack ID (U…) or email address. Args: workspace: configured workspace name. user: a user ID (U…/W…) or an email address. |
| download_fileA | Download a Slack file by its file ID. Resolves the file via files.info, then fetches url_private_download with the workspace's Bearer token. Images are returned inline (downscaled to fit size limits) AND a full-resolution copy is saved to disk. Other files are saved to ~/slack-downloads/// and the path is returned. Args: workspace: configured workspace name. file_id: the Slack file ID (e.g. 'F0123ABCD'), as found in message file metadata. |
| draft_messageA | Preview a message WITHOUT sending it. Resolves the channel and echoes the target. Use this to review exactly where a message would go before calling send_message. Args: workspace: configured workspace name. channel: channel ID (C…/G…/D…) or a name like '#general'. text: the message body (Slack mrkdwn). |
| send_messageA | Send a message to a channel — ONLY when confirm=True. With confirm=False (the default) nothing is sent: the tool echoes back the workspace, resolved channel, text, and any attachment so they can be verified first. Call again with confirm=True to actually post. Pass Args: workspace: configured workspace name. channel: channel ID (C…/G…/D…) or a name like '#general', or a user ID (U…/W…) to DM that person. text: the message body (Slack mrkdwn). May be empty when file_path is set. confirm: must be True to actually send; False returns a preview only. thread_ts: optional parent ts to reply in a thread. file_path: optional path to a local file to upload as an attachment. file_title: optional display title for the attachment (defaults to the filename). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 10 tools
Most tools target clearly distinct operations (search vs read vs list vs get vs download), and the workspace/channel argument patterns make intent clear. The one real ambiguity is draft_message versus send_message with confirm=False, which both produce a non-sending preview of the same message — an agent could reasonably pick either. read_channel and read_thread are close but adequately differentiated by thread_ts.
Every tool follows a clean verb_noun snake_case pattern: list_workspaces, search_messages, read_channel, read_thread, list_channels, get_user, download_file, draft_message, send_message. The single-word-ish check_access still fits the verb_noun shape. No camelCase or stylistic mixing.
Ten tools is well within the sweet spot and each maps to a concrete Slack workflow: discovery, access check, search, read, user lookup, file download, drafting, and sending. Nothing feels redundant or padded.
Read/search/send workflows are solid, but the surface is read-plus-post only: there is no update/edit message, delete message, or reaction tool, so an agent cannot correct or acknowledge messages. User discovery is also a gap — get_user requires an ID or email but there is no list_users, forcing agents to infer users from message metadata.