Slack MCP Server
Provides the ability to interact with a Slack workspace by posting messages to channels and retrieving a list of all workspace users
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 MCP Serversend a message to the general channel saying 'Team meeting at 3 PM today'"
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 Model Context Protocol Server
This is a connector to allow Claude Desktop (or any MCP client) to interact with your Slack workspace to post messages and query a list of all users.
Local Development
In order to run this client locally, add the following configuration to your Claude Desktop MCP Server config file:
{
"mcpServers": {
"mcp-slack-local": {
"command": "node",
"args": ["/path/to/project/dist/index.js"], <---- replace this with your project path
"env": {
"SLACK_BOT_USER_OAUTH_TOKEN": "test-bot-token",
"SLACK_TEAM_ID": "test-team-id"
}
},
}
}After this, you should be able to test this implementation in your Claude Desktop App using example prompts like:
"Can you list all users of my Slack team?"
"Can you send a welcome message to my Slack Channel with the ID
<channel id>?"
Running the server locally:
node dist/index.jsWith the build in another terminal
npm run watchRelated MCP server: Slack MCP Server by CData
Slack Permission Scopes
The following permissions are already implemented:
Permission | Description | Implemented |
app_configurations:read | Read app configuration info via App Manifest APIs | ❌ |
app_configurations:write | Write app configuration info and create apps via App Manifest APIs | ❌ |
app_mentions:read | View messages that directly mention @your_slack_app in conversations that the app is in | ❌ |
assistant:write | Allow your slack app to act as an AI Assistant | ❌ |
bookmarks:read | List bookmarks | ❌ |
bookmarks:write | Create, edit, and remove bookmarks | ❌ |
calls:read | View information about ongoing and past calls | ❌ |
calls:write | Start and manage calls in a workspace | ❌ |
canvases:read | your slack app will be able to access contents of canvases created inside Slack. | ❌ |
canvases:write | your slack app will be able to create, edit and remove canvases. | ❌ |
channels:history | View messages and other content in public channels that your slack app has been added to | ❌ |
channels:join | Join public channels in a workspace | ❌ |
channels:manage | Manage public channels that your slack app has been added to and create new ones | ❌ |
channels:read | View basic information about public channels in a workspace | ❌ |
channels:write.invites | Invite members to public channels | ❌ |
channels:write.topic | Set the description of public channels | ❌ |
chat:write | Post messages in approved channels & conversations | ✅ |
chat:write.customize | Send messages as @your_slack_app with a customized username and avatar | ❌ |
chat:write.public | Send messages to channels @your_slack_app isn't a member of | ❌ |
commands | Add shortcuts and/or slash commands that people can use | ❌ |
conversations.connect:manage | Allows your slack app to manage Slack Connect channels | ❌ |
conversations.connect:read | Receive Slack Connect invite events sent to the channels your slack app is in | ❌ |
conversations.connect:write | Create Slack Connect invitations for channels that your slack app has been added to, and accept invitations sent to your slack app | ❌ |
datastore:read | View and see data from Slack App Datastore | ❌ |
datastore:write | Write data to Slack App Datastore | ❌ |
dnd:read | View Do Not Disturb settings for people in a workspace | ❌ |
emoji:read | View custom emoji in a workspace | ❌ |
files:read | View files shared in channels and conversations that your slack app has been added to | ❌ |
files:write | Upload, edit, and delete files as your slack app | ❌ |
groups:history | View messages and other content in private channels that your slack app has been added to | ❌ |
groups:read | View basic information about private channels that your slack app has been added to | ❌ |
groups:write | Manage private channels that your slack app has been added to and create new ones | ❌ |
groups:write.invites | Invite members to private channels | ❌ |
groups:write.topic | Set the description of private channels | ❌ |
im:history | View messages and other content in direct messages that your slack app has been added to | ❌ |
im:read | View basic information about direct messages that your slack app has been added to | ❌ |
im:write | Start direct messages with people | ❌ |
im:write.topic | Set the description in direct messages | ❌ |
incoming-webhook | Create one-way webhooks to post messages to a specific channel | ❌ |
links.embed:write | Embed video player URLs in messages and app surfaces | ❌ |
links:read | View URLs in messages | ❌ |
links:write | Show previews of URLs in messages | ❌ |
metadata.message:read | Allows your slack app to read message metadata in channels that your slack app has been added to | ❌ |
mpim:history | View messages and other content in group direct messages that your slack app has been added to | ❌ |
mpim:read | View basic information about group direct messages that your slack app has been added to | ❌ |
mpim:write | Start group direct messages with people | ❌ |
mpim:write.topic | Set the description in group direct messages | ❌ |
none | Execute methods without needing a scope | ❌ |
pins:read | View pinned content in channels and conversations that your slack app has been added to | ❌ |
pins:write | Add and remove pinned messages and files | ❌ |
reactions:read | View emoji reactions and their associated content in channels and conversations that your slack app has been added to | ❌ |
reactions:write | Add and edit emoji reactions | ❌ |
reminders:read | View reminders created by your slack app | ❌ |
reminders:write | Add, remove, or mark reminders as complete | ❌ |
remote_files:read | View remote files added by the app in a workspace | ❌ |
remote_files:share | Share remote files on a user's behalf | ❌ |
remote_files:write | Add, edit, and delete remote files on a user's behalf | ❌ |
search:read.files | Search a workspace's content in files | ❌ |
search:read.im | Search a workspace's content in direct messages | ❌ |
search:read.mpim | Search a workspace's content in group direct messages | ❌ |
search:read.private | Search a workspace's content in private channels | ❌ |
search:read.public | Search a workspace's content in public channels | ❌ |
team.billing:read | Allows your slack app to read the billing plan for workspaces your slack app has been installed to | ❌ |
team.preferences:read | Allows your slack app to read the preferences for workspaces your slack app has been installed to | ❌ |
team:read | View the name, email domain, and icon for workspaces your slack app is connected to | ❌ |
tokens.basic | Execute methods without needing a scope | ❌ |
triggers:read | Read new Platform triggers | ❌ |
triggers:write | Create new Platform triggers | ❌ |
usergroups:read | View user groups in a workspace | ❌ |
usergroups:write | Create and manage user groups | ❌ |
users.profile:read | View profile details about people in a workspace | ❌ |
users:read | View people in a workspace | ✅ |
users:read.email | View email addresses of people in a workspace | ❌ |
users:write | Set presence for your slack app | ❌ |
workflow.steps:execute | Add steps that people can use in Workflow Builder | ❌ |
workflows.templates:read | Read a workflow template | ❌ |
workflows.templates:write | Write a workflow template | ❌ |
Contact
If you have questions, feel free to contact us via AVIMBU.
Available Tools
2 toolsslack_get_usersB
Get a list of all users in the workspace with basic information
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Pagination cursor for next page of results | |
| limit | No | Maximum number of users to return (default 100, max 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While it indicates this is a read operation ('Get'), it doesn't mention important behavioral aspects like authentication requirements, rate limits, error conditions, or what 'basic information' specifically includes. For a tool that presumably accesses workspace data, this leaves significant gaps in understanding how it behaves.
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 a single, efficient sentence that communicates the core purpose without any wasted words. It's appropriately sized for a straightforward list operation and front-loads the essential information. Every word earns its place in this concise formulation.
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 relatively simple list operation with 2 parameters and no output schema, the description provides adequate but minimal context. It covers what the tool does but lacks important operational details like authentication requirements, rate limits, and what specific user information is returned. Without annotations or output schema, the description should ideally provide more complete guidance about the tool's behavior and results.
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?
The schema description coverage is 100%, with both parameters ('cursor' and 'limit') fully documented in the schema. The description doesn't add any additional parameter semantics beyond what's already in the schema. According to the scoring rules, when schema coverage is high (>80%), the baseline is 3 even with no parameter information in the description.
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 verb ('Get') and resource ('list of all users in the workspace'), making the purpose immediately understandable. It specifies 'with basic information' which adds useful context about the scope of returned data. However, it doesn't explicitly differentiate from the sibling tool 'slack_post_message', which is a completely different operation.
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 provides no guidance on when to use this tool versus alternatives. There's no mention of prerequisites, appropriate contexts, or comparison with the sibling 'slack_post_message' tool. The agent must infer usage purely from the tool name and description without any explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_post_messageC
Post a new message to a Slack channel
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | The Channel ID to post the message to | |
| text | Yes | The message text to post |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While 'Post a new message' implies a write operation, it doesn't mention authentication requirements, rate limits, error conditions, or what happens if the channel doesn't exist. This leaves significant behavioral gaps for a mutation tool.
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 a single, efficient sentence that communicates the core purpose without any wasted words. It's appropriately sized for a simple tool and gets straight to the point.
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 mutation tool with no annotations and no output schema, the description is insufficient. It doesn't explain what the tool returns, error conditions, authentication requirements, or any behavioral details beyond the basic action. Given the complexity of posting to Slack (which involves permissions, formatting, etc.), more context is needed.
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?
The input schema has 100% description coverage, with both parameters clearly documented in the schema. The description doesn't add any additional semantic context about the parameters beyond what's already in the schema, so it meets the baseline for high schema coverage.
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 action ('Post a new message') and target resource ('to a Slack channel'), making the purpose immediately understandable. However, it doesn't differentiate from its sibling tool 'slack_get_users' beyond the obvious difference in function, which is why it doesn't reach a perfect score.
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 provides no guidance on when to use this tool versus alternatives or any prerequisites for usage. It simply states what the tool does without context about appropriate scenarios or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The two tools have clearly distinct purposes: one retrieves user information and the other posts messages, with no overlap in functionality. An agent can easily differentiate between them based on their descriptions.
Both tools follow a consistent 'slack_verb_noun' pattern (slack_get_users, slack_post_message), using snake_case and clear action-object naming. This makes them predictable and easy to understand.
With only 2 tools, the server feels severely under-scoped for a Slack integration, lacking essential operations like reading messages, managing channels, or handling reactions. This minimal set limits agent capabilities significantly.
The tool surface is highly incomplete for a Slack server, missing core functionalities such as reading channel messages, listing channels, updating or deleting messages, and interacting with threads. This will cause frequent agent failures in typical Slack workflows.
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
Connect Claude AI to UluP Spaces via MCP — create projects, nodes, and tasks with OAuth 2.0.
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Connect Claude to your Platform7n workspaces — chat, links, and tasks. One-click OAuth.
Related MCP Servers
- -licenseNot gradedqualityAmaintenanceMCP Server for the Slack API, enabling Claude to interact with Slack workspaces.87,50690,042MIT
- AlicenseNot gradedqualityDmaintenanceThis read-only MCP Server allows you to connect to Slack data from Claude Desktop through CData JDBC Drivers. For full CRUD support, check out the first managed MCP platform: CData Connect AI (https://www.cdata.com/ai/).MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP-compatible clients to interact with Slack through Web API tools and subscribe to inbound Slack messages via Socket Mode notifications.202MIT
- FlicenseBqualityAmaintenanceMCP server for Slack workspace integration, exposing 40+ Slack operations as tools for Claude Desktop and providing a clean async Python API.641
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/AVIMBU/slack-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server