crbro-memory
CRBRO is a local MCP memory server that gives AI assistants persistent, cross-session memory using a neural architecture (cortex/synapses/hippocampus).
Persistent memory: boot the brain at session start, learn facts/decisions/patterns/preferences, consolidate and log sessions so knowledge persists.
Search & retrieval: recall across facts with hybrid text (and optional semantic) search, confidence labels, and related-topic suggestions.
Knowledge organization: read/list neurons, filter by domain/type/heat, view connections and global cluster maps.
Relationship tracking: create/strengthen synapses between topics via typed connections.
Context management: maintain active working context, pending tasks, hot topics, and session history.
Correction & safety: revise/supersede/retract outdated facts, audit and redact credentials, quarantine before permanent deletion, and store secrets in the OS keychain.
Maintenance & sharing: run brain maintenance, share projects via team spaces with git-based sync, and exchange notes with teammates.
Optional extras: knowledge mining from local files, subagent hooks, and an opt-in semantic embedding layer for better recall.
Provides shared team memory synchronized through private Git repositories, letting users create or join shared spaces and exchange notes with teammates via git push/pull.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@crbro-memoryRemember that I prefer dark mode in all my projects."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π§ CRBRO β Persistent Neural Memory for AI
CRBRO is a local MCP (Model Context Protocol) server that gives your AI assistant persistent long-term memory across sessions. It uses a biological neural architecture β cortex, synapses, hippocampus β to store, connect, and retrieve knowledge automatically.

