slack-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SLACK_USER_TOKEN | Yes | Your Slack User OAuth Token (xoxp-…) used to act as you in Slack. The token is read from the SLACK_USER_TOKEN environment variable only and sent in the Authorization header to slack.com/api/. |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| conversations_historyA | Messages in a channel or DM as CSV, newest first. limit: a count ('50') or a window ('1d', '2w', '3m', counted from local midnight); leave it empty when passing cursor. A non-empty Cursor column on the last row means more results: pass it back as cursor, which keeps the original window and page size. |
| conversations_repliesB | A thread (parent plus replies) as CSV. thread_ts: the parent's ts, e.g. 1234567890.123456. limit and cursor work as in conversations_history. |
| conversations_add_messageB | Post a message as you. content_type: 'text/markdown' (standard markdown, rendered by Slack) or 'text/plain'. blocks: a Block Kit array, which takes precedence; text then becomes the notification fallback. Link and media unfurling is off. |
| conversations_search_messagesA | Search messages as CSV. search_query may carry Slack modifiers (in:, from:, before:, …) or be a message URL, which returns that one message. Users: ID, @handle or name. Channels: ID or #name. Dates: YYYY-MM-DD, today, yesterday, 'N days ago', 'July 2026' (during: the whole month) or a month name (during only). limit: 1-100; a cursor replays the original query and page size; filters passed with it are ignored. |
| users_searchA | Find users by ID, handle, display name, real name or email (case-insensitive substring) as CSV, with the DM channel ID when one exists. |
| channels_listB | Workspace channels as CSV. channel_types: comma-separated public_channel, private_channel, im, mpim. query: case-insensitive substring over query_targets (name, topic, purpose). sort: 'popularity' (member count). |
| channels_meB | Conversations you are a member of, as CSV. channel_types as in channels_list. |
| usergroups_listB | User groups (@mention groups) as CSV: id, name, handle, description, user_count, users (if include_users). |
| usergroups_meA | User groups you belong to, as CSV. |
| reactions_addB | Add an emoji reaction (name without colons) to a message. |
| reactions_removeB | Remove your emoji reaction from a message. |
| schedule_messageB | Schedule a message up to 120 days ahead. post_at: Unix seconds or ISO-8601 with offset. |
| list_scheduled_messagesC | Your pending scheduled messages, optionally for one channel. |
| delete_scheduled_messageB | Cancel a scheduled message before it posts. |
| canvas_createA | Create a canvas from markdown. channel_id tabs it in that channel; omit for a standalone canvas. |
| canvas_editA | Apply one edit. operation: insert_at_start|insert_at_end|insert_before|insert_after|replace|delete|rename. insert_before/insert_after/delete need section_id (canvas_find_sections); replace without section_id replaces the whole canvas; rename uses markdown_content as the new title. |
| canvas_find_sectionsB | Find section IDs in a canvas by text and/or type (h1, h2, h3, any_header, list, table, ...). |
| canvas_readC | A canvas's title and text content. |
| list_createC | Create a Slack List. schema: [{"key","name","type":"text|date|select|user|...","is_primary_column"?,"options"?}]. |
| list_itemsC | A List's items; include_list also returns its columns (column_id values for writes). |
| list_item_createB | Add an item. initial_fields: [{"column_id", : value}]; text columns take "rich_text" blocks. |
| list_items_updateC | Update up to 100 cells: [{"row_id","column_id", : value}]. |
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 22 tools
Most tools target a clear resource+action (reactions_add/remove, canvas_create/edit/read, conversations_history/replies/search). The main confusion is the 'list_' prefix colliding between Slack Lists (list_create, list_items, list_item_create) and the verb 'list' (list_scheduled_messages, usergroups_list, channels_list), which can mislead at a glance. Descriptions largely resolve this, so ambiguity is minor.
The server mixes noun_verb (canvas_read, usergroups_list, reactions_add, schedule_message, list_create) with verb_noun (list_scheduled_messages, delete_scheduled_message, canvas_find_sections, users_search, channels_list). Individual names are readable but there's no single predictable pattern, and the overloaded 'list' token adds noise.
22 tools is on the heavy side but justified by covering several distinct Slack surfaces (canvas, lists, usergroups, reactions, scheduling, conversations, users, channels). Each tool maps to a real operation with little redundancy, so it stays reasonable for a product as broad as Slack.
Core read/write workflows are present (post, schedule, search, react, canvases, lists), but notable gaps exist: no edit/delete for posted messages, no channel management (create/join/leave), no file upload/download, and reactions only cover add/remove. These are workable-around but leave the surface incomplete for full Slack automation.