Slack MCP Server

Read, search and post in a Slack workspace, including DMs, threads, unreads and user groups

By Dmitrii Korotovskii (individual) Go Local · stdio Communication

84 popularity score ★ 1.9k ↓ 54k/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add slack -- npx -y slack-mcp-server@latest --transport stdio
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": [
        "-y",
        "slack-mcp-server@latest",
        "--transport",
        "stdio"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": [
        "-y",
        "slack-mcp-server@latest",
        "--transport",
        "stdio"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "slack": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "slack-mcp-server@latest",
        "--transport",
        "stdio"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.slack]
command = "npx"
args = ["-y", "slack-mcp-server@latest", "--transport", "stdio"]
Gemini CLITerminal
gemini mcp add --scope user slack npx -- -y slack-mcp-server@latest --transport stdio
Local (container)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add slack -- docker run -i --rm -e SLACK_MCP_XOXP_TOKEN ghcr.io/korotovsky/slack-mcp-server --transport stdio
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "slack": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "SLACK_MCP_XOXP_TOKEN",
        "ghcr.io/korotovsky/slack-mcp-server",
        "--transport",
        "stdio"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "slack": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "SLACK_MCP_XOXP_TOKEN",
        "ghcr.io/korotovsky/slack-mcp-server",
        "--transport",
        "stdio"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "slack": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "SLACK_MCP_XOXP_TOKEN",
        "ghcr.io/korotovsky/slack-mcp-server",
        "--transport",
        "stdio"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.slack]
command = "docker"
args = ["run", "-i", "--rm", "-e", "SLACK_MCP_XOXP_TOKEN", "ghcr.io/korotovsky/slack-mcp-server", "--transport", "stdio"]
Gemini CLITerminal
gemini mcp add --scope user slack docker -- run -i --rm -e SLACK_MCP_XOXP_TOKEN ghcr.io/korotovsky/slack-mcp-server --transport stdio

Settings 24

SLACK_MCP_XOXP_TOKEN Optional: User OAuth token (xoxp-...). One of xoxp, xoxb or the xoxc/xoxd pair is needed.
SLACK_MCP_XOXB_TOKEN Optional: Bot token (xoxb-...); invited channels only, no search.
SLACK_MCP_XOXC_TOKEN Optional: Browser session token (xoxc-...), used with SLACK_MCP_XOXD_TOKEN.
SLACK_MCP_XOXD_TOKEN Optional: Browser cookie d (xoxd-...), used with SLACK_MCP_XOXC_TOKEN.
SLACK_MCP_PORT Optional: Listen port for SSE/HTTP, default 13080.
SLACK_MCP_HOST Optional: Listen host for SSE/HTTP, default 127.0.0.1.
SLACK_MCP_API_KEY Optional: Bearer token clients must send to the SSE and HTTP transports.
SLACK_MCP_PROXY Optional: Proxy URL for outgoing requests.
SLACK_MCP_USER_AGENT Optional: Custom User-Agent, for Enterprise Slack.
SLACK_MCP_CUSTOM_TLS Optional: Send a browser-like TLS handshake, for Enterprise Slack.
SLACK_MCP_SERVER_CA Optional: Path to a CA certificate.
SLACK_MCP_SERVER_CA_TOOLKIT Optional: Add the HTTPToolkit CA for traffic debugging.
SLACK_MCP_SERVER_CA_INSECURE Optional: Trust all certificates; its docs advise against it.
SLACK_MCP_ADD_MESSAGE_TOOL Optional: Turn on conversations_add_message: true, a channel ID list, or !ID exclusions.
SLACK_MCP_ADD_MESSAGE_MARK Optional: Mark sent messages as read.
SLACK_MCP_ADD_MESSAGE_UNFURLING Optional: Allow link previews in posts, for all or listed domains.
SLACK_MCP_REACTION_TOOL Optional: Turn on reactions_add and reactions_remove, for all or listed channels.
SLACK_MCP_ATTACHMENT_TOOL Optional: Turn on attachment_get_data.
SLACK_MCP_MARK_TOOL Optional: Turn on conversations_mark.
SLACK_MCP_USERS_CACHE Optional: Path of the users cache file.
SLACK_MCP_CHANNELS_CACHE Optional: Path of the channels cache file.
SLACK_MCP_LOG_LEVEL Optional: Log level, default info.
SLACK_MCP_GOVSLACK Optional: Send calls to slack-gov.com for GovSlack workspaces.
SLACK_MCP_ENABLED_TOOLS Optional: Comma-separated list of tools to register.

