graph-mind
Graph-MIND is a local-first, LLM-free persistent memory server that lets AI agents save, recall, share, and delete memories across sessions, PCs, and teams.
brain_remember — Saves what the user says verbatim (facts, plans, preferences, decisions) with entities, tags, importance, confidence, and
about/attributekeys so a newer value replaces an older one.brain_context — Default recall call: returns one bounded, size-capped text packet of relevant memories and past turns with dates and sources, filterable by recency, date range (
since/around), scopes, or the assistant's own past answers.brain_recall — Raw structured lookup: returns matching rows, ids, and fields; gives one entity's full history oldest-first, or lists what the store knows about.
brain_forget — Two-step deletion: search masked candidates, then delete the ids the user picks, everywhere (local PC, indexes, shared memory, other PCs).
brain_folder — Chooses where personal memory lives (local Postgres or a synced OneDrive/Google Drive/Dropbox folder), shares the brain to other PCs via a connection code, reindexes, and exports/imports the whole memory as a file.
brain_checkpoint — Team project brains: create/join projects, publish decisions, progress, blockers, next actions, artifacts and releases with handover context, view timelines, attach commits/URLs, retract, manage members and roles, and host a hub.
code_activity — Queries recorded code changes with diff excerpts, filtered by project, time range, file, symbol, or change kind.
Team memory sharing for a project: teammates' AIs can share a project's decisions and progress through Graph-MIND while the underlying files stay in GitHub, without exposing personal memory.
Team memory sharing for a project: teammates' AIs can share a project's decisions and progress through Graph-MIND while the underlying files stay in Slack, without exposing personal memory.
Graph-MIND
Your AI forgets everything when the session ends. This one remembers, and it never calls an LLM to do it.
88.8% on LongMemEval. Zero model tokens spent saving memory. Runs on your own PC.
Decide something with one agent on Monday. Ask another on Wednesday. It knows.
Install
Windows: download Graph-MIND-Setup.cmd and double-click it, or in PowerShell:
irm https://raw.githubusercontent.com/goyohan0611-png/graph-mind/main/scripts/install.ps1 | iexmacOS / Linux:
curl -LsSf https://raw.githubusercontent.com/goyohan0611-png/graph-mind/main/scripts/install.sh | shNo Python needed; nothing else to set up. Restart your AI apps afterwards. Already have Python?
pip install graph-mind-memory && graph-mind-install. More: docs/install.md.
Related MCP server: Melchizedek
What it does
One shared brain for every agent in your terminal. Whichever coding agent or model you run, they all read and write the same memory: decide something with one, ask another later, it knows. Switch agents or models; the memory stays. Which ones
Remembers conversations word for word, on your own PC. Saving is a database write: no model call, no tokens. When a question depends on the past, the agent gets back the few thousand tokens that answer it. Korean and English.
One memory across your PCs. Tell the AI "let my other PCs use this memory", paste the code it gives you to the AI on the other PC. Office network or Tailscale, over TLS, every line encrypted before it leaves a PC.
Yours. No account, no cloud of its own, no telemetry. Secrets are masked before anything is stored, and "delete the password I typed earlier" deletes it everywhere. docs/privacy.md
Teams, if you want them. Share a project's decisions and progress with teammates' AIs, never your personal memory; files stay in Slack and GitHub. docs/teams.md
Does it work?
Same 40 questions, same answer model, same official judge, pre-registered before anyone looked:
accuracy | model tokens spent saving memory | |
Graph-MIND | 85.0% | 0 |
MemPalace 3.10.0 | 57.5% | 0 |
Mem0 2.2.1 (open source) | 52.5% | ~640,000 per question |
On all 500 LongMemEval questions: 88.8%. Every question, answer and verdict is in
research/runs/; method, failures and how to rerun it:
docs/benchmarks.md.
Alpha. Used daily on Windows. macOS and Linux pass every test in CI but have not seen daily use yet.
More
MCP tools · See your memory in 3D
(graph-mind-view) · Changelog · Security ·
Development: pip install -r requirements.txt, then python -m unittest discover -s tests
Contributions are welcome under the CLA. License: AGPL-3.0; a commercial license is available for products that cannot publish their changes.
Available Tools
7 toolsbrain_checkpointA
Team project brains: decisions and progress shared with teammates' AIs, per project.
Not for the user's own memory or their other PCs: that is brain_folder. A project brain
holds what a team's AIs need to know about a project, apart from the user's personal
memory and from every other project. Nothing
personal is shared through this; only what is published here, when the user asks. Files
and notifications stay in Slack, drives and GitHub; a project brain keeps the decisions,
the progress, the context and links to where the work is.
Always pass `workspace` = your current working folder: a folder bound to a project makes
it the default `project`.
Publish only when the user asks ("공유해", "프로젝트에 올려줘", "체크포인트 남겨"): that
request is the approval, so do not ask again; ask only if the project is ambiguous.
Afterwards say exactly what went where.
- `projects`: the project brains the user takes part in, with when each was last shared.
- `create_project` + `project` (+ `path` = folder to bind): only when the user names one.
- `publish` + `type` + `summary` (one line, user's language) + `details` (a handover
note: what changed and why, files and functions, test results, links, what is left).
Never paste conversation text. `supersedes`=<id> replaces an earlier decision.
- `context` (with publish or attach): what changed, where (pages, sections, files,
functions), why, verification (test or check results), remaining, review_focus, and
the ids it answers (`addresses`) and its `evidence` (commit, PR, test log, Slack or
document links). Write only what you know; what is left out reads "not recorded".
- `attach` + `path`: a git folder links its commit at the stage it really reached
(committed / pushed / pr_open / merged / released; never call work done when the stage
says otherwise); a URL (a Slack message, a drive document) is kept as a link. Files are
not stored here: if the user wants a file shared, share it in Slack or a drive (with
the tools for those) and attach the link.
- `timeline`: "누가 어디까지 했어?" — answer from it only: who, what, what is left, and
when it was last shared. Do not guess at anything newer. Follow its `instructions`.
- `retract` + `checkpoint_id` (the publisher, or the project's owner);
`set_instructions` + `instructions` (owner).
- Members. Whoever creates a project owns it. `invite` + `member` + `role` (owner /
editor / viewer) + `projects` returns a code to give them. `members` + `project`;
`remove_member` + `member` + `project` (owner; or yourself, to leave). `audit`
(+ `project`). On a teammate's PC: `join_team` + `code` (+ `name`), `leave_team` +
`project`.
- Where projects live: on a Postgres hub (`host`: make this PC one; teammates on the
office network or over Tailscale), where `invite` on the hub's PC also makes their
account (elsewhere they need an account from the hub's operator first); without a
hub, on this PC alone. Someone in several team hubs and none of their own:
`create_project` + `hub` (an address of it).
- `set_name` + `name`: the name teammates see (else this PC's name). If a result says
NAME_REQUIRED, ask the user for it (their own name, e.g. 고요한), set it, then retry.
If the result says UNAVAILABLE, the hub cannot be reached: tell the user the latest
shared state is unknown right now; never fill in from memory.
| Name | Required | Description | Default |
|---|---|---|---|
| hub | No | ||
| code | No | ||
| name | No | ||
| path | No | ||
| role | No | ||
| type | No | ||
| action | Yes | ||
| member | No | ||
| context | No | ||
| details | No | ||
| project | No | ||
| summary | No | ||
| projects | No | ||
| workspace | No | ||
| supersedes | No | ||
| source_refs | No | ||
| instructions | No | ||
| checkpoint_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry the generic safety flags (readOnly=false, destructive=false, idempotent=false, openWorld=false), and the description adds far richer behavior: approval semantics for publishing, the rule never to paste conversation text, the requirement to report exactly what went where, the NAME_REQUIRED and UNAVAILABLE recovery paths, and the anti-hallucination instruction to never fill in a missing hub state from memory. This is substantive context an agent could not infer from the structured fields.
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 purpose and the brain_folder exclusion are front-loaded before any action detail, and the action bullets are dense but each maps to a real operation. It is nonetheless a long wall of prose with some redundancy in the opening paragraph ('Nothing personal is shared... apart from the user's personal memory'), and the hub-placement and membership bullets are tangled together.
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?
An output schema exists, so return values need not be explained, and the description instead covers result handling (NAME_REQUIRED prompt-and-retry, UNAVAILABLE fallback). It documents almost every action's required inputs and the key policy constraints. The remaining gaps — the unmentioned source_refs parameter and the unexplained type enum meanings — are minor but real for a tool this complex.
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 0% across 18 parameters, so the description carries the full explanatory burden, and it largely delivers: it binds parameters to actions (publish + type + summary + details, attach + path, invite + member + role + projects, retract + checkpoint_id, set_name + name) and explains fields like details, context, supersedes, workspace and hub. It earns a 4 rather than 5 because 'source_refs' is never mentioned by name, and the nested context keys (addresses, evidence) are described without clarifying their placement in 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?
The opening line names a specific resource and scope — 'Team project brains: decisions and progress shared with teammates' AIs, per project' — and immediately draws the boundary against the sibling brain_folder ('Not for the user's own memory or their other PCs'). The action list further pins down what the tool does per operation. It stops short of distinguishing itself from the remaining siblings (brain_recall, brain_remember, brain_context, brain_forget), though the 'user's own memory' exclusion implicitly covers them.
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 states when to publish ('only when the user asks', with literal trigger phrases), that the request itself is the approval so the agent should not re-ask, and the one exclusion (ask only if the project is ambiguous). It also routes adjacent needs elsewhere — files go to Slack/drives/GitHub via those tools, personal memory goes to brain_folder — which is explicit when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_contextARead-onlyIdempotent
Answer from the user's past: one bounded text packet to read before replying.
The default memory call: use it whenever a request may depend on earlier conversations,
facts, preferences, decisions or work. It returns `context`, a size-capped text of the
relevant memories and conversation turns, each with its date and source. For structured
rows, ids or one thing's history use brain_recall instead.
Set `recent=true` whenever the question is about what happened lately or what the user was
just doing: "what was I working on?", "where did we leave off?", "what did I do
yesterday?", "최근에", "아까", "어제", "지금 뭐 하고 있었지?". Results then come newest
first instead of by word overlap; naming something ("what did Kongi do lately") keeps them
about that. Set `since` (ISO date or time) to drop anything earlier, e.g. "this week".
Set `about_assistant=true` when the user asks what YOU said earlier: "which restaurant did
you recommend?", "what were the steps you gave me?", "네가 아까 뭐라고 했지?". Your own
past answers are then searched by meaning too, not only by their words.
Set `around` when the question is about WHEN WE TALKED: "what did we discuss last week?",
"지난달에 얘기한 거" -> resolve it yourself to a date or "start..end" (e.g. "2026-09-23"
or "2026-09-01..2026-09-30"). Conversations from then rank first; nothing is dropped.
Do not set it for when something HAPPENED ("the event I went to two weeks ago"): people
mention events days or weeks before or after, so that date misleads (measured: on dev2
it pushed the answering turn out in 2 of 11 questions and helped 2).
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| limit | No | ||
| query | Yes | ||
| since | No | ||
| around | No | ||
| policy | No | always | |
| recent | No | ||
| scopes | No | ||
| max_chars | No | ||
| about_assistant | No | ||
| knowledge_cutoff | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/non-destructive/openWorld=false), it discloses ordering semantics (recent makes results newest-first instead of word-overlap ranked), the size cap on output, and that each result carries a date and source. It also discloses that around re-ranks without dropping anything, a non-obvious behavioral trait.
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?
Purpose is front-loaded in the first sentence and each paragraph maps to a parameter decision, so most sentences earn their place. It is nonetheless long and drifts into loosely ordered asides (Korean examples, an empirical measurement) that could be tightened.
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?
Output schema exists, so return values needn't be described, and usage guidance is thorough. However, for an 11-parameter tool with zero schema descriptions, six parameters (as_of, limit, policy, scopes, max_chars, knowledge_cutoff) are silently undocumented, leaving an agent guessing on budget and scope control.
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 0% across 11 parameters, so the description must carry the load. It gives rich semantics for recent, since, about_assistant and around (with format examples like '2026-09-01..2026-09-30'), but as_of, limit, policy, scopes, max_chars and knowledge_cutoff are left entirely unexplained in both schema and description.
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: retrieve a bounded text packet of past memories to answer from, and names its scope as the default memory call. It explicitly contrasts itself with brain_recall for 'structured rows, ids or one thing's history', so an agent can disambiguate from the closest sibling without opening a 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?
Explicitly says to use it 'whenever a request may depend on earlier conversations, facts, preferences, decisions or work', then gives condition-by-condition guidance for recent/since/about_assistant/around with quoted example utterances. It even names a when-NOT case for around ('do not set it for when something HAPPENED'), with measured evidence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_folderAIdempotent
Where the user's own personal memory lives, and which of their own PCs share it.
Not for teams: project brains shared with teammates are brain_checkpoint.
Call it with `path` when the user names a folder for their memory, e.g. "use my Google
Drive's Graph-MIND folder as my brain". A folder that OneDrive, Google Drive or Dropbox
syncs makes the same memory available on every PC where the user chooses it too; nothing
else is needed. Without `path` it reports the current folder and the devices writing to it.
`path="local"` keeps the brain in this PC's own Postgres instead, shared the instant it is
written (no sync delay).
Other PCs: when the user asks to let their other PCs use this brain ("다른 PC도 붙게 해줘"),
call it with `path="share"`. It opens this PC's Postgres to the local network and Tailscale
(Windows may ask the user to approve a firewall rule once) and returns a
`connection_code`. Show the user that code and tell them to paste it to the AI on the
other PC; it contains the password, so say not to post it anywhere public.
Codes: when the user pastes any Graph-MIND code ("gm1." for their own other PC, "gmt1."
for a team invite), call this with `path=<the code>`; it does the right thing for either,
so never ask the user which kind it is.
`share_existing=true` sends what this PC remembers and the shared memory lacks (only that:
it also repairs turns that missed a hub that was down). It uploads
it to wherever the folder syncs. Set it only when the user has explicitly agreed to that.
`reindex=true` brings the search index up to date (links new memories, embeds unembedded
ones). Saving already does this; it is for a large imported backlog.
Moving a whole memory as one file ("내 기억 파일로 내보내줘", "이 기억 파일 가져와"):
`export_to=<file path>` writes every memory and conversation turn into that file;
`import_from=<file path>` adds such a file's contents to this memory, skipping what is
already here. Only when the user asks. Tell them the file holds their entire memory
(secrets were masked when saved), so keep it private like a diary.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| reindex | No | ||
| export_to | No | ||
| import_from | No | ||
| share_existing | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), it discloses real side effects: `path="share"` opens Postgres to the LAN/Tailscale, may trigger a one-time firewall prompt, and returns a connection_code containing a password with an explicit warning not to post it publicly. It also flags that export files contain the entire memory (secrets masked) and that share_existing uploads to the sync folder.
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?
Purpose and the team exclusion are front-loaded, then usage follows mode-by-mode, which is the right order. It is still long and repetitively framed around quoted user utterances, but almost every sentence adds a distinct operational rule rather than restating the schema.
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-parameter tool with no schema descriptions but a present output schema, the description covers every parameter, the side effects of each mode, the privacy caveats, and the sibling boundary. Nothing an agent needs 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 0%, so the description carries the full burden and does so: `path` is defined across its value space (a named sync folder, `"local"` for on-PC Postgres, `"share"`, or a pasted gmt1./gm1. code), and reindex, export_to, import_from, and share_existing each get a concrete meaning, trigger, and effect.
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 opening states the resource (the user's personal memory folder and which PCs share it), and the second paragraph explicitly excludes the sibling case: 'Not for teams: project brains shared with teammates are brain_checkpoint.' However, the tool is an omnibus of modes (folder config, share, code redemption, export/import, reindex) that the name 'brain_folder' does not signal, so an agent must read the whole description to learn the full scope.
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?
Nearly every mode is gated on an explicit trigger: call with `path` when the user names a folder, use `path="share"` when the user asks other PCs to connect, use `path=<the code>` when any Graph-MIND code is pasted, and 'Set it only when the user has explicitly agreed' for share_existing. It also names the alternative (brain_checkpoint) and pre-empts a question ('never ask the user which kind it is').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_forgetADestructiveIdempotent
Delete what the user wants gone from memory: "delete the password I typed earlier", "그 토큰 지워줘", "forget what I said about my ex".
Always two calls. First `query`: what to look for, in general words ("password", "wifi",
"DB login"); never repeat a secret the user typed. It returns numbered candidates with
masked previews. Show the user exactly those previews and ask which to delete; never
quote the original text. Then call again with the `ids` the user picked, and only those.
Deleting removes them from this PC, its search indexes, the shared memory and the user's
other PCs. This exchange about deleting is not saved either. The AI app's own chat
history is separate and untouched (Claude Code keeps ~/.claude/projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this destructive/non-read-only/idempotent, and the description goes well beyond them by specifying deletion scope (this PC, search indexes, shared memory, other PCs), that the deletion exchange itself is not saved, and that app chat history is separate. It does not, however, describe failure behavior or what happens if ids match nothing.
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?
Longer than most definitions, but front-loaded with the purpose and each block (examples, two-call protocol, deletion scope) earns its place. Slightly more verbose than strictly necessary, but no filler sentences.
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?
An output schema exists, so return-value detail is unnecessary; the description instead supplies everything an agent needs to safely drive a destructive, two-step deletion — trigger conditions, privacy constraints, and blast radius. Nothing material 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 0%, so the description carries the load, and it does: query must use general words and never repeat a secret the user typed; ids must be exactly the user-selected ones from the prior call. The mutual exclusivity/two-phase usage of the two optional params is implied clearly though not spelled out formally.
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 ('Delete what the user wants gone from memory') and grounds it in three concrete example utterances spanning languages. An agent can immediately distinguish this from brain_remember/brain_recall.
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 two-call protocol: first query with general words, then a second call with the selected ids 'and only those.' It also states the required interaction pattern (show masked previews, ask the user which to delete, never quote the original).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_recallARead-onlyIdempotent
Raw lookup: the matching memories and turns as structured rows, not a ready context.
To answer the user's question from their past, use brain_context instead; it returns one
bounded text packet ready to read. Use brain_recall to inspect or list: the ids and fields
of what matched (e.g. before brain_forget or `supersedes_memory_id`), one thing's history
in order, or what the store knows about.
`entity` answers "what happened to X, in order": every memory about that one thing (the
auth module, this project, my address), oldest first, with replaced entries marked and the
current one picked out. Similarity search returns only the nearest one or two of four
decisions made about one thing in four sessions; this returns all four. With neither
`query` nor `entity`, it lists what the store knows about, busiest first.
`recent`, `since`, `about_assistant` and `around` mean the same as in brain_context.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | ||
| limit | No | ||
| query | No | ||
| since | No | ||
| around | No | ||
| entity | No | ||
| recent | No | ||
| scopes | No | ||
| about_assistant | No | ||
| knowledge_cutoff | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 genuinely new behavioral context: result ordering, how replaced entries are marked, how the current one is identified, similarity-vs-history recall behavior, and default list order ('busiest first'). This is exactly the value-beyond-annotations the dimension rewards.
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 distinction, then uses focused paragraphs per parameter cluster. Slightly long, and the cross-reference to brain_context for shared params offloads meaning elsewhere, but every sentence carries 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?
An output schema exists, so return-format explanation is not required, and the description still characterizes the shape ('structured rows, not a ready context'). Given 10 params at 0% coverage, a few params (as_of, scopes, knowledge_cutoff) remain unexplained, but the recall-behavior model is otherwise well conveyed.
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 0% across 10 params, so the description must carry the burden and largely does: it explains entity semantics (every memory about one thing, oldest first, replaced entries marked), the no-query/no-entity default behavior, and defers recent/since/about_assistant/around to brain_context. It does not cover as_of, limit, scopes, or knowledge_cutoff, leaving several params undocumented anywhere.
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 precise definition of what the tool returns ('raw lookup: matching memories and turns as structured rows, not a ready context') and explicitly contrasts it with the sibling brain_context. An agent can distinguish it from every named sibling without opening a 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?
Explicitly states when to use brain_context (answering questions from the past) versus brain_recall (inspecting/listing ids and fields, one thing's history, store overview), and names concrete downstream uses like before brain_forget or supersedes_memory_id. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_rememberA
Save what the user just told you, in their own words. Call this proactively.
A fact that can change later (where they live or work, a pet, a preference, a plan, a
number they track): also pass `about` (who or what, e.g. "Kongi", "me") and `attribute`
(which property, a short English snake_case name, e.g. "breed", "home_city",
"favorite_coffee"). A later value with the same `about` and `attribute` replaces this
one and recall shows both: the value now and what it was before. Use the same
`attribute` names every time, and never put the value in the name: "last_trip", not
"last_trip_paris", or the next trip will not replace it.
Use it the moment the user mentions anything about their life, work, plans, preferences,
people, places, meals, purchases, health, decisions or events, e.g. "I had kimchi fried
rice today", "my dog is called Kongi", "we moved the meeting to Tuesday". Do not ask
whether to save it and do not wait to be told "remember this". Only `content` is
required: put the user's own sentence there verbatim. Add `entities` (who or what it is
about) and `effective_at` (when it happened, ISO time) when you know them. If it updates
something remembered earlier, pass that memory's id as `supersedes_memory_id`.
Decisions and their reasons are memories too: `memory_type="decision"`, the reason in
`content`, the project or component in `entities`.
Save silently. Do not tell the user you saved it ("I've noted that", "저장해 뒀어"); just
carry on with the conversation. Talk about memory only if the user asks what you remember
or whether something was saved.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| about | No | ||
| scope | No | global | |
| title | No | ||
| content | Yes | ||
| entities | No | ||
| modality | No | ||
| attribute | No | ||
| memory_id | No | ||
| retention | No | ||
| attributes | No | ||
| confidence | No | ||
| importance | No | ||
| source_ref | No | conversation | |
| memory_type | No | fact | |
| source_type | No | mcp-client | |
| effective_at | No | ||
| memory_class | No | ||
| related_memory_ids | No | ||
| supersedes_memory_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare write/non-idempotent/non-destructive; the description adds the substantive mutation semantics — a later value with the same `about`+`attribute` replaces the earlier one, recall surfaces both old and new, and the attribute name must be stable ('last_trip', not 'last_trip_paris') or replacement silently fails. It also discloses the user-facing contract ('Save silently', never announce the save). This is exactly the non-obvious behavior an agent could not infer from the structured fields, and it is consistent with destructiveHint=false.
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 organized into short paragraphs, each carrying distinct content (what to save, how changeable facts work, when to trigger, how to behave). It is long for a single tool and repeats the silent-save instruction twice, but the length is largely justified by the 20-parameter surface and supersession subtlety.
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?
Annotations are present and an output schema exists, so return values need no explanation and the behavioral half is well covered. However, for a 20-parameter tool the description leaves the majority of parameters unexplained (notably `scope`, `retention`, `title`, `tags`), leaving an agent guessing on invocation details that materially affect where and how the memory lands.
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 0% across 20 parameters, so the description carries the full burden and only partially meets it: it meaningfully explains `content`, `about`, `attribute`, `entities`, `effective_at`, `supersedes_memory_id` and `memory_type`. Critical parameters such as `scope`, `title`, `tags`, `retention`, `memory_class`, `modality` and the object-typed `attributes` are left entirely undefined, and `attributes` vs `attribute` is a real confusion hazard the text does not disambiguate.
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 verb and resource ('Save what the user just told you, in their own words') and makes the scope concrete by contrasting with recall's behavior ('recall shows both: the value now and what it was before'). It never names a sibling to route away from, so it is clear but not sibling-differentiating in the way a 5 requires.
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?
Usage is unusually explicit: 'Call this proactively,' 'Use it the moment the user mentions anything about their life, work, plans...', plus the exclusion-by-behavior 'Do not ask whether to save it and do not wait to be told "remember this".' It lacks any named alternative or 'do not use this when' exclusion (e.g. vs brain_checkpoint or brain_forget), which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
code_activityARead-onlyIdempotent
Code changes the capture service recorded, with diff excerpts, filtered by project,
time range (happened_from/happened_to, ISO), file, symbol or kind. For "what did I
change in auth.py last week?" or "when did the parser change?". Empty unless a code folder
is being watched (automatic-capture.json, code_workspaces).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | No | ||
| file_path | No | ||
| project_id | No | ||
| change_kind | No | ||
| happened_to | No | ||
| happened_from | No | ||
| max_diff_chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond that: the 'empty unless a code folder is being watched (automatic-capture.json, code_workspaces)' caveat is a non-obvious precondition an agent must know to interpret empty results correctly. Return format is left to the 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-loads the core purpose, then follows with examples and a caveat. Three sentences with little waste. Minor redundancy between the filter list and the example questions, but overall tight and well-ordered.
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?
An output schema exists, so return-value explanation is unnecessary. The description supplies the essential usage framing and the empty-results precondition, making it largely complete for a read-only query tool. The only shortfall is the undocumented limit/max_diff_chars parameters.
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 0%, so the description carries the param burden. It compensates well for six of eight params by naming the filter concepts (project, file, symbol, kind) and explicitly calling out happened_from/happened_to with ISO format. However, limit and max_diff_chars are never mentioned, leaving two parameters unexplained.
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: 'Code changes the capture service recorded, with diff excerpts,' making clear it returns recorded code changes rather than memory items. This cleanly distinguishes it from every sibling (brain_remember, brain_recall, etc.), all of which are memory tools. An agent can identify its domain 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?
Provides concrete example questions ('what did I change in auth.py last week?', 'when did the parser change?') that map directly to use cases, plus a critical precondition: results are empty unless a code folder is being watched. It doesn't explicitly name an alternative sibling, but the sibling set is a different domain, so routing guidance is effectively implicit.
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.
1 tool update
v0.9.0- Changed
brain_folder2 fields changed- added
Input schema / properties / export_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Export To" +} - added
Input schema / properties / import_fromAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Import From" +}
7 tool updates
v0.1.0- First observed
brain_checkpoint - First observed
brain_context - First observed
brain_folder - First observed
brain_forget - First observed
brain_recall - First observed
brain_remember - First observed
code_activity
TDQS
Scored across 7 tools
Descriptions go out of their way to route the agent (recall vs context, folder vs checkpoint), so boundaries are mostly clear. However, brain_recall/brain_context are two views of the same memory data and brain_folder/brain_checkpoint both concern sharing, which are genuine overlaps that require reading long guidance to resolve.
Six of seven tools use a consistent brain_ + verb/noun pattern (brain_recall, brain_remember, brain_context, brain_folder, brain_checkpoint, brain_forget). code_activity breaks the convention (noun_noun, no prefix), a minor but visible deviation.
Seven tools is well within the sweet spot and each earns its place across memory lifecycle, sharing, team, and code domains. No redundant or filler tools.
Coverage is broad: store, retrieve, delete, share across devices, team checkpoints, export/import, and code activity, with update handled via supersedes_memory_id. Some capability is packed into overloaded mega-tools (brain_folder, brain_checkpoint) rather than discrete operations, but no major workflow dead ends appear.
Maintenance
Related MCP Connectors
Persistent AI memory shared across Claude, ChatGPT, coding agents, and compatible MCP clients.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA graph-based MCP server that provides AI coding agents with persistent memory to store patterns, track complex relationships, and retrieve knowledge across sessions. It leverages graph structures to handle temporal queries and relational paths that traditional vector stores often miss.251MIT
- AlicenseAqualityCmaintenancePersistent memory for Claude Code. Automatically indexes every conversation and provides production-grade hybrid search (BM25 + vectors + reranker) via MCP tools. 100% local, zero config, zero API keys, zero invoice.1637 npm7MIT
- AlicenseNot gradedqualityDmaintenanceCross-machine memory system for Claude Code that records sessions as searchable markdown, syncs across machines via Git, and exposes full-text search, semantic search, session summarization, and a knowledge graph through an MCP server.30 npmMIT
- AlicenseNot gradedqualityAmaintenanceTestGraph is a shared structured knowledge and review graph for AI agents. Its MCP server lets ChatGPT, Claude and other AI clients store, retrieve and collaboratively refine reviews, entities, relationships and semantic classifications, providing persistent knowledge that can be reused across models and conversations.AGPL 3.0