Skip to main content
Glama

Slack MCP Server

by piekstra
README.md10.2 kB
# Slack MCP Server A Model Context Protocol (MCP) server that provides tools for interacting with Slack workspaces through the Slack Web API. ## Features ### Channel Management - **list_channels** - List all channels in the workspace - **get_channel_info** - Get detailed information about a specific channel - **create_channel** - Create a new channel - **archive_channel** - Archive a channel - **unarchive_channel** - Unarchive a channel - **set_channel_topic** - Set channel topic - **set_channel_purpose** - Set channel purpose ### User Management - **list_users** - List all users in the workspace - **get_user_info** - Get detailed information about a specific user - **invite_to_channel** - Invite users to a channel ### Messaging - **send_message** - Send a message to a channel (supports Block Kit) - **update_message** - Update an existing message (supports Block Kit) - **delete_message** - Delete a message - **get_channel_history** - Get message history for a channel - **search_messages** - Search for messages across the workspace ### Rich Message Formatting (Block Kit) - **send_formatted_message** - Send formatted messages with headers, sections, fields - **send_notification_message** - Send status notifications with emoji indicators - **send_list_message** - Send formatted lists with titles and descriptions ### File Management - **upload_file** - Upload a file to one or more channels ### Reactions - **add_reaction** - Add a reaction to a message - **remove_reaction** - Remove a reaction from a message ### Workspace - **get_team_info** - Get information about the Slack workspace/team ## Installation ### Using pip (Recommended - Global Install) For use with Claude Desktop or Claude CLI, install globally: ```bash pip install slack-mcp-server ``` ### From source ```bash git clone <repository-url> cd slack-mcp-server pip install -e . ``` ## Configuration ### Secure Credential Storage (Recommended) The Slack MCP Server uses macOS Keychain for secure credential storage. This is much safer than storing tokens in files. #### Quick Setup ```bash # Run the interactive setup slack-mcp-setup # or python -m slack_mcp.setup ``` The setup wizard will: 1. Guide you through obtaining a Slack API token 2. Securely store credentials in your macOS Keychain 3. Validate your configuration #### Manual Keychain Setup ```python from slack_mcp.credentials import CredentialManager manager = CredentialManager() manager.store_credential("api_token", "xoxb-your-slack-bot-token") manager.store_credential("workspace_id", "T1234567890") # Optional ``` ### Environment Variables (Fallback) If you prefer environment variables or are not on macOS, create a `.env` file: ```bash # Required SLACK_API_TOKEN=xoxb-your-slack-bot-token # Optional SLACK_WORKSPACE_ID=your-workspace-id ``` **⚠️ Security Warning**: Environment variables and `.env` files are less secure than keychain storage. ### Getting a Slack API Token 1. Go to [api.slack.com/apps](https://api.slack.com/apps) 2. Create a new app or select an existing one 3. Navigate to "OAuth & Permissions" 4. Add the required OAuth scopes (see below) 5. Install the app to your workspace 6. Copy the "Bot User OAuth Token" (starts with `xoxb-`) ### Required OAuth Scopes The following OAuth scopes are required for full functionality: **Core Scopes:** - `channels:read` - View basic channel information - `channels:manage` - Create and manage public channels - `groups:read` - View private channel information - `groups:write` - Create and manage private channels - `chat:write` - Send messages - `files:write` - Upload files - `im:read` - View direct message channels - `mpim:read` - View group direct message channels - `reactions:read` - View reactions - `reactions:write` - Add and remove reactions - `team:read` - View team information - `users:read` - View user information **⚠️ Search Limitation:** The `search_messages` tool uses Slack's search API which requires user tokens with the `search:read` scope. Since this server is designed for bot tokens (`xoxb-`), search functionality will not work. Consider removing this feature or switching to user token authentication if search is needed. ## Usage with Claude CLI (Recommended) After installing globally, add the server using Claude CLI. First, find your slack-mcp-server installation path: ```bash # Find your slack-mcp-server executable path which slack-mcp-server ``` Then add it with Claude CLI: ```bash claude mcp add slack /path/to/slack-mcp-server ``` For example: ```bash claude mcp add slack /usr/local/bin/slack-mcp-server ``` This automatically configures the server in your Claude Desktop configuration. ## Usage with Claude Desktop (Manual Configuration) Alternatively, you can manually add this to your `claude_desktop_config.json`: #### With Keychain Storage (Recommended) ```json { "mcpServers": { "slack": { "command": "python", "args": ["-m", "slack_mcp"] } } } ``` #### With Environment Variables ```json { "mcpServers": { "slack": { "command": "python", "args": ["-m", "slack_mcp"], "env": { "SLACK_API_TOKEN": "xoxb-your-slack-bot-token" } } } } ``` ## Usage with MCP Client ```python from mcp import Client # Initialize client client = Client() # Connect to the Slack MCP server await client.connect("python", ["-m", "slack_mcp"]) # List available tools tools = await client.list_tools() # Use a tool result = await client.call_tool("list_channels", { "types": "public_channel", "exclude_archived": True, "limit": 10 }) ``` ## Development ### Setting up the development environment ```bash # Clone the repository git clone <repository-url> cd slack-mcp-server # Create a virtual environment python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate # Install in development mode with dev dependencies pip install -e ".[dev]" # Set up credentials securely slack-mcp-setup ``` ### Running tests ```bash pytest ``` ### Code formatting ```bash # Format with black black slack_mcp/ # Lint with ruff ruff check slack_mcp/ ``` ## Examples ### List public channels ```python result = await client.call_tool("list_channels", { "types": "public_channel", "exclude_archived": True, "limit": 20 }) ``` ### Send a message ```python result = await client.call_tool("send_message", { "channel": "C1234567890", # Channel ID "text": "Hello from MCP!" }) ``` ### Search for messages ```python result = await client.call_tool("search_messages", { "query": "project deadline", "sort": "timestamp", "sort_dir": "desc", "count": 10 }) ``` ### Upload a file ```python result = await client.call_tool("upload_file", { "channels": "C1234567890,C0987654321", # Comma-separated channel IDs "content": "This is the file content", "filename": "report.txt", "title": "Weekly Report", "initial_comment": "Here's this week's report" }) ``` ### Send a formatted message with Block Kit ```python result = await client.call_tool("send_formatted_message", { "channel": "C1234567890", "title": "Project Update", "text": "Here's the latest update on our project progress", "fields": "Status: In Progress, Due Date: Next Friday, Assignee: @john", "context": "Last updated 2 hours ago" }) ``` ### Send a notification message ```python result = await client.call_tool("send_notification_message", { "channel": "C1234567890", "status": "success", "title": "Deployment Complete", "description": "The application has been successfully deployed to production", "details": "Build #123 deployed at 14:30 UTC" }) ``` ### Send a list message ```python result = await client.call_tool("send_list_message", { "channel": "C1234567890", "title": "Meeting Agenda", "description": "Items to discuss in today's standup", "items": "Sprint review\nBlocker discussion\nNext week planning\nDemo preparation" }) ``` ### Send message with custom Block Kit ```python result = await client.call_tool("send_message", { "channel": "C1234567890", "text": "Custom formatted message", "blocks": json.dumps([ { "type": "section", "text": { "type": "mrkdwn", "text": "*Important Notice*\nThis is a custom Block Kit message" } }, {"type": "divider"}, { "type": "context", "elements": [ { "type": "mrkdwn", "text": "Created with custom blocks" } ] } ]) }) ``` ## Error Handling The server returns JSON-formatted error messages when operations fail: ```json { "error": "Slack API error: channel_not_found" } ``` Common error codes: - `not_authed` - Invalid or missing API token - `channel_not_found` - Channel doesn't exist - `user_not_found` - User doesn't exist - `message_not_found` - Message doesn't exist - `no_permission` - Bot lacks required permissions - `rate_limited` - API rate limit exceeded ## Security Considerations - **🔐 Keychain Storage**: Use macOS Keychain for secure credential storage (recommended) - **API Token**: Never commit your Slack API token to version control - **Permissions**: Only grant the minimum required OAuth scopes - **Rate Limits**: The server respects Slack's rate limits (see [Slack Rate Limits](https://api.slack.com/docs/rate-limits)) - **Message Content**: Be mindful of sensitive information in messages and files ### Credential Management Commands ```bash # Interactive setup wizard slack-mcp-setup # View stored credentials python -c "from slack_mcp.credentials import CredentialManager; m = CredentialManager(); print(m.list_stored_credentials())" # Delete specific credential python -c "from slack_mcp.credentials import CredentialManager; CredentialManager().delete_credential('api_token')" ``` ## Contributing Contributions are welcome! Please feel free to submit a Pull Request. ## License MIT License - see LICENSE file for details ## Support For issues and questions, please create an issue in the repository.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/piekstra/slack-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server