In a container, a setting goes in with -e NAME=value after docker run.

What it does

Slack MCP Server connects an MCP client to one Slack workspace. It reads channel and DM history with paging by time span or message count, follows threads, runs Slack's message search with filters for channel, person and date, collects unread messages across channels with DMs first, and lists channels, users and user groups. Channels and people can be named as #name or @name instead of IDs, and two resources give the whole channel and user directories as CSV.

It can also act in the workspace: post messages, add or remove reactions, mark conversations read, join or leave channels, create and edit user groups, and manage items in Slack's Save for Later list. Posting, reactions, attachment download and mark-as-read stay off until a setting turns them on, and posting and reactions can be limited to a list of channels. Joining and leaving channels and the user-group tools are registered by default; SLACK_MCP_ENABLED_TOOLS narrows the set.

It signs in one of three ways: a user OAuth token (xoxp), a bot token (xoxb), or the xoxc token and d cookie copied out of a logged-in Slack browser session, which its makers call stealth mode because no Slack app has to be installed or approved. Which tools work depends on the token. It is written in Go, published on npm as a wrapper that runs the binary and as a container image on ghcr.io, speaks stdio, SSE or streamable HTTP, supports GovSlack (slack-gov.com) workspaces, and can route traffic through a proxy. Its README states that it is not an official Slack product.

What it needs

RuntimeNode.jsorDocker

A Slack workspace and one credential: a user OAuth token (xoxp) or bot token (xoxb) from a Slack app you create with the listed scopes, or the xoxc token and d cookie from a browser session. Node.js for npx, or Docker for the ghcr.io image. Enterprise Slack may need SLACK_MCP_USER_AGENT and SLACK_MCP_CUSTOM_TLS set.

Limits

Bot tokens see only channels the bot was invited to and cannot use conversations_search_messages or conversations_unreads. saved_list, saved_update and saved_clear_completed work only with browser session tokens; the mentions_only unread filter too. With xoxp, conversations_unreads makes one call per channel and is slow on large workspaces. Without the users and channels caches, channels_list does not work and #name/@name lookups fail. attachment_get_data stops at 5 MB. Leaving #general is refused. The README's tool list omits four tools the source registers.

Who it suits

Suits someone who wants an assistant to read, search and triage their own Slack, including DMs and unreads, and who can either create a Slack app or is willing to use their browser session tokens. The session-token route avoids admin approval, but it acts with your full user access and may conflict with your workspace's policies, so a user or bot token is the cleaner pick where an app can be approved. It is a third-party project, not Slack's own; anyone who needs a vendor-supported integration should look for one from Slack. Write tools beyond joining channels and user groups need to be switched on, which suits cautious read-first use.

Tools 22

conversations_history
Fetch messages from a channel or DM, paged by time span or count.
conversations_replies
Fetch the replies in one thread.
conversations_add_message
Post a message to a channel, DM or thread; off unless enabled, can be limited to chosen channels.
conversations_search_messages
Search messages with filters for channel, DM, user, date and threads, or fetch one message by its link. Not with bot tokens.
conversations_unreads
Collect unread messages across conversations, DMs first, optionally only where you are mentioned.
conversations_mark
Mark a channel or DM read up to a message; off unless enabled.
conversations_join
Join a public channel.
conversations_leave
Leave a channel, group conversation or DM.
channels_list
List public, private, DM and group DM channels, optionally by member count.
channels_me
List only the channels you belong to.
reactions_add
Put an emoji reaction on a message; off unless enabled.
reactions_remove
Take an emoji reaction off a message; off unless enabled.
attachment_get_data
Download a shared file by ID, up to 5 MB; off unless enabled.
users_search
Find people by name, display name or email, with their DM channel ID.
usergroups_list
List the workspace's user groups, with counts or member IDs.
usergroups_create
Create a user group with handle, description and default channels.
usergroups_update
Change a user group's name, handle, description or default channels.
usergroups_users_update
Replace the full member list of a user group.
usergroups_me
List your user groups, or join or leave one.
saved_list
List items in Save for Later, optionally with message text. Session tokens only.
saved_update
Mark a saved item done or set its due date. Session tokens only.
saved_clear_completed
Remove every completed item from Save for Later. Session tokens only.

Similar servers