slack-stdio-mcp
Provides a bridge to Slack's hosted MCP server, enabling messaging, search, history, canvas, and other workspace tools through OAuth authentication.
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-stdio-mcpSend a Slack message to #general: 'Hello from Glama!'"
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-stdio-mcp
Local MCP stdio bridge to Slack’s hosted MCP server
(https://mcp.slack.com/mcp).
Proxies the official tool catalog (slack_send_message, search, history,
canvas, …) after user OAuth (PKCE) and keeps tokens fresh. It does not
reimplement Slack tools.
Approach | Typical result |
Host → HTTP | Often stuck authenticating |
Claude Code Slack plugin | Works (partner app + host OAuth) |
This bridge (stdio + local OAuth/refresh) | Works for Grok, Cursor, Open Code, Codex, Claude, … |
Agent ──stdio MCP──► slack-stdio-mcp ──Bearer──► mcp.slack.com
│
├─ valid access token → reuse
├─ expired + refresh_token → silent refresh
└─ no token → browser OAuth (PKCE)Requirements
Node.js ≥ 20 (Windows, macOS, Linux)
Default OAuth app: Claude’s partner Slack app (no app setup required)
Client ID:
1601185624273.8899143856786Redirect:
http://localhost:3118/callback
Own app is optional — see Own Slack app
Related MCP server: Slack
Install
npx -y slack-stdio-mcpFirst run may open a browser for Slack Allow. Later runs reuse or refresh tokens under the platform credentials directory (see Auth).
Alternative | Command |
Latest git main |
|
From clone |
|
Configure a host
Prefer npx so you never hardcode a machine path. Put knobs in args
(CLI flags beat env; see Configuration).
Set startup_timeout_sec (or equivalent) ≥ 180 so the first OAuth Allow
is not killed by the host.
Grok Build (~/.grok/config.toml)
[mcp_servers.slack-stdio]
command = "npx"
args = ["-y", "slack-stdio-mcp"]
enabled = true
startup_timeout_sec = 180Own Slack app:
[mcp_servers.slack-stdio]
command = "npx"
args = [
"-y", "slack-stdio-mcp",
"--client-id", "YOUR.CLIENT.ID",
"--oauth-host", "127.0.0.1",
"--oauth-path", "/oauth/callback",
]
enabled = true
startup_timeout_sec = 180Claude Code / Cursor / similar (JSON)
{
"mcpServers": {
"slack-stdio": {
"command": "npx",
"args": ["-y", "slack-stdio-mcp"]
}
}
}Add the same optional flags as in the Grok example when using your own app.
Local clone
{
"mcpServers": {
"slack-stdio": {
"command": "node",
"args": ["/absolute/path/to/slack-stdio-mcp/src/server.mjs"]
}
}
}Auth
On start, if there is no usable token for the active client_id, the bridge
opens a browser (PKCE). Credentials are stored per client_id:
OS | Default root |
macOS / Linux |
|
Windows |
|
Path: …/by-client/<client_id>.json. Override with --creds-dir /
SLACK_STDIO_CREDS_DIR. Unix modes 0600/0700 when supported.
Action | How |
OAuth only (no MCP) |
|
Skip browser (CI) |
|
Inject token |
|
Token lifecycle
Load credentials for the current
client_idReuse access token if valid (5‑minute skew before
expires_at)Else refresh via
oauth.v2.access(grant_type=refresh_token)On refresh failure: clear that app’s file → OAuth (or fail if skip-oauth)
Mid-session session loss
If a Slack tool fails with an auth error (isError: true or thrown error):
Silent force-refresh + reconnect + one retry
Else open browser and return
SLACK_REAUTH_REQUIREDplus the authorize URL in the tool result (clickable in chat)After Allow, the bridge reconnects in the background — retry the tool
Successful tool payloads are never scanned for auth keywords. Settled re-auth flows are not reused; the next start gets a fresh URL.
Local tool | Purpose |
| Start re-auth; optional |
| Pending re-auth + authorize URL if any |
Startup OAuth waits up to SLACK_OAUTH_TIMEOUT_MS (default 180000). On
timeout the process exits 1 (host must restart). Keep host startup timeout
above that value. The authorize URL is always printed on stderr.
Configuration
Precedence: CLI flags > environment > built-in defaults.
CLI flag | Env | Purpose |
|
| OAuth app id (default: Claude partner) |
|
| Confidential apps only |
|
| Redirect host ( |
|
| Redirect path ( |
|
| Loopback port ( |
|
| MCP endpoint |
|
| Named store: |
|
| Absolute credentials root (wins over |
|
| Never open browser |
|
| Inject Bearer (tests/CI) |
| — | Help on stderr |
Env only: SLACK_OAUTH_TIMEOUT_MS, SLACK_ALLOW_LEGACY_TOKEN=1 (flat legacy
JSON without client_id).
npx -y slack-stdio-mcp -- --profile user_cl
npx -y slack-stdio-mcp -- --client-id 123.456 --oauth-path /oauth/callback
npx -y slack-stdio-mcp -- --skip-oauth --creds-dir /tmp/empty-credsProfiles: the same --profile name in every host/repo reuses
~/.slack-stdio-mcp/profiles/<name>/… (no absolute paths in config). Grok does
not inject the MCP server key into the process — put the profile string in
args yourself (convention: match your team/workspace name).
Platforms
Windows | macOS / Linux | |
Credentials |
|
|
Open browser |
|
|
File modes | omitted (profile ACL) |
|
CI: npm test on Ubuntu, Windows, macOS (Node 20 + 22). If the browser cannot
open, paste the authorize URL from stderr.
Own Slack app (optional)
Only if you are not using the default Claude partner app.
Slack app → OAuth & Permissions → Redirect URLs must match your
--oauth-*/SLACK_OAUTH_*(e.g.http://localhost:3118/callback)PKCE Opt In (recommended without
client_secret)Enable MCP under App Assistant / Agents & AI Apps
(else: App is not enabled for Slack MCP server access)User Token Scopes must match
USER_SCOPESinsrc/oauth-flow.mjs(source of truth; CI checks the README list below)
Scope | Used for |
| Search public channels |
| Search private channels |
| Search multi-person DMs |
| Search 1:1 DMs |
| Search files |
| Search users |
| Send messages |
| Public channel history |
| Private channel history |
| Multi-person DM history |
| 1:1 DM history |
| Canvases |
| Profiles |
| Reactions |
| Custom emoji |
| Files |
| Open/manage conversations |
| List/metadata |
Copy-paste (comma-separated; authorize uses space-separated scope, not
user_scope):
search:read.public,search:read.private,search:read.mpim,search:read.im,search:read.files,search:read.users,chat:write,channels:history,groups:history,mpim:history,im:history,canvases:read,canvases:write,users:read,users:read.email,reactions:write,reactions:read,emoji:read,files:read,channels:write,groups:write,im:write,mpim:write,channels:read,groups:read,mpim:readThese are user scopes (xoxp / xoxe.xoxp), not bot scopes. A subset is
fine if you only need some tools. Set SLACK_CLIENT_SECRET only if Slack
rejects public PKCE exchange.
npx -y slack-stdio-mcp -- \
--client-id your.client.id \
--oauth-host 127.0.0.1 \
--oauth-path /oauth/callbackScripts
Script | Command |
Start bridge |
|
OAuth only |
|
Tests |
|
Syntax + English gate |
|
Security
See SECURITY.md.
Never commit credentials,
.env, or token dumpsTokens act as the authorizing user — revoke the app in Slack when done
stdout = MCP JSON-RPC only; human logs go to stderr
Contributing
CONTRIBUTING.md · CHANGELOG.md · docs/ARCHITECTURE.md
License
This server cannot be installed
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 Servers
- AlicenseBqualityCmaintenanceThe most powerful MCP server for Slack Workspaces. This integration supports both Stdio and SSE transports, proxy settings and does not require any permissions or bots being created or approved by Workspace admins 😏.21,766MIT
- AlicenseAqualityDmaintenanceInteract with Slack Workspaces over the Slack API. Supports stdio and Streamable HTTP transport. Extended from Anthropic's archived server891275MIT
- Alicense-qualityBmaintenanceEnables MCP-compatible clients to interact with Slack through Web API tools and subscribe to inbound Slack messages via Socket Mode notifications.582MIT
- Flicense-qualityDmaintenanceA focused remote MCP server that enables LLMs to search and execute Slack Web API operations with OAuth and write guardrails.
Related MCP Connectors
Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
Artifact store for AI agents. Hosted OAuth at mcp.artifacta.io/mcp; local stdio via npm/PyPI.
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
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/epdlr/slack-stdio-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server