web-slack-mcp
An MCP server that reads Slack through theweb app, driven by Playwright over your own logged-in browser session.
Built for the case where you're a guest in a workspace and can't install aSlack app or mint API tokens — so instead of an app, it reuses the session in apersistent Chromium profile that you log into once.
Draft-only by design. It reads channels, messages, and threads, and (later)stages replies in the composer. There is no send code path in this server — itnever posts a message.
How it works
- Login is manual and one-time: a visible Chromium window opens, you sign in(SSO / magic link / whatever your workspace uses), and the session is saved toa persistent profile so it survives restarts.
- Reads go through Slack's own internal JSON API (
conversations.history,conversations.replies,conversations.view), replayed from inside thelogged-in browser context so the session cookie + boot token authenticatethem. This is far more robust than scraping the virtualized React DOM. - Navigation uses the UI only to resolve a human channel name to its id (thequick switcher routes to
/client/T…/<channel id>, which we read off the URL). - Names — including Slack Connect / external members that per-id lookupswon't return — are harvested in one
conversations.viewcall per channel.
Tools
| Tool | Description |
|---|---|
list_channels |
List channels/DMs visible in your sidebar. |
read_messages |
Read recent messages in a channel/DM (channel, limit). |
read_thread |
Read a thread by matching text in its parent message. |
search_messages |
Search messages workspace-wide with Slack search syntax. |
Requirements
- Python 3.13+
uv(providesuvx)
Install & run
Run straight from GitHub with uvx — no clone needed:
uvx --from git+https://github.com/sercant/web-slack-mcp web-slack-mcp
On the first launch the server downloads the Chromium build Playwright drivesinto Playwright's shared cache (~/Library/Caches/ms-playwright on macOS), so ithappens once and persists across runs.
Register with Claude Code
claude mcp add web-slack -- \
uvx --from git+https://github.com/sercant/web-slack-mcp web-slack-mcp
Then reload Claude Code; the tools appear as mcp__web-slack__*. The first timeyou call a read tool while signed out, the server opens a visible Chromium andwaits for you to sign in — no separate step. The session is saved and reused onlater runs.
Other MCP clients
Any client that speaks stdio works — point it at the same command:
{
"mcpServers": {
"web-slack": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/sercant/web-slack-mcp",
"web-slack-mcp"
]
}
}
}
Configuration
All optional, via environment variables:
| Variable | Default | Purpose |
|---|---|---|
SLACK_URL |
https://app.slack.com/client |
Slack web client URL. |
SLACK_PROFILE_DIR |
.slack-profile |
Where the persistent browser profile (your session) lives. |
SLACK_HEADLESS |
0 |
1 runs headless. Login needs a visible window, so keep 0 for the initial sign-in. |
SLACK_LOGIN_WAIT |
180 |
Seconds a read tool waits for you to finish signing in before giving up. |
The profile directory holds your live Slack session — treat it like acredential and keep it out of version control (it's gitignored here).
Local development
git clone https://github.com/sercant/web-slack-mcp
cd web-slack-mcp
uv sync
uv run web-slack-mcp
License
MIT