Slack distributions are in preview. Customer-managed Slack apps are the default setup mode. Aion-managed apps appear
only in environments where API provisioning is enabled, and commercial production use remains separately gated.
mcp.slack server for bounded Slack API
reads and writes.
Overview
An active Slack distribution supports two complementary paths:- Push delivery: Slack sends message, membership, reaction, and lifecycle callbacks through the Events API. Aion verifies, durably accepts, normalizes, and dispatches eligible callbacks to the agent.
- Agent-initiated tools: the agent calls the distribution-bound
mcp.slackserver for conversation metadata, recent history, thread replies, message writes, direct messages, and reactions.
Identity and installation model
Slack and Aion use several related objects. They are not interchangeable.
The principal identity does not supply or synchronize the bot profile. Set the Slack app name, bot display name,
description, color, and icon during Slack setup. Later profile changes use Aion’s editable service-identity surface when
the provisioning mode can apply them; otherwise Aion returns an explicit Slack owner action.
In v1, one managed app and service identity have one active workspace installation. Reauthorizing the same workspace
updates that installation. An OAuth callback for a different workspace is rejected. Slack Connect does not create a
second installation.
Default Request Loop
Aion acknowledges an accepted Slack callback after durable handoff. Parsing, routing, A2A dispatch, and agent execution continue asynchronously so the Events API endpoint can respond promptly.Configuration
Choose a provisioning mode
The Slack setup modal presents the independently gated modes available in the current Aion environment.
Both modes produce the same runtime bot capabilities. They differ in app ownership, who can change provider
configuration, and whether Aion can apply profile and manifest updates directly.
Customer-managed availability is controlled separately from Aion-managed availability. Aion is validating the
customer-managed single-customer policy classification directly with Slack; the guide does not present that
classification as Slack-approved. Aion-managed commercial production use remains disabled until the required Slack
authorization is recorded.
Set up a customer-managed app
Use this mode when the customer should own the Slack app and its provider credentials.- Open Integrations, select Slack, and add a Slack bot.
- Choose Customer-managed Slack app and enter the bot service profile.
- Open the Slack owner action. Select the intended workspace, review the generated bootstrap manifest, and create the app from the manifest.
- Return to Aion and enter the app id, client id, client secret, and signing secret from Slack’s app settings. Treat these values as secrets.
- Apply the second generated manifest in Slack. This stage adds the opaque Aion Events URL after Aion can resolve the app and signing secret. Save the manifest, complete Slack’s separate Request URL verification, and confirm the step in Aion.
- Continue to Slack OAuth, choose the same workspace, review the requested bot grants, and approve the installation. Workspace app-approval policy may place the request in an admin-approval-pending state.
- When setup completes, return to the draft distribution and explicitly select the new Slack bot service identity.
Set up an Aion-managed app
Use this mode only when the Aion-managed option is enabled for the current environment.- Open the Slack setup modal, choose Aion-managed Slack app, and enter the bot service profile.
- Aion creates a dedicated Slack app, persists its app credentials, and then applies the event-enabled manifest.
- Continue to Slack OAuth and approve the installation in the intended workspace.
- Select the resulting Slack bot service identity on the draft distribution.
Activate the distribution
A Slack distribution can activate when all of the following are true:- a Slack bot service identity is selected;
- its workspace installation is connected;
- the required baseline OAuth grants are present;
- the Events API subscriptions and Request URL projection are healthy; and
- the installation is not revoked, uninstalled, or waiting for reauthorization.
Add the bot to channels
Aion does not maintain a channel allowlist or production channel picker in v1. Slack membership is the channel observation control.- Public channel: invite the bot in Slack, for example with
/invite @bot-name. Remove the bot to stop observing that channel. - 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 MPIM before expecting delivery or history access.
- Slack Connect: use the same invitation model, then enable Allow externally shared channels on the distribution. External shared channels remain blocked by default.
Baseline and optional capabilities
The generated manifest is the source of truth for exact scopes and event subscriptions. Aion derives it from the Slack module’s typed capability model instead of maintaining a separate documentation-only matrix. The baseline includes app mentions, member-channel messages, private member-channel messages, one-to-one DMs, multiparty DMs, outbound chat, membership events, and app lifecycle events. Notable provider requirements include:groups:historywithmessage.groupsfor invited private channels;mpim:history,mpim:read, andmessage.mpimfor multiparty direct messages;im:history,im:read, andmessage.imfor one-to-one direct messages;channels:history,channels:read, andmessage.channelsfor joined public channels; andapp_mentions:read,chat:write, membership events, and uninstall/token-revocation events.
Message Mapping
Inbound and outbound payloads
For a message-like callback, Aion sends:- a normal text part when Slack supplied visible text;
- a normalized
MessageEventPayloadwith provider conversation coordinates; and - a
SourceSystemEventPayloadwhoseeventis the complete parsed outer Events API callback.
mcp.slack writes can select another permitted target.
Context and message identifiers
Slack has no standalone thread id. The root message timestamp,thread_ts, is Slack’s thread key.
These Slack-native fields belong to the Distribution/Messaging payload. The top-level A2A
Message.contextId is a
separate opaque Aion identifier mapped to the same immediate context. Agents must not parse it or assume it equals a
Slack channel or timestamp.
Channel, private-channel, DM, MPIM, and thread contexts are long-lived in v1. Aion reuses the mapped A2A context for
later events in the same Slack context. There is no inactivity timeout. Changing the distribution binding retires the
old mapping.
Thread mention example
This example shows both the normalized Slack coordinates and the complete parsed outer callback:Task continuity and retention
Every inbound Slack message starts a new A2A task in the reused context. This includes a message that appears to answer an earlierinput-required task. Aion does not infer a target task from participants, timing, or thread position.
Agents can consult prior tasks or their own state for the shared context, but the new request does not identify one
earlier task as its continuation.
Persisted A2A messages are immutable audit snapshots. Slack edits and deletions can update the bounded MCP
current-state cache, but they do not rewrite or delete an already dispatched A2A task. The common retention policy
defaults to 365 days from a task’s first terminal transition, then physically deletes the complete task graph.
Distribution-bound Slack MCP
Use the provider coordinates fromMessageEventPayload with the runtime-bound mcp.slack tools. A thread history
request uses both the enclosing conversation id and root timestamp:
conversations.history or conversations.replies request per minute.
Aion measures the effective tier for each installation instead of inferring it from provisioning mode.
The history tools return text, author ids, timestamps, thread coordinates, and reviewed file/attachment metadata. They
do not download file contents. SDK Thread.history() is not implemented; load and call the distribution-bound Slack
MCP tools instead. See LangGraph integration patterns.
Features
Mentions
Aion identifies mentions by the installed bot’s exact Slack user id, such as<@U0AIONBOT>. Usernames and display
names are not identity keys.
Slack can represent one mentioned channel message as both a generic message.channels or message.groups callback
and an app_mention callback. When the generic event contains the exact installed-bot mention, Aion terminally
suppresses it and dispatches the app_mention representation. There is no arbitration timeout. If Slack never sends
the expected app_mention, Aion deliberately sends no A2A request for that message.
- LangGraph
- Google ADK
- A2A
Direct and multiparty messages
One-to-one DMs use the writable App Home Messages tab andmessage.im. Multiparty DMs use message.mpim and require
the app to be added to that MPIM. Both are baseline message contexts.
- LangGraph
- Google ADK
- A2A
Plain LangGraph receives the inbound text in
state.messages. SDK-aware LangGraph receives the same text plus the
runtime-scoped Thread and message metadata.Member-channel observation
An active distribution observes supported messages in every public or private channel where its 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 family. Ordinary edits, deletions, joins, and unsupported message subtypes do not create new conversational tasks.Reactions
Reaction callbacks and reaction writes are optional. Enabling them can require expanded scopes and workspace re-consent.- LangGraph
- Google ADK
- A2A
Route inbound reactions with
create_event_router(on_reaction=handler). Read the normalized reaction event instead
of treating it as a user text turn.Replies and streaming
The default reply target preserves the inbound context. A distribution can instead select a thread, channel, direct message, or no-reply mode. Streaming is off by default. When enabled and eligible, Aion can use Slack’s native streaming methods. Otherwise it posts one message and coalesces updates to that message. The implementation records why it selected native streaming or the conventional post/update path so operators can diagnose provider eligibility and fallback behavior.- LangGraph
- Google ADK
- A2A
Use
Thread.reply(...) for the inbound context and Thread.post(...) for a new message in the enclosing
conversation. Runtime streaming events can feed the same reply when streaming is enabled.Operations and limitations
Troubleshoot a missing mention
A suppressed generic mention is never released as a fallback. If the bot ignores a mention:- Compare generic-mention suppression and
app_mentionreceipt counters for the installation. - Verify the app subscribes to
app_mentionand still hasapp_mentions:read. - Check installation, re-consent, Request URL, and Events API acknowledgement health.
- Repair the Slack configuration. Do not replay the suppressed generic event.
Interpret installation health
Current limitations
- One active workspace installation is allowed per Slack bot service identity.
- Enterprise Grid organization-wide installs are unsupported.
- Externally shared channels require a distribution-wide opt-in and are subject to stricter privacy checks.
- Native Agent View, commands, interactive payloads, and card-to-Block-Kit rendering are deferred.
- Native streaming remains preview until each supported Slack target is manually validated.
- Slack edits and deletions update bounded current-state history only; persisted A2A audit history is immutable.
- Customer-managed profile updates can require a Slack owner action. Aion-managed profile updates remain subject to provisioning entitlement and provider support.