Version2.0.0
Categorycommunication
AuthOAuth 2
Tools110
Transportstdio
LicenceMIT
01
What it does
The app, in its own words.
Full Slack workspace integration: channels, messages, threads, reactions, files, users, search, and presence. Uses Slack Web API with OAuth 2.0.
02
Tools
110 tools the agent can call.
Every one is declared with typed parameters and returns structured results, so the host can render them instead of narrating them.
- -health-checkInternal health check. Probes Slack OAuth credentials and API reachability via auth.test.
- accept-shared-inviteAccept a Slack Connect invite (joins the shared channel into the user's workspace). Provide inviteId XOR channelId. Returns { channelId, inviteId }. Not retryable. Params: channelName (local name for the joined channel), inviteId? | channelId?, isPrivate (def false), freeTrial (def false).
- add-bookmarkAdd a bookmark to a channel (links shown in the channel header). Returns the curated bookmark. Not retryable. Params: channel, title, link (URL), emoji? (e.g. ':notebook:').
- add-callRegister a call (external provider) with Slack. Returns curated call. EXPERIMENTAL. Params: externalUniqueId, joinUrl, desktopAppJoinUrl?, externalDisplayId?, title?, users? (JSON array), dateStart? (unix seconds).
- add-call-participantsAdd participants to an active call. users is a JSON array of {slackId|externalId, displayName?, avatarUrl?}. Returns { callId, added: count }. Not retryable. EXPERIMENTAL.
- add-emojiAdd a custom workspace emoji. Provide EITHER url (new image) OR aliasFor (alias of existing emoji). Returns { name, isAlias, aliasFor?, ok: true }. Not retryable. Params: name, url? | aliasFor?.
- add-reactionAdd an emoji reaction to a message. Returns { channel, timestamp, name }. Idempotent (already_reacted raises BUSINESS_RULE). Params: channel, timestamp, name (no colons).
- add-remote-fileRegister an external file (e.g. Google Drive, Dropbox) with Slack so it's discoverable in search and share-able. Returns curated remote file. Not retryable. Params: externalId, externalUrl, title, fileType?, previewImage?, indexableFileContents?.
- append-streamAppend a chunk of content to an active streaming message. Returns { streamId, appended: true }. Not retryable (each call appends — retry would duplicate content). EXPERIMENTAL. Params: streamId, content.
- approve-shared-inviteApprove a Slack Connect channel invite as a workspace admin (when admin approval is required by policy). Returns { inviteId, approved: true }. Not retryable. Params: inviteId, targetTeam? (Enterprise Grid).
- archive-channelArchive a channel (read-only afterwards). Returns { id, name } from a follow-up info call. Not retryable. Params: channelId.
- complete-uploadStep 2 of the modern upload flow: after PUT-ing bytes to the uploadUrl from get-upload-url, call this with files=[{id, title?}] to finalize. Optionally share to a channel/thread with initialComment. Returns curated file(s). Not retryable. Params: files (JSON array), channelId?, initialComment?, threadTs?.
- create-canvasCreate a standalone Slack Canvas (rich-text doc). Returns curated canvas. EXPERIMENTAL. Params: title, contentMarkdown? (initial content).
- create-channelCreate a channel. Slack normalizes the name (lowercase, no spaces, only [a-z0-9_-], ≤80). Returns the curated channel + ActionBadge('created'). Not retryable. Params: name, isPrivate? (def false), topic?, fields?, includeRaw.
- create-channel-canvasCreate a canvas attached to a channel (visible to all members). Returns curated canvas. EXPERIMENTAL. Params: channelId, title?, contentMarkdown?.
- create-listCreate a Slack List (collaborative table). Returns curated list with schema. EXPERIMENTAL — Slack Lists API is still evolving (2024+). Params: name, description?, schema? (JSON array of {name, type}), todoMode (def false).
- create-list-fieldAdd a new column to a Slack List schema. Returns the created field. Not retryable. EXPERIMENTAL. Params: listId, name, type (text|number|date|user|checkbox|select|multi_select|url|email), required (def false).
- create-list-itemAdd a row (item) to a Slack List. fields is a JSON object mapping column-id → value. Returns curated item. Not retryable. EXPERIMENTAL. Params: listId, fields (JSON).
- decline-shared-inviteDecline a Slack Connect channel invite. Returns { inviteId, declined: true }. Not retryable. Params: inviteId, targetTeam? (override target team id).
- delete-canvasDelete a canvas. Returns { canvasId, deleted: true }. Not retryable. EXPERIMENTAL. Params: canvasId.
- delete-fileDelete a file. The token user must be owner or workspace admin. Returns { fileId, deleted: true }. Not retryable. Params: fileId (F...).
- delete-listDelete a Slack List (and all its items). Returns { listId, deleted: true }. Not retryable. EXPERIMENTAL. Params: listId.
- delete-list-fieldDelete a column from a Slack List schema (all values in items are also dropped). Returns { listId, fieldId, deleted: true }. Not retryable. EXPERIMENTAL. Params: listId, fieldId.
- delete-list-itemDelete a list item. Returns { listId, itemId, deleted: true }. Not retryable. EXPERIMENTAL. Params: listId, itemId.
- delete-messageDelete a message. The token user must be author or workspace admin. Returns { channel, ts, deleted: true }. Not retryable. Params: channel, ts, asUser? (default true — deletes as the user; false impersonates the workspace).
- delete-scheduled-messageCancel a scheduled message. Returns { channel, scheduledMessageId, deleted: true }. Not retryable. Params: channel, scheduledMessageId, asUser? (def true).
- delete-user-photoDelete the authenticated user's profile photo (replaces with default avatar). Returns { deleted: true }. Not retryable. No params.
- edit-bookmarkEdit an existing channel bookmark. Partial update. Returns the updated bookmark. Not retryable. Params: channel, bookmarkId, title?, link? (http/https), emoji?.
- edit-canvasEdit a canvas with a list of changes. Operations: insert_at_start|insert_at_end (no section_id) | insert_before|insert_after|replace|delete (section_id REQUIRED — use canvases.sections.lookup). All except delete also require document_content {type:'markdown',markdown:string}. Returns curated canvas. Not retryable. EXPERIMENTAL.
- end-callMark a call as ended. Returns { callId, ended: true }. Not retryable. EXPERIMENTAL. Params: callId, duration? (seconds).
- end-dndEnd the current snooze. Returns { snoozeEnabled: false }. Idempotent. No params.
- get-access-logsGet login audit trail for the workspace (paid plans only). Returns { logs, paging }. Retryable. Params: before? (unix seconds), count (1-1000, def 100), page.
- get-callGet call details (participants, duration, status). Returns curated call. Retryable. EXPERIMENTAL. Params: callId.
- get-channelGet a single channel. Returns { id, name, isPrivate, isArchived, isMember, numMembers, topic, purpose, created, creator, isGeneral, isShared } + extras. Params: channelId, fields?, includeRaw.
- get-dndGet DND status for a user. Returns { snoozeEnabled, snoozeEndtime, snoozeRemaining, nextDndStart, nextDndEnd }. Retryable. Params: userId? (default: authed user).
- get-fileGet full info for a file (channels shared, permalinks, optional comments). Returns curated file + comments?[]. Retryable. Params: fileId (F...), includeComments (def false), includeRaw.
- get-integration-logsGet integration audit trail (apps installed/uninstalled/scope changes). Paid plans only. Returns { logs, paging }. Retryable. Params: appId?, changeType? (added|removed|enabled|disabled|updated|expanded), serviceId?, user?, count (1-1000, def 100), page.
- get-listGet list details + schema. Returns curated list. Retryable. EXPERIMENTAL. Params: listId.
- get-permalinkGet a permanent URL for a message. Returns { channel, ts, permalink }. Idempotent, retryable. Params: channel, ts.
- get-reactionsGet reactions on a message or file. Provide EITHER (channel+timestamp) for a message OR (file) for a file. Returns { reactions: [{ name, count, users }], type, target }. Retryable. Params: channel?+timestamp? | file?, full (def true — include all reactors).
- get-remote-fileGet details of a remote file. Provide externalId XOR fileId. Returns curated remote file. Retryable. Params: externalId? | fileId?.
- get-team-dndGet DND status for multiple users at once. users is a comma-separated user id list. Returns { users: [{ userId, snoozeEnabled, ... }] }. Retryable. Params: users (csv).
- get-team-infoGet the connected Slack workspace info. Returns { id, name, domain, emailDomain, iconUrl, enterpriseId, enterpriseName }. Params: fields?, includeRaw.
- get-team-preferencesGet workspace policy preferences (locale, default channels, who can create/archive channels, message edit window, calls/huddles enabled). Returns curated preferences. Retryable. No params.
- get-team-profileGet the schema of custom user profile fields for the workspace. Returns { fields: [{ id, label, type, hint, isHidden, ordering, possibleValues }] }. Retryable. Params: visibility (def all).
- get-upload-urlStep 1 of Slack's modern multi-step upload: get a pre-signed external URL + uploadId. PUT the file bytes to the URL, then call complete-upload with the uploadId. Use this for files >100MB or when progress tracking is needed. Returns { uploadUrl, fileId, length }. Params: filename, length (bytes), altTxt?, snippetType?.
- get-userGet a single user by id or email. Returns the curated user (id, name, realName, displayName, email, imageUrl, profile, tz). Provide exactly one of userId/email. Params: userId?, email?, fields?, includeRaw.
- get-user-identityGet the authenticated user's basic identity from the OAuth context (minimum scope: identity.basic, optionally identity.email/avatar/team). Returns curated identity. Retryable. No params.
- get-user-presenceGet presence for a Slack user. Returns { user, presence, online, autoAway, manualAway, connectionCount, lastActivity }. Params: userId.
- get-user-profileGet the full Slack profile for a user (status, custom_fields, image, phone, title, timezone). Returns curated profile. Retryable. Params: userId? (default: authed user), includeLabels (def false), includeRaw.
- invite-sharedSend Slack Connect invite to share a channel with external user(s). Provide emails (csv) OR userIds (csv). Returns { channel, inviteId, link }. Not retryable. Params: channel, emails? | userIds?, externalLimited (def false).
- invite-to-channelInvite users to a channel. Returns { channel, invitedUserIds, alreadyInChannel? }. Not retryable. Params: channelId, userIds[].
- join-channelJoin a public channel. Returns the curated channel. Idempotent (already_in_channel raises BUSINESS_RULE). Params: channelId.
- kick-from-channelRemove a user from a channel. Requires admin or channel owner permissions. Returns { channelId, userId, kicked: true }. Not retryable. Params: channelId, userId.
- leave-channelLeave a public or private channel. Returns { channelId, notInChannel }. Not retryable. Params: channelId.
- list-auth-teamsList Slack workspaces the current token has access to (relevant in Enterprise Grid). Returns { teams, nextCursor, hasMore }. Retryable. Params: includeIcon (def false), limit (1-100, def 100), cursor?.
- list-bookmarksList bookmarks attached to a channel. Returns { bookmarks: [{ id, channelId, title, link, emoji, type, dateCreated, dateUpdated, rank }], count }. Retryable. Params: channel.
- list-channel-membersList user ids that are members of a channel. Returns { channelId, members: string[], nextCursor, hasMore }. Retryable. Use list-users + lookup if you need profile info. Params: channelId, limit (1-1000, def 200), cursor?.
- list-channelsList channels. Returns curated rows { id, name, isPrivate, isArchived, isMember, numMembers, topic, purpose, created } + nextCursor. Params: types? (CSV public_channel|private_channel|mpim|im), limit (1-1000, def 100), cursor, excludeArchived (def true), fields?, includeRaw.
- list-connect-invitesList pending Slack Connect (cross-workspace) channel invites. Returns { invites, nextCursor, hasMore }. Retryable. Params: count (1-100, def 50), cursor?, teamId?.
- list-emojiList custom workspace emojis. Returns { emojis: [{ name, url, isAlias, aliasFor }], count }. Retryable. No params.
- list-filesList uploaded files. Returns curated rows { id, name, title, mimetype, prettyType, size, user, urlPrivate, permalink, thumbUrl, createdAt } + paging. Params: channel?, user?, limit (1-100, def 20), page (def 1), tsFrom, tsTo, types? (CSV all|spaces|snippets|images|gdocs|zips|pdfs), fields?, includeRaw.
- list-list-fieldsList the column schema of a Slack List as individual field objects. Returns { fields, count }. Retryable. EXPERIMENTAL. Params: listId.
- list-list-itemsList items (rows) in a Slack List with cursor pagination. Returns { listId, items, nextCursor, hasMore }. Retryable. EXPERIMENTAL. Params: listId, limit (1-100, def 50), cursor?.
- list-messagesList messages from a channel or thread (passes threadTs to fetch replies). Returns curated rows { ts, channel, user, text, threadTs, replyCount, reactions, permalink, createdAt } + nextCursor + isThread. Params: channel, threadTs?, limit (1-200, def 50), cursor, oldest, latest, inclusive, fields?, includeRaw.
- list-my-reactionsList all items the user has reacted to (messages and files). Returns { items, paging }. Retryable. Params: userId? (def authed), count (1-1000, def 100), page, full (def true).
- list-pinsList items pinned to a channel (messages and files). Returns { pins: [{ type, createdAt, createdBy, message? | file? }], count }. Retryable. Params: channel.
- list-remote-filesList remote files (external storage references like Google Drive, Dropbox) registered with Slack. Returns { files, nextCursor, hasMore }. Retryable. Params: channel?, tsFrom?, tsTo?, limit (1-200, def 100), cursor?.
- list-scheduled-messagesList pending scheduled messages for the authenticated user. Returns { messages: [{ id, channelId, postAt, postAtIso, text }], nextCursor, hasMore }. Retryable. Params: channel?, latest?, oldest? (unix-seconds bounds), limit (1-100, def 100), cursor?.
- list-starsList the user's saved items (stars). Returns { items, nextCursor, hasMore }. Retryable. Params: count (1-1000, def 100), cursor?.
- list-user-channelsList channels a user is a member of. Returns { channels, nextCursor, hasMore }. Retryable. Params: userId? (def authed), types? (csv: public_channel,private_channel,mpim,im), excludeArchived (def true), limit (1-1000, def 200), cursor?.
- list-usersList workspace users. Returns curated rows { id, name, realName, displayName, email, imageUrl, isBot, isAdmin, isOwner, deleted, tz } + nextCursor. Params: limit (1-200, def 100), cursor, includeDeleted (def false), includeBots (def true), fields?, includeRaw.
- mark-channel-readMark all messages in a channel up to and including `timestamp` as read for the authed user. Returns { channelId, timestamp, marked: true }. Idempotent. Params: channelId, timestamp.
- open-dmOpen or fetch a direct conversation. Single user → IM (D...); multiple → MPIM (M...). Idempotent (re-opens existing channel). Returns curated channel. Params: users[] (1+ U.../W... ids), returnIm (def true).
- pin-messagePin a message to a channel. Returns { channel, timestamp, pinned: true }. Idempotent (already_pinned not treated as error). Params: channel, timestamp.
- remove-bookmarkRemove a channel bookmark by id. Returns { channel, bookmarkId, removed: true }. Not retryable. Params: channel, bookmarkId.
- remove-call-participantsRemove participants from a call. users is a JSON array of {slackId|externalId}. Returns { callId, removed: count }. Not retryable. EXPERIMENTAL.
- remove-emojiRemove a custom workspace emoji. Workspace admin only. Returns { name, removed: true }. Not retryable. Params: name (no colons).
- remove-reactionRemove an emoji reaction from a message. Returns { channel, timestamp, name }. Idempotent (no_reaction raises BUSINESS_RULE). Params: channel, timestamp, name (no colons).
- remove-remote-fileRemove a remote file reference from Slack (does not delete the file in the external provider). Provide externalId XOR fileId. Returns { removed: true }. Not retryable. Params: externalId? | fileId? (one required).
- rename-channelRename a channel. Name must be ≤80 chars, lowercase, no spaces/periods (Slack normalizes). Returns curated channel. Not retryable. Params: channelId, name.
- revoke-authRevoke the current OAuth token (logs the user out of this Slack workspace from Teros). Returns { revoked: true }. Not retryable — destructive. Params: test (def false — set true to validate without actually revoking).
- revoke-file-publicRevoke a file's public URL (links via permalink_public stop working). Returns { fileId, revoked: true }. Not retryable. Params: fileId.
- schedule-messageSchedule a message to be posted at a future unix-seconds timestamp. Returns { channel, scheduledMessageId, postAt }. Slack rejects postAt > 120 days ahead. Not retryable. Params: channel, text, postAt (unix seconds), blocks?, threadTs?, unfurlLinks (def true), unfurlMedia (def true).
- search-filesSearch files workspace-wide. Supports Slack search syntax (in:#channel, from:@user, type:pdf). Returns curated hits { id, name, title, mimetype, permalink, thumbUrl, score, createdAt } + total + page. Params: query, sort? (score|timestamp), sortDirection?, count (1-100, def 20), page, highlight, fields?, includeRaw.
- search-messagesSearch messages workspace-wide. Supports Slack search syntax (in:#channel, from:@user, before/after). Returns curated hits { ts, channel, channelName, user, userName, text, permalink, score } + total + page. Params: query, sort? (score|timestamp), sortDirection? (asc|desc), count (1-100, def 20), page, highlight, fields?, includeRaw.
- send-ephemeralPost an ephemeral message visible only to one user in a channel. Returns { channel, user, messageTs }. Not retryable. Params: channel, user (recipient), text, blocks?, threadTs?.
- send-me-messageSend a /me action message (third-person italic in Slack UI). Returns { ts, channel }. Not retryable. Params: channel, text.
- send-messagePost a message to a channel, DM, or as a top-level message. Returns { ts, channel, message, permalink }. Not retryable (no idempotency key — duplicate messages on retry). Params: channel, text, blocks? (JSON), threadTs?, unfurlLinks (def true), unfurlMedia (def true).
- send-thread-replyReply inside a Slack thread. Returns { ts, channel, threadTs, broadcast, message }. Not retryable (no idempotency key). Params: channel, threadTs, text, blocks? (JSON), broadcast (def false).
- set-channel-purposeSet the purpose of a channel (long-form description shown in details). Max 250 chars. Returns { channelId, purpose }. Not retryable. Params: channelId, purpose.
- set-channel-topicSet the topic of a channel (short description in the channel header). Max 250 chars. Returns { channelId, topic }. Not retryable. Params: channelId, topic.
- set-dndTurn on Do Not Disturb for the authenticated user for N minutes. Returns { snoozeEnabled, snoozeEndtime, snoozeRemaining }. Not retryable. Params: numMinutes (1-1440).
- share-file-publicMake a file publicly accessible via URL (anyone with link can view, no login). Returns { fileId, permalinkPublic }. Not retryable. Params: fileId (F...).
- share-remote-fileShare an existing remote file to one or more channels. Provide externalId XOR fileId. Returns curated remote file. Not retryable. Params: channels (comma-separated channel ids), externalId? | fileId?.
- star-itemSave an item (message / file) to the user's saved items (stars). Provide EITHER (channel+timestamp) OR (file) OR (fileComment). Returns { type, target, starred: true }. Idempotent. Params: channel?+timestamp? | file? | fileComment?.
- start-streamStart a streaming message (AI responses delivered chunk-by-chunk live). Returns { streamId, channel }. Use append-stream + stop-stream to complete. EXPERIMENTAL. Params: channel, threadTs?, recipientTeamId?.
- stop-streamStop a streaming message (flushes final state). Returns { streamId, stopped: true }. Idempotent (stream already stopped not treated as error). EXPERIMENTAL. Params: streamId.
- unarchive-channelUnarchive a previously archived channel. Returns curated channel. Not retryable. Params: channelId.
- unfurl-linkProvide custom unfurl content for links posted in a message (replaces Slack's default preview). unfurls is a JSON map: {"https://your.url":{"blocks":[...],"text":"..."}}. Returns { channel, ts, unfurled: true }. Not retryable. Params: channel, ts, unfurls (JSON), userAuthRequired?, userAuthUrl?, userAuthMessage?.
- unpin-messageUnpin a message. Returns { channel, timestamp, unpinned: true }. Idempotent (no_pin not treated as error). Params: channel, timestamp.
- unstar-itemRemove an item from the user's saved items. Same exclusive-choice contract as star-item. Returns { type, target, unstarred: true }. Idempotent (no_pin not treated as error). Params: channel?+timestamp? | file? | fileComment?.
- update-callUpdate call metadata (title or join URLs). Returns curated call. Not retryable. EXPERIMENTAL. Params: callId, title?, joinUrl?, desktopAppJoinUrl?.
- update-listUpdate list metadata or schema. Partial: only fields provided are updated. Returns curated list. EXPERIMENTAL. Params: listId, name?, description?, schema? (JSON), todoMode?.
- update-list-fieldRename a list column or toggle required. type is immutable. Returns the updated field. Not retryable. EXPERIMENTAL. Params: listId, fieldId, name?, required?.
- update-list-itemUpdate fields of a list item. fields is a JSON object — only the keys provided are updated. Returns curated item. Not retryable. EXPERIMENTAL. Params: listId, itemId, fields (JSON).
- update-messageEdit an existing message. The token user must be the author. Returns { ts, channel, text, message }. Not retryable. Params: channel, ts, text? or blocks? (at least one required), attachments? (JSON).
- update-remote-fileUpdate metadata of a remote file (externalUrl, title, etc.). Provide externalId XOR fileId. Returns curated remote file. Not retryable. Params: externalId? | fileId? (one required), and any of externalUrl?, title?, fileType?, previewImage?, indexableFileContents?.
- update-user-profileUpdate the authenticated user's Slack profile (status, name fields, phone, title, custom fields). Returns the updated profile object. Not retryable. Params: statusText?, statusEmoji?, statusExpiration? (unix seconds), realName?, displayName?, phone?, title?, customFields? (JSON map of field_id → {value, alt?}), userId? (admin-only).
- upload-fileUpload a local file to Slack and optionally share it. Returns the curated file (id, name, mimetype, size, permalink, thumbUrl). Path must resolve to an absolute path. Not retryable. Params: filePath, channels?[], title?, initialComment?, threadTs?, fields?, includeRaw.
03
Auth and permissions
What it asks for.
Declared in the manifest, in advance. The app cannot reach anything it did not ask for here.
Scopes
bookmarks:readbookmarks:writecalls:readcalls:writecanvases:writechannels:historychannels:joinchannels:managechannels:readchannels:write.inviteschannels:write.topicchat:writechat:write.customizecommandsconversations.connect:manageconversations.connect:readconversations.connect:writeincoming-webhookdnd:readdnd:writeemoji:readfiles:readfiles:writegroups:historygroups:readgroups:writegroups:write.invitesim:historyim:readim:writelinks:writelists:readlists:writempim:historympim:readmpim:writepins:readpins:writereactions:readreactions:writeremote_files:readremote_files:shareremote_files:writesearch:readsearch:read.filessearch:read.publicstars:readstars:writeteam.preferences:readteam:readusers.profile:readusers.profile:writeusers:readusers:read.email
System secrets
CLIENT_IDCLIENT_SECRETREDIRECT_URI
User secrets
ACCESS_TOKENBOT_ACCESS_TOKENREFRESH_TOKENTEAM_IDTEAM_NAMEUSER_ID
Reading further
The manifest and the source for Slack live in the monorepo, alongside the other apps.