The Slack MCP connector routes your AI agent's tool calls to Slack's own MCP server through Scalekit. Each user signs in to Slack once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 19 tools.
- Tools
- 19
- What they doRead · write · destructive
- 12 · 6 · 112 read6 write1 destructive
- Users sign in with
- OAuth
- OAuth app
- Your own Slack app
What you can do
- Send messages: post to channels, DMs, and threads across your Slack workspace
- Read conversations: retrieve channel history, thread replies, and direct messages
- Search channels and users: find channels, team members, and public messages by keyword
- Manage canvases: create, read, and update Slack Canvas documents
- React to messages: add and retrieve emoji reactions on any message
- Schedule messages: deliver messages to channels at a specified future time
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Slack MCP connection
In AgentKit > Connections, create a Slack MCP connection and copy its redirect URI. The name you give it is the
connection_nameyour code passes. See Configure connections.Register an OAuth app
Slack connections use your own OAuth app. Register one with Slack and add the redirect URI you copied.
Then enter the app's Client ID and Client Secret on the Slack MCP connection.
Console steps with screenshots
Slack serves Model Context Protocol (MCP) traffic only to apps that have its MCP server turned on. Enable MCP access on the Slack app whose client ID and secret you use for the connection, then create the connection in Scalekit.
-
Enable MCP access in your Slack app
- Go to api.slack.com/apps and open the app whose Client ID and Client Secret you configure on the Slack MCP connection. MCP access applies per app, so enabling it on any other app has no effect on the connection.
- In the left sidebar, under Features, click Agents & AI Apps. Some workspaces label this item Agents.
- Turn on Slack Model Context Protocol (MCP) Server.

