Skip to main content
Glama

slack-mpm

A Python MCP (Model Context Protocol) server and API library for Slack workspace integration. Exposes 40+ Slack operations as MCP tools for use with Claude Desktop, and provides a clean async Python API for building Slack integrations.

What It Is

  • Python API library: from slack_mpm.api import messages; await messages.send_message(...)

  • MCP server: wraps the API for Claude Desktop via slack-mpm mcp

  • Agent scripts: standalone automation scripts in agents/

Related MCP server: Slack MCP Server

Prerequisites

  1. Python 3.10+ and uv

  2. A Slack App with a bot token

Creating a Slack App

  1. Go to https://api.slack.com/apps and click "Create New App"

  2. Choose "From scratch", give it a name and select your workspace

  3. Go to "OAuth & Permissions" and add these Bot Token Scopes:

    • channels:read, channels:write, channels:manage

    • chat:write, chat:write.public

    • users:read

    • files:read, files:write

    • reactions:write

    • pins:write

    • bookmarks:read, bookmarks:write

    • emoji:read

    • groups:read, groups:write

    • im:read, im:write

    • mpim:read, mpim:write

  4. Install the app to your workspace

  5. Copy the "Bot User OAuth Token" (starts with xoxb-)

For search_messages and reminders, also create a User Token with search:read, reminders:read, reminders:write.

Quick Start

git clone <repo>
cd slack-mpm
cp .env.local.example .env.local
# Edit .env.local and add your SLACK_BOT_TOKEN=xoxb-...

uv sync
uv run slack-mpm setup   # Verify your token works
uv run slack-mpm doctor  # Health check

Claude Desktop Configuration

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "slack": {
      "command": "uv",
      "args": ["run", "--directory", "/absolute/path/to/slack-mpm", "slack-mpm", "mcp"]
    }
  }
}

Restart Claude Desktop. You should see the Slack tools available.

Available Tools

Channel Tools (8)

Tool

Description

list_channels

List all channels (public + private)

get_channel_info

Get details about a channel

create_channel

Create a new channel

archive_channel

Archive a channel

invite_to_channel

Invite users to a channel

kick_from_channel

Remove a user from a channel

join_channel

Join a channel

set_channel_topic

Set channel topic

Message Tools (13)

Tool

Description

send_message

Send a message (supports blocks + threading)

send_ephemeral

Send a message visible only to one user

update_message

Edit an existing message

delete_message

Delete a message

get_permalink

Get a permanent link to a message

search_messages

Search messages (requires user token)

list_history

Fetch channel message history

add_reaction

Add emoji reaction

remove_reaction

Remove emoji reaction

pin_message

Pin a message

unpin_message

Unpin a message

reply_in_thread

Reply in a thread

get_thread_replies

Fetch all thread replies

User Tools (5)

Tool

Description

list_users

List all workspace users

get_user_info

Get user details

get_user_by_email

Look up a user by email

open_dm

Open a DM channel with user(s)

list_user_channels

List channels a user belongs to

File Tools (5)

Tool

Description

upload_file

Upload a file to channel(s)

list_files

List workspace files

get_file_info

Get file details

delete_file

Delete a file

share_file

Share an existing file to channels

Workspace Tools (4)

Tool

Description

get_workspace_info

Get workspace/team info

list_emojis

List custom emoji

get_bot_info

Get bot details

auth_test

Validate token

Reminder Tools (4)

Tool

Description

add_reminder

Create a reminder

list_reminders

List reminders

complete_reminder

Mark reminder complete

delete_reminder

Delete a reminder

Bookmark Tools (3)

Tool

Description

list_bookmarks

List channel bookmarks

add_bookmark

Add a bookmark to a channel

remove_bookmark

Remove a bookmark

Scheduled Message Tools (3)

Tool

Description

schedule_message

Schedule a future message

list_scheduled_messages

List pending scheduled messages

delete_scheduled_message

Cancel a scheduled message

Using the Python API Directly

