Skip to main content
Aion-managed Slack app provisioning is not yet available. Use the customer-managed Slack app setup described below.
A Slack Distribution Ion connects one installed Slack bot to an Ion Sequence. Slack events enter through the Distribution, become A2A requests, and travel through that Sequence. Replies return to Slack through the same Slack Bot. Assigning a Principal Identity maps the Distribution to an Aion. The separately selected Slack Bot identifies the external Slack account used by the endpoint.

Overview

An active Slack Distribution provides two complementary paths:
  1. Slack events: Slack sends message callbacks and optional reaction callbacks through the Events API. Aion validates each eligible event and sends it through the connected Sequence. Membership and app-status callbacks keep the Slack connection current without starting application work.
  2. Slack tools: Ions in the Sequence can use the mcp.slack server to inspect conversations, read recent history, send messages, open direct messages, and manage reactions.
Both paths use the Slack Bot selected on the Distribution. Code running in the Sequence never receives its Slack token and does not need to select a workspace, connection, or Distribution when calling Slack tools.

How Slack accounts relate to an Aion

Four pieces work together: The Aion Identity and Slack Bot serve different purposes. The Aion Identity defines the application boundary. The Slack Bot supplies the external account and profile that people see in Slack. Set its app name, display name, description, color, and icon during Slack setup. Each Slack Bot can connect to one workspace at a time. Reauthorizing the same workspace updates that connection, while authorizing a different workspace is rejected. A Slack Connect channel does not require another workspace connection.

Default request loop

Aion acknowledges an accepted callback before the Sequence finishes, so Slack does not wait for the application to complete its work. Aion delivers the response asynchronously. The result is a normal Slack conversation: a direct message enters through the Distribution and the Sequence returns the bot’s reply. Slack direct message showing a user prompt followed by a reply from Slack Test Agent

Configuration

Before you begin

You need:
  • an Aion organization and a Project containing a Slack Distribution Ion;
  • permission to add integrations to that Aion organization;
  • permission to create or install an app in the target Slack workspace; and
  • a Slack workspace administrator when app approval is required.

Create a customer-managed Slack bot

Use customer-managed setup when your organization should own the Slack app and its credentials.
  1. Open Integrations, select Slack, then select Add Slack account (+).
  2. Choose Customer-managed Slack app in the Setup Slack Bot dialog.
  3. Enter the bot display name and Slack app name. Optionally add a description, icon URL, and background color.
  4. Select Continue, then select Create App in Slack. Choose the intended workspace and review the generated manifest before creating the app.
  5. Return to Aion, confirm that the app was created, and enter its App ID, Client ID, Client Secret, and Signing Secret. Treat these values as secrets.
  6. Select Open Event Subscriptions in Slack, then select Retry beside the preconfigured Request URL. Wait for Slack to mark it as verified, confirm that state in Aion, then continue. If you supplied an icon URL, set or confirm the app icon in Slack before confirming this step.
  7. Complete Slack authorization in the window that opens. Review the requested bot grants and approve the installation. If Slack requires admin approval, close the Aion dialog and resume the pending setup later.
  8. Return to Integrations > Slack and verify that the Slack bot appears under Identities.
During step 6, continue only after Slack shows the Request URL as Verified. Slack Event Subscriptions page showing a verified Request URL The generated manifest already contains the Request URL and event subscriptions. Customer-managed setup does not ask for a workspace-wide Slack app configuration token.

Provider permissions

Slack grants permissions to the installed bot. Aion records the scopes Slack actually grants and shows requested permissions separately from their current grant state. New app manifests and installations request the scopes below. An existing installation keeps its current grants until you reauthorize it. The generated app configuration can also declare the app-level authorizations:read scope. When an app-level token is configured, Aion uses it to reconcile authorization records for shared Slack events. It is not a workspace bot OAuth grant, and its absence does not disable baseline Slack messages. If a requested scope is missing, update the customer-managed app configuration when necessary, then reauthorize the workspace installation. Missing optional access degrades only the associated feature. In particular, missing files:read omits native audio files and transcripts while authored text continues. If an event contains only an inaccessible audio clip, Aion starts no agent work for that event.

Aion-managed provisioning

Aion-managed Slack app provisioning is not currently available. With customer-managed setup, your organization owns the Slack app and applies later Slack configuration changes.

Assign the Slack bot to a Distribution

Completing Slack setup does not automatically bind the bot to a Project or Distribution.
  1. Open the Project in Composer.
  2. Select the Slack Distribution Ion and open its Identity tab.
  3. Select the completed bot under Slack Bot.
  4. To make this endpoint part of an Aion, select its Principal Identity.
  5. Sync the Project changes.
Select the Slack Bot created during setup: Composer Identity tab with Slack Test Agent selected as the Slack Bot for a Slack Distribution Ion An inactive Slack Distribution can exist without a selected Slack Bot. An active Distribution cannot. To clear the Slack Bot field, deactivate the Distribution first or select a replacement before syncing.

Configure Slack behavior

Open the Distribution Ion’s Configuration tab to control how Slack messages enter and leave the Sequence. Baseline messages from joined public channels, invited private channels, one-to-one direct messages, multiparty direct messages, and threads do not require an Event Policy selection. Enabling reactions can require additional OAuth grants and reauthorization. The available reply modes preserve the inbound context, create a thread reply, post to the channel, send a direct message, or suppress the default reply. An explicit messaging action can still select another authorized target.

Activate the Distribution

A Slack Distribution can activate when:
  • a Slack Bot is selected and connected to one supported workspace;
  • the Slack app has the required OAuth grants and Events API subscriptions;
  • the Request URL and Slack app configuration are current; and
  • the workspace connection is not revoked, uninstalled, or waiting for reauthorization.
Channel membership is not an activation requirement. A bot with no channel memberships can still receive direct messages. After resolving any validation messages:
  1. Open the Distribution Ion’s Info tab.
  2. Turn on Activate distribution.
  3. Select Sync Changes.

Add the bot to channels

Aion does not maintain a Slack channel allowlist. Slack membership defines which channels the bot can observe.
  • Public channel: invite the bot in Slack, for example with /invite @bot-name.
  • Private channel: an existing channel member must invite the bot. Workspace policy may require admin approval.
  • Direct message: no channel membership is required.
  • Multiparty direct message: add the bot to the multiparty conversation.
  • Slack Connect: invite the bot, then enable Allow External Shared Channels on the Distribution.
Removing the bot from a channel stops future event delivery for that channel. The external-channel setting is a privacy backstop; it does not install the app into another workspace.

Message mapping

For each accepted Slack message, Aion sends the following to the Sequence:
  • a text part when Slack supplies visible text;
  • a temporary file part for each successfully materialized native Slack audio clip;
  • a separate transcript text part for each clip with an available transcript;
  • a MessageEventPayload with the Slack conversation identifiers; and
  • a SourceSystemEventPayload containing the parsed Events API callback.
Slack-authored text remains the first text part. A native-audio transcript supplements that text and never replaces it. Each file and transcript pair shares a media identifier in its messaging-media extension metadata. The source-system payload preserves Slack fields that are not part of the normalized message. It does not contain raw request bytes, HTTP headers, signature material, or Aion routing information. If a response includes an explicit MessageActionPayload or ReactionActionPayload, Aion performs that action. Otherwise, Aion delivers the final response text using the configured Reply Mode and the inbound Slack context. For the protocol contracts, see Distribution, Event, and Distribution/Messaging.

Context and message identifiers

Slack uses the root message timestamp, thread_ts, as its thread key. For example, a thread reply carries:
These Slack-native values belong to MessageEventPayload. The top-level A2A Message.contextId is a separate Aion-generated identifier mapped to the same immediate conversation or thread. Do not parse it as a Slack ID. Channel, DM, multiparty, private-conversation, and thread contexts are long-lived. Aion reuses the mapped A2A context for later events in the same Slack context. Every inbound message still starts a new A2A task; it does not automatically resume an earlier input-required task. For framework-specific access to the normalized request, see LangGraph message mapping or Google ADK message mapping.

Use Slack tools

The mcp.slack capability makes these tools available to the Slack Distribution’s Sequence: Use the identifiers from MessageEventPayload as tool arguments. A thread-history request needs the enclosing conversation ID and root message timestamp:
History reads use Slack when it is available. During a temporary Slack error or rate limit, Aion may return recent cached results instead. Check the result’s freshness and partial-result fields before treating it as complete history. The tools return message, file, and attachment metadata but do not download Slack file contents.

Features

Files and native audio

Slack events and tools expose bounded metadata for ordinary files and legacy attachments. Aion does not download ordinary file content through this Distribution. For a provider-designated native recording whose Slack file subtype is exactly slack_audio, Aion can download up to 20 MiB, store the bytes temporarily, and emit an authenticated Aion file part. The current shared media path accepts Ogg/Opus, MP3, and M4A recordings. The bytes are retained for one hour by default. When Slack provides a complete transcript during the same processing attempt, Aion uses it. Otherwise, Aion attempts recorded speech-to-text. A failed or unsupported transcription can still deliver the stored file with safe status metadata; it never invents transcript text. Failure to materialize one clip does not discard Slack-authored text or another successful clip. Native audio requires the optional files:read bot scope. Without that grant, Aion preserves any authored text and omits file and transcript parts. If the event contains only an inaccessible audio clip, it does not start agent work. Private Slack URLs and bot credentials are never forwarded to the Sequence. See Media and attachments for why metadata, accessible content, and voice transcription have independent support states.

Mentions

Aion identifies a mention by the installed bot’s exact Slack user ID, such as <@U0AIONBOT>. Usernames and display names do not count as mentions. Slack can represent one mentioned channel message as both a generic message callback and an app_mention callback. Aion sends only the app_mention through the Sequence, preventing a duplicate turn. If Slack does not send the expected app_mention, Aion does not deliver the generic message as a fallback.

Direct and multiparty messages

One-to-one direct messages use Slack’s writable App Home Messages tab and message.im. Multiparty direct messages use message.mpim and require the bot to be added to that conversation. Both are baseline message contexts.
Use the injected Thread to reply to the inbound direct-message context. The Slack target remains runtime-scoped.

Member-channel observation

An active Distribution observes supported messages in each public or private channel where the bot is a member. There is no separate observation toggle. Removing the bot from a channel stops future event delivery for that channel. Thread broadcasts are an optional Event Policy. Edits, deletions, membership changes, Slack-authored platform notices, and unsupported message types do not start application work.

Reactions

Reaction callbacks and reaction writes are optional. Enabling reactions can require expanded scopes and workspace reauthorization.
Route inbound reactions with create_event_router(on_reaction=handler). Treat a reaction as an event rather than a user text turn.

Replies and streaming

The default reply target preserves the inbound context. You can configure replies to use a thread, channel, direct message, or no-reply mode. Streaming replies are enabled by default. Aion uses Slack’s native streaming methods when the connected Slack app and reply target support them. Otherwise, it posts one message and coalesces updates to that message.
Use Thread.reply(...) for the inbound context. To post in the enclosing conversation, call Thread.post(...) with an explicit MessageActionPayload target.

Operations and limitations

Troubleshoot a missing mention

Aion does not deliver the generic copy of a mention as a fallback. If the bot ignores a mention:
  1. Verify that the app subscribes to app_mention and still has app_mentions:read.
  2. Confirm that the bot is a member of the channel and the Distribution is active.
  3. Check whether the workspace connection requires reauthorization or Request URL verification.
  4. Repair the Slack configuration, then send a new mention.

Check connection health

Current limitations

  • Each Slack Bot can connect to one workspace at a time.
  • Enterprise Grid organization-wide installations are unsupported.
  • Externally shared channels require a Distribution-wide opt-in and stricter privacy checks.
  • Slack Agent View, commands, interactive payloads, and card-to-Block-Kit rendering are not available.
  • Ordinary Slack file contents are not downloaded; only exact-subtype native audio is materialized.
  • Slack edits and deletions do not rewrite previously recorded A2A messages.
  • Customer-managed profile changes can require you to update the app in Slack.
See Feature Support for release-state labels across messaging providers.

What to do next