web-slack-mcp
Summary: This server lets you read Slack channels, messages, and threads via your own logged-in web session, with no posting capability.
List conversations —
list_channelsshows channels, DMs, and group DMs you belong to, including those visible in your sidebar.Read recent messages —
read_messagesfetches the latest messages (up tolimit, default 20) from a channel or DM matched by name, partial name, or id; returns them oldest-first as[time] Name: text.Read threads —
read_threadfinds the most recent message containing given text and returns its parent plus replies (up tolimit, default 50), oldest-first.Search workspace-wide —
search_messagesuses Slack search syntax across the workspace.
Provides tools to read channels, messages, and threads from Slack via the web app, using a persistent browser session.
Click on "Deploy 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., "@web-slack-mcpread the last 10 messages in #design"
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.
web-slack-mcp
An MCP server that reads Slack through your own logged-in web session.
Built for the case where you're a guest in a workspace and can't install a Slack app or mint API tokens — so instead of an app, it reuses the session of a persistent Chromium profile that you log into once.
Draft-only by design. It reads channels, messages, and threads. There is no send code path in this server — it never 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 to a persistent profile so it survives restarts.
Credentials — the workspace token from the web client's localStorage plus the
dsession cookie — are extracted from that profile (headless when you're already signed in), and the browser is closed straight away.Every read is a plain HTTP call to Slack's web API (
users.conversations,conversations.history,conversations.replies,search.messages, …) authenticated with those credentials. No UI is driven.Re-login happens only when Slack rejects the session: the browser reopens, fresh credentials are extracted, and the call is retried once.
Multiple agents can use the server at once. Each MCP client runs its own server process; they share the credentials cached in the profile directory, and a file lock ensures only one of them opens the browser when a login is due.
Names — including Slack Connect / external members that per-id lookups won't return — are harvested in one
conversations.viewcall per channel.
Related MCP server: Slack MCP Server
Tools
Tool | Description |
| List channels, DMs, and group DMs you're a member of. |
| Read recent messages in a channel/DM by name, partial name, or id ( |
| Read a thread by matching text in its parent message. |
| 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-mcpOn the first launch the server downloads the Chromium build Playwright drives
into Playwright's shared cache (~/Library/Caches/ms-playwright on macOS), so it
happens 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-mcpThen reload Claude Code; the tools appear as mcp__web-slack__*. The first time
you call a read tool while signed out, the server opens a visible Chromium and
waits for you to sign in — no separate step. The session is saved and reused on
later runs, and by every other agent running the server.
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 web client URL. |
|
| Where the persistent browser profile and cached credentials live. Shared by every server process. |
| (unset) | Team id, name, or domain to use when the browser is signed into several workspaces. |
|
|
|
|
| Seconds to wait for you to finish signing in before giving up. |
The profile directory holds your live Slack session and a 0600 credentials
file — treat it like a credential and keep it out of version control.
Local development
git clone https://github.com/sercant/web-slack-mcp
cd web-slack-mcp
uv sync
uv run web-slack-mcp
uv run pytestLicense
MIT
Available Tools
5 toolscheck_loginA
Report whether the persistent browser session is logged into Slack.
Navigates to the Slack web client and checks for the app shell. Does not
modify anything. Run login first if this reports logged out.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description clarifies it is read-only (does not modify anything) and explains the navigation check. A minor gap is not mentioning potential network latency or response details, but output schema covers return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a purpose: purpose, mechanism, usage guidance. No wasted words, front-loaded key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 0 parameters, presence of output schema, and sibling descriptions, the description covers all needed information: what it does, how, and when to use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so description adds no parameter info. Schema coverage is 100% trivially. Per guidelines, 0 params baseline is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reports login status for Slack, specifies the method (navigates to web client, checks for app shell), and distinguishes from sibling login by advising to run login first if logged out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to run login first if reports logged out, and states it does not modify anything, providing clear when-to-use and when-not-to-use context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_channelsA
List the channels and DMs visible in your Slack sidebar.
Read-only. Note the sidebar is virtualized, so only currently-rendered entries appear; collapsed or scrolled-off sections may be omitted.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It explicitly states 'Read-only' and warns that the sidebar is virtualized, meaning only currently-rendered entries appear and collapsed sections may be omitted. This adds important behavioral context beyond a simple list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences. It front-loads the primary purpose and provides the key caveat about virtualization. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero parameters and an output schema (so return values don't need description), the description covers the essential points: what it lists, read-only behavior, and the important limitation of virtualized sidebar rendering. This is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the baseline is 4. The description does not need to add parameter information because none exist. The schema coverage is 100% automatically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List the channels and DMs visible in your Slack sidebar.' This is a specific verb+resource combination and distinguishes the tool from its siblings (check_login, login, read_messages, read_thread) which do not perform listing of channels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidelines are provided for when to use this tool versus alternatives. The description does not mention when not to use it or suggest other tools for different scenarios, leaving the agent without context on selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginA
Open Slack in a visible window so you can log in manually.
Optional — the read tools open this window on their own when you're signed
out. Polls up to wait_seconds for the app shell after you finish SSO /
magic-link sign-in; the session is saved to the persistent profile.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description transparently discloses behavior: opens visible window for manual login, polls up to wait_seconds for app shell, and persists the session. It omits details on timeout handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description covers purpose, usage, parameter, and behavior. It does not mention error conditions, but is sufficiently complete for a straightforward login action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description adds 'Polls up to `wait_seconds` for the app shell after you finish SSO / magic-link sign-in', explaining the parameter's purpose and how it affects behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Open Slack in a visible window so you can log in manually.' It distinguishes from sibling tools like check_login (which checks status) and read tools that auto-open the window.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description notes that read tools auto-open the window when signed out, making this tool optional. It provides context on when to use manually, but could be more explicit about specific scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_messagesA
Read the most recent messages in a channel or DM.
channel is matched via the quick switcher (name or partial name). Fetches
up to limit most-recent messages from Slack's API and returns them
oldest-first as [time] Name: text. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| channel | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses read-only nature, output format, and channel matching via quick switcher. While it lacks auth or error details, these are reasonable for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with front-loaded purpose, followed by specific details on channel matching, limit, and output format. Every sentence serves a purpose with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (not shown), the description explains output format effectively. It covers channel behavior and limit semantics. Missing error info is acceptable for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must add parameter meaning. It explains channel matching via quick switcher and limit fetches most-recent messages. Both parameters are addressed, adding value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads most recent messages, specifying the resource (messages) and action (read). It distinguishes from siblings like list_channels and read_thread, which are different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (getting recent messages) and notes it is read-only. However, it does not explicitly specify when to use this tool versus alternatives like read_thread, though sibling names make distinctions clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_threadA
Read the thread hanging off a message (parent + replies).
Finds the most recent message in channel whose text contains
message_text, then fetches its thread via Slack's API. Returns up to
limit messages, oldest-first. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| channel | Yes | ||
| message_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description notes read-only, explains algorithm (find message by text, fetch thread), ordering, and limit. Lacks details on error scenarios or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states purpose, second explains process and output. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers core behavior and output (up to limit messages, oldest-first). With output schema present, return values are covered. Missing error handling when message not found.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has no descriptions (0% coverage). Description explains each parameter: channel, message_text used for search, limit for max results. Adds meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool reads a thread (parent + replies) from a message. Distinguishes from sibling 'read_messages' by specifying thread context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes the search mechanism but does not explicitly contrast with sibling 'read_messages' or explain when to use this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
check_login - First observed
list_channels - First observed
login - First observed
read_messages - First observed
read_thread
TDQS
Scored across 5 tools
Each tool has a clear, distinct purpose: authentication status, channel listing, login, message reading, and thread reading. No overlap in functionality.
All tools follow a consistent verb_noun naming pattern (check_login, list_channels, read_messages, read_thread), with 'login' being a natural exception as a standalone verb.
Five tools is a reasonable count for a focused Slack read-only client. It covers the essential operations without being excessive, though a send tool might be expected.
The tool set covers authentication, channel enumeration, and message reading, but lacks write operations like sending messages or creating channels, which limits completeness for general Slack use.
Maintenance
Related MCP Connectors
Read-only access to a Lumin project's logs, metrics, uptime checks, alerts and infrastructure.
See which companies visited your website, what they looked at and who to call. Read-only.
Read-only access to your Citlyze workspace: AI search visibility, citations, and recommendations.
Read Hoot Lens recordings, replays, heatmaps, funnels and findings with your own account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to read messages, threads, channel info, user profiles, search conversations, and generate permalinks in Slack workspaces.1MIT
- AlicenseAqualityAmaintenanceGives AI agents full Slack access via session tokens, requiring no app registration, admin approval, or OAuth.201,217 npm32MIT
- AlicenseAqualityBmaintenanceA read-only MCP server for Slack that reads messages from channels the bot is invited to, without storing data. It provides tools to fetch channel history, thread replies, and resolve user IDs, with access controlled solely by channel invitations.5MIT

cordslite-mcpofficial
FlicenseAqualityCmaintenanceProvides read-only Discord access, enabling listing guilds, mapping channels, reading and searching messages, following threads, and viewing attachments without posting.121-