Skip to main content
Glama
Slack MCP Server

Slack MCP Server

by Arnabdaz

Slack MCP Server

Search and read public-channel Slack discussions about Jira tickets and PRs, and send/reply to messages only after an explicit two-step confirmation.

What it can and can't do

  • Reads public channels only. DMs, private channels, and group DMs are refused by a server-side guard — even though the user token could see them.

  • Search uses Slack's search.messages, which requires a user token.

  • Sending is two-step: draft_message returns a preview + one-time token; nothing posts until you call send_message with that token.

Related MCP server: Slack MCP Server

Slack app setup

  1. Create an app at https://api.slack.com/apps.

  2. Under OAuth & Permissions → User Token Scopes, add: search:read, channels:history, channels:read, users:read, chat:write.

  3. Install the app to your workspace and copy the User OAuth Token (xoxp-...).

Configuration

export SLACK_USER_TOKEN="xoxp-..."          # required
export SLACK_DRAFT_TTL_SECONDS=300           # optional, default 300

Run

uv sync
uv run slack-mcp

MCP client config

{
  "mcpServers": {
    "slack": {
      "command": "uv",
      "args": ["run", "slack-mcp"],
      "cwd": "/absolute/path/to/slack-mcp",
      "env": { "SLACK_USER_TOKEN": "xoxp-..." }
    }
  }
}

Tools

  • search_messages(query, count=20) — find messages in public channels.

  • read_thread(channel, thread_ts) — full thread with resolved names.

  • read_channel_history(channel, limit=30, around_ts=None) — recent/context.

  • list_channels(name_filter=None) — public channels.

  • resolve_users(user_ids) — ids → display names.

  • draft_message(channel, text, thread_ts=None) — preview + token; does NOT send.

  • send_message(confirmation_token) — sends the drafted message (only write path).

Available Tools

7 tools
draft_messageA

Prepare a message for sending and return a preview + confirmation token.

THIS DOES NOT SEND ANYTHING. It validates the target is a public channel, renders exactly what would be posted, and returns a one-time confirmation_token. To actually post, the user must review this preview and then call send_message(confirmation_token=...). Always show the user this preview and get their explicit approval before calling send_message.

Args: channel: Channel id or "#name". Must be a public channel. text: The exact message text to post. thread_ts: Optional thread root timestamp to reply in a thread.

Inputs: text (required), channel (required), thread_ts. Returns: object

list_channelsA
Read-only

List PUBLIC channels, optionally filtered by a name substring.

Args: name_filter: Optional case-insensitive substring to match channel names.

Inputs: name_filter. Returns: object

read_channel_historyA
Read-only

Read recent messages from a PUBLIC channel, or messages around a timestamp.

Args: channel: Channel id or "#name". Must be a public channel. limit: Number of messages (1-100, default 30). around_ts: Optional message timestamp; returns messages up to and including it, for context around a specific point.

Inputs: channel (required), limit, around_ts. Returns: object

read_threadA
Read-only

Read a full thread (root message + all replies) from a PUBLIC channel.

Args: channel: Channel id (e.g. "C0123") or "#name". Must be a public channel. thread_ts: The thread's root timestamp (the ts of the first message).

Inputs: channel (required), thread_ts (required). Returns: object

resolve_usersA
Read-only

Resolve Slack user ids (e.g. "U0123") to display names.

Args: user_ids: List of Slack user ids to resolve.

Inputs: user_ids (required). Returns: object

search_messagesA
Read-only

Search Slack messages in PUBLIC channels only.

Use this to find discussions about a Jira ticket or PR by passing the ticket key (e.g. "DSE-1234"), a PR URL, or free-text keywords as the query. Results from DMs and private channels are never returned.

Args: query: Search text — a ticket key, PR URL, or keywords. count: Max results (1-100, default 20).

Inputs: query (required), count. Returns: object

send_messageA

Send a previously drafted message. Requires a valid confirmation_token from draft_message. This is the ONLY tool that posts to Slack.

Only call this after the user has reviewed the draft_message preview and explicitly approved sending.

Args: confirmation_token: The one-time token returned by draft_message.

Inputs: confirmation_token (required). Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 7 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: searching, reading threads, reading channel history, listing channels, resolving users, drafting, and sending. The only potential overlap between read_thread and read_channel_history is clarified by their specific scopes (thread vs channel).

    Naming Consistency5/5

    All tool names follow the verb_noun pattern with snake_case (search_messages, read_thread, read_channel_history, list_channels, resolve_users, draft_message, send_message). No mixed conventions or vague verbs.

    Tool Count5/5

    7 tools is well-scoped for a Slack server covering search, read, list, resolve, and send operations. Each tool earns its place without redundancy or bloat.

    Completeness5/5

    The toolset covers the core lifecycle for public channel messaging: searching, reading history, reading threads, listing channels, resolving users, and sending with a safe draft/approve flow. No obvious dead ends for common use cases.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers