Any agent. Any harness. Any channel.
Build an agent once. Choose which AI runs it. Then just talk to it in Slack, or on the web.
$curl -fsSL https://flooagents.com/install.sh | sh- Free and open source
- Works with Claude or Codex
- Lives in Slack and the web
- Host it yourself
How it works
Ask in Slack. Get the work done.
Your agent sits in the channel where the problem comes up. Ask it there, and it replies in the same thread, so nobody has to learn a new tool.
Search Team MSR
- Messages
- Files and links
Priya Raman9:41 AM
@floo the staging deploy is failing on migrations again. Can you find out why?
Flooapp9:41 AM
On it. Reading the deploy log and the last few migrations.
Flooapp9:43 AM
Found it.
0042_add_agent_indexassumesagents.harness_id, which0039renamed toharness. Guarded the migration and opened a PR.FlooAgents
#218 fix(db): guard 0042 migration against the renamed harness column
1 file changed · +12 −3
Message #eng-releases
Any AI
Change the AI. Keep the agent.
Every agent names the AI it runs on, Claude or Codex, with the model and settings you pick. Change that one line and the agent itself stays exactly as it was.
Slack and the web
how you reach it
Tag an agent in a Slack thread, or open a chat in the web app. Each way in is separate from everything below it.
Floo
what we build
Decides what runs, when, with what access, and where the results go. It owns the session, the workspace and the run history.
The AI loop
Claude or Codex
Runs the agent. One server holds both loops, and Floo picks one by the name in the agent's config. An admin controls which loops are switched on and which models each one offers.
The sandbox
where the work happens
Gives the agent a filesystem, a shell and network access to work in. It sits behind a fixed interface, so what runs above it does not depend on how the sandbox is provided.
The top two are Floo. The bottom two are pieces you can replace.
Tool gateway
Every tool behind one door.
Connect Gmail, GitHub or your own APIs, as many as you want. Your agent only reaches for a tool when it actually needs one, and every key stays in one place.
Connect a hundred tools. Your agent's list stays the same length.
However many services you connect, the gateway adds the same two things: one to search what this agent is allowed to use, one to run a single tool. Descriptions and input forms only load when the agent asks for them, so a bigger toolbox never crowds out the thing it is actually trying to do.
Two ways it uses them
- Direct
One lookup. The agent runs a tool and replies. If the result comes back too big, the gateway turns it down and tells the agent to use a script, which is what keeps huge payloads out of the conversation.
- Script
The agent writes a small program in its own workspace and runs it, calling as many tools as the job needs and printing only what matters. The raw data stays in the workspace and never reaches the model.
A script that works becomes a skill.
Say the job is your cost per install: pull the ad spend, match it to installs, do the maths. Once the agent gets that right, the script is saved as a skill and attached to any agent that needs it.
Connect anything, once
Your own internal services, an MCP server, or a shared toolkit. Whatever you connect lands in the same list, named the same way, and your agent treats them all alike.
Permissions per person
Each agent has a list of tools it may touch, and each person has their own. A call has to clear both lists, every single time, including calls made from inside a script.
Keys never leave the gateway
An admin connects a service once and the whole team works through it. Keys are stored encrypted and added to the call as it goes out. They never reach the agent's workspace, a tool's output, or the pass the agent was given for the job.
Every call on the record
Each call is written down against the run that made it: who asked, which tool, what they asked it for, how long it took, whether it worked.
