slack-mpm
Provides tools for Slack workspace integration, enabling management of channels, messages, users, files, reminders, bookmarks, scheduled messages, and more via the Slack API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@slack-mpm list all channels"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 mcpAgent scripts: standalone automation scripts in
agents/
Related MCP server: Slack MCP Server
Prerequisites
Python 3.10+ and uv
A Slack App with a bot token
Creating a Slack App
Go to https://api.slack.com/apps and click "Create New App"
Choose "From scratch", give it a name and select your workspace
Go to "OAuth & Permissions" and add these Bot Token Scopes:
channels:read,channels:write,channels:managechat:write,chat:write.publicusers:readfiles:read,files:writereactions:writepins:writebookmarks:read,bookmarks:writeemoji:readgroups:read,groups:writeim:read,im:writempim:read,mpim:write
Install the app to your workspace
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 checkClaude 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 all channels (public + private) |
| Get details about a channel |
| Create a new channel |
| Archive a channel |
| Invite users to a channel |
| Remove a user from a channel |
| Join a channel |
| Set channel topic |
Message Tools (13)
Tool | Description |
| Send a message (supports blocks + threading) |
| Send a message visible only to one user |
| Edit an existing message |
| Delete a message |
| Get a permanent link to a message |
| Search messages (requires user token) |
| Fetch channel message history |
| Add emoji reaction |
| Remove emoji reaction |
| Pin a message |
| Unpin a message |
| Reply in a thread |
| Fetch all thread replies |
User Tools (5)
Tool | Description |
| List all workspace users |
| Get user details |
| Look up a user by email |
| Open a DM channel with user(s) |
| List channels a user belongs to |
File Tools (5)
Tool | Description |
| Upload a file to channel(s) |
| List workspace files |
| Get file details |
| Delete a file |
| Share an existing file to channels |
Workspace Tools (4)
Tool | Description |
| Get workspace/team info |
| List custom emoji |
| Get bot details |
| Validate token |
Reminder Tools (4)
Tool | Description |
| Create a reminder |
| List reminders |
| Mark reminder complete |
| Delete a reminder |
Bookmark Tools (3)
Tool | Description |
| List channel bookmarks |
| Add a bookmark to a channel |
| Remove a bookmark |
Scheduled Message Tools (3)
Tool | Description |
| Schedule a future message |
| List pending scheduled messages |
| 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-historyslack_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.txtslack_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-runslack_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 10slack_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 30Development
# 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 exportAvailable Tools
64 toolsadd_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_permalinkA
Get a permanent link to a Slack message.
Inputs: channel (required), message_ts (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.
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
Scored across 64 tools
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.
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.
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.
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
Related MCP Connectors
Hosted Slack MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted Airtable MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- -licenseNot gradedqualityBmaintenanceMCP Server for the Slack API, enabling Claude to interact with Slack workspaces.70,822 npm91,897MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for Slack workspace integration. This server allows AI assistants to interact directly with your Slack workspace, providing tools to manage channels, send messages, list users, and upload files.53,813 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for Slack integration, allowing Claude to interact with your Slack workspace.53,813 npmMIT
- AlicenseAqualityCmaintenanceMCP Server for the Slack API, enabling Claude to interact with Slack workspaces.870,822 npmMIT