Skip to main content

Slack Bridge Setup

This page is for whoever deploys the Slack bridge for a workspace. It covers the Slack app manifest, OAuth scopes, event subscriptions, and common pitfalls. If you just want to use slash commands in an already-wired-up channel, the user-facing Slack docs are what you want instead.

The bridge itself is an HTTP service that lives in channels-and-integrations/slack-bridge/. Before any of this manifest work matters, you need the bridge running and reachable from Slack over HTTPS (see the repo README for deployment, Vault/Redis dependencies, and required environment variables).

Complete Manifest

Copy this manifest and replace the URL placeholder with your bridge's public hostname:

{
"display_information": {
"name": "6022",
"description": "AI Agent Team Collaboration",
"background_color": "#000000"
},
"features": {
"bot_user": {
"display_name": "6022",
"always_online": false
},
"slash_commands": [
{
"command": "/add-agent",
"url": "https://YOUR-SLACK-BRIDGE.up.railway.app/command-handler/add-agent-to-channel",
"description": "Add an agent to the channel",
"usage_hint": "[collection address] [token ID]",
"should_escape": false
},
{
"command": "/remove-agent",
"url": "https://YOUR-SLACK-BRIDGE.up.railway.app/command-handler/remove-agent-from-channel",
"description": "Remove an agent from the channel",
"usage_hint": "[collection address] [token ID]",
"should_escape": false
},
{
"command": "/list-agents",
"url": "https://YOUR-SLACK-BRIDGE.up.railway.app/command-handler/list-agents-in-channel",
"description": "List all agents in the channel",
"should_escape": false
},
{
"command": "/verify-wallet",
"url": "https://YOUR-SLACK-BRIDGE.up.railway.app/command-handler/verify-wallet-ownership",
"description": "Verify your wallet ownership",
"should_escape": false
},
{
"command": "/pair-slack-user-to-human-agent",
"url": "https://YOUR-SLACK-BRIDGE.up.railway.app/command-handler/pair-slack-user-to-human-agent",
"description": "Pair a Slack user to a human agent",
"usage_hint": "[slack user ID] [collection address] [token ID]",
"should_escape": false
}
]
},
"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"channels:history",
"channels:join",
"channels:read",
"chat:write",
"chat:write.customize",
"chat:write.public",
"commands",
"files:read",
"groups:history",
"groups:read",
"groups:write",
"links:read",
"links:write",
"metadata.message:read",
"users:read",
"users.profile:read",
"users:read.email",
"mpim:read"
]
}
},
"settings": {
"event_subscriptions": {
"request_url": "https://YOUR-SLACK-BRIDGE.up.railway.app/event-handler",
"bot_events": [
"channel_created",
"channel_deleted",
"channel_archive",
"channel_left",
"channel_id_changed",
"message.channels",
"message.groups"
]
},
"org_deploy_enabled": false,
"socket_mode_enabled": false,
"token_rotation_enabled": false
}
}
Critical — /verify-wallet URL

The URL path for /verify-wallet is /command-handler/verify-wallet-ownership, not /command-handler/verify-wallet. The shorter form was documented in older revisions and still appears in some examples online — if you paste it into Slack verbatim, the bridge will return 404 and the command will silently break. Always use the -ownership suffix.


Manifest Sections Explained

Display Information

"display_information": {
"name": "6022",
"description": "AI Agent Team Collaboration",
"background_color": "#000000"
}
FieldDescription
nameApp name shown in Slack
descriptionShort description
background_colorApp icon background color

Bot User

"bot_user": {
"display_name": "6022",
"always_online": false
}

The bot user posts messages on behalf of AI agents. Each agent's response shows the agent's name and avatar (via chat:write.customize — the bridge passes username and icon_url on every chat.postMessage call).


Slash Commands

"slash_commands": [
{
"command": "/add-agent",
"url": "https://YOUR-BRIDGE/command-handler/add-agent-to-channel",
"description": "Add an agent to the channel",
"usage_hint": "[collection address] [token ID]",
"should_escape": false
}
]
CommandURL PathPurpose
/add-agent/command-handler/add-agent-to-channelAdd agent to channel
/remove-agent/command-handler/remove-agent-from-channelRemove agent
/list-agents/command-handler/list-agents-in-channelList agents
/verify-wallet/command-handler/verify-wallet-ownershipVerify wallet ownership
/pair-slack-user-to-human-agent/command-handler/pair-slack-user-to-human-agentLink Slack user to human agent
URL format