import asyncio
from slack_mpm.api import messages, channels, users
from slack_mpm.auth.token_manager import TokenManager

async def main():
    token = TokenManager().get_token()

    # Send a message
    await messages.send_message(token, "#general", "Hello from Python!")

    # List channels
    data = await channels.list_channels(token)
    for ch in data["channels"]:
        print(ch["name"])

    # Get user info
    user = await users.get_user_by_email(token, "person@example.com")
    print(user["user"]["real_name"])

asyncio.run(main())

Agent Scripts

Standalone automation scripts in the agents/ directory.

slack_listener.py — Real-time channel monitor

Polls a channel and prints new messages as they arrive.

uv run agents/slack_listener.py --channel C1234567890
uv run agents/slack_listener.py --channel C1234567890 --interval 10
uv run agents/slack_listener.py --channel C1234567890 --no-history

slack_notifier.py — Send notifications

Sends messages or file uploads to Slack channels from the command line or stdin.

uv run agents/slack_notifier.py --channel C1234567890 --message "Deploy complete"
echo "alert!" | uv run agents/slack_notifier.py --channel C1234567890
cat report.txt | uv run agents/slack_notifier.py --channel C1234567890 --as-file --filename report.txt

slack_responder.py — Auto-responder bot

Monitors for @mentions or DMs and auto-replies with a configured message.

uv run agents/slack_responder.py --response "Thanks, I'll get back to you!"
uv run agents/slack_responder.py --channel C1234567890 --response "Got it!" --interval 60
uv run agents/slack_responder.py --response "Out of office" --dry-run

slack_digest.py — Activity digest

Generates a summary of recent channel activity: message counts, active users, top threads.

uv run agents/slack_digest.py --channel C1234567890
uv run agents/slack_digest.py --channel C1234567890 --hours 168  # 1 week
uv run agents/slack_digest.py --channel C1234567890 --hours 24 --top-users 10

slack_archiver.py — Channel history export

Exports complete channel message history to JSON or Markdown files with thread support.

uv run agents/slack_archiver.py --channel C1234567890 --output ./archive/
uv run agents/slack_archiver.py --channel C1234567890 --output ./archive/ --format markdown
uv run agents/slack_archiver.py --channel C1234567890 --output ./archive/ --days 30

Development

# Install dev dependencies
uv sync

# Run tests
uv run pytest
uv run pytest --cov=src --cov-report=html

# Type checking
uv run mypy --strict src/

# Linting
uv run ruff check src/ agents/
uv run ruff format src/ agents/

Project Structure

src/slack_mpm/
├── api/
│   ├── _client.py      # Shared httpx client + SlackAPIError
│   ├── channels.py     # Channel operations
│   ├── messages.py     # Message operations
│   ├── users.py        # User operations
│   ├── files.py        # File operations
│   ├── workspace.py    # Workspace operations
│   ├── reminders.py    # Reminder operations
│   ├── bookmarks.py    # Bookmark operations
│   └── scheduled.py    # Scheduled message operations
├── auth/
│   ├── models.py       # SlackToken, TokenStatus, WorkspaceInfo
│   └── token_manager.py # TokenManager (loads from .env.local)
├── cli/
│   └── main.py         # CLI: setup, doctor, mcp commands
└── server/
    └── slack_mpm_server.py  # SlackMCPServer (MCP adapter)

agents/
├── slack_listener.py   # Channel message poller
├── slack_notifier.py   # Send notifications
├── slack_responder.py  # Auto-responder bot
├── slack_digest.py     # Activity digest
└── slack_archiver.py   # History export

Available Tools

64 tools
add_bookmarkB

Add a bookmark to a Slack channel.

Inputs: link (required), title (required), channel_id (required), emoji.

add_reactionA

Add an emoji reaction to a Slack message.

Inputs: name (required), channel (required), timestamp (required), use_user_token.

add_reminderB

Create a reminder for the authenticated user.

Inputs: text (required), time (required).

archive_channelA

Archive a Slack channel.

Inputs: channel (required).

