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.

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