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: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
- Open api.slack.com/apps β Create New App β From scratch.
-
Set an app name (e.g.
Portkey MCP Gateway) and pick a workspace. - Go to OAuth & Permissions.
-
Under Redirect URLs, add exactly:
-
Under Scopes β Bot Token Scopes, add the scopes agents need (e.g.
channels:read,chat:write,users:read). Match these to thescopestring in Step 3. - Open Basic Information and copy Client ID and Client Secret.
Step 2: Enable MCP (Agents & AI Apps)
- In the Slack app settings sidebar, open Agents & AI Apps.
- Toggle Enable MCP to on.
- Save.
Step 3: Register the integration in Portkey
- In Portkey, go to MCP Registry β Add MCP Integration.
- Set:
| Field | Value |
|---|---|
| Name | Slack |
| Slug | slack |
| Server URL | https://mcp.slack.com/mcp |
| Auth Type | OAuth 2.1 |
- Expand Advanced Configuration and paste (replace placeholders; align
scopewith Bot Token Scopes from Step 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
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
| Capability | User token scopes (examples) |
|---|---|
| Search messages / channels | search:read.public, search:read.private, search:read.mpim, search:read.im |
| Search files | search:read.files |
| Search users | search:read.users |
| Send message | chat:write |
| Read channel / thread | channels:history, groups:history, mpim:history, im:history |
| Create / update canvas | canvases:read, canvases:write |
| Read user profile | users:read, users:read.email |
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) β Oftenscoreortimestamp.sort_dir(string, optional) βascordesc.response_format(string, optional) β e.g.detailedorconcise.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.
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) βdetailedorconcise.include_archived(boolean, optional) β Include archived channels.
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) βdetailedorconcise.
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) βdetailedorconcise.
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) βdetailedorconcise.
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.
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.
slack_schedule_message
Schedule a message for later delivery. Arguments:channel_id(string, required) β Target conversation.message(string, required) β Body to send atpost_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.
slack_create_canvas
Create a Slack Canvas from markdown content. Arguments:title(string, required) β Canvas title.content(string, required) β Canvas-flavored markdown body.
slack_read_canvas
Fetch a canvas as markdown (and section metadata when supported). Arguments:canvas_id(string, required) β Canvas file / document ID.
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, orreplace.content(string, required) β Markdown to apply (Canvas-flavored rules apply).section_id(string, optional) β Target section fromslack_read_canvasmapping; required for safereplace.title(string, optional) β Update canvas title only when updating title-only.
slack_read_user_profile
Load profile fields for a member (or the authenticated user ifuser_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) βdetailedorconcise.
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.