auth_testB

Validate the Slack token and get workspace/user info.

Inputs: no named parameters.

complete_reminderB

Mark a reminder as complete.

Inputs: reminder (required).

create_canvasA

Create a workspace-level canvas with markdown content. Requires canvases:write scope.

Inputs: title (required), document_content (required).

create_channelC

Create a new Slack channel.

Inputs: name (required), is_private.

create_channel_canvasA

Create a canvas attached to a Slack channel. Requires canvases:write scope.

Inputs: title (required), channel (required), document_content (required).

create_listA

Create a new Slack List in a channel. Requires lists:write scope and a paid Slack plan.

Inputs: name (required), channel (required), items.

create_list_itemA

Add a new item to a Slack List. Requires lists:write scope.

Inputs: value (required), list_id (required), status.

delete_canvasA

Delete a canvas. Requires canvases:write scope.

Inputs: canvas_id (required).

delete_canvas_accessB

Revoke access to a canvas for a user or group.

Inputs: canvas_id (required), user_id, group_id.

delete_fileB

Delete a file from Slack.

Inputs: file (required).

delete_list_accessA

Revoke access to a Slack List for a user or group.

Inputs: list_id (required), user_id, group_id.

delete_list_itemA

Delete a single item from a Slack List. Requires lists:write scope.

Inputs: item_id (required), list_id (required).

delete_list_itemsA

Delete multiple items from a Slack List in one call. Requires lists:write scope.

Inputs: list_id (required), item_ids (required).

delete_messageB

Delete a Slack message.

Inputs: ts (required), channel (required).

delete_reminderC

Delete a reminder.

Inputs: reminder (required).

delete_scheduled_messageA

Cancel/delete a scheduled message before it is sent.

Inputs: channel (required), scheduled_message_id (required).

edit_canvasA

Edit (replace content of) an existing canvas. Requires canvases:write scope.

Inputs: canvas_id (required), document_content (required), operation_id.

get_bot_infoA

Get information about the bot associated with the current token.

Inputs: no named parameters.

get_channel_infoA

Get detailed information about a specific Slack channel.

Inputs: channel (required).

get_file_infoB

Get detailed information about a Slack file.

Inputs: file (required).

get_list_itemA

Get details for a single Slack List item. Requires lists:read scope.

Inputs: item_id (required), list_id (required).

get_thread_repliesA

Fetch all replies in a Slack thread.

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

get_user_by_emailA

Look up a Slack user by their email address.

Inputs: email (required).

get_user_infoB

Get detailed information about a Slack user.

Inputs: user (required).

get_workspace_infoA

Get information about the current Slack workspace.

Inputs: no named parameters.

invite_to_channelC

Invite one or more users to a Slack channel.

Inputs: users (required), channel (required).

join_channelC

Join a Slack channel.

Inputs: channel (required).

kick_from_channelB

Remove a user from a Slack channel.

Inputs: user (required), channel (required).

list_bookmarksA

List all bookmarks in a Slack channel.

Inputs: channel_id (required).

list_channelsA

List all channels in the Slack workspace (public and private).

Inputs: limit, types, name_filter, exclude_archived.

list_emojisA

List all custom emoji in the Slack workspace.

Inputs: no named parameters.

list_filesB

List files in the Slack workspace or a specific channel.

Inputs: count, channel.

list_historyC

Fetch message history from a Slack channel.

Inputs: channel (required), limit, latest, oldest.

list_list_itemsA

Fetch all items in a Slack List (paginated). Requires lists:read scope.

Inputs: list_id (required), limit.

list_remindersA

List all reminders for the authenticated user.

Inputs: no named parameters.

list_scheduled_messagesB

List all pending scheduled messages.

Inputs: channel.

list_user_channelsA

List all channels a specific Slack user is a member of.

Inputs: user (required).

list_usersC

List all users in the Slack workspace.

Inputs: limit.

lookup_canvas_sectionsA

Look up sections/blocks in a canvas. Requires canvases:read scope.

