an operating system for agents

Seven primitives.
One agent loop.

A toolkit an agent fully owns: coordinate, read code, run safely, remember, read the web, recall β€” and see what you built. Every tool is zero-dependency, MCP-native, and ships its own live web view.

the loop, running
the seven

Each tool owns one move in the loop

for agents

Findable by the thing that uses it A toolkit for agents that only a human can find is a toolkit with a bug. Three fetches, no cloning: the map, the manifest, the install.

/llms.txt the map

The curated index, in the llmstxt.org format: what the kit is, what each tool is for, and where to read more. Start here if you are a model.

/tools.json the manifest

All 70 MCP tools β€” every name, every description, every install command β€” in one fetch. Generated by asking each server tools/list, so it cannot drift.

/llms-full.txt everything

Every tool's full README concatenated, so a model can ingest the entire kit in one request instead of seven.

install Β· zero dependencies Β· Node 22+
# clone the kit and hand all seven to your model
$ for t in agent-hq lens anvil cortex scout recall iris; do
git clone https://github.com/tools-for-agents/$t.git
claude mcp add $t -s user -- node $PWD/$t/mcp/mcp-server.js
$ done
βœ“ 70 tools registered β€” nothing to npm install, nothing to break
what a tool owes an agent

Never a confident wrong answer A model cannot see your screen, cannot check your filesystem, and cannot tell that a tool was misconfigured. It has only what the tool said. So the one thing a tool must never do is sound sure.

β€œ0 results” is not an answer

β€œNothing is indexed” and β€œyour code does not contain that” are the same sentence to a caller β€” and could not be more different. An empty store says it is empty, and says how big the haystack was: 0 hits of 0 notes is a misconfigured path; 0 hits of 500 notes is a real answer.

A typo is not an empty set

status: "In Progres" β€” one letter short β€” used to return []. An agent asks what is in progress, is told nothing is, and starts work someone else is already doing. Columns, agents and namespaces are finite, known sets: a filter outside the set is a mistake, and the error lists the real values.

A read creates nothing

Ask a question in any directory and nothing is left behind. Opening a store used to create it β€” so the empty store the tool had just made then answered the question, and the tool invented the evidence for its own answer.

Every error is actionable

fetch failed is not an error message. It names no cause, suggests no action, and cannot be told apart from a typo, a dead host, or being offline. Every error here names what went wrong, where it looked, and the command that fixes it.

Every tool declares what it does

MCP tool annotations, on all 67: 37 read-only Β· 7 destructive Β· 10 open-world. A client can tell a search from a delete without calling either. (The spec's defaults are pessimistic β€” say nothing, and you have declared yourself destructive.)

Every claim is gated

The whole loop runs on every push, from fresh clones. All 70 tools are called. The UI is looked at, with data ugly enough to break it. A skipped test is a failed test. And every gate has been watched to fail β€” a gate nobody has seen fail is a gate you are trusting on faith.

one loop, one run

What a single turn looks like

agent@tools-for-agents Β· one turn
shared dna

The same discipline in every tool

dependencies
Zero
Node standard library + built-in node:sqlite. Nothing to npm install, nothing to break.
interface
70 MCP tools
Every tool ships an MCP server over stdio, so any model can drive the whole kit.
web views
7 / 7
Each tool has a serve command β€” a live, self-contained dashboard for humans.
design
One system
One type scale, one spacing grid, one palette β€” declared in tokens.json and enforced in CI by iris.