Slack MCP Server
Let Claude Code and Cursor read channels, search messages, and post to Slack from the editor.
Updated: April 15, 2026
Install
{
"mcpServers": {
"mcp-server-slack": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-slack"
],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-token",
"SLACK_TEAM_ID": "T0YOURTEAM"
}
}
}
}Capabilities
- + List channels the bot is a member of
- + Read message history from any accessible channel
- + Send messages to channels and direct messages
- + Search messages across the workspace
- + Get user profile information by ID or email
- + React to messages with emoji reactions
Limitations
- - Requires a Slack app install with a bot token
- - Cannot create new channels from the API
- - Limited to workspaces where the bot is explicitly installed
- - DM access requires `im:history` and related OAuth scopes
Slack MCP server setup for Claude Code and Cursor
Quick answer: The Slack MCP server connects Claude Code or Cursor to a Slack workspace using a bot token. The model can list channels, read history, post messages, search, and react. You need to create a Slack app, add the right OAuth scopes, install it to your workspace, and copy the bot token into the MCP config. Setup takes about 10 minutes. Tested April 15, 2026 with server version 0.6.2.
For status updates, standups, and quick team questions, this server turns "open Slack, type, wait" into a single line in the model chat. For research, it lets the model find that one message from 3 weeks ago where someone posted the right answer.
This guide covers app creation, scope selection, both editor configs, 7 example prompts, and the OAuth error you will hit at least once.
What this server does
The server wraps the Slack Web API with about 9 MCP tools: slack_list_channels, slack_post_message, slack_reply_to_thread, slack_add_reaction, slack_get_channel_history, slack_get_thread_replies, slack_get_users, slack_get_user_profile, and slack_search. Plenty of coverage for most automation.
What works well:
- Drafting and posting status updates to a channel
- Searching for a specific message or thread by keyword
- Reading the last 50 messages in a channel to build context
- Reacting to messages with emoji (e.g. :white_check_mark: when a task ships)
- Pulling user info by email to route notifications
What does not:
- Creating channels, archiving them, or managing membership
- Editing or deleting messages posted by other users
- File uploads beyond a small size limit
- Calls, huddles, or anything outside the Web API surface
Installing the Slack MCP server
The package is @modelcontextprotocol/server-slack. Standard npx -y pattern. The install pulls about 4 MB.
Before the MCP config, you need a Slack app:
- Open https://api.slack.com/apps and click "Create New App" then "From scratch".
- Name it (something like "Claude MCP") and pick the target workspace.
- Under "OAuth & Permissions", add bot token scopes. The minimum set:
channels:history,channels:read,chat:write,reactions:write,search:read,users:read,users:read.email. Addim:history,im:read,im:writeif you want DM access. Addgroups:historyandgroups:readfor private channels. - Click "Install to Workspace" and approve.
- Copy the bot token (starts with
xoxb-). - Grab the team ID from the workspace URL or the "Basic Information" page (starts with
T).
For private channels and DMs, you also need to invite the bot to each target channel with /invite @your-bot-name. The bot cannot read channels it is not a member of, even with the right scopes.
Configuring for Claude Code
Claude Code reads from ~/.claude/mcp.json or a per-project .mcp.json. Add a slack entry:
{
"mcpServers": {
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-token",
"SLACK_TEAM_ID": "T0YOURTEAM"
}
}
}
}
Restart Claude Code. Run /mcp and check that the 9 Slack tools are listed.
Do not commit the bot token to git. Slack's secret scanner will usually catch it and revoke within a few minutes, but rotation is an avoidable hassle.
Configuring for Cursor
Cursor reads from ~/.cursor/mcp.json on macOS and Linux, or %USERPROFILE%\.cursor\mcp.json on Windows. Same JSON:
{
"mcpServers": {
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-token",
"SLACK_TEAM_ID": "T0YOURTEAM"
}
}
}
}
Toggle on in Cursor settings. First API call takes 2 to 3 seconds on cold start, then Slack API calls land in 200 to 400 ms.
Example prompts and workflows
Prompts that work:
- "Post a status update to #team-engineering summarizing the 3 PRs I merged today."
- "Search Slack for messages mentioning
rate limitin the last 7 days and list the threads." - "Read the last 30 messages in #bugs and tell me which issues are still open."
- "Find the Slack user whose email is alice@acme.com and DM them 'your PR is ready to review'."
- "React with :eyes: on the most recent message in #deploys."
- "Summarize the thread under the message with timestamp 1733155432.000100 in #incidents."
- "Post a daily standup to #engineering with what I did yesterday, what I am doing today, and any blockers - pull the context from my recent Claude Code sessions."
For recurring patterns (daily standup, weekly release notes), wrap the prompt in a Claude Code slash command or a saved prompt template. The model will use the Slack MCP tools every time without re-explaining the workflow.
Troubleshooting
not_authed or invalid_auth. The bot token is wrong, expired, or was revoked. Get a fresh one from the "Install App" page of your Slack app settings.
missing_scope. The app does not have the OAuth scope the tool needs. Open the "OAuth & Permissions" page, add the missing scope, and reinstall the app. The error message tells you which scope is missing.
channel_not_found. Bot is not a member of the channel, or the channel is private and you did not grant groups:read. Invite the bot with /invite @bot-name.
Message does not appear. For private channels, the bot needs chat:write and membership. For DMs, the bot needs im:write and the target user must have messaged the bot at least once, or you need to use conversations.open first.
Rate limit hit. Slack allows around 1 message per second per channel for most methods. The server does not auto-retry - the model sees the error. For bulk posting, ask the model to throttle explicitly.
Bot cannot search older messages. The search API is limited by your workspace's message retention policy. Free workspaces cap at 90 days. Paid workspaces vary by plan.
Alternatives
A few related servers:
discord-mcpfor Discord workspaces with a similar shapeintercom-mcpfor customer conversationsmailchimp-mcporresend-mcpfor email instead of chat- Zapier or Make webhooks if you want no-code routing between Slack and other tools
The official Slack MCP server is the right pick for any team already on Slack that wants its coding agent to see and post updates. Setup is the slowest step because of Slack's app model, but it is a one-time cost. The verdict from 2 months of daily use: attach Slack for any role where status updates matter - engineering managers, on-call engineers, and anyone who runs a weekly async standup benefit the most.
Guides
Frequently asked questions
Can I use a user token instead of a bot token?
Yes, set `SLACK_USER_TOKEN` starting with `xoxp-` instead of `SLACK_BOT_TOKEN`. User tokens see everything the user sees, including private DMs. That is a bigger blast radius so only use user tokens on machines you fully control.
How do I let the bot DM users?
Add the `im:write` scope to the app, reinstall, and the bot can open a DM with any user in the workspace. The target user does not need to message the bot first - `conversations.open` creates the DM channel.
Does the server support Slack Enterprise Grid?
Yes, but each workspace in the grid needs its own app install. The `SLACK_TEAM_ID` in the config binds the server to one workspace at a time. Run 2 MCP server entries with different team IDs to cover 2 workspaces.
Can the model edit messages it posted earlier?
The stock server does not expose `chat.update`, so the model cannot edit after posting. To edit, use the Slack API directly or fork the server. Most automations post to threads instead of editing, which avoids the issue.
How do I handle Slack attachments and rich blocks?
The `slack_post_message` tool takes plain text plus an optional `blocks` array for Block Kit rich layouts. Ask the model to 'format the update as Block Kit with a header and 3 bullet sections' and it will produce the right structure.
Why does `slack_search` return fewer results than the Slack UI?
The search API respects the bot's channel membership and message visibility. The UI uses your human user account which sees more channels. Invite the bot to the channels you want searchable, or use a user token for full visibility.