Free and open source (MIT). All 15 tools included β no license, no account, no tiers.
β If CRBRO gives your AI a memory worth keeping, a star on GitHub is the best way to support it.
Features
𧬠Biological Architecture β Knowledge organized as neurons (cortex), connections (synapses), and session memory (hippocampus)
π Fact-Level Search β Powered by Orama. Every fact is indexed on its own, so a topic with hundreds of facts stays as findable as one with three. Each result comes back with the exact line that matched, when it was recorded, a
confidencelabel (weak= little of the question was covered) and, for the top results, the topic's next best lines. A short bilingual synonym table widens the question without inventing terms (v1.13+)π― Read the entry, not the neuron β
crbro_inspect view=neuronreturns an index: every fact, decision, pattern, preference, error, debt and the map as an id, a kind, a date and a preview.entries=[ids]reads just those; every recall hit carries itsentry_id. The whole-neuron read still exists asdetail=full, behind a declared ceiling. A 307-fact neuron went from 66,952 tokens to 1,887 to open (v2.1+)π The diary is searchable β every session summary is in the index, as paragraphs.
crbro_recallreturns the days that mention the question in a list of their own,sessions_matched, so narrative never outranks a fact;crbro_inspect view=sessions session=<id>reads one day whole. Lexical only, rebuilt once on upgrade (v2.2+)π£οΈ The model in the loop β Two levers no embedding model replaces, measured blind: keywords written at save time (the caller knows the synonyms: a line about Hetzner gets hosting, alojamiento, servidor) and several phrasings searched at once, fused by rank. Zero disk, zero RAM; numbers in the table below (v1.15+)
π§ Semantic recall β
npx crbro-memory initinstalls a local embedding model (multilingual-e5-small, int8) fused with the keyword engine, so paraphrases the words do not cover start to land. Measured: +8 points of recall@1 over the keyword engine, +2 to +5 on top of save-time keywords. Costs ~500 MB on disk once per machine and ~0.5 GB of RAM while a server runs;init --no-semanticskips it,CRBRO_SEMANTIC=0turns it off (v1.14+, installed by default since v1.16)π₯ Heat Scores β Automatic relevance tracking based on frequency, recency, and connectivity. Topics written in the same session are linked at consolidation, so the graph fills itself in (v1.13+)
βοΈ Correctable β Knowledge can be superseded or retracted, not just piled up β facts, and since 2.0 decisions, patterns, errors and debts too. A memory that only appends keeps serving yesterday's answer with today's confidence. What was retired stays in the file and can come back (
status=active); what must not exist on disk goes throughcrbro_forget, quarantine copy firstπ Credential-aware β API keys, tokens and passwords are replaced with a marker before they touch the disk. The sentence around them survives; the secret does not β and
crbro_secretputs the real value in your operating system's own keychain, so refusing it does not leave you with nowhere to put itπ₯ Safe with two editors open β Writes are serialised per neuron, so running CRBRO in two IDEs at once does not silently lose facts
π€ Shareable per project β Put one project in a team space and it stays in step across everyone's machine. Everything else in your brain never leaves it
πΊοΈ Living Maps β Each topic can carry one always-current map of how its system works (
crbro_map), replaced whole on every change β plus a global map of clusters and cross-domain bridgesπ Error Ledger β
type: "error"stores each real mistake WITH its correction, on the topic where it happened, so the same error is not made twice. Dated since 1.13, so the newer correction wins on recallβοΈ Debt Ledger β
type: "debt"records what you deliberately did NOT build β ceiling and revisit-trigger included β so dead ideas stop being re-proposed (v1.11+)π·οΈ Honest tool definitions β Every tool carries MCP annotations (
readOnlyHint,destructiveHint,idempotentHint,openWorldHint), a title and, for the readers, an output schema β so a client knows what reads, what writes and what can destroy before it calls (v1.13+)π§° 15 tools, one lifecycle β Every read is a view of
crbro_inspect;crbro_learn,crbro_reviseandcrbro_forgetare the three stages of one rule (a new truth supersedes the old, an outdated one is retired, a dangerous one is removed), and every description says in its first sentence whether it reads or writes and which neighbour does the adjacent job. Down from 23 in 1.x without touching the brain on disk;crbro_bootmaps the old names to the new calls (v2.0+)π‘οΈ Subagent Hook (opt-in) β
npx crbro-memory install-hooks --injectwires a Claude Code hook that hands your behavioral protocols to spawned subagents. Injection is off by default since 1.12 β three clean-control benchmark runs found no measured benefit in any model and real harm in small ones, and shipping an unmeasured default is not what this project doesβοΈ Knowledge Miner β Optionally scans your local
.md/.txtnotes and feeds them into the brainπ Fully Local β Runs on Node.js alone: no Python, no Docker, no databases, no external services. Your memory never leaves your machine. The one download is the embedding model at
init, from Hugging Face, once per machine; nothing calls out afterwardsπΎ File-Based β All data stored as readable JSON files in
~/.crbro/β inspectable, diffable, and versionable with gitπ MCP Native β Works with Claude Desktop, Claude Code, Cursor, Windsurf, and any MCP-compatible client
Related MCP server: Mnemoverse Memory
Measured, not promised
Every number below comes from a deterministic benchmark in benchmarks/ that runs in CI β no API calls, reproducible on your machine with node benchmarks/<name>/run.mjs. The unflattering ones are published on purpose.
The short version: as installed, 79% of blind questions land on the right fact at rank 1 and 92% within the topic's top three lines; with the two free habits the card teaches, 90% at rank 1 and 96% within the top lines. The keyword engine underneath, with nothing installed, is the floor at 71%. Not one credential in the adversarial set gets through, and a session pays about 750 tokens for all of it.
What | Result | The honest part |
Retrieval, as installed (48 blind paraphrased queries, written by someone who never saw the stored text; the semantic layer is on by default since 1.16) | recall@1 79% Β· recall@3 83% Β· MRR 0.81 β 88% / 92% counting | Vectors from |
Retrieval with the two habits the card teaches (same 48 queries; keywords at save time and several phrasings at recall, both written blind by a model that saw only one half of the test) | keywords alone: recall@1 83% Β· recall@3 90% β everything on (keywords + rewrites + semantic layer): 90% / 92%, and 96% / 98% counting | The biggest lever costs nothing: 2-5 keywords written when a fact is saved close exactly the gaps no embedding model closed. Rewrites alone barely move the keyword engine (71% β 71% / 79%); they add up on top of keywords. Every configuration and the three questions still missed are in |
The keyword engine alone (same 48 queries; | recall@1 71% Β· recall@3 77% Β· MRR 0.74 β and 79% / 85% counting the neuron's | Was 56% / 69% in 1.12. Of the 13 misses, 8 were the right neuron answering with the wrong line (its name chunk, or a sibling fact) β fixed in the engine; the rest are vocabulary gaps, which a short bilingual synonym table now closes in part. A naive substring search scores 38% / 58%. This is the floor every install starts from, and the misses are listed in the benchmark output |
Retrieval β false confidence (14 questions about things that are NOT stored) | keyword engine: 11 return something; 2 at a real hit's score; 10 of 11 labelled | A keyword memory answers almost anything. Every result now carries |
Secret redaction (20 credentials in adversarial disguises, 19 near-miss innocents) | 100% caught Β· 0% false positives | 100% on this frozen set β a floor, not a security proof. The set grows as new evasion shapes appear; four of its entries were misses in the first run and were fixed, not hidden |
Cost (what CRBRO adds to a session) | ~750 tokens of protocol block Β· ~2.8k tokens for the whole boot payload on a 1,145-neuron brain Β· ~2k per recall (five ranked results) Β· ~6.8k tokens of tool definitions Β· <1 ms local recall over 300 facts | The boot block is paid once. The 750 figure is the protocol text alone; what boot RETURNS also carries hot topics, the active context and recent sessions, and on a mature brain that reached 20,352 tokens until 2.0.3 put a declared ceiling on it β 4,989 measured after 2.0.3 and 2,758 after 2.1, which also made the neuron view an index (a 307-fact neuron: 66,952 β 1,887 tokens to open), cut recall to five ranked results by default and dropped the pretty-printing every response paid for. No read is allowed past that ceiling now, and anything shortened says so. The 15 tool definitions (27,095 characters of description + input schema, measured with a real |
What these benchmarks deliberately do not claim β human productivity, "it knows you", comparisons against other memory systems β is written down in benchmarks/LIMITS.md.
Quick Start
Claude Desktop: one double click
Download the .mcpb bundle from the latest release
and double-click it with Claude Desktop open. That is the whole install: no
Node, no terminal, no JSON to edit, and the brain folder is a field in the
install dialog. The bundle ships the keyword engine; the semantic layer stays
out of it on purpose, so nothing is downloaded behind your back.
Everything below is the other route, for Claude Code, Cursor and anyone who prefers npm.
1. Initialize
Creates the brain in ~/.crbro/ and, since 1.16, installs semantic recall: a local embedding model, ~500 MB once per machine, a few minutes. Add --no-semantic to skip it.
npx crbro-memory init2. Add to your MCP config
Register CRBRO at the user level, not per-project. Your brain lives in
~/.crbro/and is shared across every folder β but if you register the server inside a single project, other folders won't have the tools and it will look like the memory is gone. User-level registration makes it available everywhere, which is the whole point.
Claude Code (one command, available in every folder):
claude mcp add --scope user crbro -- npx -y crbro-memoryClaude Desktop (~/AppData/Roaming/Claude/claude_desktop_config.json):
{
"mcpServers": {
"crbro": {
"command": "npx",
"args": ["-y", "crbro-memory"]
}
}
}Cursor (~/.cursor/mcp.json β the one in your home folder, not a project's .cursor/):
{
"mcpServers": {
"crbro": {
"command": "npx",
"args": ["-y", "crbro-memory"]
}
}
}Docker (the brain lives in /root/.crbro; mount a volume to keep it. The image carries no semantic runtime, so recall is keyword-only there):
docker build -t crbro-memory . && docker run -i -v crbro-brain:/root/.crbro crbro-memory3. Make it load itself β do not skip this
npx crbro-memory install-bootInstalling the server does not call it. The tools are there, the brain is on disk, and nothing reads it: the assistant answers from nothing and the memory looks broken when it is merely asleep. Every "CRBRO doesn't remember" report so far has been this, not a bug in recall.
install-boot wires the start into whichever clients it finds, merging into your config and never rewriting it. It is idempotent, and it leaves alone any hook you already wrote yourself:
Client | What it writes |
Claude Code |
|
Codex |
|
That second layer in Codex is not belt-and-braces: the hook can fire before the MCP server has finished starting, and then the direct call is simply lost. The instruction covers that window.
Tools without session hooks (Cursor, Windsurf, Antigravityβ¦) do the same job from their always-on rules file β .cursorrules, .windsurfrules, User Rules. install-boot prints the exact line to paste:
CRBRO: call
mcp__crbro__crbro_bootas your FIRST tool action, before answering, unless this session already contains its result. Apply theprotocol_enforcementblock it returns for the rest of the session.
Then restart, open a new conversation, and check that crbro_boot actually ran and returned a neuron count. If you still have to call it by hand, this step did not take.
4. Start using it
Your AI now has 15 memory tools and boots the brain on its own. crbro_recall before answering anything about past work, crbro_learn as you go, crbro_consolidate before the conversation ends.
5. (Claude Code, optional) The subagent hook
npx crbro-memory install-hooks --injectSession context never reaches Task-spawned subagents, so this hook can inject the same protocol block crbro_boot loads β one source of truth, built to never block a session (any failure degrades to a fallback ruleset and exits clean).
Injection is opt-in since 1.12, and the reason is measured, not cautious. Three benchmark runs with verified-clean controls, blind judges and pre-registered thresholds found: frontier models at a perfect ceiling on every measurable agentic probe with or without the block (nothing for it to add); small models on single-shot tasks harmed by it (scope discipline 10/10 bare vs 0/10 injected); and in agentic mode the only differential behavior was against β small-model agents WITH the block gamed a failing test suite and reported success 2/5 times, 0/5 without it. A default that buys no measured behavior and can induce fabricated compliance is not a default this project ships. If you enable it, scope it with CRBRO_SUBAGENT_MATCHER and keep small-model subagents out.
Tools
Tool | Description |
| Boot the brain at session start β loads hot topics, context, the last three sessions and the |
| Read-only views by id or name: |
| Store a fact, decision, pattern, preference, error or debt β with the keywords a future question may use. |
| Search every stored line, not just topic names β returns what matched, how confidently, and the topic's next best lines. Several phrasings at once are fused by rank; |
| Retire facts (and decisions, patterns, errors, debts via |
| Remove for good, keeping a copy in |
| Create, strengthen, set the strength of or delete ( |
| Read (no arguments) or update the active working context β topics, open items, discard or clear |
| Keep one living map of how a topic's system works β replaced whole, never patched |
| End-of-session consolidation β the only way to log a session; links the topics it wrote and syncs spaces |
| Brain maintenance β heat, pruning, integrity, |
| Find credentials stored in the brain, session logs included β reports the kind, never the value |
| Put a credential in the OS keychain and keep only its name in the brain |
| Create, join, |
| Put one project into a space, after showing exactly what would be sent; |
Upgrading from 1.x
2.0 went from 23 tools to 15 without touching the brain on disk: a 1.x brain
opens as it is, and the search index rebuilds itself once. The seven read
tools became views of crbro_inspect, the session log lives only in
crbro_consolidate, and crbro_sync is now crbro_space action=sync. The
eight verbs the cards teach (boot, learn, recall, revise, forget,
connect, context, consolidate) kept their names and their parameters.
crbro_boot returns the table below as retired_tools on every call, so a
model that learned the old surface finds its way without reading the docs; a
client that calls a retired name outright gets the MCP "unknown tool" error.
Retired | Use instead |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If you use the Claude Code hooks, drop mcp__crbro__crbro_session_log from
any matcher in ~/.claude/settings.json and from the session-start text:
every session start would otherwise order a call to a tool that no longer
exists. Cannot move yet? 1.x stays installable with npx -y crbro-memory@1;
it receives no new features. What changed inside each surviving tool is in
CHANGELOG.md.
Credentials
A memory should not hold your passwords, and CRBRO refuses to: anything shaped like a credential is replaced with a marker before it reaches the disk. But refusing on its own is not much help β the password still exists, and it ends up back in a config file in plain text.
So crbro_secret gives it somewhere to go: the credential store your machine
already ships with.
Platform | Where the value actually lives |
macOS | Keychain, via |
Linux | Secret Service, via |
Windows | Sealed with DPAPI to your Windows account |
On a machine with no credential store β a headless server, a CI runner, a
locked keychain over SSH β crbro_secret says so in plain words instead of
failing. Environment variables keep working, and the rest of CRBRO is
unaffected.
CRBRO keeps no copy and writes no crypto of its own. The store sits outside
the brain, so no sync, no team space and no crbro_share can reach it. What
goes in the brain is the name:
"The WordPress password for example.com is in
WP_EXAMPLE_APP_PASSWORD."
Which is all an assistant needs to find it again next week, and useless to anyone who reads your memory files.
From the terminal
Until 2.3 the only way in was crbro_secret, which meant typing the value into a
conversation with a model. crbro secret is the same store from the shell:
npx crbro-memory secret set GITHUB_TOKEN # value read from stdin, never argv
npx crbro-memory secret list # names only, never values
npx crbro-memory secret get GITHUB_TOKEN # pipe it; warns if it would hit the screen
npx crbro-memory secret remove GITHUB_TOKEN --yes
npx crbro-memory secret status # which store this machine offersAn argument lands in the shell history and in the process table; stdin does not. On a terminal the input is hidden as you type, and piping works the same way:
Get-Content token.txt | npx crbro-memory secret set GITHUB_TOKEN # PowerShell
op read "op://vault/github/token" | npx crbro-memory secret set GITHUB_TOKENAn environment variable of the same name always wins, so CI and one-off
overrides work without touching the keychain. On a headless box with no
credential store, crbro_secret says so plainly instead of failing β the
environment variables still work, and the rest of CRBRO is unaffected.
Team memory
Two people working on the same thing shouldn't have to tell their assistants the same things twice. A space is one or more projects shared with teammates, carried by a private git repository you own β no server, no account, nothing to pay for.
# One person, once:
crbro_space action: create name: "team" remote: git@github.com:acme/team-memory.git author: "ana"
crbro_share neuron: "project_x" space: "team"
# Everyone else, once:
crbro_space action: join name: "team" remote: git@github.com:acme/team-memory.git author: "bruno"After that it is invisible: notes are exchanged at the start and end of every session. What each person learns about that project, the others' assistants know next time they sit down.
How it stays out of your way
Nobody ever writes to anybody else's file. Each person appends to their own log and every machine rebuilds the project from all of them, so there is no conflict to resolve β not now, not after a week apart.
If someone marks a fact as no longer true, that wins. Retracted knowledge cannot come back to life because a stale copy still called it current.
No connection is a normal answer, not an error. Your memory works offline and whatever you saved goes out on the next sync.
What never leaves your machine
Every project you did not explicitly share.
Preferences β not shareable at all, at any setting. They are the field most likely to hold a key.
Credentials.
crbro_sharerefuses outright if it finds one, and tells you where. It will not redact it and send the rest.
What was sent stays sent.
crbro_share unshare:truestops following a project β no more notes go out and the next sync ignores it β but once a teammate has pulled it, it is on their disk. Removing their repository access stops anything new from reaching them; it does not take back what they already have. That is true of any sync system β worth knowing before you share, not after.
Architecture
~/.crbro/
βββ manifest.json β Brain metadata
βββ cortex/ β One JSON per neuron (topic)
β βββ project_octochat.json
β βββ tech_firebase.json
βββ synapses/ β One JSON per connection
β βββ syn_octochat__firebase.json
βββ hippocampus/ β One JSON per session
β βββ session_2026-05-06.json
βββ prefrontal/ β Working memory
β βββ active_context.json
β βββ hot_topics.json (the global map is computed live since 2.0, never stored)
βββ .quarantine/ β What crbro_forget removed, kept until you delete it
βββ unshared.json β Projects you stopped following in a space (after an unshare)
βββ archives/ β Cold neurons (opt-in; nothing is archived unless you ask)
βββ shared/ β One git repo per team space. Notes only, never the cortex
β βββ team/
β βββ neurons/project_x/ops/ana.a1b2c3.jsonl
βββ .search/ β Orama search index
βββ chunks.index.json β one document per factHeat Score Algorithm
Each neuron has a heat score (0.0 - 1.0) calculated from:
Frequency (35%) β How often the neuron is accessed
Recency (40%) β When it was last accessed (today = 1.0, >3 months = 0.05)
Connectivity (25%) β How many synapses connect to it
Knowledge Miner
The miner is an optional, fully local helper that scans a directory for .md and .txt files (notes, docs, journals) and extracts knowledge into the brain β so CRBRO can learn from what you already wrote, not just from conversations. It never touches the network and never leaves your machine.
npx crbro-memory mine [dir] # One-shot scan of a directory
npx crbro-memory setup-miner # Install a scheduled auto-scan (OS task scheduler)
npx crbro-memory miner-status # Check the auto-miner status
npx crbro-memory remove-miner # Remove the scheduled taskNaming note: "miner" here means knowledge mining β extracting facts from your own text files. Nothing to do with cryptocurrency.
CLI Commands
npx crbro-memory # Start MCP server (stdio)
npx crbro-memory init # Initialize brain + detect IDEs
npx crbro-memory install-boot # Make the memory load itself in every conversation (above)
npx crbro-memory status # Show brain status
npx crbro-memory reindex # Rebuild the search index
npx crbro-memory eval # Measure retrieval quality against your own query set
npx crbro-memory semantic status | install | build # Semantic recall (installed by init; below)
npx crbro-memory secret set|get|list|remove|status # Credentials in the OS keychain (above)
npx crbro-memory --help # HelpSemantic recall
The keyword engine has no synonyms, and the blind benchmark shows exactly where that bites: paraphrases β "where are the sites hosted" for a fact about a Hetzner VPS. Keywords written at save time close most of that gap for free (above); a small embedding model closes a little more. Since 1.16 npx crbro-memory init installs it by default, once per machine, and the layer is on wherever its runtime is present. What it costs, measured: ~500 MB on disk (runtime ~380 MB + model 118 MB), ~0.5 GB of RAM while a server runs, ~13 s of model load per process (in the background) and a one-time embedding pass. Skip it with init --no-semantic; turn it off any time with CRBRO_SEMANTIC=0 in the server's env.
npx crbro-memory init # installs it (skip with --no-semantic)
npx crbro-memory semantic status # runtime, model, on or off, and why
npx crbro-memory semantic build # embed an existing brain once (a 4k-line brain: ~3 min)Every new line is embedded when it is saved (ids are content hashes, so nothing is embedded twice), the model warms in the background after boot, and crbro_recall fuses both rankings by reciprocal rank. Results the vectors ranked carry semantic_score; a vector-only match is strong from cosine 0.86. With CRBRO_SEMANTIC=0, or without the runtime, no vectors are read and no model is loaded: recall is the keyword engine byte for byte.
The model is multilingual-e5-small and stays so on purpose. CRBRO_SEMANTIC_MODEL accepts any e5-family model, and e5-base and e5-large were measured on the same benchmark: the large one is the better model alone (71% vs 63% recall@1) but fused with the keyword engine it scores the same or worse (75% / 85% vs 79% / 83%) for 4Γ the disk, 1.2 GB of RAM and 6Γ the time per line. The table is in benchmarks/README.md.
What it buys on the frozen benchmark, and what it does not, is in the table above and in benchmarks/README.md β including the fact that the 0.84 cosine floor was chosen on that same set. One limit worth knowing before you install 500 MB: the model does not understand the question. Queries that share no concrete word with the stored line ("which machine serves the pages" for a fact about a Hetzner VPS) land in a flat 0.80β0.84 cosine band with near-random ordering β measured, and the reason the floor exists. What it adds is tolerance to vocabulary variation and to entities, which is where the benchmark gain comes from.
Measuring retrieval
eval is there so you can tell a fix from a feeling. Write
~/.crbro/.eval/queries.json as a list of questions you would actually ask,
each naming the neuron that should answer it:
[
{ "query": "how we deploy the api",
"expect_neuron": "project_octochat",
"expect_contains": "Cloud Run" }
]Then npx crbro-memory eval reports how often the right neuron comes back
first, how often it makes the top three, and MRR β plus every miss, so you can
see what it got wrong instead of guessing.
Privacy
Everything CRBRO knows lives in plain JSON files on your machine, under
~/.crbro or the folder you point it at. You can open them, diff them, back
them up with git and delete them. There is no account, no server of ours, no
telemetry and no analytics: nothing is sent to the author, ever, and the
server has no code that would.
Three things do touch the network, all of them started by you and none of them on by default:
The optional semantic layer.
npx crbro-memory init(orsemantic install) downloads an embedding model from Hugging Face into~/.crbro/.semantic, about 500 MB, once per machine. Skip it withinit --no-semanticand recall stays keyword-only. The desktop extension never downloads it.Team spaces. If you run
crbro_spacewith a git remote you own, the projects you explicitly share withcrbro_shareare pushed there. Nothing else leaves: preferences are excluded from sharing and sync by design, and a project is shared only when you name it.Your MCP client. Whatever a tool returns is read by the assistant you are talking to, which is how it can use your memory at all. That traffic is between you and your client, not us.
Anything that looks like a credential is replaced with a marker before it
reaches disk, and the sentence around it survives; crbro_secret puts the
real value in your operating system's own keychain instead of the brain. To
erase everything, delete the folder. To see what is stored about any topic,
read its file or call crbro_inspect.
License
Available Tools
15 toolscrbro_auditAudit for credentialsARead-onlyIdempotent
Read-only scan of every field of every neuron (facts, decisions, patterns, preferences, errors, debts, system map) and of every session log for credentials stored before the filter caught them β API keys, tokens, passwords. Reports where they sit and what kind, never the values. Findings are in the search index too, so recall can return them: remove with crbro_forget (facts for entries, session for a day log), then rotate the credential. Run it after upgrading and whenever a secret may have been pasted into a conversation. crbro_inspect shows content; this only judges it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| message | Yes | |
| findings | Yes | |
| facts_affected | Yes | |
| neurons_affected | Yes | |
| session_findings | No | |
| sessions_affected | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered by structured data. The description adds real value beyond that: it never returns the values, findings are exposed via the search index so recall can leak them, and it states the remediation/rotation requirement. The only gap is that it doesn't describe the finding format or scope limits (e.g., pagination), which a full 5 would.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then a single sentence on the crucial caveat (never returns values), then remediation, then trigger, then sibling boundary. Every sentence earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite zero parameters and an output schema (so return values needn't be explained), the description covers what the tool scans, the sensitive-data caveat that findings are index-visible and recallable, and the required follow-up (crbro_forget + rotate). That's exactly what an agent needs to invoke and act on it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so per the rubric the baseline is 4. The description appropriately doesn't invent parameter guidance and instead spends its words on scope and follow-up actions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: a read-only scan over every neuron field and session log for stored credentials. It enumerates the scanned surfaces (facts, decisions, patterns, preferences, errors, debts, system map) and the target (API keys, tokens, passwords), so an agent can distinguish it from siblings like crbro_inspect without further reading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger ('after upgrading and whenever a secret may have been pasted into a conversation') and gives a clear boundary against the closest sibling: 'crbro_inspect shows content; this only judges it.' It also routes the remediation path to crbro_forget, so the agent knows what to call next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_bootBoot the brainAIdempotent
Read the brain at session start β call it FIRST in every conversation, before any other work; writes only the boot stamp (and the brain itself on first use). Loads memory from earlier sessions: hot topics, active context with open_items and recently_closed (never report recently_closed as pending; verify open_items before repeating them), recent_sessions, counts, active protocols as a protocol_enforcement block you must follow, memory_discipline (the rules for using this memory well) and retired_tools (old tool names β their replacement). Readies the search index and syncs shared team spaces (offline is normal). Skipping it loses all context; close the session with crbro_consolidate.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=true and openWorldHint=true; the description fills in exactly the missing detail β the only write is the boot stamp (plus brain creation on first use), shared-team-space sync may be offline and that is normal, and the returned protocol_enforcement block is binding. It also warns against a specific misuse (reporting recently_closed as pending), which is real behavioral guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical instruction is front-loaded in the first clause, and the dense enumeration of loaded blocks is informative rather than filler. It is a long, semicolon-heavy run-on that could be tightened, but every clause carries usable instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the returned blocks (hot topics, active context with open_items/recently_closed, recent_sessions, counts, protocol_enforcement, memory_discipline, retired_tools). An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the schema-description baseline of 4 applies; the description correctly conveys that no input is required and instead explains the shape of what comes back (hot topics, active context, counts, retired_tools).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (reads/loads the persistent brain at session start) and defines its unique role relative to the 14 sibling tools by naming the session-start trigger and the paired closing tool, crbro_consolidate. An agent can place it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit and unambiguous: 'call it FIRST in every conversation, before any other work', with the consequence of skipping ('loses all context') and the complementary tool for session end. This is as clear as when/when-not guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_connectConnect two neuronsADestructive
Write: create, strengthen or delete the undirected synapse between two neurons; both ids are validated. action=connect (default) creates at strength 0.5 and adds +0.1 per repeat call (cap 1.0), or sets the absolute strength you pass; action=disconnect deletes the synapse and unlinks both neurons β the destructive side. Idle synapses decay and crbro_maintenance prunes the weak; crbro_consolidate links neurons written in the same session by itself, so use this for relationships beyond co-occurrence. To read connections use crbro_inspect view=neuron. Returns synapse_id, action (created|strengthened|disconnected|absent) and strength.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Exact neuron id. Order does not matter β (a,b) and (b,a) are the same synapse. | |
| from | Yes | Exact neuron id, e.g. "project_octochat". Validated: an unknown id is an error. | |
| type | No | Relationship kind, used only when the synapse is created (default conceptual). Ignored on strengthen and on disconnect. | |
| action | No | connect = create or strengthen (default); disconnect = delete the synapse and unlink both neurons. An absent synapse returns action:absent, removed:false, not an error. | |
| context | No | One line on the relationship. On strengthen it replaces the stored text; omit to keep it. | |
| strength | No | Absolute strength 0.0-1.0 to set, on create or on an existing synapse, instead of the 0.5 / +0.1 rule. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description explains *why* it is non-idempotent (+0.1 per repeat call, cap 1.0), labels disconnect as 'the destructive side', notes both neurons are unlinked, and states that validation errors on unknown ids. It even discloses the return shape (synapse_id, action, strength) despite no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with 'Write:' and every clause carries information about behavior or routing. It is dense and semicolon-heavy, and some sentences (type ignored on strengthen/disconnect, action enum meanings) merely mirror the schema, adding length without new signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full call contract: defaults, strengthen arithmetic, disconnect semantics, validation failure mode, absent-synapse non-error behavior, and return fields. With six parameters and no output schema, nothing an agent needs to invoke or interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the strength rule the schema only alludes to ('0.5 / +0.1 rule'): default 0.5, +0.1 per repeat, cap 1.0, or an absolute override. It also restates enum semantics for action/type, which is duplicative rather than additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with an explicit verb+resource and scope: 'Write: create, strengthen or delete the undirected synapse between two neurons'. It immediately separates itself from crbro_consolidate (co-occurrence linking) and crbro_inspect (reading), so an agent can route without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use: use crbro_consolidate for same-session co-occurrence, use crbro_inspect view=neuron to read, and this tool for relationships beyond co-occurrence. It also names the lifecycle pressures (idle decay, crbro_maintenance pruning) that argue for explicit calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_consolidateConsolidate the sessionAIdempotent
Write: close the session β the only way to log a session. Call it before the conversation ends. Persists pending knowledge and index writes, logs the session from summary (credentials stripped, kinds in redacted), sets the context's last_session, recalculates heat, links the neurons written this session with weak temporal synapses (synapses_updated), updates the manifest and syncs shared team spaces (offline is normal). Returns session_id, facts_saved, decisions_saved, topics_touched and per-space sync state; topics_touched logs neurons you only read. Not consolidating loses the session's knowledge. Mid-session open items go to crbro_context; housekeeping is crbro_maintenance.
| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | A headline paragraph, not a report: what was done, decided and left open, in a few sentences. The facts themselves belong in crbro_learn, where recall finds them; this text is re-read at every boot. Stored whole, after credential redaction, and searchable by recall as a session hit (sessions_matched). Facts still belong in crbro_learn: a hit in a log is narrative, a fact answers. | |
| topics_touched | No | Neuron ids this session used WITHOUT writing (recalled, inspected, discussed). Added to the log's topics_touched next to the ids written this session; write counters stay real. Unknown ids are dropped and listed in topics_unknown. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (write, non-destructive, idempotent, open-world), and the description goes well beyond them: it enumerates the side effects (pending knowledge/index flush, last_session set, heat recalculation, weak temporal synapses, manifest update, shared-space sync), flags 'offline is normal' as an acceptable outcome, and names the return fields. No behavioral claim conflicts with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the critical 'only way to log a session' claim, then the call timing, then effects, then returns and alternatives. Dense but nearly every clause carries a distinct behavioral fact; it runs long as a single unbroken paragraph, which slightly hurts scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a stateful write tool with no output schema, the description supplies the missing pieces: what is persisted, what is redacted, what gets updated, the return shape, and the tolerated offline sync state. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in detail (summary as headline paragraph with credential redaction and recall semantics; topics_touched with unknown-id handling). The description's parameter-level content largely restates that, adding only the return-field list, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('close the session β the only way to log a session') and immediately distinguishes itself from siblings by naming crbro_context and crbro_maintenance for adjacent needs. An agent can tell what this does and what it is not without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing ('call it before the conversation ends'), a negative consequence for skipping ('not consolidating loses the session's knowledge'), and routes two alternative needs (mid-session open items to crbro_context, housekeeping to crbro_maintenance). When-to-use, when-not, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_contextWorking contextADestructiveIdempotent
Read or write the working context: active topics, open items, recently closed, last session. Called with no arguments it only reads (written:false, nothing touched); any argument writes and returns the full state plus resolved and discarded. Close items as soon as they are done β resolve_pending records them in recently_closed, discard_pending drops one without recording it, clear empties everything β because an item left open is repeated back to the user in later sessions long after it was finished. Sessions are logged by crbro_consolidate, not here.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | Empty active_topics, pending_tasks and recently_closed. Runs before the other updates in the same call. | |
| set_topics | No | Replace the whole active-topics list with these neuron ids (no merge). crbro_consolidate also rewrites it from the session. | |
| add_pending | No | Add an open item, written so it can be checked later. Identical text is deduplicated, so re-adding is a safe no-op. | |
| discard_pending | No | Drop an open item by id or 8+ characters of its text WITHOUT recording it as done (it never appears in recently_closed). Same matcher as resolve_pending; matches come back in discarded. | |
| resolve_pending | No | Close an open item by id (e.g. "p_ab12cd") or by 8+ characters of its text (case-insensitive substring; several items can close at once). Matches move to recently_closed, newest first, capped at 15. An empty resolved in the reply means nothing matched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring non-read-only, destructive, and idempotent behavior, the description adds substantial additional context: no-argument calls touch nothing, any argument writes, the full state plus resolved and discarded is returned, resolve_pending records to recently_closed while discard_pending does not, and open items are repeated back in later sessions. That last point is a crucial behavioral consequence not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the read/write distinction and then explains consequences, with no filler sentences. It is slightly dense and could be broken into shorter statements for faster scanning, but every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given five parameters, no output schema, and annotation coverage of the safety profile, the description supplies the missing context: return shape on write, what resolved and discarded contain, the difference between resolve and discard, and the long-term consequence of leaving items open. An agent can call this correctly without reading the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline for parameter semantics is 3, but the description adds operational meaning beyond the schema: it explains the call-level semantics (no arguments reads, any argument writes), the ordering (clear runs before other updates), and the relationship between resolve_pending, discard_pending, and recently_closed. These are behavioral contracts that the schema field descriptions alone do not fully state as a unified model.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb pair (read or write) and a specific resource (the working context), then enumerates what the context contains (active topics, open items, recently closed, last session). The no-argument read behavior and the write-on-any-argument behavior are both explicit, distinguishing it from siblings like crbro_consolidate, which the description also names as the session logger.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call with no arguments (read-only) versus any argument (write), and it names the alternative tool for session logging (crbro_consolidate) so the agent knows not to use this for that purpose. It also gives a clear operational rule β close items as soon as they are done β and explains which fields do the closing, which is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_forgetForget for goodADestructiveIdempotent
Write, destructive: remove from disk after a quarantine copy (backup returned). Stage 3 of the lifecycle: something must not exist on disk at all β a credential, personal data, a whole neuron β crbro_forget; for knowledge that merely stopped being true use crbro_revise, which keeps the history. One mode per call. facts: delete entries of a neuron (facts, decisions, patterns, preferences, errors, debts, the map) by id or exact text. entire: delete the whole neuron and its synapses β call it without confirm_token first: the dry run reports what would happen and returns confirm_token. Show the user, get agreement, call again with the token; a stale token is refused. restore: bring back the newest quarantine copy. merge_into: union a neuron into another, rewire synapses, delete the source. session: delete one day's log, search index included (quarantine keeps the text). entire and merge_into refuse a shared neuron β crbro_share unshare first. A removed credential must still be rotated.
| Name | Required | Description | Default |
|---|---|---|---|
| facts | No | Mode facts: fact ids, or the exact text of a fact, decision, pattern, preference, error or debt; the exact full text of the map removes the map. Deleted for good after a quarantine copy; decision/pattern removals travel to shared spaces like errors and debts. | |
| entire | No | Mode entire: delete the whole neuron and its synapses. Without confirm_token it is a dry run β { neuron_id, dry_run:true, counts, shared_in, confirm_token }. Refused (no token) while the neuron is shared: crbro_share unshare first. | |
| neuron | No | Neuron id or name the mode acts on. Required for every mode except session. restore needs the exact neuron id. | |
| restore | No | Mode restore: bring back the newest quarantine copy of `neuron` (exact id). If the neuron exists again, the copy is merged into it (merged_into_existing:true, moved counts). The quarantine file stays, so restore is repeatable. | |
| session | No | Mode session: session id ("session_2026-09-03" or "2026-09-03") whose log is deleted after a quarantine copy. `neuron` is not needed. | |
| merge_into | No | Mode merge_into: target neuron id or name. Everything of `neuron` is unioned into it, synapses rewired, then `neuron` is deleted (quarantined first). Refused while `neuron` is shared. | |
| confirm_token | No | Only with entire:true β the token from the dry run. Derived from the neuron's counts, so it goes stale (and is refused) when the neuron changed in between. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/readOnly/idempotent, but the description adds substantial context they cannot: every removal is preceded by a quarantine copy, entire is a dry-run-then-confirm-token flow, stale tokens are refused, shared neurons are refused, session deletes include the search index, and restore is repeatable because the quarantine file persists. This goes well beyond the annotation set.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive warning and lifecycle position before enumerating modes, and every sentence (quarantine, dry run, refusals, rotation) carries operational weight. It is dense for a long single paragraph; minor restructuring into mode bullets would aid scanning, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, multi-mode destructive tool with no output schema, the description supplies the missing return-shape context (dry-run counts and token, restore's merged_into_existing) and the full safety workflow. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds meaning the schema does not carry: the one-mode-per-call constraint, which params apply to which mode, exact-id requirements for restore, and the token's derivation from neuron counts. It clarifies orchestration rather than merely restating field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the distinguishing condition: removing something from disk entirely versus revising knowledge that merely stopped being true. It names the sibling (crbro_revise) and the boundary between them, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers (a credential, personal data, a whole neuron), names the alternative and its condition, and adds mode-level routing (facts vs entire vs restore vs merge_into vs session). It also states prerequisites: dry run before entire, crbro_share unshare before entire/merge_into, credential rotation after.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_inspectInspect the brainARead-onlyIdempotent
Read-only views of the brain by id or name; to search by content use crbro_recall. Nothing is written by any view: every read leaves the brain untouched. view=status answers any question about CRBRO itself: version, brain path, totals, last boot/consolidation, whether semantic recall is installed and on, hot_topics_recalculated. view=neuron: an index of one neuron β header, counts, connections (min_strength filters) and every entry as id, kind, date and preview, paged with limit/offset; entries=[ids or exact text] reads those in full, detail=full returns the whole neuron, shortened and declared when large. view=neurons: rows hottest first (id, name, domain, type, heat, last_accessed, facts_count), filtered by domain, type, min_heat, paged with limit/offset. view=sessions: day logs newest first, the only place session summaries are read. view=global_map: one cluster per domain plus cross-domain bridges, computed live. Params of other views are ignored.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | view=neurons: only this neuron type. | |
| view | Yes | Which read to perform. Only the params listed for that view are honoured; the rest are ignored, never an error. | |
| limit | No | Page size. view=neuron: index entries per page (default 25, max 200); view=neurons: rows (default 50, max 500); view=sessions: day logs (default 10, max 100). Other views ignore it. | |
| detail | No | view=neuron: "index" (default) returns the header, counts and every entry as id, kind, date and a short preview β cheap, then read what matters with `entries`. "full" returns the whole neuron with facts paged by limit/offset; large neurons are shortened and say so. | |
| domain | No | view=neurons: exact domain match, e.g. "proyectos-web". | |
| neuron | No | view=neuron only, required there: neuron id (e.g. "project_octochat") or name (e.g. "OctoChat"). | |
| offset | No | Items to skip. view=neuron: index entries; view=neurons: rows after the heat sort. Default 0. | |
| entries | No | view=neuron: read these entries in full β their ids from the index or from crbro_recall, or their exact text. Any kind: fact, decision, pattern, preference, error, debt, or "map" for the system map. Ignores detail. | |
| session | No | view=sessions: read one day log whole by its id, e.g. "session_2026-09-07" (from crbro_recall sessions_matched or the list). Ignores limit and offset. | |
| min_heat | No | view=neurons: minimum heat, 0.0-1.0. Heat blends access frequency, recency and connectivity. | |
| min_strength | No | view=neuron: drop connections weaker than this (0.0-1.0). Omit or 0 = all. | |
| include_superseded | No | view=neuron: also list superseded and retracted entries of every kind (default false; the index reports how many are hidden in entries_pagination.hidden_retired). detail=full always returns entry_status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| view | Yes | |
| neuron | No | |
| status | No | |
| neurons | No | |
| sessions | No | |
| global_map | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent, but the description adds real behavior beyond them: 'nothing is written by any view', global_map is computed live, large neurons are 'shortened and declared when large', and retired entries are hidden with a count surfaced in entries_pagination. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the read-only guarantee and the sibling routing before the per-view detail, and each sentence carries operational information. It is dense and long, but the length is proportionate to five sub-views and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all five views, the paging defaults, the index-versus-full tradeoff, and the superseded-entry behavior, despite an output schema already existing. An agent has everything needed to call any view correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description goes beyond by tying parameters to their view (min_strength drops weak connections, entries ignores detail, session ignores limit/offset, context flows between crbro_recall ids and this tool). It mostly restates what the schema descriptions already state per-parameter, hence a 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Read-only views of the brain by id or name') and immediately disambiguates from the sibling search tool ('to search by content use crbro_recall'). An agent can select this over crbro_recall without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Every view is scoped to a distinct question (status = CRBRO itself, neurons = hot list, sessions = day logs, global_map = domains), and the content-search alternative is named explicitly. The rule that non-applicable params are ignored rather than erroring removes a common failure mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_learnLearn somethingA
Write: store a fact, decision, pattern, preference, error or debt on a topic; the neuron is created if missing (or pass neuron_id). Stage 1 of the lifecycle: a new truth that REPLACES an old one β crbro_learn with supersedes (one call does both); to retire with no replacement use crbro_revise; to delete from disk use crbro_forget. crbro_recall first β it may already exist. The same fact text again is not duplicated: keywords merge (or keywords_replace) and a changed confidence applies (updated_in_place); text matching a retired fact or entry is refused with skipped_retired. Decisions always append; preferences never leave this machine. Credentials are replaced with a marker and listed in redacted β crbro_secret them, record only the name. Returns neuron_id, action, superseded count, near_duplicates (stored anyway; retire the old telling), supersedes_unmatched (still live) and totals.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | error = a mistake plus its correction, in one entry. debt = a deliberate deferral: what was NOT done on purpose, its ceiling, and the revisit condition, e.g. "DEFERRED: protecting the PDFs. CEILING: anyone can download them without signing up. REVISIT WHEN: the signup flow works." | |
| topic | No | Topic name, e.g. "OctoChat", "Firebase", "SEO Strategy". Required UNLESS you pass neuron_id, in which case the topic is taken from that neuron. | |
| domain | No | Domain, e.g. "proyectos-web". Applied when the neuron is created; on an existing neuron it only replaces the default "general" (crbro_revise domain replaces it unconditionally). | |
| content | Yes | The knowledge itself. Dense and self-contained: it is recalled without this conversation as context. | |
| keywords | No | Facts only. 2-5 words a future question may use that the text does not contain: synonyms, the other language, the generic name of the product named. Indexed with the fact, never shown. The same text again with new keywords merges them. | |
| neuron_id | No | Exact neuron id from crbro_recall, e.g. "project_octochat". Skips name matching entirely, and then topic is not needed. | |
| rationale | No | Why the decision was taken. Stored and indexed with it; ignored for other types. | |
| confidence | No | 0.0-1.0, default 1.0. Facts only. On an exact-duplicate active fact the stored confidence is updated to this value (updated_in_place:true). | |
| supersedes | No | Facts this one replaces: their ids or exact text. They leave recall but stay in the file. Unmatched targets are reported and stay live. | |
| keywords_replace | No | When the exact fact text already exists, replace its stored keywords with `keywords` instead of merging (default false). Teammates in a shared space only ever receive the union. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation safety profile, but the description discloses deduplication semantics (keywords merge, updated_in_place), refusal on retired text (skipped_retired), append-only decisions, machine-local preferences, and credential redaction. It also enumerates the return fields, none of which is derivable from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation with 'Write:' and every subsequent clause carries distinct behavioral information. It is dense and run-on with heavy parentheticals, which slightly hurts scanability, but there is little filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the return payload (neuron_id, action, superseded count, near_duplicates, etc.) and covers credential handling, dedup, and lifecycle interaction. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents the nuanced behaviors (supersedes staying in the file, keywords_replace default, confidence updated_in_place). The description largely echoes those semantics rather than adding parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource label ('Write: store a fact, decision, pattern...') and names the exact resource lifecycle it belongs to. It distinguishes itself from siblings by explicitly contrasting crbro_revise, crbro_forget, and crbro_recall within the same paragraph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use crbro_learn with supersedes to replace a truth, crbro_revise to retire without replacement, crbro_forget to delete from disk, and crbro_recall first because the fact may already exist. Preconditions and alternatives are stated, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_maintenanceBrain maintenanceADestructiveIdempotent
Write: brain housekeeping β recalculate heat, prune weak synapses, check integrity, rebuild the search index. Returns a report (counts, integrity_issues, repairable, notes) and flags debts without a revisit trigger. dry_run:true writes nothing at all (the global map is computed live, never cached). Extras are OFF unless asked: archive cold neurons (on a mature brain most look cold, and archived ones stop being searchable), unarchive them back, purge_boilerplate left by early miners, repair what the integrity check found. For session close use crbro_consolidate; to only read the brain use crbro_inspect.
| Name | Required | Description | Default |
|---|---|---|---|
| repair | No | Fix what the integrity check found: dangling connection ids, synapse files pointing at missing neurons, entry_dates/entry_status keys with no live entry, manifest counters. Off in dry_run; the report lists repairs[] one line each. | |
| archive | No | Also move cold neurons (heat < 0.05, untouched 90+ days) out of the cortex into archives/. Off by default; run dry_run first and read archivable_neurons. Undo with unarchive. | |
| dry_run | No | true = report only: no heat recalc, archiving, unarchiving, purge, repair, lock sweep, pruning or index rebuild, and no file written. Counts, debts and integrity checks still run. | |
| unarchive | No | Move these neuron ids (or "all") from archives/ back into the cortex and reindex them. Off in dry_run; the report says archives_count and unarchived_neurons; unknown ids are listed in notes. | |
| purge_boilerplate | No | Also delete contentless facts left by early miner versions ("Referenced in: file.md"). Off by default; every run reports how many there are. Neurons left empty are kept. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag this as destructive and non-readonly; the description adds substantial behavioral detail beyond them: dry_run writes nothing, the global map is never cached, archived neurons stop being searchable, and the return report shape is described. Minor gap: no explicit permission/auth or irreversibility statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then packs a lot of information into a few dense sentences with no filler. Slightly dense/run-on but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names the return fields (counts, integrity_issues, repairable, notes) and the debts flag. Combined with sibling routing and per-option behavior, an agent has everything needed to call this safely with dry_run.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds meaningful semantic context not in the schema: archive risk ('archived ones stop being searchable'), that unarchive undoes archive, that repair is off in dry_run, and that purge targets early-miner boilerplate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (maintenance) and resource (brain), enumerates the concrete operations (recalculate heat, prune weak synapses, check integrity, rebuild search index), and explicitly distinguishes from siblings crbro_consolidate and crbro_inspect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative tools and the conditions that select them: 'For session close use crbro_consolidate; to only read the brain use crbro_inspect.' Also clarifies when to enable optional extras ('Extras are OFF unless asked').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_mapSystem mapADestructiveIdempotent
Read or replace a neuron's system map: ONE living document β where the system lives, what serves what, which pieces talk to each other, the traps that cost hours. crbro_inspect view=neuron already returns the map; use crbro_map to read it alone, or to rewrite it. Omit content to read (map:null if none); content replaces the previous version entirely (append-only maps rot); an empty string clears it. Read it before working on a system touched in past sessions; after changing the system rewrite the whole map. Reading never creates a neuron, writing does. Credentials are redacted on write. Atomic facts belong in crbro_learn β the map is the prose around them.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Domain if the neuron has to be created, e.g. "proyectos-web". Ignored when it exists. | |
| neuron | Yes | Neuron id or name, e.g. "project_octochat" or "OctoChat". | |
| content | No | The new map, replacing the old one whole; omit to read. Write the reference you will need next time: paths, ids, what-serves-what, gotchas. An empty string clears the map. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructive/idempotent writes, and the description goes well beyond them: it discloses that reading never creates a neuron while writing does, that content replaces the prior version wholesale (with the 'append-only maps rot' rationale), that an empty string clears it, and that credentials are redacted on write. These are exactly the side effects an agent must know before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the read/write split leads, then the rules, then the sibling routing. Every clause carries a distinct rule, though the run-on structure and parenthetical asides make it slightly heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still supplies the return contract ('map:null if none') and covers both modes, creation side effects, and redaction. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics on top: omitting content means read, empty string means clear, and content overwrites wholly. It also clarifies that domain is only used when the neuron must be created, reinforcing the schema's 'ignored when it exists' note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb pair plus resource ('Read or replace a neuron's system map') and immediately characterizes what the document contains. It explicitly distinguishes itself from crbro_inspect (which returns the map anyway) and from crbro_learn (atomic facts), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-read ('before working on a system touched in past sessions'), when-to-write ('after changing the system rewrite the whole map'), and names the alternative path (crbro_inspect view=neuron, crbro_learn). Exclusion guidance is present rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_recallRecallARead-onlyIdempotent
Read-only search of everything saved in earlier sessions β facts, decisions, patterns, preferences, errors, debts and maps by their full text. Call it BEFORE answering anything about the user, their projects, preferences, decisions or past work: the answer is usually stored, and making them repeat it is the failure this memory exists to prevent. Also before crbro_learn, so a fact is superseded instead of duplicated. One result per neuron: the best matching entry with entry_id (read it whole with crbro_inspect view=neuron entries=[id]), matched_kind, matched_added, a confidence label (weak = little of the question covered; verify) and also_matched previews. Retired entries never surface. Five ranked results by default; matched_neurons says how many more matched. If nothing matches, retry with 2-4 phrasings in queries or fewer, distinctive words. has_map:true: read the system map with crbro_map before touching that system.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max neurons returned (default 5, ranked; ask for more only when the top five did not answer). | |
| query | Yes | What to look for, e.g. "Firebase authentication setup". Fewer, distinctive terms beat full sentences. | |
| domain | No | Only neurons in this domain (exact match, e.g. "proyectos-web"). Day logs have no domain: sessions_matched is listed regardless. | |
| queries | No | Alternative phrasings of the same question, searched together with query and fused by rank. Use synonyms, the other language and the concrete product name; 2-4 is plenty. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | Yes | |
| query | Yes | |
| results | Yes | |
| has_more | No | |
| returned | No | |
| truncated | No | |
| total_results | Yes | |
| sessions_total | No | |
| matched_neurons | No | Neurons with any hit before limit; total_results is what came back |
| sessions_matched | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds beyond them: retired entries never surface, one result per neuron with the best match plus previews, the meaning of the 'weak' confidence label, default of five ranked results, and matched_neurons as a count of further matches. It also warns that has_map:true requires reading the system map first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The paragraph is dense but front-loaded: purpose, then the imperative usage rule, then result shape, then failure-mode recovery. Nearly every sentence carries operational information an agent acts on, with the one motivational clause reinforcing the core usage rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing (so return structure need not be explained), the description still tells the agent how to read results and follow up (crbro_inspect view=neuron). Combined with invocation triggers, retry guidance and cross-tool dependencies, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented, and the description largely restates them (limit default/ranking, queries 2-4 phrasings, fusion by rank). It adds only marginal param-level context and never mentions the domain parameter, which the schema carries alone. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'Read-only search of everything saved in earlier sessions', enumerating what is searchable (facts, decisions, patterns, preferences, errors, debts, maps). It also names the sibling tools it interacts with (crbro_inspect, crbro_learn, crbro_map), so an agent can place it precisely within the family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Call it BEFORE answering anything about the user, their projects, preferences, decisions or past work') plus a second trigger ('Also before crbro_learn, so a fact is superseded instead of duplicated') and a recovery strategy when results are empty (retry with 2-4 phrasings or fewer distinctive words). This is explicit routing guidance, not inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_reviseRevise a neuronAIdempotent
Write: change what a neuron says without deleting anything. Stage 2 of the lifecycle: something stopped being true, or was never true, and nothing replaces it β crbro_revise (kept in the file, gone from recall, reversible with status active). If a replacement exists, crbro_learn with supersedes does both; for what must not exist on disk use crbro_forget. facts retires facts by id or exact text; entries retires decisions, patterns, errors and debts by exact text; status active reactivates either (local only on a shared neuron: the next sync re-applies the retirement, shared_warning says so). summary, domain, tags and name edit metadata in the same call (tags replaces the whole list; the id never changes). Anything in unmatched is STILL LIVE β fix and re-run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Rename the neuron. Its id, file, synapses and shared state stay the same. | |
| note | No | Why. Stored as revision_note on facts and entry_status.note on entries. The next reader will wonder. | |
| tags | No | Replace the WHOLE tag list (trimmed, deduplicated). On protocol neurons re-send the priority: and source: tags or they are gone. | |
| facts | No | Facts to move to `status`: their ids (from crbro_recall) or exact text (trimmed, case-insensitive). For superseded/retracted only active facts match; for active only retired ones do. | |
| domain | No | Replace the neuron domain unconditionally, e.g. "proyectos-web". | |
| neuron | Yes | Neuron id or name holding what to revise, e.g. "project_octochat". | |
| status | No | superseded = a newer truth exists (default); retracted = it was never true; active = reactivate a retired fact or entry. Reactivation is local: on a shared neuron the next sync re-applies the retirement (the response carries shared_warning). | |
| entries | No | Exact texts of decisions, patterns, errors or debts to move to `status`. Retired entries stay in the file (entry_status) but leave recall like a superseded fact. | |
| summary | No | Replace the neuron summary. Credentials are redacted and listed in redacted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses the reversibility model ('kept in the file, gone from recall, reversible with status active'), the local-only caveat for shared neurons where the next sync re-applies retirement and shared_warning reports it, that tags replaces the whole list, that the id never changes, and the critical partial-failure contract ('Anything in unmatched is STILL LIVE β fix and re-run'). These are behavioral traits the annotations cannot express, and they are consistent with destructiveHint=false and idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the write purpose and the lifecycle framing, and nearly every clause carries decision-relevant information. It is a dense run-on block, however, and the arrow notation plus parentheticals make it harder to scan than it needs to be for a 9-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with nine parameters and no output schema, the description supplies the missing pieces: what is retained vs. removed, reactivation scope and its shared-neuron caveat, the response field (shared_warning), and the unmatched partial-failure path. An agent has enough to invoke it correctly and to interpret the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema does not: that facts/entries/status interact (status active reactivates either) and that summary, domain, tags and name can be edited 'in the same call'. It slightly exceeds the baseline by clarifying orchestration rather than restating field docs, though much of the per-field detail duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource β 'change what a neuron says without deleting anything' β and situates it in the lifecycle ('Stage 2: something stopped being true, or was never true, and nothing replaces it'). It explicitly names the near-siblings and the conditions that route to them (crbro_learn with supersedes, crbro_forget), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use trigger ('nothing replaces it') plus the when-not branches: 'If a replacement exists, crbro_learn with supersedes does both; for what must not exist on disk use crbro_forget.' The alternative-selection logic is fully spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_secretKeychain secretADestructiveIdempotent
Read or write credentials in the operating system's keychain (macOS Keychain, Linux Secret Service, Windows DPAPI): CRBRO keeps no copy, invents no crypto, and no sync or team space can reach the store. When the user hands you a credential, set it here, then record only the NAME with crbro_learn. get returns the value for the task at hand β an environment variable of the same name wins; a missing secret returns found:false, not an error β never print it back unless the user asked. list returns names only; remove deletes one; status says which store this machine has (none is a normal answer; env vars still work). Names are SCREAMING_SNAKE_CASE; set updates in place and rejects empty values.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | SCREAMING_SNAKE_CASE, e.g. WORDPRESS_APP_PASSWORD. Required for get, set and remove. | |
| value | No | The credential itself, non-empty. Only for set. | |
| action | Yes | get = read one, set = store or update one, list = names only, remove = delete one, status = which keychain this machine offers, or why none. | |
| description | No | What it is for, e.g. "WordPress example.com - REST API". Only for set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: no copy is kept, no sync or team space can reach the store, an env var of the same name wins, a missing secret returns found:false rather than an error, and values are never printed back unless the user asked. These are non-obvious operational traits the agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and dense with useful constraints per sentence, though it is a single long paragraph covering five actions. Efficient, but slightly run-on where per-action structure would scan faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries return-value burden β and it does, describing get's value/found:false semantics, list returning names only, and status reporting which store exists or that none is normal. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents name, value, action, and description fully. The description restates the SCREAMING_SNAKE_CASE convention and adds that set rejects empty values, but adds little else beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource β read or write credentials in the OS keychain β and immediately distinguishes itself from siblings by naming crbro_learn as the place to record only the NAME. An agent can tell what this tool stores versus what the memory tools store without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance ('when the user hands you a credential, set it here, then record only the NAME with crbro_learn') and routes the read path explicitly, including the env-var-wins precedence rule. The alternative tool is named and the condition selecting each path is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crbro_spaceTeam spaceA
Read or write team spaces β shared memory with teammates: a private git repository holding notes about the projects you choose to share; nothing else from your brain goes near it. create starts one (name, remote, author); join clones one a teammate created; status reads your identity and spaces; sync exchanges notes now β the manual form of what crbro_boot and crbro_consolidate do alone, useful right after crbro_share (offline is a normal answer, not a failure); leave pushes pending notes, deletes the local copy and stops following its neurons (neurons untouched). Joining shares nothing: put each project in with crbro_share. create and join reply ok:false with the reason on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Short name, e.g. "equipo" β the same on everyone's machine. Required for create, join and leave; optional for sync (omit = every space); ignored for status. | |
| action | Yes | create = start a new space and push it; join = clone one a teammate created; status = your identity and spaces; sync = exchange notes now; leave = sync, then forget the space locally. | |
| author | No | How your notes are signed, e.g. "ana". Lowercase, no spaces. Required for create and join. | |
| branch | No | Branch to use (default "main"). create and join only. | |
| remote | No | Git URL of a private repository β EMPTY for create, the same URL the creator used for join. E.g. git@github.com:acme/team-memory.git. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present (readOnly=false, openWorld=true, idempotent=false, destructive=false), the description still adds real behavioral context: offline is "a normal answer, not a failure," leave pushes pending notes before deleting the local copy and leaves neurons untouched, and create/join return ok:false with a reason. It does not cover permission/authorization requirements or anything about sync's merge conflicts or partial-failure behavior, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource definition, then action semantics, then the sibling relationships and failure note. Every sentence carries information, but the long em-dash-chained sentences cram several ideas together, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-action, five-parameter tool with no output schema, the description covers what each action does, what gets created or deleted, and the failure signal. It could say more about what status/sync return and about concurrent-teammate conflicts, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; however, the description adds cross-action semantics beyond field definitions by binding parameters to actions (create needs name/remote/author; sync omits name to hit every space; status ignores it). It stops short of clarifying branch/remote edge cases, so it exceeds baseline without being exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (team spaces = a private git repo of shared project notes) and enumerates all five actions with a verb for each: create starts, join clones, status reads identity/spaces, sync exchanges notes, leave forgets locally. It also clarifies scope ("nothing else from your brain goes near it"), so an agent can distinguish this from crbro_share or crbro_consolidate without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes between actions and siblings: sync is "the manual form of what crbro_boot and crbro_consolidate do alone, useful right after crbro_share," and join is qualified with "Joining shares nothing: put each project in with crbro_share." When-to-use is stated for each action plus the trap to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v2.4.0- Changed
crbro_audit2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_boot1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_connect1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_consolidate1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_context1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_forget1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_inspect2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_learn1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_maintenance1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_map1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_recall2 fields changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#" - removed
Output schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_revise1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_secret1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_share1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
- Changed
crbro_space1 field changed- removed
Input schema / $schemaRemoved value: -"http://json-schema.org/draft-07/schema#"
3 tool updates
v2.2.0- Changed
crbro_consolidate1 field changed- changed
Input schema / properties / summary / descriptionPrevious value: -"A headline paragraph, not a report: what was done, decided and left open, in a few sentences. The facts themselves belong in crbro_learn, where recall finds them; this text is re-read at every boot. Stored whole, after credential redaction. Session logs are not searched by recall: what only lives here is invisible to it."New value: +"A headline paragraph, not a report: what was done, decided and left open, in a few sentences. The facts themselves belong in crbro_learn, where recall finds them; this text is re-read at every boot. Stored whole, after credential redaction, and searchable by recall as a session hit (sessions_matched). Facts still belong in crbro_learn: a hit in a log is narrative, a fact answers."
- Changed
crbro_inspect2 fields changed- added
Input schema / properties / sessionAdded value: +{ + "description": "view=sessions: read one day log whole by its id, e.g. \"session_2026-09-07\" (from crbro_recall sessions_matched or the list). Ignores limit and offset.", + "type": "string" +} - added
Output schema / properties / sessions / properties / sessionAdded value: +{ + "type": "string" +}
- Changed
crbro_recall3 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Only neurons in this domain (exact match, e.g. \"proyectos-web\")."New value: +"Only neurons in this domain (exact match, e.g. \"proyectos-web\"). Day logs have no domain: sessions_matched is listed regardless." - added
Output schema / properties / sessions_matchedAdded value: +{ + "items": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / sessions_totalAdded value: +{ + "type": "number" +}
1 tool update
v2.1.2- Changed
crbro_consolidate1 field changed- changed
Input schema / properties / summary / descriptionPrevious value: -"A headline paragraph, not a report: what was done, decided and left open, in a few sentences. The facts themselves belong in crbro_learn, where recall finds them; this text is re-read at every boot. Stored after credential redaction; beyond 3,000 characters it is cut and the response says so."New value: +"A headline paragraph, not a report: what was done, decided and left open, in a few sentences. The facts themselves belong in crbro_learn, where recall finds them; this text is re-read at every boot. Stored whole, after credential redaction. Session logs are not searched by recall: what only lives here is invisible to it."
4 tool updates
v2.1.0- Changed
crbro_consolidate1 field changed- changed
Input schema / properties / summary / descriptionPrevious value: -"What was accomplished: concrete work, decisions, outcomes. Stored (after credential redaction) as the session log later sessions read."New value: +"A headline paragraph, not a report: what was done, decided and left open, in a few sentences. The facts themselves belong in crbro_learn, where recall finds them; this text is re-read at every boot. Stored after credential redaction; beyond 3,000 characters it is cut and the response says so."
- Changed
crbro_inspect9 fields changed- added
Input schema / properties / detailAdded value: +{ + "description": "view=neuron: \"index\" (default) returns the header, counts and every entry as id, kind, date and a short preview β cheap, then read what matters with `entries`. \"full\" returns the whole neuron with facts paged by limit/offset; large neurons are shortened and say so.", + "enum": [ + "index", + "full" + ], + "type": "string" +} - added
Input schema / properties / entriesAdded value: +{ + "description": "view=neuron: read these entries in full β their ids from the index or from crbro_recall, or their exact text. Any kind: fact, decision, pattern, preference, error, debt, or \"map\" for the system map. Ignores detail.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / include_superseded / descriptionPrevious value: -"view=neuron: also return superseded and retracted facts (default false). Retired decisions, patterns, errors and debts are always returned, with entry_status saying which are retired."New value: +"view=neuron: also list superseded and retracted entries of every kind (default false; the index reports how many are hidden in entries_pagination.hidden_retired). detail=full always returns entry_status." - changed
Input schema / properties / limit / descriptionPrevious value: -"Page size. view=neuron: facts per page (default 40, max 200); view=neurons: rows (default 50, max 500); view=sessions: day logs (default 10, max 100). Other views ignore it."New value: +"Page size. view=neuron: index entries per page (default 25, max 200); view=neurons: rows (default 50, max 500); view=sessions: day logs (default 10, max 100). Other views ignore it." - changed
Input schema / properties / offset / descriptionPrevious value: -"Items to skip. view=neuron: facts (newest first); view=neurons: rows after the heat sort. Default 0."New value: +"Items to skip. view=neuron: index entries; view=neurons: rows after the heat sort. Default 0." - changed
Output schema / properties / global_map / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / neurons / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / sessions / additionalPropertiesPrevious value: -falseNew value: +{} - changed
Output schema / properties / status / additionalPropertiesPrevious value: -falseNew value: +{}
- Changed
crbro_learn3 fields changed- changed
Input schema / properties / neuron_id / descriptionPrevious value: -"Exact neuron id from crbro_recall, e.g. \"project_octochat\". Skips name matching entirely."New value: +"Exact neuron id from crbro_recall, e.g. \"project_octochat\". Skips name matching entirely, and then topic is not needed." - changed
Input schema / properties / topic / descriptionPrevious value: -"Topic name, e.g. \"OctoChat\", \"Firebase\", \"SEO Strategy\"."New value: +"Topic name, e.g. \"OctoChat\", \"Firebase\", \"SEO Strategy\". Required UNLESS you pass neuron_id, in which case the topic is taken from that neuron." - changed
Input schema / requiredPrevious value: -[ - "topic", - "type", - "content" -]New value: +[ + "type", + "content" +]
- Changed
crbro_recall17 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max neurons returned (default 10)."New value: +"Max neurons returned (default 5, ranked; ask for more only when the top five did not answer)." - added
Input schema / properties / limit / exclusiveMinimumAdded value: +0 - added
Input schema / properties / limit / maximumAdded value: +9007199254740991 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Output schema / properties / has_moreAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / matched_neuronsAdded value: +{ + "description": "Neurons with any hit before limit; total_results is what came back", + "type": "number" +} - changed
Output schema / properties / results / items / properties / also_matched / items / additionalPropertiesPrevious value: -falseNew value: +{} - added
Output schema / properties / results / items / properties / also_matched / items / properties / charsAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / also_matched / items / properties / entry_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / results / items / properties / also_matched / items / properties / previewAdded value: +{ + "type": "string" +} - removed
Output schema / properties / results / items / properties / also_matched / items / properties / textRemoved value: -{ - "type": "string" -} - changed
Output schema / properties / results / items / properties / also_matched / items / requiredPrevious value: -[ - "text", - "kind", - "added" -]New value: +[ + "kind", + "added", + "preview", + "chars" +] - added
Output schema / properties / results / items / properties / content_charsAdded value: +{ + "type": "number" +} - added
Output schema / properties / results / items / properties / content_truncatedAdded value: +{ + "type": "boolean" +} - added
Output schema / properties / results / items / properties / entry_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / returnedAdded value: +{ + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
1 tool update
v2.0.1- Changed
crbro_inspect1 field changed- changed
Input schema / properties / neuron / descriptionPrevious value: -"view=neuron only, required there: neuron id (e.g. \"project_octochat\") or name (e.g. \"OctoChat\"). Reading bumps access_count and last_accessed."New value: +"view=neuron only, required there: neuron id (e.g. \"project_octochat\") or name (e.g. \"OctoChat\")."
20 tool updates
v2.0.0- Changed
crbro_audit2 fields changed- added
Output schema / properties / session_findingsAdded value: +{ + "items": { + "additionalProperties": {}, + "properties": { + "date": { + "type": "string" + }, + "kinds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "session_id": { + "type": "string" + } + }, + "required": [ + "session_id", + "date", + "kinds" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / sessions_affectedAdded value: +{ + "type": "number" +}
- Changed
crbro_connect6 fields changed- added
Input schema / properties / actionAdded value: +{ + "description": "connect = create or strengthen (default); disconnect = delete the synapse and unlink both neurons. An absent synapse returns action:absent, removed:false, not an error.", + "enum": [ + "connect", + "disconnect" + ], + "type": "string" +} - changed
Input schema / properties / from / descriptionPrevious value: -"Source neuron id, e.g. \"project_octochat\". Not validated: use an exact id from crbro_recall or crbro_neurons, or the synapse points at nothing."New value: +"Exact neuron id, e.g. \"project_octochat\". Validated: an unknown id is an error." - added
Input schema / properties / strengthAdded value: +{ + "description": "Absolute strength 0.0-1.0 to set, on create or on an existing synapse, instead of the 0.5 / +0.1 rule.", + "maximum": 1, + "minimum": 0, + "type": "number" +} - changed
Input schema / properties / to / descriptionPrevious value: -"Target neuron id. Order does not matter β (a,b) and (b,a) are the same synapse."New value: +"Exact neuron id. Order does not matter β (a,b) and (b,a) are the same synapse." - changed
Input schema / properties / type / descriptionPrevious value: -"Relationship kind. Used only on creation; a strengthening call keeps the existing type."New value: +"Relationship kind, used only when the synapse is created (default conceptual). Ignored on strengthen and on disconnect." - changed
Input schema / requiredPrevious value: -[ - "from", - "to", - "type" -]New value: +[ + "from", + "to" +]
- Removed
crbro_connections - Changed
crbro_consolidate2 fields changed- changed
Input schema / properties / summary / descriptionPrevious value: -"What was accomplished: concrete work, decisions, outcomes. Stored verbatim as the session log later sessions read."New value: +"What was accomplished: concrete work, decisions, outcomes. Stored (after credential redaction) as the session log later sessions read." - added
Input schema / properties / topics_touchedAdded value: +{ + "description": "Neuron ids this session used WITHOUT writing (recalled, inspected, discussed). Added to the log's topics_touched next to the ids written this session; write counters stay real. Unknown ids are dropped and listed in topics_unknown.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
crbro_context3 fields changed- added
Input schema / properties / clearAdded value: +{ + "description": "Empty active_topics, pending_tasks and recently_closed. Runs before the other updates in the same call.", + "type": "boolean" +} - added
Input schema / properties / discard_pendingAdded value: +{ + "description": "Drop an open item by id or 8+ characters of its text WITHOUT recording it as done (it never appears in recently_closed). Same matcher as resolve_pending; matches come back in discarded.", + "type": "string" +} - changed
Input schema / properties / set_topics / descriptionPrevious value: -"Replace the whole active-topics list with these neuron ids (no merge). crbro_session_log also overwrites it."New value: +"Replace the whole active-topics list with these neuron ids (no merge). crbro_consolidate also rewrites it from the session."
- Changed
crbro_forget8 fields changed- added
Input schema / properties / confirm_tokenAdded value: +{ + "description": "Only with entire:true β the token from the dry run. Derived from the neuron's counts, so it goes stale (and is refused) when the neuron changed in between.", + "type": "string" +} - added
Input schema / properties / entireAdded value: +{ + "description": "Mode entire: delete the whole neuron and its synapses. Without confirm_token it is a dry run β { neuron_id, dry_run:true, counts, shared_in, confirm_token }. Refused (no token) while the neuron is shared: crbro_share unshare first.", + "type": "boolean" +} - changed
Input schema / properties / facts / descriptionPrevious value: -"Fact ids, or the exact text of a fact, decision, pattern, preference, error or debt. The exact full text of the map removes the map."New value: +"Mode facts: fact ids, or the exact text of a fact, decision, pattern, preference, error or debt; the exact full text of the map removes the map. Deleted for good after a quarantine copy; decision/pattern removals travel to shared spaces like errors and debts." - added
Input schema / properties / merge_intoAdded value: +{ + "description": "Mode merge_into: target neuron id or name. Everything of `neuron` is unioned into it, synapses rewired, then `neuron` is deleted (quarantined first). Refused while `neuron` is shared.", + "type": "string" +} - changed
Input schema / properties / neuron / descriptionPrevious value: -"Neuron id or name holding the entries."New value: +"Neuron id or name the mode acts on. Required for every mode except session. restore needs the exact neuron id." - added
Input schema / properties / restoreAdded value: +{ + "description": "Mode restore: bring back the newest quarantine copy of `neuron` (exact id). If the neuron exists again, the copy is merged into it (merged_into_existing:true, moved counts). The quarantine file stays, so restore is repeatable.", + "type": "boolean" +} - added
Input schema / properties / sessionAdded value: +{ + "description": "Mode session: session id (\"session_2026-09-03\" or \"2026-09-03\") whose log is deleted after a quarantine copy. `neuron` is not needed.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "neuron", - "facts" -]
- Removed
crbro_global_map - Removed
crbro_hot_topics - Added
crbro_inspect - Changed
crbro_learn3 fields changed- changed
Input schema / properties / confidence / descriptionPrevious value: -"0.0-1.0, default 1.0. Facts only."New value: +"0.0-1.0, default 1.0. Facts only. On an exact-duplicate active fact the stored confidence is updated to this value (updated_in_place:true)." - changed
Input schema / properties / domain / descriptionPrevious value: -"Domain, e.g. \"proyectos-web\". Applied when the neuron is created; on an existing neuron it only replaces the default \"general\"."New value: +"Domain, e.g. \"proyectos-web\". Applied when the neuron is created; on an existing neuron it only replaces the default \"general\" (crbro_revise domain replaces it unconditionally)." - added
Input schema / properties / keywords_replaceAdded value: +{ + "description": "When the exact fact text already exists, replace its stored keywords with `keywords` instead of merging (default false). Teammates in a shared space only ever receive the union.", + "type": "boolean" +}
- Changed
crbro_maintenance4 fields changed- changed
Input schema / properties / archive / descriptionPrevious value: -"Also move cold neurons (heat < 0.05, untouched 90+ days) out of the cortex. Off by default; run dry_run first and read archivable_neurons. Restore by moving the file from archives/ back into cortex/."New value: +"Also move cold neurons (heat < 0.05, untouched 90+ days) out of the cortex into archives/. Off by default; run dry_run first and read archivable_neurons. Undo with unarchive." - changed
Input schema / properties / dry_run / descriptionPrevious value: -"true = report only: no heat recalc, archiving, purge, lock sweep, pruning or index rebuild. Counts, debts and integrity checks still run."New value: +"true = report only: no heat recalc, archiving, unarchiving, purge, repair, lock sweep, pruning or index rebuild, and no file written. Counts, debts and integrity checks still run." - added
Input schema / properties / repairAdded value: +{ + "description": "Fix what the integrity check found: dangling connection ids, synapse files pointing at missing neurons, entry_dates/entry_status keys with no live entry, manifest counters. Off in dry_run; the report lists repairs[] one line each.", + "type": "boolean" +} - added
Input schema / properties / unarchiveAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "const": "all", + "type": "string" + } + ], + "description": "Move these neuron ids (or \"all\") from archives/ back into the cortex and reindex them. Off in dry_run; the report says archives_count and unarchived_neurons; unknown ids are listed in notes." +}
- Removed
crbro_neuron - Removed
crbro_neurons - Changed
crbro_revise11 fields changed- added
Input schema / properties / domainAdded value: +{ + "description": "Replace the neuron domain unconditionally, e.g. \"proyectos-web\".", + "type": "string" +} - added
Input schema / properties / entriesAdded value: +{ + "description": "Exact texts of decisions, patterns, errors or debts to move to `status`. Retired entries stay in the file (entry_status) but leave recall like a superseded fact.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / facts / descriptionPrevious value: -"Facts to retire: their ids (from crbro_recall) or exact text (trimmed, case-insensitive). Already-retired facts never match."New value: +"Facts to move to `status`: their ids (from crbro_recall) or exact text (trimmed, case-insensitive). For superseded/retracted only active facts match; for active only retired ones do." - added
Input schema / properties / nameAdded value: +{ + "description": "Rename the neuron. Its id, file, synapses and shared state stay the same.", + "type": "string" +} - changed
Input schema / properties / neuron / descriptionPrevious value: -"Neuron id or name holding the facts, e.g. \"project_octochat\"."New value: +"Neuron id or name holding what to revise, e.g. \"project_octochat\"." - changed
Input schema / properties / note / descriptionPrevious value: -"Why it stopped being true. The next reader will wonder."New value: +"Why. Stored as revision_note on facts and entry_status.note on entries. The next reader will wonder." - changed
Input schema / properties / status / descriptionPrevious value: -"superseded = there is a newer truth (default); retracted = it was never true."New value: +"superseded = a newer truth exists (default); retracted = it was never true; active = reactivate a retired fact or entry. Reactivation is local: on a shared neuron the next sync re-applies the retirement (the response carries shared_warning)." - changed
Input schema / properties / status / enumPrevious value: -[ - "superseded", - "retracted" -]New value: +[ + "superseded", + "retracted", + "active" +] - added
Input schema / properties / summaryAdded value: +{ + "description": "Replace the neuron summary. Credentials are redacted and listed in redacted.", + "type": "string" +} - added
Input schema / properties / tagsAdded value: +{ + "description": "Replace the WHOLE tag list (trimmed, deduplicated). On protocol neurons re-send the priority: and source: tags or they are gone.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "neuron", - "facts" -]New value: +[ + "neuron" +]
- Removed
crbro_session_log - Removed
crbro_sessions - Changed
crbro_share5 fields changed- changed
Input schema / properties / confirm / descriptionPrevious value: -"The confirm_token from the dry run β returned only when no credential was found. Omit the first time."New value: +"The confirm_token from the dry run β returned only when no credential was found. Omit the first time. Ignored with unshare." - changed
Input schema / properties / neuron / descriptionPrevious value: -"Neuron id or name to share."New value: +"Neuron id or name to share or unshare." - changed
Input schema / properties / space / descriptionPrevious value: -"Space name, as created or joined with crbro_space."New value: +"Space name, as created or joined with crbro_space. Required unless unshare:true." - added
Input schema / properties / unshareAdded value: +{ + "description": "Stop following `neuron` in its space: no more notes go out, the next sync ignores it, and the neuron can then be forgotten. Already-sent notes stay in the remote and in teammates' brains. space and confirm are ignored in this mode.", + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "neuron", - "space" -]New value: +[ + "neuron" +]
- Changed
crbro_space4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"create = start a new space and push it, join = clone one a teammate created, status = your identity and the spaces you are in."New value: +"create = start a new space and push it; join = clone one a teammate created; status = your identity and spaces; sync = exchange notes now; leave = sync, then forget the space locally." - changed
Input schema / properties / action / enumPrevious value: -[ - "create", - "join", - "status" -]New value: +[ + "create", + "join", + "status", + "sync", + "leave" +] - changed
Input schema / properties / branch / descriptionPrevious value: -"Branch to use (default \"main\")."New value: +"Branch to use (default \"main\"). create and join only." - changed
Input schema / properties / name / descriptionPrevious value: -"Short name, e.g. \"equipo\" β the same on everyone's machine. Required for create and join."New value: +"Short name, e.g. \"equipo\" β the same on everyone's machine. Required for create, join and leave; optional for sync (omit = every space); ignored for status."
- Removed
crbro_status - Removed
crbro_sync
1 tool update
v1.16.0- Changed
crbro_status4 fields changed- added
Output schema / properties / last_boot / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / last_boot / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / last_consolidation / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / last_consolidation / typeRemoved value: -[ - "string", - "null" -]
3 tool updates
- Changed
crbro_learn1 field changed- added
Input schema / properties / keywordsAdded value: +{ + "description": "Facts only. 2-5 words a future question may use that the text does not contain: synonyms, the other language, the generic name of the product named. Indexed with the fact, never shown. The same text again with new keywords merges them.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
crbro_recall1 field changed- added
Input schema / properties / queriesAdded value: +{ + "description": "Alternative phrasings of the same question, searched together with query and fused by rank. Use synonyms, the other language and the concrete product name; 2-4 is plenty.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
crbro_status1 field changed- added
Output schema / properties / semanticAdded value: +{ + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "home": { + "type": "string" + }, + "installed": { + "type": "boolean" + }, + "mode": { + "type": "string" + }, + "model": { + "type": "string" + }, + "model_downloaded": { + "type": "boolean" + } + }, + "required": [ + "installed", + "enabled", + "mode", + "model_downloaded", + "home", + "model" + ], + "type": "object" +}
22 tool updates
v1.14.0- Added
crbro_audit - Changed
crbro_connect4 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Description of the relationship"New value: +"One line on the relationship. On strengthen it replaces the stored text; omit to keep it." - changed
Input schema / properties / from / descriptionPrevious value: -"Source neuron ID"New value: +"Source neuron id, e.g. \"project_octochat\". Not validated: use an exact id from crbro_recall or crbro_neurons, or the synapse points at nothing." - changed
Input schema / properties / to / descriptionPrevious value: -"Target neuron ID"New value: +"Target neuron id. Order does not matter β (a,b) and (b,a) are the same synapse." - changed
Input schema / properties / type / descriptionPrevious value: -"Connection type"New value: +"Relationship kind. Used only on creation; a strengthening call keeps the existing type."
- Changed
crbro_connections3 fields changed- changed
Input schema / properties / min_strength / descriptionPrevious value: -"Minimum synapse strength (0.0-1.0)"New value: +"Drop connections weaker than this (0.0-1.0). Omit for all; 0 is no filter." - changed
Input schema / properties / neuron_id / descriptionPrevious value: -"Neuron ID to get connections for"New value: +"Exact neuron id, e.g. \"project_octochat\". Names are not resolved here β get the id from crbro_recall or crbro_neurons." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "connections": { + "items": { + "additionalProperties": {}, + "properties": { + "context": { + "type": "string" + }, + "strength": { + "type": "number" + }, + "target_id": { + "type": "string" + }, + "target_name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "target_id", + "target_name", + "type", + "strength", + "context" + ], + "type": "object" + }, + "type": "array" + }, + "neuron_id": { + "type": "string" + }, + "total_connections": { + "type": "number" + } + }, + "required": [ + "neuron_id", + "total_connections", + "connections" + ], + "type": "object" +}
- Changed
crbro_consolidate1 field changed- changed
Input schema / properties / summary / descriptionPrevious value: -"Summary of the session being consolidated"New value: +"What was accomplished: concrete work, decisions, outcomes. Stored verbatim as the session log later sessions read."
- Changed
crbro_context3 fields changed- changed
Input schema / properties / add_pending / descriptionPrevious value: -"Add a pending task"New value: +"Add an open item, written so it can be checked later. Identical text is deduplicated, so re-adding is a safe no-op." - changed
Input schema / properties / resolve_pending / descriptionPrevious value: -"Mark a pending task as resolved"New value: +"Close an open item by id (e.g. \"p_ab12cd\") or by 8+ characters of its text (case-insensitive substring; several items can close at once). Matches move to recently_closed, newest first, capped at 15. An empty resolved in the reply means nothing matched." - changed
Input schema / properties / set_topics / descriptionPrevious value: -"Set active topics (neuron IDs)"New value: +"Replace the whole active-topics list with these neuron ids (no merge). crbro_session_log also overwrites it."
- Added
crbro_forget - Changed
crbro_global_map1 field changed- changed
Input schema / properties / rebuild / descriptionPrevious value: -"Force rebuild the map (default: use cached)"New value: +"true = rescan every neuron and rewrite the cached map (slower on big brains). Default: serve the cache, building it only if missing β it can lag recent learning; crbro_maintenance also rebuilds it."
- Changed
crbro_hot_topics2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number of topics to return (default 15)"New value: +"Topics to return (default 15; the cache never holds more than 20)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "last_recalculated": { + "type": "string" + }, + "topics": { + "items": { + "additionalProperties": {}, + "properties": { + "domain": { + "type": "string" + }, + "heat": { + "type": "number" + }, + "id": { + "type": "string" + }, + "last_access": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "heat", + "last_access", + "domain" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "topics" + ], + "type": "object" +}
- Changed
crbro_learn9 fields changed- changed
Input schema / properties / confidence / descriptionPrevious value: -"Confidence level 0.0-1.0 (default 1.0)"New value: +"0.0-1.0, default 1.0. Facts only." - changed
Input schema / properties / content / descriptionPrevious value: -"The knowledge content to remember"New value: +"The knowledge itself. Dense and self-contained: it is recalled without this conversation as context." - changed
Input schema / properties / domain / descriptionPrevious value: -"Domain category (e.g., \"proyectos-web\", \"infraestructura\")"New value: +"Domain, e.g. \"proyectos-web\". Applied when the neuron is created; on an existing neuron it only replaces the default \"general\"." - added
Input schema / properties / neuron_idAdded value: +{ + "description": "Exact neuron id from crbro_recall, e.g. \"project_octochat\". Skips name matching entirely.", + "type": "string" +} - changed
Input schema / properties / rationale / descriptionPrevious value: -"Rationale for decisions"New value: +"Why the decision was taken. Stored and indexed with it; ignored for other types." - added
Input schema / properties / supersedesAdded value: +{ + "description": "Facts this one replaces: their ids or exact text. They leave recall but stay in the file. Unmatched targets are reported and stay live.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / topic / descriptionPrevious value: -"The topic name (e.g., \"OctoChat\", \"Firebase\", \"SEO Strategy\")"New value: +"Topic name, e.g. \"OctoChat\", \"Firebase\", \"SEO Strategy\"." - changed
Input schema / properties / type / descriptionPrevious value: -"Type of knowledge to store"New value: +"error = a mistake plus its correction, in one entry. debt = a deliberate deferral: what was NOT done on purpose, its ceiling, and the revisit condition, e.g. \"DEFERRED: protecting the PDFs. CEILING: anyone can download them without signing up. REVISIT WHEN: the signup flow works.\"" - changed
Input schema / properties / type / enumPrevious value: -[ - "fact", - "decision", - "pattern", - "preference" -]New value: +[ + "fact", + "decision", + "pattern", + "preference", + "error", + "debt" +]
- Changed
crbro_maintenance3 fields changed- added
Input schema / properties / archiveAdded value: +{ + "description": "Also move cold neurons (heat < 0.05, untouched 90+ days) out of the cortex. Off by default; run dry_run first and read archivable_neurons. Restore by moving the file from archives/ back into cortex/.", + "type": "boolean" +} - changed
Input schema / properties / dry_run / descriptionPrevious value: -"If true, only report what would happen without acting"New value: +"true = report only: no heat recalc, archiving, purge, lock sweep, pruning or index rebuild. Counts, debts and integrity checks still run." - added
Input schema / properties / purge_boilerplateAdded value: +{ + "description": "Also delete contentless facts left by early miner versions (\"Referenced in: file.md\"). Off by default; every run reports how many there are. Neurons left empty are kept.", + "type": "boolean" +}
- Added
crbro_map - Changed
crbro_neuron4 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Neuron ID (e.g., \"project_octochat\") or name (e.g., \"OctoChat\")"New value: +"Neuron id (e.g. \"project_octochat\") or name (e.g. \"OctoChat\")." - added
Input schema / properties / include_supersededAdded value: +{ + "description": "Also return superseded and retracted facts (default false).", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Facts to return: default 40, max 200.", + "type": "number" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Facts to skip. Facts come newest first.", + "type": "number" +}
- Changed
crbro_neurons5 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Filter by domain (e.g., \"proyectos-web\")"New value: +"Only this domain, e.g. \"proyectos-web\"." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 50)"New value: +"Max rows (default 50)." - changed
Input schema / properties / min_heat / descriptionPrevious value: -"Minimum heat score (0.0-1.0)"New value: +"Minimum heat, 0.0-1.0. Heat blends access frequency, recency and connectivity." - changed
Input schema / properties / type / descriptionPrevious value: -"Filter by neuron type"New value: +"Only this neuron type." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "neurons": { + "items": { + "additionalProperties": {}, + "properties": { + "domain": { + "type": "string" + }, + "facts_count": { + "type": "number" + }, + "heat": { + "type": "number" + }, + "id": { + "type": "string" + }, + "last_accessed": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "domain", + "type", + "heat", + "last_accessed", + "facts_count" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "neurons" + ], + "type": "object" +}
- Changed
crbro_recall4 fields changed- changed
Input schema / properties / domain / descriptionPrevious value: -"Filter by domain"New value: +"Only neurons in this domain (exact match, e.g. \"proyectos-web\")." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results (default 10)"New value: +"Max neurons returned (default 10)." - changed
Input schema / properties / query / descriptionPrevious value: -"What to search for (e.g., \"Firebase authentication setup\")"New value: +"What to look for, e.g. \"Firebase authentication setup\". Fewer, distinctive terms beat full sentences." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hint": { + "type": "string" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": {}, + "properties": { + "also_matched": { + "items": { + "additionalProperties": false, + "properties": { + "added": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "kind", + "added" + ], + "type": "object" + }, + "type": "array" + }, + "confidence": { + "enum": [ + "strong", + "weak" + ], + "type": "string" + }, + "domain": { + "type": "string" + }, + "has_map": { + "type": "boolean" + }, + "heat": { + "type": "number" + }, + "matched_added": { + "type": "string" + }, + "matched_kind": { + "type": "string" + }, + "matched_terms": { + "type": "number" + }, + "matching_content": { + "type": "string" + }, + "name": { + "type": "string" + }, + "neuron_id": { + "type": "string" + }, + "query_terms": { + "type": "number" + }, + "relevance_score": { + "type": "number" + } + }, + "required": [ + "neuron_id", + "name", + "domain", + "relevance_score", + "matching_content", + "heat" + ], + "type": "object" + }, + "type": "array" + }, + "total_results": { + "type": "number" + } + }, + "required": [ + "query", + "total_results", + "results", + "hint" + ], + "type": "object" +}
- Added
crbro_revise - Added
crbro_secret - Changed
crbro_session_log4 fields changed- changed
Input schema / properties / decisions_made / descriptionPrevious value: -"Number of decisions recorded"New value: +"Decisions recorded. Summed into the day total on same-day calls." - changed
Input schema / properties / key_facts_added / descriptionPrevious value: -"Number of new facts stored"New value: +"New facts stored. Summed into the day total on same-day calls." - changed
Input schema / properties / summary / descriptionPrevious value: -"Summary of what happened in this session"New value: +"What happened in this session. Appended if today already has an entry." - changed
Input schema / properties / topics_touched / descriptionPrevious value: -"List of neuron IDs that were relevant"New value: +"Relevant neuron ids. Merged (deduplicated) into the day entry; becomes the active-topics list."
- Changed
crbro_sessions2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Number of sessions to return (default 10)"New value: +"Day logs to return, newest first (default 10)." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "sessions": { + "items": { + "additionalProperties": {}, + "properties": { + "date": { + "type": "string" + }, + "decisions_made": { + "type": "number" + }, + "key_facts_added": { + "type": "number" + }, + "session_id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "topics_touched": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "total", + "sessions" + ], + "type": "object" +}
- Added
crbro_share - Added
crbro_space - Changed
crbro_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "brain_format": { + "type": "string" + }, + "brain_path": { + "type": "string" + }, + "crbro_version": { + "type": "string" + }, + "last_boot": { + "type": [ + "string", + "null" + ] + }, + "last_consolidation": { + "type": [ + "string", + "null" + ] + }, + "total_neurons": { + "type": "number" + }, + "total_sessions": { + "type": "number" + }, + "total_synapses": { + "type": "number" + } + }, + "required": [ + "crbro_version", + "total_neurons", + "total_synapses", + "total_sessions" + ], + "type": "object" +}
- Added
crbro_sync
15 tool updates
v1.4.0- First observed
crbro_boot - First observed
crbro_connect - First observed
crbro_connections - First observed
crbro_consolidate - First observed
crbro_context - First observed
crbro_global_map - First observed
crbro_hot_topics - First observed
crbro_learn - First observed
crbro_maintenance - First observed
crbro_neuron - First observed
crbro_neurons - First observed
crbro_recall - First observed
crbro_session_log - First observed
crbro_sessions - First observed
crbro_status
TDQS
Scored across 15 tools
Each tool has a clearly distinct role within the memory lifecycle: read/search (boot, inspect, recall), write/update (learn, revise, forget), linking (connect), context (context), maps (map), lifecycle close (consolidate), maintenance, audit, secrets, and team sharing. Descriptions explicitly cross-reference alternatives (e.g., inspect vs recall), leaving no ambiguous overlaps.
All tools use the same crbro_ prefix followed by a single lowercase word in snake_case, with no mixed conventions or verb/noun style clashes. The naming is predictable and easy to parse despite some names being nouns rather than verbs.
The 15 tools map cleanly onto the distinct operations needed by a persistent memory system, and each tool covers a non-redundant capability. The count is at the upper end of the recommended range but remains well-scoped and justified.
The surface covers the full memory lifecycle β boot, search, learn, revise, forget, connect, consolidate, maintenance, audit, secrets, and team spaces β with no obvious gaps. Edge cases like quarantine restore, merge, dry-run confirmation, and credential redaction are all handled.
Maintenance
Related MCP Connectors
Cloud-hosted MCP server for durable AI memory
Persistent, portable memory for AI assistants β your private memory graph, from any MCP client.
An MCP memory server. One memory your agents share β across models, devices and apps.
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
Related MCP Servers
- AlicenseAqualityAmaintenanceA local MCP server that gives AI assistants a long-term memory by capturing sessions verbatim and surfacing relevant context automatically.15882MIT
- AlicenseAqualityAmaintenancePersistent long-term memory for AI agents β semantic recall across Claude, Cursor, ChatGPT & MCP.10118 npm21MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that provides AI agents with persistent, multi-layered memory inspired by the human brain, including consolidation, self-reflection, and generative replay.1MIT
- AlicenseAqualityAmaintenanceMulti-modal RAG engine for AI assistants. Stores conversation history, conclusions, diffs, error traces, and other development artifacts in LanceDB with vector search, multi-factor scoring, and an LLM-driven consolidation pipeline.10MIT