CONNECT APP
Build with Slack
Communication
- OAuth
MCP
Give your agent Slack tools
Every Slack action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Slack account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "slack_v2",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Send Message to Channel:
const result = await mcp.callTool({
name: "slack_v2-send-message-to-channel",
arguments: {
conversation: "Channel",
text: "Text",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "slack_v2",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Send Message to Channel:
result = await session.call_tool("slack_v2-send-message-to-channel", {
"conversation": "Channel",
"text": "Text",
})API PROXY
Call the Slack API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Slack API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://slack.com/api/users.profile.get",
})
// Any allowed Slack endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://slack.com/api/users.profile.get
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9zbGFjay5jb20vYXBpL3VzZXJzLnByb2ZpbGUuZ2V0?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Slack actions from your backend
Connect a user's Slack account once, then run Send Message to Channel on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "slack_v2-send-message-to-channel",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
slack_v2: { authProvisionId: "apn_xxxxxxx" },
conversation: "Channel",
text: "Text",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="slack_v2-send-message-to-channel",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"slack_v2": {"authProvisionId": "apn_xxxxxxx"},
"conversation": "Channel",
"text": "Text",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "slack_v2-send-message-to-channel",
"configured_props": {
"slack_v2": { "authProvisionId": "apn_xxxxxxx" },
"conversation": "Channel",
"text": "Text"
}
}'TOOLS
Slack actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Send Message to Channel
actionSend a message to a public or private channel. Legacy, channel-only variant — prefer Post Message for new integrations: it covers channels, users, and groups from a single tool, and also supports threaded replies and unfurl settings. Use this tool only if a workflow specifically needs to target a channel exclusively, without the user/group support Post Message offers. See the documentationWritev0.2.4 -
Add Emoji Reaction
actionAdd an emoji reaction to a message. See the documentationWritev0.0.28 -
Add Reaction
actionAdd an emoji reaction to a message. Accepts a channel ID (preferred — resolves instantly) or channel name (resolved by scanning up to 5 pages, ~5,000 channels, of the workspace's channel list — a name beyond that bound will not be found). Use Get Channel History or Search to find the message timestamp. Emoji name should be without colons (e.g.thumbsup,fire,heart). See the documentationWritev0.0.8 -
Archive Channel
actionArchive a public or private channel. Direct messages and group DMs can't be archived — pass a channel ID (e.g.C1234567890), not a user or group ID. See the documentationWritev0.0.36 -
Browse Files
actionList files shared in a channel or across the workspace. Accepts a channel ID (preferred — resolves instantly) or channel name (resolved by scanning up to 5 pages, ~5,000 channels, of the workspace's channel list — a name beyond that bound will not be found). Filter by file type (e.g.images,pdfs,snippets). Returns file metadata including name, type, size, and download URL. See the documentationRead-onlyv0.0.8 -
Build and Send a Block Kit Message
actionConfigure custom blocks and send to a channel, group, or user. See the documentation.Writev0.5.11 -
Create a Channel
actionCreate a new channel. See the documentationWritev0.0.36 -
Create Reminder
actionCreate a reminder. See the documentationWritev0.0.37 -
Delete File
actionDelete a file. See the documentationWritev0.0.36 -
Delete Message
actionPermanently delete a message. This cannot be undone. To delete a specific message (including the most recent one), first call Get Channel History to retrieve messages —messages[0]is the most recent — then pass itstshere. Quote the message text back to the user to confirm before deleting. Accepts a channel ID (preferred — resolves instantly) or NAME for the conversation; a name is resolved by scanning up to 5 pages (~5,000 channels) of the workspace's channel list, which can be slow, and a valid channel beyond that bound will not be found. Slack only lets an identity delete its own messages, so this deletes as whichever identity posted: it retries automatically with the other identity if the first attempt returnscant_delete_message. See the documentationWritev0.2.6 -
Edit Message
actionEdit an existing message. Accepts a channel ID (preferred — resolves instantly) or channel name (resolved by scanning the workspace's channel list, which can be slow). Requires the message timestamp (ts) from Get Channel History or Post Message. You can only edit messages posted by the same token/user. See the documentationWritev0.0.9 -
Find Message
actionFind a Slack message by keyword or natural-language query across public and private channels. Returns matching messages with channel context, timestamps, and permalinks. Pass the returnedmessage_tsto Reply to a Message to answer in thread, or to Get Thread Replies to read the rest of that conversation. Use Search instead when you need file results or want to restrictchannelTypes; use this action when you want to order results withsort/sortDirection. User mentions come back in the canonical<@U123>form; echo it verbatim to post a real mention. Display names are returned separately asmentions, an array of{ id, name }objects, omitted when no mention carried a name. Do NOT splice a name back inline: Slack renders<@U123|Name>as literal text, not a mention. See the documentationRead-onlyv0.2.3 -
Find User by Email
actionFind a user by matching against their email. See the documentationRead-onlyv0.0.35 -
Find User by ID
actionFind a user by their ID — including a specific user you already have the Slack ID for, whether or not it's your own. Returns user profile information including name, email (requiresusers:read.emailscope), timezone, and status. If you only have an email address, use Find User by Email instead. See the documentationRead-onlyv0.0.12 -
Get Channel Details
actionRetrieve details for a Slack channel, specified by ID (preferred — resolves instantly) or by name (resolved by scanning the workspace's channel list, which can be slow). See the documentationRead-onlyv0.1.6 -
Get Channel History
actionRead the recent message history from a specific channel or direct message (DM). Accepts a channel ID (preferred — resolves instantly) or channel name (resolved by scanning up to 5 pages, ~5,000 channels, of the workspace's channel list — a name beyond that bound will not be found, so pass the ID when you have it). To read a DM, pass the other person's user ID (e.g.U1234567890) as the channel — pass your OWN user ID to read your conversation with yourself. Use this when you want to see a channel's or DM's latest messages — unlike Search which finds messages by keyword. Returns messages with text, timestamps (ts), reactions, and user IDs. Message timestamps can be used with Get Thread Replies, Edit Message, and Add Reaction. Passfields(e.g.text,ts,user) unless you need full message objects — raw Slack messages carry blocks, attachments and edit metadata, so a busy channel can run to tens of thousands of characters and be truncated before you see any of it. See the documentationRead-onlyv0.2.5 -
Get Current User
actionDo NOT use for a plain "who am I" / "what's my user ID" question — call Get User Details for that; it answers the same question with a far smaller payload. Do NOT use to look up a DIFFERENT, specifically-identified user (by ID or email) — this only ever describes the authenticated caller; use Find User by ID / Find User by Email for someone else. Do NOT use to enumerate multiple teams/workspaces (e.g. Enterprise Grid) — use List Teams for that; this returns only the caller's own current team. Use this ONLY when you specifically need the full member profile: locale, timezone, presence/status, admin and owner flags, name variants, or workspace domain and enterprise metadata. Combinesauth.test,users.info,users.profile.getandteam.info. See Slack API docs.Read-onlyv0.0.11 -
Get File
actionReturn information about a file. See the documentationRead-onlyv0.1.11 -
Get Thread Replies
actionRetrieve all replies in a message thread. Accepts a channel ID (preferred — resolves instantly) or channel name (resolved by scanning up to 5 conversations.list pages, ~5,000 active public/private channels — a name beyond that limit returns a configuration error). To read a thread in a DM, pass the other person's user ID (e.g.U1234567890) as the channel — pass your OWN user ID to read your conversation with yourself. Use Get Channel History or Search to find the parent message's timestamp (thread_ts). Returns the parent message followed by all replies in chronological order. Passfields(e.g.text,ts,user) unless you need full message objects — raw Slack messages carry blocks, attachments and edit metadata, so a long thread can run to tens of thousands of characters and be truncated before you see any of it. See the documentationRead-onlyv0.1.6 -
Get User Details
actionUse when the user asks who am I, what's my user ID, what's my username, which workspace am I in, or what's my email — this is the default identity lookup and the one to call first in any session. Returns user ID, name, email, timezone, profile, and workspace metadata. Other tools like Search and List Channels can then filter by your user ID, and Post Message can use it as the channel to DM yourself. Prefer this over Get Current User, which returns a much larger payload and is only needed for full profile detail (locale, status, admin flags). See the documentationRead-onlyv0.0.8 -
Invite User to Channel
actionInvite one or more users to an existing channel. Accepts a channel ID (preferred — resolves instantly) or NAME (resolved by scanning up to 5 pages, ~5,000 channels, of the workspace's channel list — a name beyond that bound will not be found), and a user ID, EMAIL address or display name — all resolved automatically. Pass several users as a comma-separated list. See the documentationWritev0.1.6 -
Kick User
actionRemove a user from a conversation. See the documentationWritev0.0.36 -
List Channels
actionReturn a list of channels in a workspace. Passfields(e.g.["id","name"]) to limit the returned properties — a full channel object is ~1KB, so a workspace of any real size can return a payload large enough to be truncated. Omitfieldswhen you need the complete channel objects. UsenamePrefixto filter results to channels whose names start with a given string (e.g.dev-) without a client-side filter loop. SetmemberOnly: trueto return only channels the authenticated user is a member of — on a large workspace this shrinks the result from thousands of channels to the handful that matter, and it is usually what you want when acting on the user's behalf. Returnshas_more: trueandnext_cursorwhen more channels exist than were fetched — when you see that, raisenumPages(or passcursor) before answering any 'how many' or 'list every' question, otherwise your answer is silently incomplete. See the documentationRead-onlyv0.4.0 -
List Emojis
actionList all available emojis in the Slack workspace. Optionally include emoji image URLs. See the documentationRead-onlyv0.0.10 -
List Files
actionReturn a list of files within a team. See the documentationRead-onlyv0.1.11 -
List Group Conversations
actionReturn a list of multi-person direct message (group DM) conversations the connected account is a member of. Use the returnedid(e.g.G1234567890) wherever a Group conversation ID is required. Returnshas_more: trueandnext_cursorwhen more conversations exist than were fetched — raisenumPages(or passcursor) to see the rest. See the documentationRead-onlyv0.0.5 -
List Group Members
actionList all users in a User Group. See the documentationRead-onlyv0.0.20 -
List Icon (emoji) Options
actionRetrieves available options for the Icon (emoji) field. See the documentationRead-onlyv0.0.8 -
List Members in Channel
actionRetrieve members of a channel. Accepts a channel ID (preferred — resolves instantly) or NAME (e.g. general or #general), resolved by scanning up to 5 pages (~5,000 channels) of the workspace's channel list — a name beyond that bound will not be found. See the documentationRead-onlyv0.1.6 -
List Messages (Deprecated)
actionDEPRECATED — do NOT use for reading a channel's or DM's messages. Use Get Channel History instead: it resolves channel names, channel IDs, and direct messages (by user ID), supportsfieldsselection to keep responses small, and returns the same message data. This legacy tool remains only for existing workflows: it accepts a raw conversation ID and returns full, untrimmed message objects. See the documentationRead-onlyv0.0.11 -
List Reminder Options
actionRetrieves available options for the Reminder field. See the documentationRead-onlyv0.0.8 -
List Replies
actionRetrieve a thread of messages posted to a conversation. See the documentationRead-onlyv0.0.36 -
List Teams
actionReturn the full list of teams (workspaces) accessible to the connected account, with pagination (has_more/next_cursor) so you know whether there could be more than what came back. Use this — not Get User Details or Get Current User, which only ever describe the caller's single current team — whenever the task asks to enumerate, count, or check for multiple teams/workspaces, especially on an Enterprise Grid org-wide token. Use the returnedid(e.g.T1234567890) wherever a Team ID is required. Returnshas_more: trueandnext_cursorwhen more teams exist than were fetched — raisenumPages(or passcursor) to see the rest. See the documentationRead-onlyv0.0.5 -
List User Group Options
actionRetrieves available options for the User Group field. See the documentationRead-onlyv0.0.8 -
List Users
actionReturn a list of all users in a workspace. See the documentationRead-onlyv0.0.35 -
Post Message
actionSend a message to a channel, user, or group. Accepts a channel ID (e.g.C1234567890) or channel name (e.g.#generalorgeneral) — names are resolved automatically. To post a note to yourself (save a personal note or reminder), pass your own user ID (e.g.U1234567890) as the Channel — use Get Current User to find your user ID first. To reply to a thread, providethreadTs(Slack calls thisthread_ts) from Get Channel History. Supports plain text with Slack mrkdwn formatting and Block Kit blocks. Posts as the authenticated user by default; setsendAsBottotrueto post as the Slack app's bot user instead. See the documentationWritev0.1.0 -
Reply to a Message Thread
actionSend a message as a threaded reply to an existing message. Use this when the reply should be nested under a specific message rather than posted as a new top-level message — for example, responding to a triggering event or continuing a discussion. Requiresthread_ts, the parent message's timestamp (e.g.1403051575.000407); get it from Get Channel History or an incoming event'stsfield. For a plain, non-threaded message use Post Message instead. See the documentationWritev0.2.11 -
Search
actionSearch Slack messages and files using the Real-Time Search API. Supports keyword and semantic search across public and private channels. Use Get User Details first to find your user ID for filtering by 'my' messages. Returns matching messages with channel context, timestamps, and permalinks. User mentions come back in the canonical<@U123>form; echo it verbatim to post a real mention. Display names are returned separately asmentions, an array of{ id, name }objects, omitted when no mention carried a name. Do NOT splice a name back inline: Slack renders<@U123|Name>as literal text, not a mention. See the documentationRead-onlyv0.1.3 -
Send a Large Message (3000+ characters)
actionSend a large message (more than 3000 characters) to a channel, group or user. See postMessage or scheduleMessage docs hereWritev0.1.11 -
Send Message
actionSend a message to a user, group, private channel or public channel. See the documentationWritev0.2.4 -
Send Message (Advanced)
actionCustomize advanced settings and send a message to a channel, group or user. See postMessage or scheduleMessage docs hereWritev0.1.11 -
Send Message to User or Group
actionSend a message to a user or group. See the documentationWritev0.2.4 -
Set Channel Description
actionChange the description or purpose of a channel. See the documentationWritev0.0.21 -
Set Channel Topic
actionSet the topic on a channel, specified by ID (preferred — resolves instantly) or by name (resolved by scanning up to 5 pages, ~5,000 channels, of the workspace's channel list — a name beyond that bound will not be found). See the documentationWritev0.1.6 -
Set Status
actionSet the current status for a user. See the documentationWritev0.0.20 -
Update Group Members
actionUpdate the list of users for a User Group. See the documentationWritev0.0.21 -
Update Message
actionUpdate a message. See the documentationWritev0.2.11 -
Update Profile
actionUpdate basic profile field such as name or title. See the documentationWritev0.0.36 -
Upload File
actionUpload a file. See the documentationWritev0.1.15 -
Verify Slack Signature
actionVerifying requests from Slack, slack signs its requests using a secret that's unique to your app.Request Bodymust be the raw request body as a string (not a parsed object) — Slack computes its signature over the exact raw bytes it sent, so re-serializing a parsed object will not match. See the documentationRead-onlyv1.0.4
-
New Channel Created (Instant)
triggerEmit new event when a new channel is created.Instantv0.0.20 -
New Interaction Events (Instant)
triggerEmit new events on new Slack interactivity events sourced from Block Kit interactive elements, Slash commands, or Shortcuts.Instantv0.0.31 -
New Keyword Mention (Instant)
triggerEmit new event when a specific keyword is mentioned in a channelInstantv0.1.10 -
New Message In Channels (Instant)
triggerEmit new event when a new message is posted to one or more channelsInstantv1.1.10 -
New Private Channel Created
triggerEmit new event when a new private channel is created. See the documentationv0.0.10 -
New Reaction Added (Instant)
triggerEmit new event when a member has added an emoji reaction to a messageInstantv1.2.10 -
New Saved Message (Instant)
triggerEmit new event when a message is saved. Note: The endpoint is marked as deprecated, and Slack might shut this off at some point down the line.Instantv0.0.16 -
New User Added (Instant)
triggerEmit new event when a new member joins a workspace.Instantv0.0.14 -
New User Mention (Instant)
triggerEmit new event when a username or specific keyword is mentioned in a channelInstantv0.1.10
MULTI-APP
Use Slack with other popular apps
Most products don't stop at one integration. Pair Slack with the other apps your users rely on, and ship use cases that span both.
- App slug
- slack_v2
- Authentication
- OAuth
- Categories
- Communication
- Actions
- 50
- Triggers
- 9
- API proxy
- Available
OAuth scopes
These are the scopes Pipedream's managed Slack OAuth client requests when one of your users connects an account. Supply your own OAuth client to request a different set.
- chat:write
- chat:write.customize
- chat:write.public
- files:read