Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Slack MCP server

Vendor MCP
Open markdown

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 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

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. 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>
  3. 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_name your code passes. See Configure connections.

  4. 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.

    1. 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.

      Turn on the Slack Model Context Protocol (MCP) Server toggle in the Slack app portal

    2. 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.

  5. 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.actions
    const connector = 'slackmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { 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 call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'slackmcp_slack_read_user_profile',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • slackmcp_slack_get_reactionsRetrieve all emoji reactions on a specific Slack message.Read-only

    Slack 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-only

    Slack 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-only

    Slack 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-only

    Slack 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-only

    Slack 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-only

    Slack 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-only

    Slack 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-only

    Slack 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

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 history
const result = await actions.executeTool({
connector,
identifier,
toolName: 'slackmcp_slack_read_channel',
toolInput: { channel_id: 'C01234567' },
})
console.log(result)