The short answer
Slack’s official MCP server, at https://mcp.slack.com/mcp, acts with a user token, and each tool needs specific OAuth scopes on that token.1 Request only the scopes the agent’s job needs. For a research agent that searches and reads, that means the search:read.* and *:history scopes and nothing with write. Leaving out chat:write and files:write removes the agent’s two easiest ways to send data somewhere. And replace @modelcontextprotocol/server-slack if you still run it: that reference server was archived in May 2025.2
Deedglass
A tool call meets your rules before it runs
Asks to run
DELETE FROM visits;
Deletes every row in visits
Deedglass checks your rules
- Reading dataAllowed
- Deleting a whole table (DROP, TRUNCATE)Never
- Changing or deleting rows without saying which (WHERE)This one
- Other changesWait for a person
How Slack’s server is built
A few design choices shape the risk, all from Slack’s overview page:1
- User tokens. Tools act as the person who completed OAuth, so an agent can read every channel that person can.
- Admin approval. MCP client apps go through Slack’s standard app approval, so workspace admins can approve and manage them.
- Only listed apps. Only apps published in the Slack Marketplace and internal apps can use MCP; unlisted apps are prohibited.
- Audit logs. Slack points to its audit logs for MCP activity.
That last point is worth acting on. If you’re the admin, find MCP activity in the audit logs before you need it.
The scope map
Slack documents the scope each tool needs.1 Sorted by what the scope lets the agent do:
| Tool | Scopes | Reads or writes |
|---|---|---|
| Search messages and channels | search:read.public, search:read.private, search:read.mpim, search:read.im |
reads |
| Search files | search:read.files |
reads |
| Search users | search:read.users |
reads |
| Read a channel or thread | channels:history, groups:history, mpim:history, im:history |
reads |
| Read files | files:read |
reads |
| User profile and email | users:read, users:read.email |
reads |
| List channels and members | channels:read, groups:read, im:read, mpim:read |
reads |
| Get reactions | reactions:read |
reads |
| Send or schedule a message | chat:write |
writes, and can send data out |
| Upload a file | files:write |
writes, and can send data out |
| Create a conversation or channel | channels:write, groups:write, im:write, mpim:write |
writes |
| Create or update a canvas | canvases:read, canvases:write |
writes |
| Lists | lists:read, lists:write |
writes |
| Add reactions | reactions:write |
writes (low impact) |
Note the private ones. search:read.private, groups:history and im:history reach private channels and direct messages. An agent rarely needs your DMs.
Three minimal sets
A research agent that answers “what did we decide about X?”:
Code What the screen or file shows, copied as is.
search:read.public channels:history channels:read
Public channels only. Add search:read.private and groups:history only if the answer lives in private channels the agent should see.
A standup summarizer that reads one channel and posts one message:
Code What the screen or file shows, copied as is.
channels:history channels:read chat:write
chat:write is back, so keep the client’s approval prompt on for “send message”, and check the channel name in each request.
An incident helper that drafts a canvas from a channel:
Code What the screen or file shows, copied as is.
channels:history channels:read canvases:read canvases:write
No chat:write and no files:write. It writes a canvas a person can read and share.
Why the write scopes matter most
Simon Willison’s “lethal trifecta” is private data, exposure to untrusted content and the ability to communicate externally.3 Slack can supply all three by itself. Private channels are the data. Any message from anyone, including external people in Slack Connect channels, is untrusted content. And chat:write or files:write is a way out: post a summary of a private channel into a shared one, or upload a file to a conversation an outsider can see.
Slack’s own advice points the same way: be careful about connecting the Slack server alongside other MCP servers, since each has its own security characteristics.1 An agent with Slack read scopes and a separate tool that can reach the internet has the trifecta even without chat:write.
So the rule of thumb: an agent that reads widely shouldn’t write at all, and an agent that writes should read narrowly.
The archived reference server
@modelcontextprotocol/server-slack is one of the reference servers moved to modelcontextprotocol/servers-archived, created and archived on 28 May 2025.2 Its README had you paste a bot token (xoxb-) into the config as SLACK_BOT_TOKEN, and it’s unmaintained.2 Moving to Slack’s own server also moves you to OAuth, admin approval and audit logs.
What a config scanner sees
In our run of deedglass 0.13.0’s scan, the archived Slack server in the sample config added no write paths and no finding.4 The scanner didn’t flag the bot token written into the file either. If your configs still carry SLACK_BOT_TOKEN in an env block, find it with a search, rotate the token, and remove the entry:
Code Commands typed in a terminal. The text around it says what happens.
grep -rn "server-slack\|SLACK_BOT_TOKEN" .mcp.json .cursor .vscode ~/.cursor 2>/dev/null
A checklist
- No
@modelcontextprotocol/server-slackin any config. - The MCP client app is approved by a workspace admin.
- Scopes match the agent’s job; no
*.imor*.mpimscopes unless needed. - Agents that read widely don’t hold
chat:writeorfiles:write. - Send-message and upload tools ask before each call.
- Someone knows where MCP activity shows up in the audit logs.
Questions people ask
Does the Slack MCP server use bot tokens or user tokens?
User tokens. Each tool needs specific scopes on the user token, and the agent acts as the user who signed in.1
Which scope lets a Slack MCP agent send messages?
chat:write, for both sending and scheduling messages. Leave it out for agents that only read.1
Is @modelcontextprotocol/server-slack still maintained?
No. It was archived on 28 May 2025 with the other retired reference servers.2
Related reading: the lethal trifecta, prompt injection, the same review for Notion’s MCP server, and the general MCP security checklist and ten-minute config audit.
To see what the rest of your agent setup can change, run npx deedglass scan in the repository (what the grade means), or watch the checks in the playground.
Written with AI assistance and checked against our claims register.