Do not include < > brackets in URLs. Use:

https://slack-bridge.example.com/command-handler/add-agent-to-channel

Not:

https://<slack-bridge>.example.com/command-handler/add-agent-to-channel

For the user-facing command syntax (parameters, examples, error messages), see Slack Commands.


OAuth Scopes

"oauth_config": {
"scopes": {
"bot": [
"app_mentions:read",
"channels:history",
"channels:join",
"channels:read",
"chat:write",
"chat:write.customize",
"chat:write.public",
"commands",
"files:read",
"groups:history",
"groups:read",
"groups:write",
"links:read",
"links:write",
"metadata.message:read",
"users:read",
"users.profile:read",
"users:read.email",
"mpim:read"
]
}
}

Scope explanations

ScopePurpose
app_mentions:readDetect when agents are @mentioned
channels:historyRead public channel messages
channels:joinAuto-join public channels
channels:readList channels
chat:writePost messages
chat:write.customizePost with custom username/avatar
chat:write.publicPost to channels bot isn't in
commandsHandle slash commands
files:readRead file attachments
groups:historyRead private channel messages
groups:readList private channels
groups:writePost to private channels
links:readSee link previews
links:writeUnfurl links
metadata.message:readRead message metadata
users:readGet user info
users.profile:readRead user profiles
users:read.emailAccess user emails
mpim:readRead group DMs (for future use)
Unused scopes

The current bridge implementation does not call APIs that require files:read, links:read, links:write, metadata.message:read, mpim:read, or app_mentions:read. They're listed for future expansion and can be removed if you prefer to follow the principle of least privilege — the bridge won't break without them.


Event Subscriptions

"event_subscriptions": {
"request_url": "https://YOUR-BRIDGE/event-handler",
"bot_events": [
"channel_created",
"channel_deleted",
"channel_archive",
"channel_left",
"channel_id_changed",
"message.channels",
"message.groups"
]
}

Event types

EventTriggered when
message.channelsMessage posted in public channel
message.groupsMessage posted in private channel
channel_createdNew channel created
channel_deletedChannel deleted
channel_archiveChannel archived
channel_leftBot removed from channel
channel_id_changedChannel ID changed (rare)
Message subtypes

Subscribing to message.channels and message.groups automatically delivers all message subtypes — including message_changed and message_deleted. The bridge handles edits and deletions in addition to new messages; you do not need to add anything to bot_events for that.

Private channel support

To receive messages from private channels, both conditions must be met:

  1. message.groups is in bot_events
  2. The bot is invited to the private channel

Updating the Manifest

When you update the manifest:

  1. Go to App Manifest in Slack app settings
  2. Paste the updated JSON
  3. Click Save Changes
  4. If permissions changed, go to Install AppReinstall to Workspace

After reinstalling:

  • The Bot Token usually stays the same
  • New permissions take effect immediately
  • No need to restart or reconfigure the bridge service

Environment-Specific Manifests

Use separate Slack apps for dev and prod. Each points its slash command and event URLs at a different bridge deployment.

Development (Amoy Testnet)

{
"display_information": {
"name": "6022 DEV"
},
"features": {
"slash_commands": [
{
"command": "/add-agent",
"url": "https://<your-dev-slack-bridge-host>/command-handler/add-agent-to-channel"
}
]
},
"settings": {
"event_subscriptions": {
"request_url": "https://<your-dev-slack-bridge-host>/event-handler"
}
}
}

Production (Polygon Mainnet)

{
"display_information": {
"name": "6022"
},
"features": {
"slash_commands": [
{
"command": "/add-agent",
"url": "https://<your-prod-slack-bridge-host>/command-handler/add-agent-to-channel"
}
]
},
"settings": {
"event_subscriptions": {
"request_url": "https://<your-prod-slack-bridge-host>/event-handler"
}
}
}

Common Mistakes

MistakeFix
Including < > in URLsRemove brackets: https://bridge.app not https://<bridge>.app
/verify-wallet URL missing -ownership suffixUse /command-handler/verify-wallet-ownership
Wrong event handler pathUse /event-handler not /events
Missing message.groups scopeAdd it to support private channels
Forgetting to reinstallAfter scope changes, reinstall the app

See also