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:

  1. Log in to your Slack account and go to Your Apps (api.slack.com/apps)
  2. Click Create New App (or open your existing internal app) and select your workspace
  3. Note the credentials:
    1. Open the app's Basic Information page
    2. Under App Credentials, copy the Client ID and Client Secret (keep the secret secure)
  4. Configure the redirect URL:
    1. Go to OAuth & Permissions
    2. Under Redirect URLs, add the redirect URL — this will be filled later from Leena AI
    3. Save the changes
  5. 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:

  1. Log in to your Leena AI workspace
  2. Navigate to Settings > Integrations
  3. Search for "Custom MCP" and select it from the list to add its new connector
  4. Give the connection a name (for example, "Slack MCP")
  5. Start configuring the connector
    1. MCP remote URL: The Slack MCP server URL — https://mcp.slack.com/mcp
    2. Authentication type: Select "User OAuth 2.0"
  6. Fill in the OAuth fields:
    1. Redirect URI: The callback URL for the OAuth flow (auto-generated by Leena AI)
    2. Client ID: Your Slack app's client ID
    3. Client secret: Your Slack app's client secret
  7. Copy the Redirect URI and update the Slack app
    1. Copy the auto-generated Redirect URI from Leena AI
    2. Go back to your Slack app's OAuth & Permissions page and add it under Redirect URLs
    3. Save the changes
  8. Complete the OAuth flow and save the configuration
    1. Click Connect in Leena AI for the Slack MCP connection
    2. You'll be redirected to Slack's authorization page
    3. Sign in to your Slack workspace if prompted
    4. Click Allow to grant access
    5. You'll be redirected back to Leena AI with a successful connection
    6. The connector will be saved
  9. 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

NameDescription
QuerySearch query using Slack's search syntax (e.g., in:#channel, from:@user, has:file, after:YYYY-MM-DD, "exact phrase", -word)

Optional

NameDescription
Channel TypesComma-separated channel types to include — any combination of public_channel, private_channel, mpim (group DM), im (DM). Defaults to all
Content TypesContent types to include — any combination of messages and files
SortSort by relevance or date — score (default) or timestamp
Sort DirectionSort direction — desc (default) or asc
LimitNumber of results to return, up to a maximum of 20 (default 20)
CursorCursor for pagination; leave blank for the first request
After / BeforeOnly messages after/before the given Unix timestamps (inclusive)
Only My ChannelsLimit results to channels the user is a member of (default false)
Include BotsInclude bot messages (default false)
Include ContextInclude 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

NameDescription
QuerySearch query for finding channels

Optional

NameDescription
Channel TypesComma-separated channel types to include — any combination of public_channel and private_channel. Defaults to public_channel
Include ArchivedInclude archived channels in the search results
LimitNumber of results to return, up to a maximum of 20 (default 20)
CursorCursor 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

NameDescription
Channel IDID of the channel, private group, or IM channel to fetch history for (a user ID reads DM history)

Optional

NameDescription
LimitNumber of messages to return, between 1 and 100 (default 100)
Oldest / LatestStart / end of the time range of messages to include (timestamps)
CursorCursor 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

NameDescription
Channel IDChannel, private group, or IM channel to fetch thread replies for
Message TimestampTimestamp of the parent message in Slack ts format (e.g. "1234567890.123456")

Optional

NameDescription
LimitNumber of messages to return, between 1 and 1000 (default 100)
Oldest / LatestStart / end of the time range of messages to include (Slack ts format)
CursorCursor 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

NameDescription
Channel IDThe channel to post to (a user ID sends a direct message)
MessageThe message content (markdown formatted)

Optional

NameDescription
Thread TimestampAnother message's ts value to make this message a thread reply
Reply BroadcastWhen 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
📘

Messages cannot be posted to externally shared (Slack Connect) channels.

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

NameDescription
Channel IDChannel where the message will be scheduled (a user ID schedules a direct message)
MessageMessage content to schedule (markdown formatted)
Post AtUnix timestamp when the message should be sent (minimum 2 minutes ahead, maximum 120 days)

Optional

NameDescription
Thread TimestampMessage timestamp to reply to (for thread replies)
Reply BroadcastBroadcast 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

NameDescription
QuerySearch query — full or partial names, email addresses, departments/roles, combinations, and exclusions (e.g. "engineering -intern")

Optional

NameDescription
LimitNumber of results to return, up to a maximum of 20 (default 20)
CursorCursor 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

NameDescription
User IDSlack user ID to look up (e.g. "U0123456789"); defaults to the current user
Include LocaleInclude 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):

ActionDescription
slack_search_publicSearches messages and files in public channels only
slack_send_message_draftCreates a message as a draft for the user to review before sending
slack_add_reactionAdds an emoji reaction to a message
slack_get_reactionsRetrieves the reactions on a message
slack_list_channel_membersLists the members of a channel
slack_read_fileReads a file shared in Slack
slack_search_emojisSearches the emojis available in the workspace
slack_create_canvasCreates a Slack canvas
slack_read_canvasReads the content of a Slack canvas
slack_update_canvasUpdates a Slack canvas


Did this page help you?