Slack MCP
Overview
The Slack MCP connector enables your Leena AI Agents to integrate with your organization's Slack workspace, facilitating automated communication workflows such as searching messages and files, reading channels and threads, sending and scheduling messages, and looking up people.
The Slack MCP server is Slack's official remote Model Context Protocol (MCP) server that securely exposes Slack content and actions as tools for AI agents. Leena AI connects to it through the MCP connector, allowing Agents to search across channels, DMs, and files, read conversation history and threads, send and schedule messages, work with canvases, and access member profiles — all while respecting each user's existing Slack access, with workspace admins keeping visibility and control over the integration.
API Details
Leena AI integrates with the Slack MCP server via the Model Context Protocol (MCP) over Streamable HTTP (JSON-RPC 2.0).
MCP server URL: https://mcp.slack.com/mcp
Documentation link: https://docs.slack.dev/ai/slack-mcp-server/
Setup
The Slack MCP server is connected through Leena AI's MCP connector. The connector supports the following authentication types: No authentication, Custom auth (static headers), Admin OAuth 2.0, and User OAuth 2.0.
The Slack MCP server uses OAuth 2.0 user authorization with a Slack app's credentials. For Slack MCP, use:
- User OAuth 2.0 (recommended): Each employee signs in with their own Slack account, and every action runs with that user's existing Slack access — the same channels, DMs, and files they can see in Slack.
The Slack MCP server can be used by apps published in the Slack Marketplace or internal apps created for your workspace, and a workspace admin has to approve the MCP integration. Admins can manage all MCP client integrations for the workspace.
Prerequisites
Before setting up the Slack MCP connector, ensure you have:
- A Slack workspace and permission to create a Slack app (or an existing internal/Marketplace app) for your organization
- Workspace admin approval for the MCP integration — admins can approve and manage MCP client integrations
- Slack accounts for the employees who will use the actions
- Access to your Leena AI workspace with connector management permissions
Get credentials
Here is how to get the OAuth credentials of your Slack app:
- Log in to your Slack account and go to Your Apps (api.slack.com/apps)
- Click Create New App (or open your existing internal app) and select your workspace
- Note the credentials:
- Open the app's Basic Information page
- Under App Credentials, copy the Client ID and Client Secret (keep the secret secure)
- Configure the redirect URL:
- Go to OAuth & Permissions
- Under Redirect URLs, add the redirect URL — this will be filled later from Leena AI
- Save the changes
- Ask a workspace admin to approve the app/MCP integration for your workspace
Add connection
Here is how to add a connection on Leena AI:
- Log in to your Leena AI workspace
- Navigate to Settings > Integrations
- Search for "Custom MCP" and select it from the list to add its new connector
- Give the connection a name (for example, "Slack MCP")
- Start configuring the connector
- MCP remote URL: The Slack MCP server URL —
https://mcp.slack.com/mcp - Authentication type: Select "User OAuth 2.0"
- MCP remote URL: The Slack MCP server URL —
- Fill in the OAuth fields:
- Redirect URI: The callback URL for the OAuth flow (auto-generated by Leena AI)
- Client ID: Your Slack app's client ID
- Client secret: Your Slack app's client secret
- Copy the Redirect URI and update the Slack app
- Copy the auto-generated Redirect URI from Leena AI
- Go back to your Slack app's OAuth & Permissions page and add it under Redirect URLs
- Save the changes
- Complete the OAuth flow and save the configuration
- Click Connect in Leena AI for the Slack MCP connection
- You'll be redirected to Slack's authorization page
- Sign in to your Slack workspace if prompted
- Click Allow to grant access
- You'll be redirected back to Leena AI with a successful connection
- The connector will be saved
- Once the connection is authorized, the available actions are fetched automatically from the Slack MCP server and can be selected while building skills (workflows)
With User OAuth 2.0, each employee authorizes their own Slack account the first time an action runs on their behalf. If a user hasn't connected yet, Leena AI shares an authorization link so they can sign in to Slack.
Actions
Actions for this connector are discovered dynamically from the Slack MCP server. Every action runs with the authenticated user's existing Slack access — searches and reads only return content the user can already see in Slack.
The following key actions are supported for the Slack MCP connector:
slack_search_public_and_private
Searches for messages and files across all Slack conversations the user can access — public channels, private channels, DMs, and group DMs — using Slack's search syntax with modifiers such as in:, from:, to:, is:, has:, before:/after:, exact phrases, and exclusions. Here are some common use cases:
- Knowledge Recall: Find past discussions or decisions on a topic
- File Search: Find shared documents, PDFs, or canvases using file filters
- Scoped Search: Search within a specific channel or from a specific person
- Timeline Search: Find messages within a date range
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Query | Search query using Slack's search syntax (e.g., in:#channel, from:@user, has:file, after:YYYY-MM-DD, "exact phrase", -word) |
Optional
| Name | Description |
|---|---|
| Channel Types | Comma-separated channel types to include — any combination of public_channel, private_channel, mpim (group DM), im (DM). Defaults to all |
| Content Types | Content types to include — any combination of messages and files |
| Sort | Sort by relevance or date — score (default) or timestamp |
| Sort Direction | Sort direction — desc (default) or asc |
| Limit | Number of results to return, up to a maximum of 20 (default 20) |
| Cursor | Cursor for pagination; leave blank for the first request |
| After / Before | Only messages after/before the given Unix timestamps (inclusive) |
| Only My Channels | Limit results to channels the user is a member of (default false) |
| Include Bots | Include bot messages (default false) |
| Include Context | Include surrounding context messages for each result (default true) |
Here is a sample JSON input:
{
"query": "leave policy in:#hr-helpdesk after:2026-07-01",
"limit": 10,
"sort": "timestamp"
}Response
The action returns a list of matching messages and/or files, each containing:
- The message text (with surrounding context, when enabled) or file details
- Channel, author, and timestamp information
- Thread information where applicable
- Cursor for the next page (when more results are available)
slack_search_channels
Searches for Slack channels by name or description. Here are some common use cases:
- Channel Lookup: Find the channel ID for a known channel name before reading or posting
- Discovery: Find channels related to a team, project, or topic
- Archive Check: Include archived channels when looking for historical discussions
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Query | Search query for finding channels |
Optional
| Name | Description |
|---|---|
| Channel Types | Comma-separated channel types to include — any combination of public_channel and private_channel. Defaults to public_channel |
| Include Archived | Include archived channels in the search results |
| Limit | Number of results to return, up to a maximum of 20 (default 20) |
| Cursor | Cursor for pagination; leave blank for the first request |
Here is a sample JSON input:
{
"query": "it-support",
"channel_types": "public_channel,private_channel"
}Response
The action returns a list of matching channels, each containing:
- Channel name and ID
- Topic and purpose
- Archive status
- Cursor for the next page (when more results are available)
slack_read_channel
Reads messages from a Slack channel in reverse chronological order (newest first). A user ID can be used as the channel ID to read DM history. Here are some common use cases:
- Catch-up: Summarize the latest messages in a channel
- Context Gathering: Read recent channel history before drafting a reply
- DM Review: Read the user's direct message history with a person
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Channel ID | ID of the channel, private group, or IM channel to fetch history for (a user ID reads DM history) |
Optional
| Name | Description |
|---|---|
| Limit | Number of messages to return, between 1 and 100 (default 100) |
| Oldest / Latest | Start / end of the time range of messages to include (timestamps) |
| Cursor | Cursor for pagination from a previous request |
Here is a sample JSON input:
{
"channel_id": "C0123456789",
"limit": 50
}Response
The action returns the channel's messages, each containing:
- Message text, author, and timestamp
- Reactions and thread information (in the detailed format)
- Cursor for the next page (when more results are available)
slack_read_thread
Reads messages from a specific Slack thread — the parent message and all replies. Here are some common use cases:
- Thread Summary: Summarize a long discussion thread
- Decision Extraction: Pull the outcome of a threaded conversation
- Reply Preparation: Read a thread before replying to it
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Channel ID | Channel, private group, or IM channel to fetch thread replies for |
| Message Timestamp | Timestamp of the parent message in Slack ts format (e.g. "1234567890.123456") |
Optional
| Name | Description |
|---|---|
| Limit | Number of messages to return, between 1 and 1000 (default 100) |
| Oldest / Latest | Start / end of the time range of messages to include (Slack ts format) |
| Cursor | Cursor for pagination from a previous request |
Here is a sample JSON input:
{
"channel_id": "C0123456789",
"message_ts": "1753856400.123456"
}Response
The action returns the thread's messages (parent and replies), each containing:
- Message text, author, and timestamp
- Reactions and thread information (in the detailed format)
- Cursor for the next page (when more results are available)
slack_send_message
Sends a message to a Slack channel or user (a user ID as the channel ID sends a DM). Messages support standard markdown formatting — bold, italics, code, block quotes, lists, links, tables, and code blocks — up to 5,000 characters per text element. Here are some common use cases:
- Notifications: Post workflow updates or reminders to a channel
- Direct Messages: Send a summary or follow-up to a specific person
- Thread Replies: Reply within an existing thread, optionally broadcasting to the channel
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Channel ID | The channel to post to (a user ID sends a direct message) |
| Message | The message content (markdown formatted) |
Optional
| Name | Description |
|---|---|
| Thread Timestamp | Another message's ts value to make this message a thread reply |
| Reply Broadcast | When replying in a thread, also send the reply to the whole conversation |
Here is a sample JSON input:
//Post to a Channel
{
"channel_id": "C0123456789",
"message": "Reminder: please submit your timesheets by Friday EOD."
}
//Reply in a Thread
{
"channel_id": "C0123456789",
"message": "This has been resolved — closing the loop here.",
"thread_ts": "1753856400.123456"
}Response
Upon successful sending, the action returns:
- Confirmation of the sent message with its timestamp
- A link to the message
slack_schedule_message
Schedules a message for future delivery to a Slack channel (it does not send immediately). The scheduled time must be at least 2 minutes in the future and at most 120 days out. Here are some common use cases:
- Timed Reminders: Schedule a reminder before a meeting or deadline
- Off-hours Posting: Prepare an announcement to go out during working hours
- Follow-ups: Schedule a check-in message for a future date
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Channel ID | Channel where the message will be scheduled (a user ID schedules a direct message) |
| Message | Message content to schedule (markdown formatted) |
| Post At | Unix timestamp when the message should be sent (minimum 2 minutes ahead, maximum 120 days) |
Optional
| Name | Description |
|---|---|
| Thread Timestamp | Message timestamp to reply to (for thread replies) |
| Reply Broadcast | Broadcast the thread reply to the channel |
Here is a sample JSON input:
{
"channel_id": "C0123456789",
"message": "Standup starts in 10 minutes.",
"post_at": 1754035200
}Response
Upon successful scheduling, the action returns confirmation of the scheduled message and its delivery time.
Once scheduled, the message cannot be edited via the API — it can be managed from "Drafts and sent" in the Slack app.
slack_search_users
Searches for Slack users by name, email, or profile attributes such as department, role, or title. Here are some common use cases:
- People Lookup: Find a user's ID by name or email before messaging them
- Team Discovery: Find people in a department or with a specific role
- Disambiguation: Distinguish between users with similar names
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
| Name | Description |
|---|---|
| Query | Search query — full or partial names, email addresses, departments/roles, combinations, and exclusions (e.g. "engineering -intern") |
Optional
| Name | Description |
|---|---|
| Limit | Number of results to return, up to a maximum of 20 (default 20) |
| Cursor | Cursor for pagination; leave blank for the first request |
Here is a sample JSON input:
{
"query": "priya engineering"
}Response
The action returns a list of matching users, each containing:
- User ID and display name
- Email and profile attributes
- Cursor for the next page (when more results are available)
slack_read_user_profile
Retrieves detailed profile information for a Slack user — contact info, status, timezone, organization, and role. If no user is specified, it returns the current user's profile. Here are some common use cases:
- Contact Details: Get a colleague's email, title, or timezone
- Availability Context: Check a user's status before scheduling or messaging
- Self Lookup: Identify the connected user's own profile
Input Parameters
Here are the input parameters required to set up this action:
Mandatory
This action has no mandatory input parameters (it defaults to the current user).
Optional
| Name | Description |
|---|---|
| User ID | Slack user ID to look up (e.g. "U0123456789"); defaults to the current user |
| Include Locale | Include the user's locale information (default false) |
Here is a sample JSON input:
{
"user_id": "U0123456789"
}Response
The action returns the user's profile including:
- Name, title, and organization
- Contact information
- Status and timezone
Other available actions
In addition to the key actions above, the following actions are discovered from the Slack MCP server and can be used in skills (workflows):
| Action | Description |
|---|---|
| slack_search_public | Searches messages and files in public channels only |
| slack_send_message_draft | Creates a message as a draft for the user to review before sending |
| slack_add_reaction | Adds an emoji reaction to a message |
| slack_get_reactions | Retrieves the reactions on a message |
| slack_list_channel_members | Lists the members of a channel |
| slack_read_file | Reads a file shared in Slack |
| slack_search_emojis | Searches the emojis available in the workspace |
| slack_create_canvas | Creates a Slack canvas |
| slack_read_canvas | Reads the content of a Slack canvas |
| slack_update_canvas | Updates a Slack canvas |
Updated about 16 hours ago
