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.Documentation Index
Fetch the complete documentation index at: https://docs.portkey.ai/docs/llms.txt
Use this file to discover all available pages before exploring further.
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.
