Every tool the brain offers, in its own words.
An agent is a user here, not an integration. So what it reads about a tool is product: where to start, what to send, what comes back, and what a refusal means. Below is that text as the agent sees it, tool by tool, with what each one takes, what it returns, and the refusals it can give. A connection sees only the tools its scope allows, so a read-only agent is never offered a write.
Nine tools at sign-in: eight read, one asks.
Every connection that signed in holds these. They read the open area, which our server holds as markdown. In an encrypted brain they find nothing, and say so.
- list_brains
-
THE BRAINS YOU HOLD. Each with its name, id, kind (private or shared), whether it is encrypted, and your role on its root. With more than one, pass a name or id as `brain` to every other tool; search_brain without it looks in all of them. An encrypted brain is read only on its people's computers: no tool here reads or writes it.
takes nothing
returns {brains}, each with name, id, kind, encrypted, role - search_brain
-
START HERE to find anything. Search for words; each must start a word of a page's path or text (quit finds quitting), any order, any case. Returns matching paths, each with the brain it is in, the paragraph where the words land, and updated_at. Without `brain` it searches every brain you hold. path_prefix narrows to one folder (e.g. operations/quit-smoking/). Then call read_node on a path, with the hit's brain.
takes query (up to 500 characters), limit (1 to 50, default 10), path_prefix, brain
GET /v0/open/search over HTTP
returns {hits}: each path with its brain, the paragraph, and updated_at - read_node
-
READ THE BRAIN. Returns one node as plain markdown, addressed by its path (e.g. operations/quit-smoking/brief.md), followed by one JSON line of metadata: version (what write_node's expected_version wants), updated_at, content_hash (compare against your copy to check staleness). Pass section (a heading, e.g. "## Day log") to get just that block instead of the whole page. Pass version to read an older version — only versions node_history lists exist; recording began 2026-09-07.
takes path, section, version, brain
returns the body as markdown in one block, then {path, brain, version, updated_at, content_hash} in a second, so a copy back into a write cannot carry a stale line
refuses a miss is an answer in words: no open-area node at that path, or the headings when a section is not there - list_nodes
-
BROWSE a brain. Lists open-area pages under a path prefix (e.g. operations/) with version, updated_at, content_hash and size — no content. Also the cheap staleness check: compare content_hash against your copy and re-read only the pages that changed. Empty prefix lists everything.
takes path_prefix, limit (1 to 500, default 200), brain
GET /v0/open/list over HTTP
returns {brain, nodes} - node_history
-
THE UNDO MAP. Lists recorded versions of one page, newest first: version, writer (the client), person (the user behind it, or null), written_at, content_hash, size. Read an old body with read_node(path, version). Recording began 2026-09-07 and nothing is backfilled, so a page at version 14 may list only 14 — the missing versions predate history and are gone, not broken.
takes path, limit (1 to 100, default 20), brain
GET /v0/open/history over HTTP
returns {path, versions} - brain_map
-
THE FOLDER MAP. One call shows a brain's folders with how many pages each holds, each folder's index file and the one sentence it states as the folder's purpose, and the skeleton files marked ★. Call it before you add a page or a folder, so the page lands where its kind already lives; it replaces walking the tree with list_nodes, and it is how you find the folder that already exists before you make a second one under another name. path narrows to one folder; depth (default 2) is how many folder levels it shows. It lists folders, not pages: list_nodes lists the pages of one folder.
takes path (a folder), depth (1 to 6, default 2), brain
returns text: the map, at most 300 folder lines and 60 root pages
refuses in an encrypted brain, a note that no map can be made there - read_skeleton
-
THE BRAIN'S OWN RULES, ALL AT ONCE. Returns every skeleton file of a brain in one response, each with its role: CLAUDE.md, the index, and each top folder's index file. Read it before you change how the brain is organised, or when the owner asks how it works. It is large: to work on one task, read CLAUDE.md and the one index file of the folder you work in with read_node instead. Lists the skeleton files the brain lacks.
takes brain
returns text: the count and the missing files, then each file with its role and version, at most 300,000 characters
refuses in an encrypted brain, the same note - check_structure
-
AUDIT THE STRUCTURE; it changes nothing. Compares a brain with its template and its own index files: skeleton files that are missing, folders without an index file, index files without a purpose sentence, pages outside any known folder, links in the skeleton and index files that point nowhere, and pages no page links to. Each finding says how to fix it. Report the findings to the owner. Fix one only when your task calls for it or the owner agrees: new structure needs a go.
takes brain
GET /v0/open/lint over HTTP
returns {brain, template, checked, counts, findings, note}, at most 100 findings, each with a fix
refuses in an encrypted brain, the same note - propose
-
ASK YOUR PERSON FOR A GO. Leave a proposal: a change you want their yes on before you make it, such as a new folder, a change to a skeleton file (★ in brain_map) you may not edit, or a large reorganisation. It shows in the cockpit's Waiting for you until your person marks it done. Give a short title, the change and why in the body, and the page it concerns, if one. The brain keeps it as plain text, readable by your person alone.
takes title (1 to 120 characters), body (up to 2,000), path, brain
returns {id, brain, waiting: true}
refuses not_found for a path it cannot read; encrypted_brain; quota past 50 proposals waiting in the brain; forbidden for a connection no person approved
Seven tools behind a second approval.
Approve writing and these appear. Each call still needs editor on the folder it writes, and manager to change a skeleton file. Replace, append, and patch are three tools because they are three different promises.
- write_node
-
WRITE TO THE BRAIN. Save markdown at a path (e.g. operations/quit-smoking/log.md), creating it or replacing it. Prefer append_node for adding to the end and patch_node for editing one spot — never resend a whole page to change a line. Pass expected_version (from read_node's metadata) to refuse the write if the page changed since you read it; 0 means the page must not exist yet. Every version is kept in node_history. A skeleton file (★ in brain_map) changes only by a manager of its folder; anyone else is refused, with the names of who can.
takes path, content (up to 1,000,000 characters), expected_version, brain
PUT /v0/open/node over HTTP
returns {path, version, created}
refuses version_mismatch, with the version the page is at - append_node
-
ADD TO THE END of a page — the tool for a log line. Send only the new part; the server adds it after a newline, so you never resend the page. Creates the page if it does not exist. Returns the new version and the page's total size in bytes.
takes path, content, brain
POST /v0/open/append over HTTP
returns {path, version, created, size} - patch_node
-
EDIT ONE SPOT in a page without resending it. Replaces old_string with new_string; old_string must match the page exactly once — include enough surrounding lines to make it unique. Refuses without writing when it matches zero times (your copy is stale: read the page again) or more than once. A skeleton file (★ in brain_map) changes only by a manager of its folder.
takes path, old_string, new_string (each up to 100,000 characters), brain
POST /v0/open/patch over HTTP
returns {path, version, size}
refuses no_match; ambiguous, with the count; unchanged; not_found - delete_node
-
REMOVE A PAGE. The page stops being readable and stops appearing in list_nodes or search_brain; every version it had stays in node_history, so read_node with an explicit version still answers and the removal is reversible. Use it when a page is superseded or was triaged into another page — a brain keeps what is true, not everything it was ever told. Pass expected_version to refuse the removal if the page changed since you read it. A skeleton file is removed only by a manager.
takes path, expected_version, brain
DELETE /v0/open/node over HTTP
returns {path, version, deleted: true}
refuses not_found; version_mismatch - move_node
-
RENAME OR MOVE ONE PAGE, keeping its identity and its history — the page arrives at the new path as the same node, not as a copy, and every page in the brain that links to it is pointed at the new path, except pages you cannot write and skeleton files (★) you do not manage, which come back in `left`: tell your person. A [[name]] link follows only while the file name stays. Refused when something already holds the destination, including a page removed earlier: a path belongs to one node forever. A page moves inside one brain only. Pass expected_version to refuse the move if the page changed since you read it. To move a whole folder use move_folder.
takes from, to, expected_version, brain
POST /v0/open/move over HTTP
returns {from, to, version, relinked, left}
refuses not_found; path_taken; version_mismatch - create_folder
-
START A NEW AREA of the brain: a folder and its index file, named by the template's pattern (e.g. operations/q4-launch/brief.md, specialists/legal/legal.md) and holding your one-sentence purpose, so the area is structured from its first page. Use it when the first page of a new kind of thing arrives, instead of writing pages into a folder nobody described. Check brain_map first: refused when the folder exists, when its parent does not (create the parent first), or when a sibling has nearly the same name (project/ beside projects/). Folder names are lowercase words joined by dashes. The answer says where to index the new folder; do that next.
takes path (the new folder, no trailing slash), purpose (10 to 300 characters), allow_similar, brain
returns {ok, brain, folder, index, version, next}
refuses invalid_request; exists; no_parent; similar, naming the sibling - move_folder
-
MOVE OR RENAME A WHOLE FOLDER in one write. Every page under it keeps its identity and history, and every link in the brain that points into it is rewritten, except in pages you cannot write and skeleton files (★) you do not manage. Use it instead of move_node page by page. Refused when the destination already holds pages (two folders never merge), when a page would land on a path a removed page holds, when the folder is shared on its own, and when it moves a skeleton file you do not manage. Returns the moved pages, the pages whose links it fixed, and in `left` the pages that still point at the old path because you cannot change them: tell your person.
takes from, to, brain
returns {ok, brain, from, to, moved, pages, relinked, left}
refuses invalid_request; not_found; not_empty; path_taken; shared_folder
Three tools only the sync client can use.
They carry ciphertext and version vectors for a device to merge. A hosted agent is never shown them: with no key on hand there would be nothing to decrypt.
- is_fresh
-
SYNC PLUMBING, not for reading. Whether any node changed since a timestamp. Only a sync client needs this. To read the brain use search_brain and read_node.
takes since (an ISO-8601 date and time with its zone), brain
returns {changed, latest}: how many nodes changed after since in the folders you read, and the newest stamp - pull_changes
-
SYNC PLUMBING, not for reading. Returns encrypted blobs and version vectors for a sync client to merge: content is base64 and may be ciphertext you cannot decrypt. To read the brain use search_brain and read_node instead. (max 200)
takes since, after (the id the last page had at that stamp), brain
GET /v0/nodes over HTTP
returns {nodes}, ascending, at most 200 - push_changes
-
SYNC PLUMBING, not for writing prose. Pushes pre-encoded nodes from a sync client; a conflict returns the server vclock to merge and retry.
takes nodes[], brain
PUT /v0/nodes/:id over HTTP
returns {results}, one per node: ok, or concurrent with the server's vector, path_taken, or invalid naming the field
refuses rate_limited, with the seconds to wait, when the account pushed more than its rate allows
Every open page is a resource too.
A client with no tool search, or one that reads connectors through its generic resource tools, still reaches the brain: each open page you may read is listed as a resource, named by its first heading.
- instibrain://{brain}/{path}
-
The open pages of each brain you hold, one resource each, named by the page's title. A skeleton file says its role.
lists every open page you read, in every brain you hold, typed text/markdown; an encrypted brain lists nothing
returns the body, then the same metadata line read_node prints, as application/json
refuses any other path, a folder you do not read, or a brain you do not hold, with an error
A refusal is an answer, not an error.
A no comes back as a normal reply with a code and a message that says what to do next, so the agent reads it as a step and not as a broken brain. These refusals any tool can give; Agent shows four of them byte for byte.
| Code | When |
|---|---|
| no_brain | The connection holds no brain yet |
| brain_needed | The agent holds several brains and named none; the message lists each with its id |
| ambiguous_brain | Several brains carry the name given; the message lists their ids |
| no_such_brain | No brain of that name or id is held |
| invalid_path | A path the brain cannot hold, with the reason; a path over 512 characters fails the tool's own schema first |
| invalid_content | A NUL character in the text |
| forbidden, reason role | A write the agent's role on the folder does not allow; the message says whether the folder is shared with the agent at all, and who can change that |
| forbidden, reason skeleton | A write to a skeleton file the agent does not manage, with the names of the managers who do |
| encrypted_brain | Any write into an encrypted brain: the server holds ciphertext and cannot write a page |
| quota | The account is at its limit of pages or bytes |
A refused path or content writes nothing. The handshake that
opens the connection carries the brain's instructions for agents, starting with: read
CLAUDE.md at the root first.
Written for how a model fails, tested by watching it fail.
Connect the AI you already pay for and read the same words from inside it.