AI teammate for your whole team
An AI teammate for Slack that can actually reach your systems.
Mention it in a thread and it reads the history, searches your documents and the web, and queries GitHub, Sentry, ClickUp or any MCP server. It can reach your systems — it just can’t hold the keys: credentials are injected outside the model, every write waits for a human, and it runs on whichever model you point it at.
Sam9:12 AM
@attest_tag checkout errors are up since this morning’s deploy — what changed?
attest_tag replied in #eng-oncall: Two things landed at 08:40 UTC. Sentry opened a new group one minute later — TypeError: cannot read ‘currency’ — 412 events, all on POST /checkout/confirm. That is the same minute #2841 “drop legacy currency fallback” merged. The PR removes the ?? "USD" default in priceFor(), and three call sites still hand it a cart with no currency set. Want me to fix it and raise a PR? Ran on z-ai/glm-5.3-flash — 3.4k in, 512 out, $0.0021.
Connects to
What it does
A teammate, not a search box.
It remembers what you told it, runs on a schedule, writes files, reaches your services, and knows what it is not allowed to do on its own.
In the thread
Threads & streaming
Answers stream in while a status line says what it is doing. Say “stop” and the model call and every tool in flight are cancelled.
Slack tools
Thread and channel history with names resolved, workspace search, channel lists, pins, user lookup.
Your documents
Chunked, embedded and searched. Ask a policy question and it answers only from what you indexed — and names the page.
Web search & fetch
Search and page fetch with an SSRF guard: no private, loopback or link-local hosts, no non-HTTP schemes.
Files & artifacts
Reads PDFs and text you attach. Ask for something as a file and it writes one, uploads it, and keeps it in the console.
Commands
!help, !usage, !model, !memory, !routines, !jobs, !mute — handled before anything reaches the model.
Reaching out
Connections
One credential for one service, scoped to the channels you choose, with allowed hosts, paths and methods.
Bundles & presets
Group connections, instructions and skills, then attach them to a channel. Presets for a dozen services fill in the details.
Credential proxy
The model emits a URL. The proxy matches it, injects the secret at the edge, and scrubs it back out of the response.
Remote MCP servers
Point at an MCP server and its tools load on demand — not 20k tokens of definitions on every round. Bearer or OAuth.
Repositories & fix jobs
Connect a repo, then say “fix this and raise a PR”. A worker container does it and opens a draft.
Memory & routines
“Remember for this channel…” and “every weekday at 9am…”, in plain sentences, stored per channel.
Running it
Admin console
Scopes, bundles, documents, memory, routines, jobs, artifacts, activity and settings — served by the binary itself.
Approvers & roles
Approval tiers that name the bundle their members may grant from, plus admin, editor and viewer in the console.
Budgets & limits
A monthly cap for the workspace, another per channel, and a per-user hourly rate limit. It pauses rather than surprises.
Audit trail
Every turn, tool call, proxied request and completion — with tokens and cost — stored and exportable as CSV.
Model routing
A cheap default, a heavy model for code and long threads, a vision model for images, and per-thread overrides.
Scheduled digests
Routines run in a fresh thread on cron, in your timezone, and edit their own post with the result.
The core loop
Ask, reach, hold, ship.
The same four beats on every turn, whether the answer is a sentence or a pull request.
01Ask
Mention it in the thread you were already having.
It rebuilds the whole thread on every turn, so edits and deletions are noticed. Follow-ups need no mention. Attached files and PDFs are read into context, and long threads are windowed with a running summary rather than truncated.
Mei4:07 PM
@attest_tagwhat’s our policy on carrying leave into the next year? check our docs
attest_tagApp4:07 PM
Up to 5 days carry into Q1 and expire on 31 March. Anything above 5 needs your manager’s sign-off before 15 December, and contractors are out of scope entirely.
- Employee handbook§4.2 Annual leave
- 2026 policy updateCarry-over changes
02Reach
It looks things up in the systems that hold the answer.
Slack history and search, your indexed documents, the web, and any service you have connected — GitHub, ClickUp, Sentry, Jira, Notion, Stripe, or a remote MCP server. It says which tool it is running while it runs.
Dan2:41 PM
@attest_tag the Vasquez account is still on the old plan — can you bump their seat count to 40 and note it on the ticket?
attest_tagApp2:41 PM
Found them: acct_8813, Growth plan, 25 seats, renewed 3 weeks ago. The ticket is SUP-2291. Two writes, so I’ll wait.
Waiting on a human
Raise Vasquez Ltd from 25 to 40 seats
billing/stripePOST /v1/subscription_items/si_88…03Hold
Reading is free. Changing something is not.
Every write through the proxy posts what it intends to do and waits — Confirm, Cancel, or hand the thread back and say what you actually wanted. Writes that are nobody's to self-approve leave the thread and go to an approver instead.
attest_tagApp11:04 AM
Access request · tier Approver
Priya asked in #eng-oncall for production access to be granted to a new on-call rotation.
- POST
/api/v2/teams/oncall-eu/members - PUT
/api/v2/escalation_policies/EP-77
Both calls run in order under the tier’s own bundle — not yours, and not the channel’s. Stops at the first failure.
You cannot approve your own request. Enforced three times over, once in SQL.
04Ship
And when the fix is obvious, it opens the pull request.
A separate container clones the branch, runs the tests, makes the change, runs them again, and opens a draft PR carrying the brief, the evidence, and the test results before and after. It may push one branch. It never merges.
Priya9:14 AM
yes please — raise it as a draft against main
attest_tagApp9:14 AM
Fix job #f-4172 · acme/storefront
- clone
- tests baseline
- fix
- tests
- pull request
It may push one branch and open one draft PR. It never merges, and never pushes to main.
Connections
The model emits a URL. The proxy does the rest.
Every AI vendor says the model never sees your credentials. This is the path a request actually takes.
The model
emits http_request with a URL and no secret
- 1ResolveWhat may this channel reach? The union of its scopes and bundles, cached for a minute.
- 2MatchHost, path prefix and method against the connection. Anything else is refused, with a reason the model can act on.
- 3InjectThe credential joins here, at the network edge. 30-second timeout, redirects not followed.sealed credential store
- 4HoldWrites wait for a Confirm in the thread. Reads are never held.
- 5ScrubCredential values and anything secret-shaped are stripped from the response, then audited.
Your service
GitHub · ClickUp · Sentry · Jira · an MCP server · your own API
Admin console
Everything it did, and everything it may do.
Served by the same binary, at /admin. Spend against budget, every turn and tool call, what each channel can reach, and who may approve what.
Overview
1,284
turns
3,910
tool calls
216
documents
48
memories
Models & cost
Open weights by default. Your endpoint either way.
It speaks the OpenAI-compatible API, so it runs on OpenRouter, on a vendor endpoint, or on something you host yourself — and on z-ai/glm-5.3-flash out of the box. A cheap model answers most things; a heavy one is routed to automatically for code, for long threads, and for turns that have already made eight tool calls.
Every completion’s tokens and cost are recorded, so the number under a reply is measured, not estimated — and the monthly budget is a ceiling the bot stops at rather than a line it reports having crossed.
$0.002
a typical answered question
1
Go binary, console embedded
0
credentials the model can read
100%
of turns, tools and spend audited
Guardrails
Built for the day it gets something wrong.
A model that can reach your systems is only as safe as what happens when it misreads the room. Every one of these is enforced outside the model.
Tool output is data, never instructions
Results are wrapped and the prompt forbids following anything inside them. Fake tool-result tags in model output are stripped.
No credential ever enters the model
Sealed at rest, injected at the edge, scrubbed from every response before it reaches the model or the thread.
Nobody approves their own request
Enforced three times over, once in SQL. Requests route to the least powerful tier that covers every call in them.
Reads stay inside the asker's Slack
The bot is in channels you are not. It checks your membership before reading any conversation that isn't public.
Web fetches cannot reach your network
Non-HTTP schemes and private, loopback and link-local hosts are refused. The proxy reaches allow-listed hosts only.
Everything is on the record
Every turn, tool call, proxied request and completion, with tokens and cost, exportable as CSV.
Pricing
One workspace. Every channel.
Priced per workspace, not per seat — the whole point is that everybody in the channel can use it. Model spend is yours, metered at cost, capped by a budget you set.
Questions
What teams ask first
Do we have to hand it our API keys?
Which model does it run on?
Can it change things without asking?
Can it read channels we haven't invited it to?
What does it actually cost to run?
Where does our data live?
What do we have to migrate?
Put it in one channel and see what it does.
Half an hour, your workspace, one channel and one connected service. You will know by the end of it whether this belongs in your Slack.