Inputs: canvas_id (required).

markdown_to_canvasA

Validate and prepare markdown content for canvas creation. Accepts a markdown string or a file path, returns the validated content suitable for create_canvas() or create_channel_canvas().

Inputs: content, file_path.

markdown_to_listA

Convert markdown to Slack List items. Parses checklists (- [ ] / - [x]), bullet lists (- item), and tables. Returns a list of dicts with 'value' and optional 'status'.

Inputs: content, file_path.

open_dmB

Open a direct message channel with one or more Slack users.

Inputs: users (required).

pin_messageB

Pin a message in a Slack channel.

Inputs: ts (required), channel (required).

remove_bookmarkB

Remove a bookmark from a Slack channel.

Inputs: channel_id (required), bookmark_id (required).

remove_reactionB

Remove an emoji reaction from a Slack message.

Inputs: name (required), channel (required), timestamp (required), use_user_token.

reply_in_threadB

Reply to a message in a Slack thread.

Inputs: text (required), channel (required), thread_ts (required), use_user_token.

schedule_messageA

Schedule a message to be sent at a future time.

Inputs: text (required), channel (required), post_at (required).

search_messagesA

Search for messages across the workspace. Requires a user token (xoxp-) with search:read scope — bot tokens (xoxb-) are not supported by Slack's search API.

Inputs: query (required), count.

send_ephemeralA

Send an ephemeral message visible only to a specific user.

Inputs: text (required), user (required), channel (required).

send_messageC

Send a message to a Slack channel.

Inputs: text (required), channel (required), blocks, thread_ts, +2 more.

set_canvas_accessB

Set access rules for a canvas (grant read/write/owner to users or groups).

Inputs: canvas_id (required), access_level (required), user_ids, group_ids.

set_channel_topicB

Set the topic for a Slack channel.

Inputs: topic (required), channel (required).

set_list_accessB

Set access rules for a Slack List (grant read/write/owner to users or groups).

Inputs: list_id (required), access_level (required), user_ids, group_ids.

share_fileA

Share an existing Slack file to additional channels.

Inputs: file (required), channels (required).

unpin_messageB

Unpin a message from a Slack channel.

Inputs: ts (required), channel (required).

update_listB

Update a Slack List's metadata (name, description). Requires lists:write scope.

Inputs: list_id (required), name, description.

update_list_itemA

Update an existing Slack List item. Requires lists:write scope.

Inputs: item_id (required), list_id (required), value, status.

update_messageC

Update/edit an existing Slack message.

Inputs: ts (required), text (required), channel (required), use_user_token.

upload_fileA

Upload a file to one or more Slack channels. Provide either 'content' (UTF-8 text only) or 'file_path' (disk path for binary or text files), not both.

Inputs: channels (required), filename (required), title, content, +2 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 64 tools

    Disambiguation5/5

    Each tool pairs a distinct resource with a clear action, spanning channels, messages, users, files, reminders, canvases, and lists. Close pairs like list_channels/list_user_channels and create_canvas/create_channel_canvas are clearly differentiated by their descriptions and target nouns.

    Naming Consistency4/5

    The vast majority of tools follow a consistent verb_noun snake_case pattern, such as list_channels, create_channel, send_message, and delete_file. Minor deviations like send_ephemeral, open_dm, auth_test, reply_in_thread, markdown_to_canvas, and markdown_to_list slightly break the pattern but remain readable and predictable.

    Tool Count1/5

    With 64 tools, the server far exceeds the well-scoped 3-15 range and even crosses the 50+ extreme threshold. While Slack has a large API surface, exposing this many endpoints in one MCP server creates a heavy, overwhelming toolset for agents to navigate.

    Completeness4/5

    The tool surface covers most major Slack domains: channels, messages, threads, files, users, reminders, bookmarks, scheduled messages, canvases, and lists. Common missing operations like listing pinned messages, getting a single message, leaving a channel, or renaming a channel are notable gaps but can usually be worked around.

    Maintenance

    ActivityInactive
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers