Skip to main content
Use Slack’s remote MCP server to read channels, post messages, and work with workspace data. Portkey MCP Gateway adds centralized auth, access control, and observability on top of Slack’s endpoint.

When should you use this server

  • Surface channel context or recent threads during agent workflows
  • Draft or send messages from AI assistants with human-in-the-loop review
  • Look up users or channel metadata for routing and notifications

Key features

  • Workspace-aware tools (channels, chat, usersβ€”depending on granted Bot Token Scopes)
  • Hosted endpointβ€”no self-hosted Slack MCP binary to run
  • OAuth-based access aligned with Slack app permissions

Authentication

  • Method: OAuth 2.1 with manual OAuth metadata (Slack does not use Dynamic Client Registration for this flow)
  • Slack app: Create an app at api.slack.com/apps, configure redirect URL, Bot Token Scopes, and Agents & AI Apps β†’ Enable MCP (required)

Endpoint

Remote MCP server:
https://mcp.slack.com/mcp

Connect via Portkey MCP Gateway

Slack requires registering an OAuth app and passing client_id, client_secret, redirect_uri, and scope in Portkey Advanced Configurationβ€”same pattern as other providers that need manual OAuth metadata (for example GitHub).

Step 1: Create a Slack OAuth app

  1. Open api.slack.com/apps β†’ Create New App β†’ From scratch.
  2. Set an app name (e.g. Portkey MCP Gateway) and pick a workspace.
  3. Go to OAuth & Permissions.
  4. Under Redirect URLs, add exactly:
    https://mcp.portkey.ai/oauth/upstream-callback
    
  5. Under Scopes β†’ Bot Token Scopes, add the scopes agents need (e.g. channels:read, chat:write, users:read). Match these to the scope string in Step 3.
  6. Open Basic Information and copy Client ID and Client Secret.

Step 2: Enable MCP (Agents & AI Apps)

Turn Enable MCP on under Agents & AI Apps in the Slack app sidebar. If this stays off, tool discovery fails and OAuth breaks at the end of the flow.
  1. In the Slack app settings sidebar, open Agents & AI Apps.
  2. Toggle Enable MCP to on.
  3. Save.

Step 3: Register the integration in Portkey

  1. In Portkey, go to MCP Registry β†’ Add MCP Integration.
  2. Set:
FieldValue
NameSlack
Slugslack
Server URLhttps://mcp.slack.com/mcp
Auth TypeOAuth 2.1
  1. Expand Advanced Configuration and paste (replace placeholders; align scope with Bot Token Scopes from Step 1):
{
  "oauth_metadata": {
    "client_id": "YOUR_SLACK_CLIENT_ID",
    "client_secret": "YOUR_SLACK_CLIENT_SECRET",
    "redirect_uri": "https://mcp.portkey.ai/oauth/upstream-callback",
    "scope": "channels:read chat:write users:read"
  }
}
  1. Configure workspace access as needed, then save the integration.

Step 4: Connect from an agent

Gateway URL pattern: https://mcp.portkey.ai/{slug}/mcp (use the registry slug, e.g. slack).
Claude Desktop / Cursor
{
  "mcpServers": {
    "slack": {
      "url": "https://mcp.portkey.ai/slack/mcp"
    }
  }
}
On first tool use, the client opens Slack authorization. Portkey stores and refreshes tokens.

Tools provided

Slack publishes machine-readable tool definitions at runtime (tools/list on https://mcp.slack.com/mcp after auth). Tool names and optional fields can changeβ€”use the client’s tool inspector or tools/list as the source of truth. Summaries below follow Slack MCP server overview and the developing with Slack MCP scope table.Tool results are human-readable markdown with hydrated user and channel names where applicableβ€”not raw IDs only.

OAuth scopes by capability

CapabilityUser token scopes (examples)
Search messages / channelssearch:read.public, search:read.private, search:read.mpim, search:read.im
Search filessearch:read.files
Search userssearch:read.users
Send messagechat:write
Read channel / threadchannels:history, groups:history, mpim:history, im:history
Create / update canvascanvases:read, canvases:write
Read user profileusers:read, users:read.email
Rate limits follow Slack Web API tiers per action (see the overview rate limit table).

slack_search_public

Search public Slack content (messages and files in accessible public channels). Keyword-oriented unless the workspace has features that enable broader search. Arguments:
  • query (string, required) β€” Search string; supports Slack modifiers (in:, from:, dates, etc.).
  • content_types (string, optional) β€” Comma-separated: messages, files.
  • cursor (string, optional) β€” Pagination cursor from a prior response.
  • limit (number, optional) β€” Page size (capped by Slack).
  • sort (string, optional) β€” Often score or timestamp.
  • sort_dir (string, optional) β€” asc or desc.
  • response_format (string, optional) β€” e.g. detailed or concise.
  • include_context (boolean, optional) β€” Include surrounding context messages when supported.
  • max_context_length (number, optional) β€” Cap context length per hit.
  • context_channel_id (string, optional) β€” Hint channel for ranking or context.
  • after / before (string, optional) β€” Unix timestamp window filters.
  • include_bots (boolean, optional) β€” Include bot-authored messages.
Returns: Text (markdown) hits plus pagination fields the server exposes (e.g. next_cursor).

slack_search_public_and_private

Same search surface extended to private channels, DMs, and MPIMs the authorized user can access. Requires private search scopes (e.g. search:read.private, search:read.im, search:read.mpim). Arguments: Same family as slack_search_public (see tools/list for the exact schema on your build). Returns: Markdown search results and pagination metadata.

slack_search_channels

Find channels by name or description. Arguments:
  • query (string, required) β€” Search text.
  • cursor (string, optional) β€” Pagination.
  • limit (number, optional) β€” Page size.
  • response_format (string, optional) β€” detailed or concise.
  • include_archived (boolean, optional) β€” Include archived channels.
Returns: Channel metadata (IDs, topics, purposes) as markdown or structured text per response_format.

slack_search_users

Find workspace members by name, email, or profile attributes. Arguments:
  • query (string, required) β€” Search string.
  • cursor (string, optional) β€” Pagination.
  • limit (number, optional) β€” Page size.
  • response_format (string, optional) β€” detailed or concise.
Returns: User summaries (IDs, display names, titles, etc.).

slack_read_channel

Read recent messages from a channel, group, or conversation ID. Arguments:
  • channel_id (string, required) β€” Channel or conversation ID (C…, G…, D…).
  • limit (number, optional) β€” Messages to return.
  • cursor (string, optional) β€” Pagination cursor.
  • latest / oldest (string, optional) β€” Timestamp bounds.
  • response_format (string, optional) β€” detailed or concise.
Returns: Message timeline as markdown (authors and text hydrated where possible).

slack_read_thread

Read all replies in a thread. Arguments:
  • channel_id (string, required) β€” Channel containing the thread.
  • message_ts (string, required) β€” Parent message timestamp (1234567890.123456).
  • limit (number, optional) β€” Max replies.
  • cursor (string, optional) β€” Pagination.
  • latest / oldest (string, optional) β€” Bounds.
  • response_format (string, optional) β€” detailed or concise.
Returns: Thread transcript as markdown.

slack_send_message

Post a message to a channel or DM. Arguments:
  • channel_id (string, required) β€” Destination channel or DM ID.
  • message (string, required) β€” Message body (Slack-flavored markdown where supported).
  • thread_ts (string, optional) β€” Reply in a thread.
  • reply_broadcast (boolean, optional) β€” Also post to channel.
  • draft_id (string, optional) β€” Send and consume a drafted message if the flow created one.
Returns: Confirmation text and message identifiers when provided by Slack.

slack_send_message_draft

Create a draft in a channel or thread without sending. Arguments:
  • channel_id (string, required) β€” Target conversation.
  • message (string, required) β€” Draft markdown.
  • thread_ts (string, optional) β€” Draft as a thread reply.
Returns: Draft handle or link the client uses to open or send the draft later.

slack_schedule_message

Schedule a message for later delivery. Arguments:
  • channel_id (string, required) β€” Target conversation.
  • message (string, required) β€” Body to send at post_at.
  • post_at (integer, required) β€” Unix time (must be in the future; Slack enforces min/max horizon).
  • thread_ts (string, optional) β€” Schedule as a thread reply.
  • reply_broadcast (boolean, optional) β€” Broadcast thread reply to channel.
  • draft_id (string, optional) β€” Delete a draft after scheduling.
Returns: Scheduled message metadata (e.g. schedule ID) when Slack returns it.

slack_create_canvas

Create a Slack Canvas from markdown content. Arguments:
  • title (string, required) β€” Canvas title.
  • content (string, required) β€” Canvas-flavored markdown body.
Returns: Canvas URL or ID string the model can surface to the user.

slack_read_canvas

Fetch a canvas as markdown (and section metadata when supported). Arguments:
  • canvas_id (string, required) β€” Canvas file / document ID.
Returns: Markdown content plus optional section_id_mapping for follow-up edits.

slack_update_canvas

Append, prepend, or replace canvas sections. Arguments:
  • canvas_id (string, required) β€” Target canvas.
  • action (string, required) β€” append, prepend, or replace.
  • content (string, required) β€” Markdown to apply (Canvas-flavored rules apply).
  • section_id (string, optional) β€” Target section from slack_read_canvas mapping; required for safe replace.
  • title (string, optional) β€” Update canvas title only when updating title-only.
Returns: Updated canvas URL and revised section mapping when provided.

slack_read_user_profile

Load profile fields for a member (or the authenticated user if user_id omitted). Arguments:
  • user_id (string, optional) β€” Slack user ID; defaults to current user when omitted.
  • include_locale (boolean, optional) β€” Include locale fields.
  • response_format (string, optional) β€” detailed or concise.
Returns: Profile card text / markdown.
Add "headers": { "x-portkey-api-key": "YOUR_PORTKEY_API_KEY" } when the workspace requires the Portkey API key on the MCP requestβ€”see Integrations. For self-hosted gateways, replace mcp.portkey.ai with the gateway host.Third-party Slack apps send prompts and workspace data to Slack under their terms. Grant only the Bot Token Scopes agents need.
Last modified on April 16, 2026