slack-readonly-mcp
Provides read-only access to Slack workspaces, including listing channels, retrieving channel history and thread replies, looking up user information, listing users, and searching messages.
Click on "Install 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-readonly-mcplist the recent messages in #general"
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-readonly-mcp
A self-hosted, read-only Slack MCP server for Claude Code (and any MCP client).
Why this exists
Hosted Slack MCP connectors route your Slack message content through a third-party hosted MCP layer. If you care about where that data goes, that hop sits outside your control. This server avoids it:
It runs locally as a stdio subprocess that the MCP client launches.
It calls the Slack Web API directly with your own token.
Tool results flow only into your MCP client's context → whatever model endpoint you've configured (e.g. an org with zero data retention).
So the full path is: your machine → Slack API → your MCP client → your model endpoint. No third-party MCP intermediary. Data-retention guarantees are a property of the model endpoint you point the client at — this server doesn't change them, it only adds tools.
Note: Data that lives in Slack is governed by your Slack plan, not by this server. This server only governs the path between Slack and your client.
Related MCP server: Slack MCP Server
Tools (all read-only)
Tool | Purpose |
| List channels (id, name, topic, members) |
| Recent messages in a channel |
| All replies in a thread |
| Metadata for one channel |
| Look up a user (email omitted) |
| List workspace users (email omitted) |
| Search messages — requires a user token (see below) |
Setup
1. Create a Slack app with read-only scopes
At https://api.slack.com/apps → Create New App → From a manifest, paste:
display_information:
name: Claude Read-Only
oauth_config:
scopes:
bot:
- channels:read
- channels:history
- groups:read
- groups:history
- im:read
- im:history
- mpim:read
- mpim:history
- users:read
user:
- search:read # optional — only needed for slack_search_messages
settings:
org_deploy_enabled: false
socket_mode_enabled: falseInstall it to the workspace, then copy the Bot User OAuth Token (xoxb-…).
If you want search, also copy the User OAuth Token (xoxp-…). Invite the bot
to any private channels you want it to read (/invite @Claude Read-Only).
2. Build
npm install
npm run build3. Register with Claude Code
claude mcp add slack-readonly \
--env SLACK_BOT_TOKEN=xoxb-your-token \
-- node /path/to/slack-readonly-mcp/dist/index.jsOr, for a project-scoped .mcp.json (keep the token in your shell env, not in
the file — Claude Code expands ${VAR}):
{
"mcpServers": {
"slack-readonly": {
"command": "node",
"args": ["/path/to/slack-readonly-mcp/dist/index.js"],
"env": {
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
"SLACK_USER_TOKEN": "${SLACK_USER_TOKEN}"
}
}
}
}Search caveat
Slack's search.messages endpoint cannot be called with a bot token — it
requires a user token. Set SLACK_USER_TOKEN (xoxp-…, search:read) to enable
slack_search_messages; without it, the other six tools work and search returns
a clear error.
Notes
All logging goes to stderr; stdout is the JSON-RPC channel.
The server fails fast (exit 1) if
SLACK_BOT_TOKENis unset.Read-only by design. Adding write tools (post/reply/react) means adding write scopes — a deliberately separate, larger-blast-radius change.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/tomfunk/slack-readonly-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server