Skip to main content
Glama
piekstra

Slack MCP Server

by piekstra
README.md
# 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.

TDQS

B3.4/5.0

Scored across 26 tools

Disambiguation4/5

Most tools have distinct purposes, but there is some overlap among message-sending tools (send_message, send_formatted_message, send_notification_message, etc.) that could cause confusion. However, their descriptions clarify specific use cases, preventing major misselection.

Naming Consistency5/5

Tool names follow a consistent snake_case verb_noun pattern throughout (e.g., add_reaction, archive_channel, create_channel). All tools adhere to this convention, making them predictable and readable.

Tool Count3/5

With 26 tools, the count is borderline high for a Slack server, as it includes many specialized message-sending variants. While comprehensive, it may feel heavy compared to typical MCP servers, which often have 3-15 tools for well-scoped purposes.

Completeness5/5

The tool set provides complete coverage for Slack interactions, including channel management (create, archive, unarchive, set purpose/topic), user and channel info retrieval, message handling (send, update, delete, search, history), reactions, file uploads, and invitations. No obvious gaps exist for core workflows.

Maintenance

ActivityInactive
ResponsivenessNo issues