-
Connect in Scalekit
In Scalekit dashboard, go to AgentKit > Connections > Create Connection. Find Slack MCP and click Create. Enter the Client ID and Client Secret of the same Slack app, then click Save.
-
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'slackmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Slack MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'slackmcp_slack_read_user_profile',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "slackmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Slack MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="slackmcp_slack_read_user_profile",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolslackmcp_slack_get_reactionsRetrieve all emoji reactions on a specific Slack message.Read-onlySlack Get Reactions
Retrieve all emoji reactions on a specific Slack message.
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
message_tsstringrequired- Timestamp of the message. Get it from slack_read_channel or slack_read_thread.
slackmcp_slack_list_channel_membersList members of a Slack channel, group, or group DM with profile details.Read-onlySlack List Channel Members
List members of a Slack channel, group, or group DM with profile details.
Inputs
channel_idstringrequired- ID of the channel to list members from
cursorstring- Pagination cursor from previous response
include_botsboolean- Include bots and apps in the member list (default: false)
include_deletedboolean- Include deleted/deactivated users in the member list (default: false)
limitinteger- Number of members to return per page (default: 30, max: 30)
response_formatstring- Level of detail (default: 'detailed'). Options: 'detailed', 'concise', 'ids_only'one of
detailedconciseids_only
slackmcp_slack_read_canvasRetrieve the Markdown content and section ID mapping of a Slack Canvas document.Read-onlySlack Read Canvas
Retrieve the Markdown content and section ID mapping of a Slack Canvas document.
Inputs
canvas_idstringrequired- ID of the Slack canvas document. Get it from slack_search_public.
slackmcp_slack_read_channelRead messages from a Slack channel in reverse chronological order (newest first).Read-onlySlack Read Channel
Read messages from a Slack channel in reverse chronological order (newest first).
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
cursorstring- Pagination cursor from the previous response to fetch the next page.
lateststring- Only return messages before this Unix timestamp (e.g. 1640995200.000000).
limitinteger- Maximum number of results to return per page.
oldeststring- Only return messages after this Unix timestamp (e.g. 1609459200.000000).
response_formatstring- Level of detail in the response. Accepted values: detailed, concise, ids_only.
slackmcp_slack_read_fileRead a Slack file's content by file ID.Read-onlySlack Read File
Read a Slack file's content by file ID. Returns text or base64-encoded content.
Inputs
file_idstringrequired- ID of the Slack file. Get it from slack_search_public.
slackmcp_slack_read_threadRead all messages in a Slack thread — the parent message and its replies.Read-onlySlack Read Thread
Read all messages in a Slack thread — the parent message and its replies.
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
message_tsstringrequired- Timestamp of the message. Get it from slack_read_channel or slack_read_thread.
cursorstring- Pagination cursor from the previous response to fetch the next page.
lateststring- Only return messages before this Unix timestamp (e.g. 1640995200.000000).
limitinteger- Maximum number of results to return per page.
oldeststring- Only return messages after this Unix timestamp (e.g. 1609459200.000000).
response_formatstring- Level of detail in the response. Accepted values: detailed, concise, ids_only.
slackmcp_slack_read_user_profileRetrieve detailed profile information for a Slack user including status and contact info.Read-onlySlack Read User Profile
Retrieve detailed profile information for a Slack user including status and contact info.
Inputs
include_localeboolean- Include user's locale information. Default: false
response_formatstring- Level of detail in response. 'detailed' includes all fields, 'concise' shows essential info. Default: detailed'one of
detailedconcise user_idstring- Slack user ID to look up (e.g., 'U0ABC12345'). Defaults to current user if not provided
slackmcp_slack_search_channelsSearch for Slack channels by name or description and return channel IDs and metadata.Read-onlySlack Search Channels
Search for Slack channels by name or description and return channel IDs and metadata.
Inputs
channel_typesstring- Comma-separated list of channel types to include in the search. Defaults to public_channel. Mix and match channel types by providing a comma-separated list of any combination of public_channel, private_channel. Example: public_channel,private_channel; Second Example: public_channel
cursorstring- The cursor returned by the API. Omit this parameter for the first request, and use this to get the next page of results
include_archivedboolean- Include archived channels in the search results
keywordsarray- Array of lexical search terms. Each element MUST be a single word (no spaces) OR an exact phrase in quotes. All elements are AND'd (every element must match). Use the author test: only include words the author would naturally write.
limitinteger- Number of results to return, up to a max of 20. Defaults to 20.
natural_language_querystring- The user's question restated in conversational tone. Used for semantic reranking. Do not include filter-like content (people, channels, dates) — those belong in filters. Pass an empty string when the query is purely structural (only filters, no semantic question).
response_formatstring- Level of detail (default: 'detailed'). Options: 'detailed', 'concise'one of
detailedconcise
slackmcp_slack_search_emojisSearch custom emojis available in this Slack workspace by name.Read-onlySlack Search Emojis
Search custom emojis available in this Slack workspace by name.
Inputs
querystringrequired- Search query string.
slackmcp_slack_search_publicSearch messages and files in public Slack channels only.Read-onlySlack Search Public
Search messages and files in public Slack channels only.
Inputs
afterstring- Only messages after this Unix timestamp (inclusive)
beforestring- Only messages before this Unix timestamp (inclusive)
content_typesstring- Content types to include, a comma-separated list of any combination of messages, files. Here's more info about the content types: messages: Slack messages from public channels accessible to the acting user files: Files of all types accessible to the acting user
context_channel_idstring- Context channel ID to support boosting the search results for a channel when applicable
cursorstring- The cursor returned by the API. Omit this parameter for the first request, and use this to get the next page of results
filtersstring- Slack search modifiers (e.g., 'from:<@U123> in:<#C456> after:2025-01-01'). Use for people, channels, dates, and content type constraints.
include_botsboolean- Include bot messages (default: false)
include_contextboolean- Include surrounding context messages for each result (default: true). Ignored when response_format is 'concise', which never shows context. Set to false to reduce response size.
keywordsarray- Array of lexical search terms. Each element MUST be a single word (no spaces) OR an exact phrase in quotes. All elements are AND'd (every element must match). Use the author test: only include words the author would naturally write.
limitinteger- Number of results to return, up to a max of 20. Defaults to 20.
max_context_lengthinteger- Max character length for each context message. Longer messages are truncated.
natural_language_querystring- The user's question restated in conversational tone. Used for semantic reranking. Do not include filter-like content (people, channels, dates) — those belong in filters. Pass an empty string when the query is purely structural (only filters, no semantic question).
only_my_channelsboolean- Limit results to public channels the user is a member of. Set to true when the user asks to search only their own or joined channels. Default: false.
response_formatstring- Level of detail (default: 'detailed'). Options: 'detailed', 'concise'one of
detailedconcise sortstring- Sort order: 'score' (relevance, default) or 'timestamp' (newest first unless sort_dir is 'asc').one of
scoretimestamp sort_dirstring- Sort direction (default: 'desc'). Options: 'asc', 'desc'one of
ascdesc
slackmcp_slack_search_public_and_privateSearch messages and files across all Slack channels including private ones the user has access to.Read-onlySlack Search Public And Private
Search messages and files across all Slack channels including private ones the user has access to.
Inputs
afterstring- Only messages after this Unix timestamp (inclusive)
beforestring- Only messages before this Unix timestamp (inclusive)
channel_typesstring- Comma-separated list of channel types to include in the search. Defaults to 'public_channel,private_channel,mpim,im' (all channel types including private channels, group DMs, and DMs). Mix and match channel types by providing a comma-separated list of any combination of `public_channel`, `private_channel`, `mpim`, `im`
content_typesstring- Content types to include, a comma-separated list of any combination of messages, files. Here's more info about the content types: messages: Slack messages from channels accessible to the acting user files: Files of all types accessible to the acting user
context_channel_idstring- Context channel ID to support boosting the search results for a channel when applicable
cursorstring- The cursor returned by the API. Omit this parameter for the first request, and use this to get the next page of results
filtersstring- Slack search modifiers (e.g., 'from:<@U123> in:<#C456> after:2025-01-01'). Use for people, channels, dates, and content type constraints.
include_botsboolean- Include bot messages (default: false)
include_contextboolean- Include surrounding context messages for each result (default: true). Ignored when response_format is 'concise', which never shows context. Set to false to reduce response size.
keywordsarray- Array of lexical search terms. Each element MUST be a single word (no spaces) OR an exact phrase in quotes. All elements are AND'd (every element must match). Use the author test: only include words the author would naturally write.
limitinteger- Number of results to return, up to a max of 20. Defaults to 20.
max_context_lengthinteger- Max character length for each context message. Longer messages are truncated.
natural_language_querystring- The user's question restated in conversational tone. Used for semantic reranking. Do not include filter-like content (people, channels, dates) — those belong in filters. Pass an empty string when the query is purely structural (only filters, no semantic question).
only_my_channelsboolean- Limit results to channels the user is a member of. Set to true when the user asks to search only their own or joined channels. Default: false.
response_formatstring- Level of detail (default: 'detailed'). Options: 'detailed', 'concise'one of
detailedconcise sortstring- Sort order: 'score' (relevance, default) or 'timestamp' (newest first unless sort_dir is 'asc').one of
scoretimestamp sort_dirstring- Sort direction (default: 'desc'). Options: 'asc', 'desc'one of
ascdesc
slackmcp_slack_search_usersSearch for Slack users by name, email, or profile attributes.Read-onlySlack Search Users
Search for Slack users by name, email, or profile attributes.
Inputs
cursorstring- The cursor returned by the API. Omit this parameter for the first request, and use this to get the next page of results
keywordsarray- Array of lexical search terms. Each element MUST be a single word (no spaces) OR an exact phrase in quotes. All elements are AND'd (every element must match). Use the author test: only include words the author would naturally write.
limitinteger- Number of results to return, up to a max of 20. Defaults to 20.
natural_language_querystring- The user's question restated in conversational tone. Used for semantic reranking. Do not include filter-like content (people, channels, dates) — those belong in filters. Pass an empty string when the query is purely structural (only filters, no semantic question).
response_formatstring- Level of detail (default: 'detailed'). Options: 'detailed', 'concise'one of
detailedconcise
slackmcp_slack_add_reactionAdd an emoji reaction to a Slack message.WriteSlack Add Reaction
Add an emoji reaction to a Slack message. Requires the channel ID, message timestamp, and emoji name.
- Idempotent
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
emojistringrequired- Reaction (emoji) name without colons
message_tsstringrequired- Timestamp of the message. Get it from slack_read_channel or slack_read_thread.
slackmcp_slack_create_canvasCreate a Slack Canvas document from Canvas-flavored Markdown content.WriteSlack Create Canvas
Create a Slack Canvas document from Canvas-flavored Markdown content.
Inputs
contentstringrequired- Canvas-flavored Markdown content for the canvas body.
titlestringrequired- Display name shown at the top of the canvas.
slackmcp_slack_create_conversationCreate a channel, DM, or group DM.WriteSlack Create Conversation
Create a channel, DM, or group DM. Returns a channel ID for sending messages.
Inputs
channel_namestring- Name for the new channel (lowercase, hyphens, max 80 chars). Omit to create a DM instead.
is_privateboolean- If true, creates a private channel. Only used with channel_name. Default: false.
user_idsarray- Slack user IDs to invite. 1 ID = DM, 2–8 IDs = group DM, up to 1000 IDs for a channel.
slackmcp_slack_schedule_messageSchedule a message for future delivery to a Slack channel at a specified Unix timestamp.WriteSlack Schedule Message
Schedule a message for future delivery to a Slack channel at a specified Unix timestamp.
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
messagestringrequired- Message content to schedule
post_atintegerrequired- Unix timestamp (seconds) for when to send the scheduled message.
reply_broadcastboolean- Broadcast thread reply to channel
thread_tsstring- Timestamp of the parent message to reply in a thread. Get it from slack_read_channel.
slackmcp_slack_send_messageSend a message to a Slack channel or user.WriteSlack Send Message
Send a message to a Slack channel or user. Use a user ID as channel_id to send a DM.
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
messagestringrequired- Add a message
draft_idstring- ID of a previously saved draft to delete after sending.
reply_broadcastboolean- Also send to conversation
thread_tsstring- Timestamp of the parent message to reply in a thread. Get it from slack_read_channel.
unfurl_app_linksboolean- Set to true to enable link previews from installed apps (e.g. GitHub, Jira) in the message.
slackmcp_slack_send_message_draftSave a message as a draft in a Slack channel without sending it.WriteSlack Send Message Draft
Save a message as a draft in a Slack channel without sending it.
Inputs
channel_idstringrequired- ID of the Slack channel. Get it from slack_search_channels.
messagestringrequired- The message content in standard markdown
thread_tsstring- Timestamp of the parent message to reply in a thread. Get it from slack_read_channel.
slackmcp_slack_update_canvasUpdate an existing Slack Canvas document by appending, replacing, or deleting content.DestructiveSlack Update Canvas
Update an existing Slack Canvas document by appending, replacing, or deleting content. Prefer `sections` for atomic multi-edit operations; `action`/`content`/`section_id` remain as a legacy single-edit path.
Inputs
canvas_idstringrequired- ID of the canvas to update (e.g., "F1234567890")
actionstring- Legacy single-edit type. Prefer `sections`. One of append, prepend, replace.one of
appendprependreplace contentstring- Legacy single-edit markdown content. Prefer `sections`.
section_idstring- Legacy single-edit target section ID from slack_read_canvas. Prefer `sections`.
sectionsarray- Preferred: array of edit operations applied atomically against a single document snapshot. Max 100 operations. Use this for any update with one or more edits.
No tools match.
Workflows
Proxy API call
import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'
const scalekit = new ScalekitClient( process.env.SCALEKIT_ENVIRONMENT_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actions
const connector = 'slackmcp'const identifier = 'user_123'
// Read a channel's message historyconst result = await actions.executeTool({ connector, identifier, toolName: 'slackmcp_slack_read_channel', toolInput: { channel_id: 'C01234567' },})console.log(result)from scalekit import ScalekitClientimport os
scalekit_client = ScalekitClient( os.environ['SCALEKIT_ENVIRONMENT_URL'], os.environ['SCALEKIT_CLIENT_ID'], os.environ['SCALEKIT_CLIENT_SECRET'],)
connector = 'slackmcp'identifier = 'user_123'
# Read a channel's message historyresult = scalekit_client.actions.execute_tool( connection_name=connector, identifier=identifier, tool_name='slackmcp_slack_read_channel', tool_input={'channel_id': 'C01234567'},)print(result)