First-party app
Slack

Slack

Post messages, manage channels, files, reactions, stars, users and user groups on Slack.

stable Communication

About

Slack ships in the w6w first-party pack. It declares 47 actions, 3 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.slack
Version
0.2.6
Author
w6w
Licence
MIT
Categories
Communication

Overview

Slack brings a workspace’s day-to-day communication into a workflow. Message actions post, update, delete and schedule messages, search across a workspace’s history, and manage stars and emoji reactions on individual messages. Channel actions create, archive, rename and manage membership of channels, including inviting, removing and listing members.

File actions upload and retrieve files shared in a workspace, and user actions look up people by ID, email or presence, alongside updating a user’s own profile. User group actions create, enable, disable and manage the members of Slack’s named groups, useful for keeping notification groups or team rosters in sync from outside Slack itself.

With 47 actions, this is one of the more complete integrations in the pack, covering essentially everything a workflow would reach for when working with Slack day to day rather than a narrow slice of its API.

Build with Slack

Three routes to the same 47 actions. The Workflow tab is generated from Slack's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Archive Channel

channel-archive

Archives a Slack channel (conversations.archive).

Close Channel

channel-close

Closes a direct message or multi-person direct message (conversations.close).

Create Channel

channel-create

Creates a new channel (conversations.create). Names starting with # are cleaned.

Get Channel

channel-get

Retrieves channel information (conversations.info).

Get Many Channels

channel-get-many

Lists channels visible to the token (conversations.list).

Get Channel History

channel-history

Fetches a page of messages from a channel (conversations.history).

Invite to Channel

channel-invite

Invites one or more users to a channel (conversations.invite).

Join Channel

channel-join

Joins an existing channel (conversations.join).

Kick from Channel

channel-kick

Removes a user from a channel (conversations.kick).

Leave Channel

channel-leave

Leaves a channel (conversations.leave).

Get Channel Members

channel-member

Lists members of a channel (conversations.members).

Open Channel

channel-open

Opens/resumes an IM or MPIM (conversations.open).

Rename Channel

channel-rename

Renames a channel (conversations.rename).

Get Thread Replies

channel-replies

Fetches replies to a threaded message (conversations.replies).

Set Channel Purpose

channel-set-purpose

Sets the purpose (description) of a channel (conversations.setPurpose).

Set Channel Topic

channel-set-topic

Sets the topic of a channel (conversations.setTopic).

Unarchive Channel

channel-unarchive

Reverses an archive (conversations.unarchive).

Get File

file-get

Retrieves file information (files.info).

Get Many Files

file-get-many

Lists uploaded files (files.list). Legacy page-number pagination.

Upload File

file-upload

Uploads a file to Slack (files.getUploadURLExternal + completeUploadExternal).

Delete Message

message-delete

Deletes a message (chat.delete).

Delete Scheduled Message

message-delete-scheduled

Cancels a scheduled message (chat.deleteScheduledMessage).

Get Many Scheduled Messages

message-get-many-scheduled

Lists pending scheduled messages (chat.scheduledMessages.list).

Get Message Permalink

message-get-permalink

Returns a permalink URL for a specific message (chat.getPermalink).

Post Message

message-post

Sends a message to a channel, DM or user. Switches to chat.postEphemeral when `ephemeralUser` is set.

Schedule Message

message-schedule

Schedules a message for future delivery (chat.scheduleMessage).

Search Messages

message-search

Searches messages across the workspace (search.messages). Requires a user token.

Update Message

message-update

Edits an existing message (chat.update).

Add Reaction

reaction-add

Adds an emoji reaction to a message (reactions.add).

Get Reactions

reaction-get

Fetches reactions on a specific message (reactions.get).

Remove Reaction

reaction-remove

Removes an emoji reaction from a message (reactions.remove).

Add Star

star-add

Stars a message or file (stars.add).

Delete Star

star-delete

Removes a star from a message or file (stars.remove).

Get Many Stars

star-get-many

Lists starred items for the authenticated user (stars.list).

Get User

user-get

Retrieves user profile information (users.info).

Get Many Users

user-get-many

Lists workspace users (users.list).

Get User Presence

user-get-presence

Reads a user's presence status (users.getPresence).

Get User Profile

user-get-profile

Retrieves a user profile (users.profile.get).

Lookup User by Email

user-lookup-by-email

Finds a user by their registered email address (users.lookupByEmail).

Update User Profile

user-update-profile

Updates the authenticated user's (or an admin-specified user's) profile (users.profile.set).

Create User Group

usergroup-create

Creates a new user group (usergroups.create).

Disable User Group

usergroup-disable

Disables an existing user group (usergroups.disable).

Enable User Group

usergroup-enable

Re-enables a previously disabled user group (usergroups.enable).

Get Many User Groups

usergroup-get-many

Lists user groups in the workspace (usergroups.list).

Get User Group Members

usergroup-get-users

Lists user IDs in a user group (usergroups.list?include_users=true, filtered).

Update User Group

usergroup-update

Updates properties of a user group (usergroups.update).

Set User Group Members

usergroup-update-users

Replaces the user list of a user group (usergroups.users.update).

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Slack's real ids.

{
  "manifestVersion": "2",
  "name": "slack-example",
  "steps": [
    {
      "id": "channel-create",
      "uses": {
        "app": "io.w6w.slack",
        "action": "channel-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "name": "<name>"
      }
    }
  ]
}

Here are some of the things you can do

  • Create Channel

    perform
    channel-create
  • Get Channel

    read
    channel-get
  • Get Many Channels

    read
    channel-get-many
  • Get Channel History

    read
    channel-history
  • Invite to Channel

    perform
    channel-invite

+42 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Slack, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Slack. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "message-post",
  payload: {
    channel: "<value>",
    // text: "<value>",
    // blocks: "<value>",
    // attachments: "<value>",
    // threadTs: "<value>",
    // replyBroadcast: "<value>",
    // ephemeralUser: "<value>",
    // asUser: "<value>",
    // linkNames: "<value>",
    // mrkdwn: "<value>",
    // unfurlLinks: "<value>",
    // unfurlMedia: "<value>",
    // parse: "<value>",
    // iconUrl: "<value>",
    // iconEmoji: "<value>",
    // username: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action message-post --payload '{"channel":"<value>"}'

Give an AI agent Slack — without giving it Slack's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.slack#channel-create",
    "input": {
      "name": "<name>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Slack connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Slack's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Slack itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Slack declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Slack platform status

Slack's own status API. Judges its headline state by the Apps/Integrations/APIs surface this app's Actions depend on, reports every surface every open incident names, and publishes a timeline of open incidents. Unauthenticated and unsigned.

service

Recent incident history

Incidents Slack published in the last week, from its Atom feed. Context only — `service` is authoritative for current state, and this never affects a verdict. `timeline` carries the feed's full folded history.

quota

API quota headroom