Slack

Connect Slack so your agents can list channels, read a thread and post to your workspace - with a confirmation card before every single message.

Esta página aún no está disponible en tu idioma, mostramos la versión en inglés.

Your agents can read your channels and post to them. They just can't do it behind your back.

Connect your Slack workspace and any agent can pull up what's being discussed in #launch, catch up on a thread, react to a message, and write the update you were going to write yourself. Then it stops and shows you the message.

Nothing reaches your workspace until you click Post.

The gate is real, not a promise

slack.post_message is marked requires_confirmation in Unyo's tool-policy table - it's database configuration, not a line in a prompt an agent could talk itself out of. When an agent wants to post, the run stops, a confirmation card appears with the exact channel and the exact text, and the message is only sent by the separate action that your click triggers. Ignore the card for 15 minutes and it expires.

What it unlocks

Once Slack is connected, five tools appear in your agents' toolboxes:

Ask for thisThe toolWhat actually happens
"Which channels do I have?"slack.list_channelsLists your public and private channels (up to 50 by default)
"What's been said in #launch today?"slack.read_channelReads the last messages in a channel (20 by default, 50 max)
"Catch me up on that thread"slack.read_threadReads a full thread from its timestamp
"Post the summary to #marketing"slack.post_messageShows you a confirmation card. Posts only when you click
"React with 🎉 to Sam's message"slack.reactAdds an emoji reaction

Slack isn't one agent's private toy - it's mounted for your team, so each agent uses it for its own job:

  • Ashley posts the week's content plan into #marketing and reacts to the thread where the team signed off on it.
  • Blake drops a revenue snapshot into #leadership - with the numbers he actually computed, not estimated.
  • Riley reads #product-feedback and turns the recurring complaints into a written brief.
  • Sam reads a support escalation thread and drafts the reply you'll send to the customer.
  • Ema reads the channel you've been ignoring and tells you what actually needs you.

Reading Slack is free. Posting costs 10 credits.

slack.list_channels costs 0 credits, and reading a channel, reading a thread and reacting are free today. slack.post_message costs 10 credits. The credits are reserved when the confirmation card appears, so you can see the cost blocked while you decide, and refunded automatically if you cancel or let the card expire. You are never charged for a message you didn't send.

The three-step posting flow

Slack is one of the integrations where Unyo deliberately slows down. Agents follow a GATHER → PROPOSE → EXECUTE sequence:

  1. GATHER - the agent works out where the message should go. If it doesn't know your channels, it calls slack.list_channels first. Your real channel list is attached to the confirmation card so you can redirect it before posting.
  2. PROPOSE - the confirmation card appears with the channel and the message text, formatted the way Slack will render it. The run pauses here.
  3. EXECUTE - you click. Only then does the message go to Slack.

An agent that misspells a tool name can't post by accident

If the model garbles a write tool's name - slack.postmsg, slack.post_mesage - the call is refused rather than guessed into an action. And even a perfectly spelled post still stops at the confirmation card. Fuzzy matching is allowed to help a harmless read; it is never allowed to reach your workspace.

Connect Slack

  1. Open Integrations from the sidebar (it's a top-level page - not inside Settings).
  2. Filter to Productivity, or search for Slack.
  3. Click Connect on the Slack card.
  4. Sign in to Slack and pick the workspace you want Unyo in.
  5. Review the permissions Slack shows you, then click Allow.
  6. You land back on Integrations with the Slack card marked Connected.

If an agent needs Slack mid-conversation and you haven't connected it, you don't have to go hunting - a Connect card appears right in the chat, takes you straight into the Slack sign-in, and drops you back in the same conversation. The run picks up where it paused and re-runs the exact action it was waiting on. Nothing to retype.

Permissions - what we ask for, and what we refuse

Slack issues Unyo a bot token. Here's every scope in the request, in plain English:

ScopeWhat it lets your agents do
channels:readSee your public channels, so an agent can list them and pick the right one
groups:readSee the private channels Unyo has been invited to
channels:historyRead messages in a public channel to catch you up
groups:historyRead messages in a private channel Unyo has been invited to
chat:writePost a message - gated behind your click, every time
reactions:writeAdd an emoji reaction to a message
files:writeUpload an image alongside a post (used by the publish announcement below)
users:readTurn a user ID into a name, so "who said that?" has an answer
users:read.emailMatch a Slack member to the right person
team:readRead your workspace name, to show you which workspace is connected
channels:manageChannel management
reminders:read / reminders:writeReminder management

What we deliberately did not ask for:

Not requestedWhat that means for you
files:readUnyo cannot read the files in your Slack workspace. Not the contract PDF in #legal, not the export someone dumped in #data. Unyo can attach an image to a message it sends; it cannot open one you sent. The capability was never granted, so it can't be misused.
im:history, mpim:historyNo DM access. Your direct messages are not visible to any agent.
Message searchSlack's search.messages API only works with a user token - a token that acts as you. Unyo's OAuth issues bot tokens only, so the search tool was removed from the codebase entirely. Your agents can read a channel you name; they cannot go trawling your workspace history.

A private channel is invisible to Unyo until someone invites the Unyo app into it. groups:read doesn't grant access to private channels - it grants access to the private channels you've already let it into.

Announce your published posts in Slack (optional, off by default)

If you publish social posts through Unyo, you can have the workspace told automatically. Open Automation settings from the sidebar and turn on Slack Post Announce, then pick the destination channel.

When a post goes live, Unyo posts a formatted card to that channel: what was published, on which platforms, the caption, real permalinks to each live post, and the images attached.

This is opt-in and off unless you turn it on, and it fires on publication - a post you never published never gets announced. It's the one place files:write earns its keep.

Example prompts

What are people saying in #product-feedback this week? Give me the three complaints that came up more than once.

Read the thread in #launch about the pricing change and summarise where we landed, then post that summary back to the thread.

Post to #marketing: this week's content plan is ready, three posts scheduled for Tue/Thu/Fri. Keep it short.

Catch me up on #leadership - I've been out for two days and I don't want to read 200 messages.

React with 🎉 to the last message in #wins.

What Unyo does with your Slack data

  • Your token is encrypted at rest. It goes through Unyo's encrypt_token / decrypt_token database functions and is never written to or read from a plain column. As of 16 July 2026, every populated OAuth token column in the production database was verified encrypted at the cipher-byte level - zero plaintext tokens exist.
  • Your token never appears anywhere you could leak it. Not in a log, not in an error message, not in an HTTP response, not in the live activity stream. It's resolved for the length of one outbound call to Slack and discarded.
  • Nothing you write in Slack is used to train a model. Every model Unyo runs is under a no-training, zero-retention guarantee. Your channel messages are read to answer the question you asked, and that's the end of them.
  • Your data is yours alone. The Slack connection row is protected by row-level security - 100% of Unyo's public tables carry it, verified live on 16 July 2026 - so no other account can reach it, by construction rather than by convention.
  • Deleting your account deletes it. Account deletion purges roughly 80 tables atomically and calls Slack's revoke endpoint to kill the token at the source.
Can an agent post to Slack without me seeing it first?

No. slack.post_message requires a confirmation in Unyo's tool-policy table, so the run halts and renders a card with the channel and the full message text. The message is only sent by the action your click triggers. There is no setting that turns this off, and there's no auto-post mode - unattended sending doesn't exist anywhere in Unyo. The one exception is the Slack Post Announce automation, which you turn on yourself, point at a channel yourself, and which only ever fires on a post you published.

Can Unyo read my DMs or my private channels?

Not your DMs - the DM scopes were never requested. Private channels only if you invite the Unyo app into them; until then they're invisible. And it can't read your Slack files at all: files:read was deliberately left out of the request.

Can I ask an agent to search my Slack history?

No, and that's a Slack constraint we chose not to work around. Slack's search API only accepts a user token - a token that acts as you, with your access to everything. Unyo's OAuth issues bot tokens only, so search was removed from the codebase rather than shipped by escalating what we ask for. Agents can read a channel or a thread you name; they can't crawl your workspace.

What does it cost?

Posting a message costs 10 credits. Listing your channels costs nothing, and reading a channel, reading a thread and reacting are free today. The credits are reserved while the confirmation card is up, and refunded automatically if you cancel or let it expire. Connecting Slack itself is free.

What happens if I disconnect Slack mid-task?

The agent doesn't crash and it doesn't invent an answer. It pauses with a "Waiting for connection" notice and holds the exact action it was about to take. Reconnect, and it replays that action once - with a guard that makes double-charging impossible.

Disconnecting and revoking

Open Integrations from the sidebar and click Disconnect on the Slack card. The connection is deleted from Unyo immediately and your agents lose every Slack tool on their next run.

Be aware of exactly what that does and doesn't do. Disconnecting removes Unyo's stored token - we can no longer reach your workspace. It does not call Slack's revoke endpoint, so the Unyo app may still appear in your workspace's installed-apps list. To remove it at the source, go to your Slack workspace's Settings & administration → Manage apps, find Unyo, and remove it.

Two cases where Unyo does revoke at Slack for you:

  • Deleting your Unyo account calls Slack's auth.revoke endpoint before purging your data. Killing the grant is unambiguously the right thing to do there, so we do it.
  • Removing Unyo from Slack's own app settings invalidates the token immediately; Unyo's next call fails cleanly and the card asks you to reconnect.

Troubleshooting

"Slack isn't connected" even though the card says Connected. The token was revoked at Slack's end - usually because someone removed the app from the workspace. Disconnect and reconnect.

The agent can't find a channel you know exists. It's private and the Unyo app hasn't been invited in. Type /invite @Unyo in that channel and ask again.

The agent listed a channel but says it can't read it. Same cause. channels:read shows public channels; reading a private one needs Unyo to be a member.

The confirmation card disappeared before you clicked. Cards expire after 15 minutes and the credits are refunded. Ask the agent again.

Nothing happens when you click Connect. The Slack sign-in opens in a new window - allow pop-ups for unyo.app.

Slack Post Announce isn't firing. Check two things in Automation settings: the toggle is on, and a destination channel is selected. With the toggle on but no channel picked, there's nowhere to post.