web-slack-mcp
web-slack-mcp is a read-only MCP server that lets you interact with Slack through a persistent browser session (no API tokens required), making it ideal for guest workspace users where installing a Slack app or minting API tokens isn't possible. It cannot send or post messages.
Check login status (
check_login): Verify whether your persistent browser session is currently logged into Slack.Log in manually (
login): Open a visible Chromium browser window to sign into Slack via SSO, magic link, or other methods; the session is saved for future use.List channels and DMs (
list_channels): Retrieve the channels and direct messages visible in your Slack sidebar.Read recent messages (
read_messages): Fetch the most recent messages from a specified channel or DM (by name or partial name), returned oldest-first with timestamps and author names.Read a thread (
read_thread): Find a message in a channel by matching text, then retrieve its full thread (parent message + replies).Search messages (
search_messages): Search workspace-wide using Slack syntax.
Provides tools to read channels, messages, and threads from Slack via the web app, using a persistent browser session.
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., "@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 the web 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 a Slack app or mint API tokens — so instead of an app, it reuses the session in a persistent 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 — 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.
Reads go through Slack's own internal JSON API (
conversations.history,conversations.replies,conversations.view), replayed from inside the logged-in browser context so the session cookie + boot token authenticate them. 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 (the quick switcher routes to
/client/T…/<channel id>, which we read off the URL).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 visible in your sidebar. |
| Read recent messages in a channel/DM ( |
| 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.
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 (your session) lives. |
|
|
|
|
| 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 a credential 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-mcpLicense
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. Dates show when Glama detected each change.
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
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Catch up on Slack without reading it. Unreads, threads, search. Browser-session or hosted OAuth.
Enable interaction with Slack workspaces. Supports subscribing to Slack events through Resources.
Read-only access to your Citlyze workspace: AI search visibility, citations, and recommendations.
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that enables AI assistants to access Slack workspace data, including channels, messages, threads, and user information.24,3163MIT
- 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.191,02129MIT
- AlicenseNot gradedqualityBmaintenanceRead-only MCP server for Slack with OAuth 2.1 authentication, enabling message retrieval, thread replies, search, user and channel listing.8Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/sercant/web-slack-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server