mcp-slack
# mcp-slack
MCP server for Slack integration, built with FastMCP. Provides tools for listing channels, reading messages, and posting to Slack.
## Install
```bash
pip install -e ".[dev]"
```
## Environment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| `SLACK_BOT_TOKEN` | Yes | Bot User OAuth Token (`xoxb-...`) |
| `SLACK_DEFAULT_CHANNEL` | No | Fallback channel for `slack_post_message` |
Copy `.env.example` to `.env` and fill in your values.
## Tools
| Tool | Description |
|------|-------------|
| `slack_list_channels` | List all channels accessible by the bot |
| `slack_read_channel(channel, limit?)` | Read last N messages from a channel (default: 20, max: 100) |
| `slack_post_message(channel, text)` | Send a message to a channel |
The `channel` parameter accepts either a channel name (without `#`) or a Slack channel ID.
## Slack App Setup
1. Go to [api.slack.com/apps](https://api.slack.com/apps) and create a new app
2. Under **OAuth & Permissions**, add the required **Bot Token Scopes** for the tools you want to use:
| Tool | Required Bot Scopes |
|------|---------------------|
| `slack_list_channels` | `channels:read`, `groups:read` |
| `slack_read_channel` | `channels:history`, `groups:history` |
| `slack_post_message` | `chat:write` |
*Note: Private-channel access (`groups:*`) and DM scopes are only needed if the bot operates outside public channels.*
3. Install the app to your workspace
4. Copy the **Bot User OAuth Token** (`xoxb-...`) to `SLACK_BOT_TOKEN`
5. Invite the bot to channels it should access: `/invite @your-bot-name`
### Troubleshooting: `missing_scope` Error
If a tool fails with a `missing_scope` error, it means the bot doesn't have the necessary permissions to perform that action. Check the error message to see which scope is missing, cross-reference it with the table above, and add the missing scope in your Slack App's **OAuth & Permissions** page. (Remember to reinstall the app to your workspace after changing scopes!)
## Usage
### Standalone
```bash
mcp-slack
```
### Claude Desktop config
```json
{
"mcpServers": {
"slack": {
"command": "mcp-slack",
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-token"
}
}
}
}
```
## Development
```bash
pip install -e ".[dev]"
ruff check src/ tests/
ruff format src/ tests/
pytest
```
## License
MIT
TDQS
Scored across 3 tools
Each tool maps to a distinct Slack action+resource: listing channels, reading messages, and posting messages. There is no overlap in purpose or argument shape between them.
All three tools use a consistent slack_ prefix with a clear verb_noun pattern (slack_list_channels, slack_read_channel, slack_post_message). The convention is predictable throughout.
Three tools is on the thin side for a Slack integration; the set covers only the most basic read/write loop. It is functional but leaves little room for common adjacent operations.
Core operations (list channels, read messages, post message) are present, but there are notable gaps: no thread replies, reactions, message search, user/DM lookup, or message editing. Agents can do basic workflows but will hit dead ends on common Slack tasks.