Slack MCP Server
Pricing
Pay per usage
Slack MCP Server
MCP server for Slack workspaces. Read channel history, search messages, fetch thread replies, list users and channels, and post messages. Supports OAuth, Bot, and browser token authentication. Based on korotovsky/slack-mcp-server with 600+ GitHub stars.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
CQ
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
0
Monthly active users
20 days ago
Last modified
Categories
Share
A Slack integration Actor exposing Model Context Protocol (MCP) style tools for Slack workspaces. Read channel history, fetch threads, search messages, list channels and users, and (optionally) post messages — all via a single
actioninput, with results written to the Actor dataset.
Overview
This Actor is a standalone TypeScript implementation that calls the Slack Web API directly. Each run executes one tool (selected by the action input) and pushes the results to the Actor's dataset, with a run summary stored in the key-value store under OUTPUT.
Tool names follow the community Slack MCP convention (conversations_history, conversations_replies, etc.) so the Actor is easy to slot into MCP-oriented automations, but it is not a wrapper around any third-party server.
At a glance
| 5 tools | conversations_history, conversations_replies, conversations_add_message, conversations_search_messages, channels_list |
| 2 resource listings | list_users, list_channels |
| 3 auth modes | OAuth user token (xoxp), Bot token (xoxb), Browser tokens (xoxc + xoxd) |
| Flexible limits | Time-based (1d, 7d, 1m) or count-based, depending on the tool |
| Safe by default | Message posting is disabled unless explicitly enabled |
If you run the Actor without a token, it does not fail — it returns a server_info capability record (list of tools and auth modes) to the dataset and OUTPUT so you can inspect what it does before authenticating.
Quick Start
1. Get a Slack token
Option A — OAuth user token (recommended, full access)
- Go to api.slack.com/apps and create/select an app.
- Open OAuth & Permissions and add the scopes you need, e.g.
channels:history,channels:read,groups:read,users:read,search:read, andchat:write(only if posting). - Install to the workspace and copy the User OAuth Token (starts with
xoxp-).
Option B — Bot token
- Use a Bot token (
xoxb-) for automated integrations. - Note: bot tokens cannot search messages (Slack's
search.messagesrequires a user token).
Option C — Browser tokens (stealth)
- Open Slack in a browser and press F12.
- Application → Cookies → copy the
dcookie value → use asxoxdToken. - In the Console run:
JSON.parse(localStorage.localConfig_v2).teams[Object.keys(JSON.parse(localStorage.localConfig_v2).teams)[0]].token
- Copy the
xoxc-*value → use asxoxcToken. Bothxoxcandxoxdare required together.
2. Run the Actor
{"authMode": "oauth","xoxpToken": "xoxp-your-token-here","action": "conversations_history","channelId": "#general","limit": "7d"}
Tools
The action field selects which tool runs. channelId accepts a channel ID (C01234567), #channel-name, @username (opens a DM), or a bare channel name.
conversations_history
Retrieve messages from a channel or DM.
channelId(required) — channel ID or namelimit— time range (1d,7d,1m) or a message count. Default1dincludeActivityMessages— include join/leave/topic messages (defaultfalse)
conversations_replies
Get the replies in a thread.
channelId(required) — channel containing the threadthreadTs(required) — parent message timestamp (e.g.1234567890.123456)limit— message count (numeric only for this tool)includeActivityMessages— defaultfalse
conversations_search_messages
Search messages across the workspace. Requires an OAuth (xoxp) or browser token — not a bot token.
searchQuery— text to search for (defaults to*if omitted)filterInChannel— restrict to a channelfilterFromUser— messages from a userfilterWithUser— conversations with a userfilterDateAfter/filterDateBefore—YYYY-MM-DDrangefilterThreadsOnly— only threaded messages (defaultfalse)limit— max results (default20)
channels_list
List channels in the workspace.
channelTypes— comma-separated types (defaultpublic_channel,private_channel)sortBy—defaultorpopularity(by member count). Defaultdefaultlimit— max results (default100, capped at 999)
conversations_add_message
Post a message to a channel or thread. Disabled unless enableMessagePosting is true.
channelId(required) — target channelmessageText(required) — message contentthreadTs— optional; reply in a threadmessageContentType—text/markdown(default) ortext/plainallowedPostingChannels— optional comma-separated whitelist of channel IDs
Resource listings
| Action | Purpose |
|---|---|
list_users | List all (non-deleted) users in the workspace (id, name, real name, display name, email, bot/admin flags, timezone) |
list_channels | List channels including public, private, IM and MPIM conversations |
Input Reference
| Parameter | Type | Default | Notes |
|---|---|---|---|
action | string (enum) | channels_list | Required. Tool to run (see above) |
authMode | string (enum) | oauth | oauth, bot, or browser |
xoxpToken | string (secret) | — | User OAuth token (OAuth mode) |
xoxbToken | string (secret) | — | Bot token (Bot mode) |
xoxcToken | string (secret) | — | Browser token (Browser mode) |
xoxdToken | string (secret) | — | Browser d cookie; required with xoxc |
channelId | string | — | Channel ID / #name / @user / bare name |
threadTs | string | — | Thread timestamp for replies |
limit | string | 1d | Time range or count (tool-dependent) |
channelTypes | string | public_channel,private_channel | For channels_list |
sortBy | string (enum) | default | default or popularity |
searchQuery | string | — | Search text |
filterInChannel | string | — | Search: restrict to channel |
filterFromUser | string | — | Search: from a user |
filterWithUser | string | — | Search: with a user |
filterDateAfter | string | — | Search: after YYYY-MM-DD |
filterDateBefore | string | — | Search: before YYYY-MM-DD |
filterThreadsOnly | boolean | false | Search: only threads |
messageText | string | — | Message body (posting) |
messageContentType | string (enum) | text/markdown | text/markdown or text/plain |
enableMessagePosting | boolean | false | Must be true to post |
allowedPostingChannels | string | — | Whitelist of channel IDs for posting |
includeActivityMessages | boolean | false | Include join/leave/topic messages |
proxyUrl | string | — | Proxy URL (accepted in input) |
logLevel | string (enum) | info | debug, info, warn, error |
Output
Results are written to two storages:
- Dataset — one item per result (message, channel, or user), each annotated with the
actionthat produced it and a_timestamp. See the dataset schema for the full field list and the Messages / Channels / Users views. - Key-value store
OUTPUT— a run summary:success,action,resultCount,hasMore,cursor, and a human-readablesummary(orsuccess: falsewith anerrormessage on failure).
Example dataset items
Message:
{"action": "conversations_history","channelId": "C01234567","user": "U01234567","text": "Message content here","timestamp": "1234567890.123456","thread_ts": "1234567890.123456"}
Channel:
{"action": "channels_list","id": "C01234567","name": "general","topic": "General discussion","memberCount": 150}
Use Cases
| Use Case | Description |
|---|---|
| AI/agent Slack access | Give an AI agent read (and optional write) access to a workspace via MCP-style tools |
| Channel analytics | Export message history for analysis |
| Search automation | Find messages matching specific criteria |
| Archival | Save channel history and search results to Apify datasets |
| Notifications | Post automated updates to allow-listed channels |
Safety Features
- Message posting disabled by default — must set
enableMessagePosting: true. - Channel whitelist — restrict posting to specific channel IDs with
allowedPostingChannels. - Secret inputs — tokens are marked secret and are only used during the run.
- Activity filtering — join/leave/topic messages are filtered out unless
includeActivityMessagesis set.
Limitations
- A valid Slack token is required to perform any operation. Without a token the Actor returns only its capability info. Each tool needs the corresponding scopes (e.g.
channels:history,channels:read,groups:read,users:read,search:read,chat:write). - Bot tokens cannot search —
conversations_search_messagesrequires an OAuth (xoxp) or browser token; using a bot token returns a clear error. - Browser tokens expire —
xoxc/xoxdvalues are session-bound and must be re-extracted periodically; both are required together. - Posting is gated —
conversations_add_messagefails unlessenableMessagePostingistrue, and is further restricted byallowedPostingChannelswhen set. - Private channels and DMs require the token's identity to be a member.
- Slack rate limits apply — Slack tiers its Web API methods; large workspaces may require paginating with the returned
cursor. - Single tool per run — this Actor is request/response: one
actionexecutes per run and results go to the dataset. It is not a persistent/standby MCP transport and does not hold an open stdio/HTTP MCP session.
Pricing
This Actor runs on the Apify platform and consumes standard platform resources (compute units and, if configured, proxy). You are billed according to your Apify plan's usage-based pricing; there are no additional per-result fees from the Actor itself.
Resources
License
MIT License.

