Skip to main content
Glama

Agents call MemAI's MCP tools to write memories — facts, decisions, checkpoints, pitfalls, documented flows — during a session and read them back in later ones, which is the state an MCP server's own process does not keep between conversations.

The tools answer any MCP host. What surrounds them targets Claude Code: the hook events that put the store in front of a session, the bundled skills, and the warden subagent that consults it on a session's behalf.

Highlights

  • Types, not one blob. note, reasoning, anti_pattern, checkpoint, task, diagram — a pitfall is read back by the tool that asks for pitfalls, not found by luck among everything else. A task is a goal and a checklist: items move through todo, doing, done and dropped, each carries its own comments and linked memories, and the task archives itself once every item is closed.

  • Domains are paths. A memory filed on acme/checkout/billing still answers a read of acme, and also cross-lists it under the subjects that cut across that tree.

  • Keyword retrieval, nothing to download. SQLite FTS5 with BM25 over title, content, tags and domain. No embedding model, no network call, no GPU.

  • The store reaches a session by itself. Hook events warm a cold session and prompt it to write; the warden subagent reports only the memories that bear on what is actually happening.

  • Curation stays a person's. Confidence, decay dates, dedup and staged suggestions: an agent proposes, a human applies them in the dashboard.

  • One file holds a project. Rows, keyword index, edit history, relations, diagrams: a project's whole memory in one SQLite file. Keep one for everything, or one per project and switch between them from the dashboard. Copy it, back it up, delete it.

Related MCP server: heropen

What it looks like

Mid-task, an agent writes down what it just paid for:

note(
    title="Stripe sends charge.succeeded twice for one charge",
    domain="acme/checkout/billing",
    tags="idempotency, webhook, retry, duplicate delivery",
    content="A retry carries the same event id, so the handler has to key off "
            "the event id. Keying off the charge id lets the second delivery "
            "book the order again.",
)

Days later a cold session opens on that subject and asks for its bearing:

pulse("acme/checkout")

It gets the latest checkpoint in full and a count of what is pending anywhere under that path: open tasks, pitfalls, handoffs, notes and flows. The session asks for the category it needs, and gets headers it can open:

must_read("acme/checkout", type="note")    # titles and uids, that note among them
get_memory(uid)                          # the one the work touches, in full

A task is how work reaches the next session. The agent files it with a goal and one item per line, and works it as it goes:

made = task(
    title="Move billing webhooks to the idempotent handler",
    goal="Every billing webhook is deduplicated by event id.",
    items="Key charge.succeeded by event id\nCover refunds and disputes\n"
          "Remove the charge-id lookup",
    domain="acme/checkout/billing",
)
uid = made["uid"]
charge, refunds, lookup = (i["id"] for i in made["items"])  # each is {id, n}
task_item(uid, charge, state="done", comment="Handler keys off the event id.")
task_note(uid, title="Refund replay", items=str(refunds),
          goal="Replay a refund once, however often it arrives.",
          context=f"Refunds arrive twice on retry; [[#{charge}]] shows the key.",
          steps="Key refunds by event id.",
          pitfalls="A dispute reuses the refund's event id.", done_when="The replay test passes.",
          depends_on=str(charge))

An item is a short label, at most 80 characters; its detail goes in a brief. What only makes sense inside the task — an item's brief, a rule several items share — is a task note, not a memory. A note on items is a brief: GOAL, CONTEXT, STEPS, PITFALLS, DONE WHEN and DEPENDS ON, with EXTRA INFO for anything else. Every tool names an item by its id; the number a list shows is only its place. A person never sees the id, so an agent names an item to one as item n of the task: the task's content lists each item as its number, text and id, every task result carries n beside each id it names, and a foot_note on each restates the rule. Free text cites an item as [[#id]], which reads back as the item's current number and label, and the dashboard inserts one when # is typed in a task's text. task_item also renames an item or deletes one, and edit_memory(uid, goal=...) rewrites the goal, so a task is corrected in place. Search, recall and the session brief never return a note. get_memory(uid) on a task returns its head (goal, progress, counts), and task_read(uid, part) reads its items, notes, comments and links one page at a time. Every tool result stays under the size Claude Code shows inline: what can grow comes back in pages with a next_offset. memai-store task-adopt turns memories linked to a task's items into its notes, and refuses one that would land on items without being a brief.

Open tasks come first in the session-start brief. The PreToolUse hook notes the domains a session names in its memai calls, and at the end of a turn the stop hook blocks once per interval to ask the agent to update the open tasks of those domains, and to check similar domains for a task filed under another path. A session that named no domain is not asked. The dashboard's Maintenance view switches that reminder off and sets its interval; a task's checklist, comments and linked memories are worked there as well. A closed task is an archived memory, so list_by_domain(domain, type="task", status="archived") lists the completed and cancelled ones.


Quickstart

python -m venv .venv
.venv/Scripts/pip install --no-deps -e .   # .venv/bin/pip off Windows
.venv/Scripts/pip install --require-hashes -r requirements-dev.txt
.venv/Scripts/python tools/install-webui.py   # the admin dashboard
.venv/Scripts/python -m pytest
npm run typecheck && npm test           # the dashboard's own checks

Register the server with your host, then let it reach a session by itself — the hooks put the store in front of an agent that did not ask for it, and the bundled skills and subagent teach it what to do with them:

claude mcp add --scope user memai C:\path\to\MemAI\.venv\Scripts\memai-mcp.exe

memai-hook install            # the four hook events
memai-hook install --skills   # the bundled skills
memai-hook install --agents   # the warden subagent
memai-hook install --check    # what is registered, and what is out of date

See Hooks and the warden for what each event emits and how to turn the warden off.

NOTE

Two hosts, two different files. Neither reads the other's, so a server registered in one is invisible to the other, and an empty list in one says nothing about the other.

host

the file it reads

how to write it

Claude Code CLI — claude in a terminal

~/.claude.json, top-level mcpServers

claude mcp add --scope user memai <command>

Claude desktop app — Chat and the Code tab

Windows: %APPDATA%\Claude\claude_desktop_config.jsonmacOS: ~/Library/Application Support/Claude/claude_desktop_config.json

edit the file, or Settings → Developer → Edit configuration

Both hosts take the same block, pointing at the console script the install put in the environment:

{
  "mcpServers": {
    "memai": {
      "command": "memai-mcp"
    }
  }
}

A bare memai-mcp resolves only if that environment's Scripts\ (bin/ off Windows) is on the PATH of the process that launches the server — and a GUI app inherits the desktop session's PATH, not your shell's. Unless you know it is there, give the absolute path instead:

{
  "mcpServers": {
    "memai": {
      "command": "C:\\path\\to\\MemAI\\.venv\\Scripts\\memai-mcp.exe"
    }
  }
}

claude mcp list reports what the CLI loaded; the desktop app lists what it loaded under Settings → Developer → local MCP servers. A host reads its config once, at startup, so restart it after an edit.

On Windows, install.bat does the venv, install and dashboard-build steps, update.bat pulls the checkout and then runs install.bat, and run-admin.bat starts the dashboard (it activates .venv itself; extra arguments pass through, e.g. run-admin.bat --port 8890). stop-mcp.bat and stop-admin.bat stop what is running. install.bat and update.bat refuse to start while an MCP server or the dashboard still runs from the checkout, list what is open, and offer to close it.

IMPORTANT

Windows locks an .exe while a process is running it, so apip install cannot rewrite .venv\Scripts until every MCP server and the dashboard are down.

An agent installing MemAI on a new machine follows .agents/install.md: requirements, the order that keeps a running server from breaking the install, both MCP config files, and the checks that confirm the result.

Staying current. The stop hook asks GitHub, at most once per interval (a day unless chosen otherwise), which releases are published and caches them — tag, page and notes, one record per release — in MEMAI_HOME/update.json. A session that starts behind is told which version it runs, how many releases came after it, what each of them changed (their notes, flattened to a few plain lines) and the commands that update this checkout — for the person to run once every session and the dashboard are closed, for the reason above. The dashboard shows the same thing at leisure: the version mark in its app bar carries the count and opens Releases, which renders the packaged CHANGELOG.md with the running version marked and anything published since it at the top. There, Check now asks GitHub at once, and Check every sets the interval, from an hour to a week (the server accepts up to 30 days); the choice is kept in MEMAI_HOME/update-settings.json and holds for every project. memai-hook install --check prints the same comparison. MEMAI_UPDATE_CHECK=0 stops the request, and belongs in the environment the host itself runs in: the hook and the dashboard make it, not the MCP server, which only reads what they cached.


The dashboard

memai-admin (or python -m memai.admin) serves the store at http://127.0.0.1:8888 — loopback only; --host / --port / MEMAI_ADMIN_PORT to change. It is where memories are read, edited, triaged and curated by a person, where the diagrams are arranged, and — behind the version mark in its app bar — where the release history is read.

memai-admin --status says where it is, memai-admin --stop stops it.

The dashboard is a Vue 3 and TypeScript app that Vite builds into src/memai/webui/dist/. Without Node 22.18+ or a reachable npm registry, the install takes the prebuilt one from the release instead. On start, memai-admin rebuilds it when its sources differ from the ones the build was stamped with, running npm ci too when the lockfile changed; it serves the build it has when npm is missing or fails. MEMAI_ADMIN_BUILD=0 turns that off.

A memory can be pinned from its record: for every domain, or for its own domain only (its subdomains and cross-listed paths included). must_read() and pulse() count pinned memories beside the categories, the session brief counts the global ones, and an agent lists them with must_read(type=..., pinned=true) and reads every one before acting.

A host starts several MCP servers per session, so the dashboard is started once and shared: each server asks /api/ping whether one already answers before trying to bind, and the one that wins keeps the port. It is detached on purpose, so it outlives the session that opened it.

{
  "mcpServers": {
    "memai": {
      "command": "memai-mcp",
      "env": {
        "MEMAI_HOME": "/path/to/your/memai-store",
        "MEMAI_ADMIN_AUTOSTART": "1",
        "MEMAI_ADMIN_PORT": "8888"
      }
    }
  }
}

Every variable MemAI reads belongs in that block: a server the host launches sees this environment and no other, not your shell's. MEMAI_HOME is a placeholder — drop the line to keep the store at ~/.memai, and on Windows mind that JSON wants its backslashes doubled.

Where the data lives

Under $MEMAI_HOME if it is set, otherwise ~/.memai. Not tracked in git — user data, created on first run.

path

what it is

memai.db

the General project, the one every install starts with

projects/<name>.db

every other project, one file each, named as you named it

active

one line naming the project in use; absent means General

backups/

VACUUM INTO copies of General, named General-<stamp>.db; any other project's go in backups/<name>/

renders/, warden/

generated SVGs, and the warden's per-session state

A project is one whole memory: its own domains, relations, diagrams and settings. Any name that works as a Windows file name works as a project name, and two names that differ only in case are one project. The switch is in the dashboard's top bar, and every MCP server, hook and dashboard on the machine opens the active project on its next call — no restart. Every write's result and every pulse() name the project they touched, and list_projects() lists them all.

Memories move between projects from the dashboard — a selection in Memories, or a whole domain in Domains — with move_to_project(), or with memai-store move. A move copies each memory with its history into the target, checks it there and only then removes the original, after a backup of the source is written. What the copy cannot carry — a relation to a memory outside the selection, a diagram jump across it — is reported before anything moves.


Documentation

How the parts work lives in the wiki:

Licence

MemAI is MIT. Roboto is bundled in webui/fonts/ under the SIL Open Font License 1.1 (webui/fonts/OFL.txt), separate from MemAI's own licence.

Available Tools

42 tools
also_domainA

Cross-list an existing memory into one more domain path.

For the membership a memory picks up after the fact: it was filed where it lives, and later turns out to be part of a subject that cuts across the tree. Every read scoped to domain returns it from now on, without moving it -- use the dashboard's re-home for that.

Returns {"uid": ..., "also": [...]} with the whole resulting set. A path the memory's own domain already sits under is dropped as redundant, so the echo is what actually holds.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
domainYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and mostly succeeds: it discloses the additive (non-moving) effect, that every read scoped to the domain will return the memory, that duplicate/redundant paths are dropped, and the shape of the response. It omits auth requirements and failure modes, but the core behavioral semantics are unusually well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action in sentence one, which is good, but the middle paragraph leans on metaphor ('cuts across the tree', 'the echo is what actually holds') that adds ambiguity rather than precision for a simple two-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description compensates by specifying the return object (`uid`, `also`). Behavior, usage, and result shape are all covered; only parameter-level detail for `uid` is thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It conveys the meaning of `domain` (a path, subject to redundancy dedup) but says nothing about `uid` beyond the response echo, so one of two parameters stays undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Cross-list') and resource ('an existing memory') plus the target ('one more domain path'), and contrasts against a sibling behavior by saying 'without moving it -- use the dashboard's re-home for that.' This distinguishes it from move_to_project/unfile_domain, though it does not name them directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear triggering scenario: a memory was filed where it lives and later turns out to belong to a cross-cutting subject. It also implicitly sets the boundary that the memory is not relocated. No explicit 'do not use when' or named alternative sibling, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

anti_patternC

Record a mistake/temptation to avoid repeating, and the correct approach.

Stored as type='anti_pattern'; pulse() counts the open ones for a domain and pending(type='anti_pattern') lists them. also cross-lists it into further domain paths, review_after dates when to recheck it and source_ref says what it came from -- see note().

ONE pitfall per memory: a second temptation from the same session is its own anti_pattern(), connected with link_memories(). See note() on what a body holds and when it is two memories.

title: one line naming what this memory is about, in the words someone would look for it by. It is what a list shows instead of the opening of the body, and it outweighs every other field in search, so a title that repeats the type ("note about the parser") names nothing. At most 120 characters, and a name that needs more than that is summarizing the body instead of naming it.

tags carries the synonyms the body never uses: retrieval is BM25 over content and tags, so a memory with none is reachable only by quoting itself. See note() for what belongs there.

ParametersJSON Schema
NameRequiredDescriptionDefault
alsoNo
tagsNo
titleYes
domainNo
insteadYes
patternYes
sessionNo
why_wrongYes
source_refNo
review_afterNo

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. While it mentions storage type, cross-listing behavior, and review scheduling, it lacks crucial mutation details: no indication of required permissions, whether the operation is idempotent, side effects, or what the response contains. It also doesn't clarify if creating an anti-pattern affects other domains or requires specific context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat verbose with multiple paragraphs and references to other tools ('see note()' three times), which may require additional lookups. However, it is structured logically and front-loads the core purpose. Some sentences could be more direct.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 10 parameters, no annotations, no output schema, and 0% schema coverage, the description leaves significant gaps. It doesn't explain what happens on creation (e.g., where it's stored, how it's indexed), doesn't cover all required parameters, and relies heavily on external references (note()), which may not be available to the agent. It also omits error handling or constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for 10 parameters (4 required). The description only partially compensates: explains meaning of 'also', 'review_after', 'source_ref', 'title' (with constraints), and 'tags' (with retrieval impact). It leaves 'pattern', 'why_wrong', 'instead', 'domain', and 'session' completely undefined in both schema and description, making it difficult to correctly populate required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Record a mistake/temptation to avoid repeating, and the correct approach.' This clearly distinguishes it from the sibling note() tool by focusing on anti-patterns. However, it doesn't explicitly contrast the distinction with other memory types in the first sentence.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage context ('to avoid repeating') and mentions related tools (pulse, pending, note) without explicitly stating when to use anti_pattern vs note or other memory types. The reference to 'see note()' suggests differences but doesn't fully clarify selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

checkpointA

Snapshot current working state (intent/established/pursuing/open_questions).

A summary of where the work stands, so the next session picks up the right bearing via pulse(). Fields are free-length; still prefer a readable summary here and put timeless detail into note() -- checkpoints are read for bearing, not as an archive. One fact per note(), each cited back here by [[uid]] and linked with link_memories(); pulse() returns the latest checkpoint IN FULL, so every session pays for whatever was parked in these fields. Stored as type='checkpoint'.

title: one line naming what this memory is about, in the words someone would look for it by. It is what a list shows instead of the opening of the body, and it outweighs every other field in search, so a title that repeats the type ("note about the parser") names nothing. At most 120 characters, and a name that needs more than that is summarizing the body instead of naming it.

also: other domain paths this belongs to, comma-separated -- the cross-cutting subjects beside the one it is filed under. See note().

tags carries the synonyms the body never uses: retrieval is BM25 over content and tags, so a memory with none is reachable only by quoting itself. See note() for what belongs there.

ParametersJSON Schema
NameRequiredDescriptionDefault
alsoNo
tagsNo
titleYes
domainNo
intentYes
sessionNo
pursuingYes
establishedYes
open_questionsYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses storage type ('type=checkpoint'), the cost model (every session pays for what's parked here), and how it's retrieved by pulse(). It does not detail permissions or deletion behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, but grows long with detailed guidance on title, also, and tags. While each section is purposeful, it borders on verbose and mixes tool description with field-level instruction that could be in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and 9 parameters with 0% schema coverage, the description provides critical context on usage, storage, and retrieval. It is nearly complete for an agent to invoke correctly, though it could say more about the impact of session or domain fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for 9 parameters, so the description compensates substantially: it documents the purpose of title, also, and tags, and lists the intent/established/pursuing/open_questions fields. Uncovered parameters like domain, session, and the required core fields lack detailed semantics beyond naming.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Snapshot current working state' with parenthetical fields. It distinguishes from siblings via explicit references to pulse(), note(), and link_memories(), but does not directly name why this differs from handoff or reasoning.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear routing guidance: use checkpoint for bearing, put timeless detail into note(), cite facts by [[uid]], and understand it's read via pulse(). It does not provide explicit when-not-to-use versus handoff, but strong context relative to its primary consumer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dedup_scanA

Surface likely-duplicate/contradictory memory pairs.

Lexical overlap over near-identical text -- each pair carries its method. Two takes on one subject in different words do not surface here. Same-domain/session checkpoint pairs are excluded (timelines, not dups) and checkpoint pairs rank below durable-type pairs. Not an automatic merge -- returns candidate pairs + similarity score for the agent to review and decide (link_memories / edit_memory / forget as appropriate).

domain scans a path and everything nested under it, which is usually what you want: near-duplicates collect between a module and its own routines.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainNo
thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral load and does so well: it discloses the matching method, that each pair is tagged with its `method`, that same-domain/session checkpoint pairs are excluded, and that checkpoint pairs rank below durable pairs. It explicitly clarifies this is not an automatic merge, which is the key safety-relevant behavior. It stops short of describing scoring/threshold effects or result volume.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is front-loaded: what it surfaces, then what it excludes, then what it is not. Sentences are dense but each carries distinct information. There is mild redundancy in the closing paragraph, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 covers the non-obvious essentials: exclusions, ranking, non-mutating behavior, and next steps. The remaining gap is the un-documented tunable parameters (threshold/limit/type), which an agent needs in order to call it well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for four parameters, so the description must carry parameter meaning and only partly does. It explains `domain` well (scans a path and everything nested under it, with a rationale for why that is usually desired), but `type`, `limit`, and `threshold` (the key similarity cutoff at 0.6) are left entirely undefined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource (surface likely-duplicate/contradictory memory pairs) and immediately narrows the mechanism (lexical overlap over near-identical text). It differentiates itself from what an agent might reach for instead by declaring that paraphrased takes on one subject do not surface here, which separates it from semantic search/recall siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear when-it-fires / when-it-does-not condition (lexical overlap only; different-words pairs excluded) and routes the agent to the right follow-ups (link_memories / edit_memory / forget). It does not explicitly compare against sibling scan tools like optimize_scan or get_relations, so the alternative-selection guidance is implied rather than complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagramA

Document what a routine does, start to end, as a graph. Stored as type='diagram'.

For a PROCESS, not a fact: note() records what is true, checkpoint() where the work stands, this one how a routine runs. Every step is a separate object that can carry its own explanation and its own links to other memories, which is what makes a diagram the source of truth for its domain instead of one more wall of prose.

Keep every label objective -- what happens at that step, nothing more. The reasoning, caveats and history belong in that node's note, where they explain without cluttering the flow.

nodes: [{"key": "load", "label": "Read the export window", "shape": "step", "note": "optional long explanation"}] edges: [{"from": "load", "to": "check", "label": "optional branch"}]

key: stable id the edges refer to; letters, digits, '_' or '-'. shape: start|step|decision|io|end. Exactly one 'start' is required and every node must be reachable from it. Cycles are allowed -- a retry loop is a real flow, not a mistake.

also: other domain paths this flow belongs to, comma-separated. domain is the routine's own place in the tree; also is for the flows that run ACROSS routines -- several of them can be steps of one end-to-end process without any of them being the parent of the others. Cross-list each into that process's path and asking about it returns all of them, instead of hoping one search phrasing reaches every one.

review_after and source_ref behave as in note(), and a flow is exactly the kind of memory they are for: it describes code, and the code moves.

Returns {"uid": ...}, or {"ok": False, "errors": [...]} with nothing written at all. Node positions are computed and stored server-side, so the flow renders identically for every reader -- see get_diagram().

ParametersJSON Schema
NameRequiredDescriptionDefault
alsoNo
kindNoflowchart
tagsNo
edgesYes
nodesYes
titleYes
domainNo
sessionNo
summaryNo
source_refNo
review_afterNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: validation constraints (exactly one 'start', all nodes reachable, cycles allowed), atomicity ('nothing written at all' on error), server-side position computation, and the cross-linking semantics of 'also'. This is unusually rich behavioral disclosure for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose before the schema examples, and each block (nodes/edges, key rules, also semantics) earns its place for a complex tool. Some sentences lean editorial ('one more wall of prose', 'not a mistake'), which adds length without operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with no output schema and no annotations, the description covers validation, return shape ({uid} vs {ok:False,errors}), and the linking model well. It falls short only on the auxiliary metadata params (kind, tags, session, summary) that an agent still has to guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does substantial work: node fields (key/label/shape/note), the key character rules, the shape enum (start|step|decision|io|end), edge from/to/label, and the meaning of 'also', 'domain', 'review_after' and 'source_ref'. However 'kind', 'tags', 'session', 'summary' and 'title' remain entirely undocumented, so it does not fully close the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Document what a routine does, start to end, as a graph') and pins the storage type ('type=\'diagram\''). It explicitly distinguishes itself from siblings note() and checkpoint(), so an agent can select 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule: 'For a PROCESS, not a fact: note() records what is true, checkpoint() where the work stands, this one how a routine runs.' It names the alternatives and the discriminating condition, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagram_edgeA

Wire two steps of a diagram together, relabel that wire, or remove it.

label carries the condition on a branch out of a decision node ('yes', 'no', 'on timeout'). Calling again with the same endpoints updates the label instead of adding a second edge between them.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
labelNo
deleteNo
to_keyYes
from_keyYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does add non-obvious value: it discloses upsert/idempotent semantics ('calling again with the same endpoints updates the label instead of adding a second edge'), which is exactly the kind of trait an agent needs. It does not cover permissions, error behavior, or the return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tight and front-loaded: the primary action comes first, followed by the label semantics and the idempotency note. Every sentence earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations, no output schema, and 0% schema coverage across five parameters, the definition covers the core workflow and idempotency but omits 'uid', endpoint semantics, and any error/return context. It is adequate but leaves real gaps for an agent invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains 'label' well (condition on a decision branch, with examples) and implicitly covers from/to via 'two steps' and delete via 'remove it', but 'uid' is never mentioned and endpoints are not named explicitly, leaving part of the 5-parameter surface undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names specific verbs and resource: wire two diagram steps together, relabel the wire, or remove it. It clearly frames this as an edge-mutation tool. However, it does not differentiate itself from the sibling 'diagram_link', which an agent might plausibly confuse with 'diagram_edge'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the three operations listed (wire, relabel, remove), and the 'calling again with the same endpoints' note hints at repeated invocation. But there is no explicit when-to-use vs alternatives guidance (e.g. vs diagram_link or diagram_node), and no prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagram_jumpA

Continue one step of a flow into ANOTHER flow, optionally at one of its steps.

Not the same statement as diagram_link: that attaches prose explaining a step, this says the rest of this branch is documented elsewhere. Use it where a routine hands off -- a sub-process, an error path owned by another flow, a variant of the same job.

Leave peer_node empty to arrive at the target diagram as a whole. Stored once and read from both ends, so the return trip already exists and get_diagram(format='json') reports it on both diagrams. uid and node_key are this diagram's side either way, which is also how a jump is deleted from the receiving end.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
labelNo
deleteNo
node_keyYes
peer_uidYes
peer_nodeNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose non-obvious behavior: the jump is 'stored once and read from both ends,' the reverse edge already exists, get_diagram reports it on both diagrams, and a jump can be deleted from the receiving end. It stops short of describing permissions, side-effect profile for the delete flag, or reversibility guarantees.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, and the sibling-contrast and behavioral notes are ordered usefully. Slightly verbose with inline code formatting and parenthetical asides, but no sentence is purely filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation-style operation with no annotations and no output schema, the description covers purpose, usage, and some behavior, but leaves label and peer_uid semantics and the delete flag's exact effect under-specified, so an agent still has gaps before invoking correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and only partly does: it clarifies that leaving peer_node empty targets the whole diagram and that uid/node_key denote 'this diagram's side,' plus implicit delete semantics. It never explains label or peer_uid, leaving several of the six parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Continue one step of a flow into ANOTHER flow') and immediately differentiates itself from the sibling diagram_link by contrasting what each one represents. An agent can distinguish the two 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (diagram_link) with an explicit contrast of meaning, and gives concrete when-to-use cases: a sub-process hand-off, an error path owned by another flow, or a variant of the same job. Nothing is left to inference about routing between the two link tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagram_nodeA

Add, patch or remove one step of a diagram.

Only the arguments you pass are touched, so patching a note leaves the label alone; pass note="" to clear one. delete=True removes the step together with its edges and its memory links.

The whole-graph rules are relaxed here on purpose: a step may sit unattached until you add its edges, which is what lets a flow be built up across several calls. diagram() enforces them.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
uidYes
noteNo
labelNo
shapeNo
deleteNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and discloses important behavior: only passed arguments are touched, note="" clears a note, delete=True removes the step plus its edges and memory links, and unattached steps are allowed. It does not cover error conditions or whether deletion is reversible, but the mutation semantics are well described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then efficiently layers in patch semantics, delete behavior, and the intentional relaxation of whole-graph rules. No wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and 0% schema description coverage, the description covers purpose and key mutation behaviors but is incomplete for a 6-parameter tool. It omits meaning for most parameters and does not address error or return behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 6 parameters, so the description must compensate. It clarifies 'note' and 'delete' semantics but leaves 'key', 'uid', 'label', and 'shape' unexplained, leaving the agent without definitions for most parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set (add, patch, remove) and resource (one step of a diagram), and distinguishes itself from diagram() by noting that whole-graph rules are relaxed here while diagram() enforces them. The edge mention also implicitly separates it from diagram_edge.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains that whole-graph rules are intentionally relaxed so a flow can be built across multiple calls, and contrasts with diagram() which enforces them. However, it does not explicitly state when to use this versus diagram_edge or when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagram_relayoutA

Recompute a diagram's stored node positions from scratch.

Positions live in the store, not in a viewer, so every reader sees the same picture and positions hand-adjusted in the admin dashboard persist. This discards those adjustments and rebuilds the layered arrangement -- the fix for a diagram dragged into a mess.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that manual adjustments are discarded, that positions live in the shared store (so all readers see the same picture), and that a layered arrangement is rebuilt. It omits whether the operation is reversible, what permissions are needed, or what the response returns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action is front-loaded in the first sentence, followed by supporting rationale about storage and consequence. Three sentences with little waste, though the middle sentence about store-vs-viewer could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with no output schema and no annotations, the description conveys the key effect (destroys manual positions, rebuilds layout) and the shared-store semantics. The only real gap is that what 'uid' refers to is left to inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the sole parameter 'uid' is undocumented in both schema and description. The phrase 'a diagram's' weakly implies uid identifies the target diagram, but the description does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Recompute a diagram's stored node positions from scratch.' An agent immediately knows this rewrites layout data rather than editing nodes or edges. It does not, however, name or contrast itself with any sibling (diagram_node, diagram_edge, get_diagram), so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear use case -- 'the fix for a diagram dragged into a mess' -- which tells the agent when this tool is appropriate. There is no explicit when-not guidance or named alternative, but the trigger condition is concrete enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_memoryA

Correct a memory's content or its source reference, keeping the previous version.

Corrections are common in append-only memory stores that only support delete, not edit; this preserves the old content instead of losing it.

mode='append' adds new_content as a new line at the end instead of replacing the body. Use it when a memory gains a fact rather than turning out to be wrong: the alternative is reading the whole thing, restating it and sending it back, which pays for the body twice and stakes the existing text on it being copied faithfully. Append what THIS memory gained. A fact about a further subject is a new memory plus an edge, not a line at the bottom -- appended text is ranked as part of the body it lands in and comes back with it.

source_ref points the memory at what its claim came from -- the field note() takes at write time, and the one a later pass checks the claim against. It is settable on its own, with no new_content, for the common case of a body that is right and a reference that is missing or has moved; an empty source_ref leaves the stored one alone, and clearing one is a dashboard edit. Passing neither is an error rather than a silent no-op.

title renames the memory: the one line a list shows it by, and the field weighing most in search, at most 120 characters. Settable on its own, like source_ref. A diagram is renamed through its graph instead -- its title is part of what generates the body, so a rename here would be overwritten by the next structural change.

tags REPLACES the tag set, comma-separated: pass the whole set that should survive, not the one being added. Settable on its own, and indexed, so this is how an untagged memory becomes findable by the words its body never uses. An empty string leaves the stored tags alone -- clearing them, like clearing a source_ref, is a dashboard edit.

Refuses to rewrite a diagram's content: that is generated from the graph, so a hand-written replacement would be silently overwritten by the next structural change -- edit the flow through diagram_node/diagram_edge. Its source_ref is ordinary metadata and is editable here like any other memory's. A task's content is generated from its goal and items the same way, and is refused the same way.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
modeNoreplace
noteNo
tagsNo
titleNo
source_refNo
new_contentNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and delivers: previous versions are preserved, source_ref/tags/title are each settable alone, empty strings leave stored values untouched (clearing is a dashboard edit), passing neither new_content nor source_ref is an error rather than a no-op, title is capped at 120 chars, tags are indexed, and diagram/task content rewrites are refused because they would be silently overwritten. This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and each paragraph maps to a parameter or refusal case, so the length is largely earned by 7 params at 0% schema coverage. It does repeat stock phrases ('Settable on its own' three times, 'a dashboard edit' twice) that could be consolidated, adding mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter mutation tool with no annotations and no output schema, the description covers every meaningful parameter, the append-vs-replace decision, empty-string and error semantics, and the refusal cases for generated content. Nothing an agent needs in order 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate fully, and it does: it gives meaning to mode ('append' vs replace), new_content, source_ref (the field note() writes and later passes check against, plus empty-string semantics), title (what a list shows, search weight, 120-char cap), tags (comma-separated, REPLACES the set, indexed, empty leaves alone), and note (the write-time reference field). Only uid is left undescribed, which is acceptable as the identity key.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb (correct) and resource (a memory's content or source reference) and adds the defining trait that distinguishes it from delete-only siblings: the previous version is kept. An agent can immediately tell this apart from forget (delete), note (create), or purge_memory 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance per mode ('append' when a memory gains a fact rather than being wrong), names the alternative approach it replaces (read, restate, resend) and why it is worse, and spells out per-field standalone usage for source_ref, title, and tags. It also names the cases where this tool must NOT be used (diagrams, tasks) and routes them to diagram_node/diagram_edge instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

forgetB

Archive a memory (soft delete -- content is kept, just excluded from default search/list).

A reason is recorded as a status-change audit entry, without touching the content. Archiving an open task cancels it; its items keep their states.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
reasonNo
superseded_byNo

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses soft-delete semantics (content kept, excluded from default search/list), records a reason as an audit entry without mutating content, and notes the side effect that archiving an open task cancels it. It omits whether archiving is reversible and any permission/auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the parenthetical clarification front-loaded right after the verb. No filler; every clause conveys a distinct behavioral fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a soft-delete mutation with no annotations and no output schema, the description covers the core behavior and one side effect. However it leaves reversibility, the meaning of `superseded_by`, and usage routing to siblings unaddressed, so it is only minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% across 3 parameters, so the description must compensate. It explains `reason` (recorded as a status-change audit entry, without touching content) but says nothing about `uid` or the cryptic `superseded_by`, leaving the most ambiguous parameter entirely undefined.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb+resource and immediately clarifies the non-obvious name 'forget' as 'Archive a memory (soft delete)'. It distinguishes soft-delete semantics from a hard delete by noting content is kept. It stops short of naming the actual sibling alternative (purge_memory) explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It describes what happens when the tool runs but never states when to choose it over alternatives like purge_memory, edit_memory, or set_confidence. There are no prerequisites or exclusions given, leaving the agent to infer selection from the behavior alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_diagramA

Read a diagram back: format='svg-interactive' to show it, 'json' to reason about it.

Formats: 'svg-interactive' (canvas drawing in a pan/zoom shell -- the one to SHOW), 'svg' (same drawing as a plain file, to attach or link), 'mermaid' (portable, but re-lays out and DISCARDS the arrangement the user made), 'text' (the prose projection), 'json' (the full graph with positions, notes and links -- the only round-trippable one, and the one to reason over).

Both SVG formats write the markup to a file and return its path plus a thin index of the steps; the payload is deliberately too small to draw from. The returned next_step says what to do with the path, at the point where it matters. help(command='get_diagram') has the rest.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
formatNomermaid

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses that both SVG formats write markup to a file and return only a path plus a thin index ('the payload is deliberately too small to draw from'), that mermaid DISCARDS the user's arrangement, and that `next_step` tells the caller what to do with the path. That is exactly the kind of non-obvious behavioral context annotations would otherwise provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key routing rule (which format for show vs. reasoning) is front-loaded in the first sentence, and the rest is organized as a compact format inventory followed by return behavior. Slightly verbose with parentheticals, but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param, no-output-schema, no-annotation read tool, the description covers format semantics, the actual return shape (file path + thin index + next_step), and defers detail to help(command='get_diagram'). Only the meaning of `uid` is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and there are no enums, so the description must define the format values — which it does thoroughly, including round-trippability and side effects per value. The `uid` parameter receives no explanation at all, leaving one of two params undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening 'Read a diagram back' gives a specific verb (read) plus resource (diagram), and the format list immediately differentiates this from write-oriented siblings like diagram_node, diagram_edge, and diagram_relayout. An agent can tell what it retrieves and in what shapes without opening anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Guidance is explicit per format: 'svg-interactive' is 'the one to SHOW', 'json' is 'the one to reason over', 'mermaid' is portable but re-lays out, 'text' is the prose projection. It stops short of naming when to prefer a sibling (e.g. `diagram` or `diagram_jump`) instead of calling this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_domain_caseA

Report the store's domain-casing policy.

Returns {"mode": "preserve"|"lower"|"upper"}. 'preserve' stores domains as written; 'lower'/'upper' coerce every domain to that case on write (a non-conforming domain is adjusted, not rejected, and the writer's result carries a domain_adjusted note). Read this before coining a new domain so its casing matches what will be stored.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it enumerates the returned mode values, explains what each mode means, and discloses a non-obvious behavioral rule — that a non-conforming domain is adjusted rather than rejected and the writer's result carries a domain_adjusted note. That is exactly the kind of cross-tool consequence an agent cannot infer elsewhere.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, return shape second, write-time consequence third, then the usage cue. Every sentence adds information; none restates the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No parameters, no output schema, and the description fills that gap by specifying the return payload and the semantics of each value, plus how it interacts with writes. Nothing needed 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate beyond the schema. Baseline for a 0-param tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Report the store's domain-casing policy.' It is immediately distinguishable from the sibling set_domain_case, which mutates rather than reads. An agent can classify the tool without opening anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit usage context: 'Read this before coining a new domain so its casing matches what will be stored.' That is a clear when-to-use trigger, though it never names the counterpart set_domain_case or states when not to call it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_memoryA

Fetch a single memory's full record, including its edit history and relations.

A diagram also comes back with its mermaid source, its per-node links and its jumps to and from other flows; any other memory comes back with referenced_by_diagrams, the flows that point a step at it -- so a note tells you which processes depend on it without a second lookup. A task also comes back with a task block: its goal, state, items (each with the memories linked to it) and comments, oldest first.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, and it does disclose substantial conditional behavior: a diagram returns mermaid source, per-node links and jumps, while other memories return referenced_by_diagrams, and tasks return a task block with goal, state, items and comments. That return-shape variance by memory type is genuinely useful context an agent cannot get elsewhere. It omits operational traits such as whether the call is read-only, permission requirements, and what happens when the uid is unknown.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary sentence is front-loaded and the per-type detail follows in a logical order. The middle sentence is dense and slightly awkward ('the flows that point a step at it'), but every clause conveys distinct return-shape information rather than padding. Well sized for the amount of conditional behavior being described.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe returns, and it does so thoroughly across the diagram, generic-memory, and task cases. The remaining gaps — uid semantics, not-found behavior, and read-only/permission expectations with no annotations present — are the main things an agent would still be guessing at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is a single required parameter, uid, and the schema provides 0% description coverage for it. The description never explains what a uid is, its format, or where an agent obtains one (e.g., from search or list_recent results). The only implicit signal is that it identifies 'a single memory,' which is thin for the one input the tool requires.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource — 'Fetch a single memory's full record' — which cleanly separates it from bulk siblings like search, list_by_domain, and list_recent. It also enumerates what 'full record' contains (edit history, relations), so the agent knows the depth of the fetch. It stops short of naming a specific alternative sibling to disambiguate against, which keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the agent can infer 'call this when you already have a uid and need the complete record,' and the 'without a second lookup' phrasing hints at avoiding follow-up calls. There is no explicit when-to-use/when-not guidance and no routing to alternatives such as search or get_relations for partial lookups. Adequate but leaves the agent to infer the decision boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_relationsA

List all relations (incoming and outgoing) for a memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears full responsibility for behavioral disclosure. It accurately states that the tool lists both incoming and outgoing relations, implying a read-only operation. However, it omits potential details like pagination or ordering, but for a simple list tool this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 8 words with no filler or redundancy. It is front-loaded with the action and resource, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter), and the existence of an output schema documenting return values, the description sufficiently covers its purpose. It clearly states what is listed (incoming and outgoing relations) and for which memory, meeting completeness needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It indicates that 'uid' is the unique identifier of a memory, adding basic context. However, it does not specify the expected format of the UID (e.g., UUID or string pattern), leaving some ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'list' and specifies the resource 'relations (incoming and outgoing) for a memory'. It clearly distinguishes from siblings like 'get_memory' (gets a single memory) and 'link_memories' (creates relations).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states it lists all relations for a memory, but provides no guidance on when to use it over alternatives like 'search' or 'list_by_domain'. No explicit when-not-to-use or prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

helpA

Explain the memai tools, read directly from their code docstrings.

Without arguments: every tool with its one-line summary, and which of them this process did not load (MEMAI_TOOLS). With command='': that tool's signature and its FULL documentation -- longer than the schema description, because the schema is paid for on every request and this is paid for when someone reads it.

ParametersJSON Schema
NameRequiredDescriptionDefault
commandNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it discloses that the no-arg mode also reports which tools this process did not load (MEMAI_TOOLS), and explains the docstring-vs-schema tradeoff. It doesn't state auth or rate-limit behavior, but for a read-only help tool that gap is minor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then the two modes. Mostly earning its place, though the parenthetical about schema cost being 'paid for on every request' is a bit of editorializing that could be trimmed without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-param help tool with no output schema and no annotations, the description covers both invocation modes and what each returns, which is what an agent needs to call it correctly. It stops short of describing the exact docstring format, but that is not essential to invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% (the 'command' param has no schema description), so the description must compensate. It does: command='<name>' selects a specific tool's signature and full documentation, versus an empty/omitted value returning the full list. The syntax format is given, though the exact accepted name set is not enumerated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Explain the memai tools, read directly from their code docstrings.' It is unmistakably the meta/help tool and cannot be confused with any sibling like search or recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly branches usage by input: 'Without arguments' returns the full tool list, and 'With command=<name>' returns that tool's signature and full docs. The conditions that select each mode are named directly, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_by_domainA

List memories for a domain and its subdomains, most recent first.

Fallback when search misses. domain is a path, matched from the outermost segment in: 'acme/x100' lists the module's own memories plus every routine under it. Pass subtree=False for what is filed at exactly that path and nowhere deeper.

A domain that matches no path is retried as a run of segments INSIDE one, so list_by_domain('p200') still finds the routine once it lives at 'acme/x100/p200'. The literal reading wins whenever it has rows, and an ambiguous name (the same code under two modules) covers both branches rather than picking one -- each row's domain says which branch it came from. list_domains() is the way to see the paths first.

status is 'active' (the default), 'archived' or 'all'. Closing a task archives its memory, so list_by_domain(domain, type='task', status='archived') returns the completed and cancelled tasks. A task row carries state (open, completed or cancelled) and progress {done, total}.

Returns {"results": [...], "est_tokens": N}. Content is snippet-truncated per result -- call get_memory(uid) for the full record; a result's est_tokens estimates what that full record costs, and the top-level est_tokens is the sum over the results.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainYes
statusNoactive
subtreeNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so richly: default status is 'active', closing a task archives its memory (so archived status surfaces completed/cancelled tasks), results are snippet-truncated, and get_memory(uid) is required for the full record. It also defines est_tokens semantics at both row and top level.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and keeps every paragraph earning its place; the path-matching and return-format details are non-obvious and necessary. It is dense and fairly long, but there is little fat to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description specifies the return shape ({"results": [...], "est_tokens": N}), the truncation behavior, and the escape hatch to get full records. For a filtered-list tool this is complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: 'domain' path matching (outermost-segment matching, subdomain inclusion, retry as a run of segments inside a path, ambiguity covering both branches), 'subtree' semantics, and 'status' values are all explained. 'type' is shown by example and 'limit' is the only parameter left unaddressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('List memories for a domain and its subdomains, most recent first') and immediately distinguishes itself from siblings: it is a fallback to 'search' and a complement to 'list_domains()'. An agent can tell what this tool does and where it sits in the family 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames itself as the 'Fallback when search misses' and points to list_domains() to discover paths first. It also explains the subtree=False case. It stops short of stating hard when-not-to-use conditions, but the routing context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_domainsA

List the domain tree: every path with its counts and latest activity.

Warm-up discovery. domain is free text and drifts over time (e.g. 'proj-1042' vs 'proj-1042-cache-warmup'), so this surfaces the paths actually in use instead of leaving you to guess one. Ordered by most recent activity.

Per entry: domain (the full path), parent, depth, count (filed at exactly this path), subtree (that plus everything nested under it), children, and implicit -- true for a level that exists only because something deeper is filed under it. Read subtree to pick the scope worth warming up: a parent holding nothing of its own can still be where the work is.

also and subtree_also are the same two counts for memories CROSS-LISTED here rather than filed here -- the cross-cutting subjects. A path with count 0 and also above it is one of those and nothing else: an end-to-end flow whose steps all live under other branches. Reads scoped to it return them all.

Casing may be enforced store-wide -- call get_domain_case() to see the active policy before coining a new domain.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so richly. It discloses ordering by most recent activity, implicit levels, cross-listed counts (also and subtree_also), and casing policy enforcement. For a zero-param read/list tool, this is substantial transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the main purpose in the first sentence, then proceeds through usage and output semantics. It is long and explains return fields despite an output schema existing, so some content is verbose, but the structure is logical and the extra detail is mostly useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a zero-param list tool with an output schema and no annotations, the description is complete. It covers purpose, discovery context, return-field meanings, cross-listing behavior, and the related casing-policy tool, leaving no major ambiguity for invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is no parameter schema for the description to clarify. Baseline for zero params is 4, and the description appropriately focuses on output semantics instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'List the domain tree: every path with its counts and latest activity.' It also frames the tool as warm-up discovery for surfacing domain paths in use, which distinguishes it from guessing or searching for a domain. The core purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: warm-up discovery, reading subtree to pick a scope worth warming up, and calling get_domain_case() before coining a new domain. It does not explicitly name when-not-to-use or compare against sibling tools like list_by_domain, but the intended context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_projectsA

The projects in this home, and which one every call here reads and writes.

A project is one SQLite file with its own memories, domains, relations and diagrams. The active one is switched in the admin dashboard, and a running server follows on its next call -- so every write's result names the project it landed in, and pulse() names the one it read. Each entry carries name, memories (the active rows) and active. Names are matched without regard to case wherever a tool takes one.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does meaningful work: it explains the active-project switching semantics, that running servers follow on the next call, that write results name their landing project, and that pulse() names the read project. It omits whether the list itself is read-only or paginated, but discloses the key behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is well front-loaded and states the core purpose, but the paragraph then expands into cross-tool narrative (pulse(), write results, case matching) that is tangential to a zero-argument list tool, adding length without directly serving invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter, no-output-schema list tool, the description supplies the field names returned (`name`, `memories`, `active`) and the semantics of the active project, which is enough to call and interpret it. It stops short of stating pagination or ordering behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline is 4. The description usefully adds case-insensitive name matching semantics that apply wherever a tool takes a project name, which is relevant context even though no parameter exists here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (projects in this home) and clarifies the scope that no parameter controls. It does not explicitly differentiate from the sibling list_domains, which lists a different resource type, but the resource is stated clearly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by describing what the tool returns and how the active project is switched (admin dashboard). There is no explicit when-to-use or when-not-to-use guidance, and no named alternatives like list_domains or move_to_project.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recentA

List the most recent active memories, optionally filtered by type/domain.

A domain covers its subdomains, and a bare deep segment resolves to the branches holding it (see list_by_domain); subtree=False narrows to that exact path.

Returns {"results": [...], "est_tokens": N}. Content is snippet-truncated per result -- call get_memory(uid) for the full record; a result's est_tokens estimates what that full record costs, and the top-level est_tokens is the sum over the results.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainNo
subtreeNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that content is snippet-truncated per result, explains that est_tokens on a result estimates the full-record cost while the top-level est_tokens is the sum, and directs the agent to get_memory for complete records. It omits ordering guarantees, pagination, and auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then domain-resolution nuance, then return-shape details. Every sentence carries information, though the est_tokens explanation is dense enough to require careful reading.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description supplies the return shape and truncation behavior, and it addresses three of four parameters. Only the `limit` parameter remains undocumented, which is a minor gap for a list tool with zero required arguments.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It adds real meaning for type/domain filtering and especially subtree (domain covers subdomains; subtree=False narrows to the exact path), but the `limit` parameter is never mentioned and no accepted `type` values are given.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list the most recent active memories) with a clear scope (optionally filtered by type/domain). It references the sibling list_by_domain for domain semantics, giving partial sibling differentiation, though it never contrasts itself against search or recall.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the name and the 'optionally filtered' clause, and it routes the agent to get_memory(uid) for full records. However, it never states when to prefer this over search, recall, or list_by_domain, so the agent must infer the selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_to_projectA

Carry memories from the active project into another one, and remove them here.

uids is comma-separated, domain a path (its subdomains and archived rows go too); give either or both. Each memory travels whole -- body, cross-listings, usage counts, edit history, the relations and diagram graph inside the slice -- into target, is checked there, and only then purged from the active project, after a backup of it is written.

dry_run is the default and moves nothing: it reports what would move, conflicts (uids target already holds, which stay here) and outside -- the relations, diagram links and jumps, superseded_by marks and [[uid]] references that cross the edge of the slice, all of which the move drops. Read that report with the user, then widen the slice or accept the loss BEFORE calling again with dry_run=False: the purge is irreversible short of the backup. create makes a target that does not exist yet. list_projects() names the projects there are.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidsNo
createNo
domainNo
targetYes
dry_runNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: the purge is irreversible short of the backup, a backup is written, conflicts (uids target already holds) stay put, and 'outside' edge artifacts (relations, diagram links/jumps, superseded_by marks, [[uid]] references) are dropped. This is precisely the destructive, lossy behavior an 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then parameters, then the dry_run workflow. Slightly dense with parentheticals and backticks, but every clause carries operational weight and nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-param destructive move with no annotations and no output schema, the description is close to complete: it covers scope, loss, backup, conflicts, target discovery, and the safe dry-run-first workflow. It doesn't explicitly describe the shape of the dry_run report fields beyond naming conflicts and outside, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and does: uids is comma-separated, domain is a path whose subdomains and archived rows go too, either or both may be given, dry_run's default and meaning are spelled out, and create makes a missing target. Meaningful semantics far beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: carry memories from the active project into another and remove them here. It goes beyond a simple rename by describing exactly what travels and what is purged, and names the sibling list_projects() as the way to discover targets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use and a strong workflow rule: dry_run defaults to reporting-only, read the report with the user, then widen the slice or accept the loss BEFORE calling again with dry_run=False. It also explains the create flag for non-existent targets. This is genuine when/how guidance, not inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

noteA

Save a general long-term memory (fact, decision, finding). Stored as type='note'.

Timeless knowledge -- retrieved by relevance, not recency. Bring it back with recall() (or search(type='note')); pending(type='note') lists the most recent ones as headers.

title: one line naming what this memory is about, in the words someone would look for it by. It is what a list shows instead of the opening of the body, and it outweighs every other field in search, so a title that repeats the type ("note about the parser") names nothing. At most 120 characters, and a name that needs more than that is summarizing the body instead of naming it.

content: ONE fact, and what a reader needs to use it -- what holds, where it holds, what it rules out. Retrieval ranks whole memories, so a body answering four questions comes back for all four and is read for one: write the second subject as its own memory, on its own domain, and connect the two with link_memories(). A [[uid]] typed inside a body is a reference a reader can follow, not an edge -- get_relations() and the graph do not see it until link_memories() creates one. Past a couple of thousand characters, a body is usually several memories written as one.

domain: the subject this belongs to, as a path from the outermost scope in ('acme/x100/p200'). File it as deep as the fact is specific -- a note about one routine goes on the routine, and still comes back when someone asks about the module or the product above it.

also: other domain paths this belongs to, comma-separated. domain is where the memory LIVES -- one path, one parent chain. also is for the subjects that cut ACROSS that tree: the same routine belongs to the module it runs in and to the end-to-end flow it is one step of, and neither of those is the other's ancestor. Every read scoped to any of those paths returns it. A path that domain already sits under is dropped as redundant -- the result echoes what was stored.

tags: comma-separated keywords and synonyms. Retrieval is BM25 over content, tags and domain paths, and tags weigh second only to the body, so they are where a memory becomes findable by words its own text never uses -- the identifier, the symbol, the error string, the plain-language phrasing someone will actually type. A memory with none is reachable only by quoting itself.

review_after: when this stops being safe to trust unchecked, as a date ('2026-11-01') or a span from today ('90d'). pulse() counts what is overdue in a scope as scope.stale and optimize_scan lists it. Leave it empty for anything that does not go stale -- most facts do not, and a date nobody meant is worse than none.

source_ref: what the fact came FROM -- a path, a URL, a table name -- so a later pass can check the claim against the thing itself instead of inferring what to check from the wording.

ParametersJSON Schema
NameRequiredDescriptionDefault
alsoNo
tagsNo
titleYes
domainNo
contentYes
sessionNo
source_refNo
review_afterNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so richly: retrieval is by relevance not recency, title outweighs all other fields in search, tags weigh second only to the body, a [[uid]] in the body does NOT create a graph edge until link_memories() is called, redundant `also` paths are silently dropped, and review_after drives pulse()'s scope.stale and optimize_scan. These are non-obvious side effects and ranking behaviors an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then a compact read-path line, then per-parameter blocks in schema order. Every sentence carries information, but the prose is long and occasionally discursive (e.g. the extended title rationale), which is defensible given 0% schema coverage but not maximally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter write tool with no annotations and no output schema, the description covers purpose, read paths, graph-edge semantics, and 7 of 8 parameters. Gaps remain: the `session` parameter is never explained, and the description does not state what the call returns (e.g. the echoed redundant-path behavior is mentioned but not the response shape).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with 8 parameters, so the description must compensate and largely does: it explains title (120-char cap, why repeating the type is useless), content (one fact, multi-subject bodies should be split), domain vs also (lives-on vs cuts-across, ancestor dedup), tags (BM25 synonym surfacing), review_after (date or span syntax), and source_ref. Only `session` goes undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource up front ('Save a general long-term memory (fact, decision, finding)') and pins the storage type ('Stored as type=note'), which is exactly what distinguishes it from the sibling type-specific savers (task, anti_pattern, reasoning). An agent can tell what this writes 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the read-side alternatives explicitly (recall(), search(type='note'), pending(type='note')) and gives a conditional rule for review_after ('Leave it empty for anything that does not go stale'). It stops short of saying when to prefer a different save tool (task/anti_pattern/checkpoint) or when not to use note at all, so it is clear context rather than full routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

optimize_runsA

List optimization runs with their review progress.

Read-only companion to optimize_stage: after staging, use this to see whether the user has applied/rejected your suggestions in the admin dashboard. Each run carries total/pending/applied/rejected counts, its note, and the safety-backup path once the first apply happened. Applying/rejecting stays in the dashboard by design -- the agent proposes, the human disposes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description fully discloses read-only nature, the counts, note, and safety-backup path, and the workflow division. Could be 5 but lacks explicit mention of no side effects beyond read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two paragraphs with front-loaded purpose and concise supplementary context. Slightly wordy but every sentence adds value; no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers purpose, usage timing, output contents, and relationship to sibling tool, leaving no gaps for this simple list tool with no parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, baseline is 4. The description adds value by explaining the output fields (counts, note, backup path) which enriches understanding beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'optimization runs', and distinguishes itself from optimize_stage by specifying it's a read-only companion for post-staging review.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'after staging, use this to see whether the user has applied/rejected your suggestions in the admin dashboard' and clarifies that applying/rejecting stays in the dashboard, effectively guiding when and when not to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

optimize_scanA

Dump the memory corpus compactly so you can plan a curation pass.

Step 1 of the "optimize my memories" workflow: every memory's curation-relevant fields, the relation edges among them, usage counts, dedup and domain hints, and per-memory anchors (URLs, paths, identifiers) to check against live facts. Read it, then stage what you decided with optimize_stage.

Start with what the store already says is suspect: due: true on a memory means its own writer dated it for a recheck and the date has passed, and source_ref says what to check it against.

recalls and stats.never_recalled are NOT that. A low count means unproven, not useless -- a memory about a rare subject looks exactly like a memory nobody wants, and the rare subject is frequently the reason the store is there. Use the aggregate to judge the STORE and never a single row: do not propose archiving something because it is unread.

The listing is slim so a big store fits one response, and a page ends early at an internal size budget -- truncated means page onward with offset + count. since limits the scan to a delta for recurring passes; full=True keeps whole bodies.

BEFORE PROPOSING ANY CHANGE, CHECK IT AGAINST LIVE FACTS, and record what you checked in each suggestion's verified. Destructive kinds are rejected without it. help(command='optimize_scan') has the rest: what every hint means, how since stays cross-window, and what "live facts" covers per memory type.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo
typeNo
limitNo
sinceNo
domainNo
offsetNo
include_archivedNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so heavily: it explains that the listing is slim, that pages can end early at an internal size budget, and that `truncated` signals continued paging. It explains hint semantics like due/source_ref and repeats a critical safety rule about verification before destructive proposals. Missing is the pagination/size mechanics spelled out precisely, but the safety and truncation behaviors are well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the purpose and step-1 framing, which is good, but the description is long and repetitive across paragraphs, with a mid-text all-caps warning and repeated emphasis. Some sentences earn their place; others (the recalls/stats paragraph) are defensive and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter read tool with no output schema and no annotations, the description covers purpose, workflow placement, hint semantics, and a critical verification rule. However, because there is no output schema, the definition does not fully specify the returned listing shape or all parameter behaviors, and it explicitly offloads detail to the help tool. That deferral leaves the standalone definition incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only meaningfully explains `since` (delta scans), `full` (whole bodies), and `truncated`/offset/count paging. Parameters `type`, `domain`, `limit`, `offset`, and `include_archived` are barely or not addressed, and the description defers to help(command='optimize_scan') for the rest. This leaves several param semantics implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: dump the memory corpus compactly for a curation pass. It positions itself as step 1 of a named workflow and names the sibling (optimize_stage) to use next. It is distinguishable from dedup_scan and other read siblings, though the 'dump' framing is slightly informal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit context: use as step 1 of the optimization workflow, then stage with optimize_stage. It also warns not to treat low recall counts as archiving signals. It lacks explicit when-not-to-use guidance relative to siblings like search or get_memory, but the workflow framing is unusually clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

optimize_stageA

Stage a batch of curation suggestions for human review in the dashboard.

Step 2 of the "optimize my memories" workflow. NOT applied here: the user reviews and applies or rejects each one in the admin dashboard, which backs up before the first apply and can undo any of them.

Each suggestion is {"kind", "target_uid", "payload", "rationale", "verified"}. Kinds: compact/reword {"new_content"}, retag {"tags"}, redomain {"domain"}, crosslist {"also": [...]}, set_confidence {"confidence"}, review {"review_after"} (a date or a span like '180d'; '' clears it), archive {"reason"}, link {"from_uid","to_uid", "relation_type"}, merge {"keep_uid","drop_uid"}, distill {"source_uids","new_type","new_content","title"}. link/merge derive target_uid from the payload and distill creates its target -- omit it for those.

Destructive kinds (archive, set_confidence=contradicted, merge, distill) require a non-empty verified describing the live-facts check behind them. Invalid suggestions are skipped and reported in errors; the rest are staged. Returns {run_id, staged, errors}.

note is one short summary of the pass, at most 250 characters; a longer one raises and stages nothing. What a single suggestion needs said belongs in its own rationale and verified, which are not capped. help(command='optimize_stage') explains each kind in full.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
suggestionsYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so richly: it discloses that nothing is applied, that the dashboard backs up before the first apply and can undo, that destructive kinds require a non-empty `verified`, that invalid suggestions are skipped and reported in `errors`, and that an over-long `note` raises and stages nothing. This is exactly the mutation/safety context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and workflow position, then the suggestion contract, then failure modes. The kind enumeration is long but each entry carries unique information the schema does not, so little is wasted; density is high but justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description still supplies the return shape ({run_id, staged, errors}), the skip-and-report error semantics, the destructive-verification requirement, and a pointer to help(command='optimize_stage') for deeper kind documentation. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and it does: it fully documents the shape of each suggestion (kind, target_uid, payload, rationale, verified), enumerates every kind with its payload fields, explains target_uid derivation for link/merge/distill, and gives `note`'s 250-character cap and raise behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — staging curation suggestions for human review — and immediately positions itself as 'Step 2 of the "optimize my memories" workflow', which separates it from the scan/apply siblings. An agent knows this stages rather than applies 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly states the context (step 2 of the optimize workflow) and an explicit when-not: 'NOT applied here: the user reviews and applies or rejects each one in the admin dashboard.' It does not name the specific sibling to run first (e.g. optimize_scan), leaving sequencing to inference, so it stops 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.

optimize_statusA

Inspect one optimization run: every suggestion and its decision.

Read-only. Returns the run header plus each suggestion's kind, target_uid, payload, rationale, verified, status (pending/applied/rejected) and decided_at -- so you can tell which proposals landed, follow up on rejected ones, or build on applied ones in a later pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It declares read-only behavior and lists all returned fields (run header, suggestion details including decision status), giving good insight into what the tool provides without side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose in the first sentence. The second sentence is informative but slightly verbose listing fields; could be more concise. No wasted words overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter and no output schema, the description is adequate. It explains what the tool returns. However, it lacks context on how run_id is obtained, error handling for invalid IDs, and doesn't mention pagination or large runs, leaving some gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, 'run_id', has no description in the schema (0% coverage). The tool description does not explain what run_id represents or how to obtain it (e.g., from optimize_runs), leaving the agent with minimal guidance beyond the integer type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific verb 'inspect' and the resource 'optimization run'. It distinguishes itself from siblings like 'optimize_runs' (lists runs) and 'optimize_scan' (scans) by focusing on a single run's details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this tool is for inspecting a single run in detail, providing context on its scope. However, it lacks explicit when-to-use vs alternatives, such as when you would use 'optimize_scan' instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pendingA

What is still open in a scope: counts per category, or one category's headers.

Without type: {"categories": [{"type", "count"}, ...]} for task, anti_pattern, handoff, note and diagram, in that order, leaving out the empty ones, plus "pinned" -- the same shape, counting the memories a person pinned as mandatory reading -- when any pin is in scope. A pinned memory still counts in its category. With type: {"type", "total", "items", "next_offset"} -- one page of headers (uid, title, domain, est_tokens; a task adds progress {done, total} and doing, the keys of its items in progress), newest first, a task by its latest item update. Open a header with get_memory(uid). next_offset is absent on the last page.

pinned=true narrows the page to the pins of that type, and also accepts checkpoint and reasoning. Every pin listed is read with get_memory(uid) before acting, none skipped.

Pending means: a task that is open; an active anti_pattern, handoff or note that is not contradicted; an active diagram.

domain covers its subdomains and what is cross-listed there; empty is the whole project. A pin is in scope when it is global, or when the memory's domain or one of its also paths is the asked domain or above it; the whole project counts global pins only. limit is 1 to 50. Any other type is an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainNo
offsetNo
pinnedNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it defines 'pending' semantics, specifies output shapes for both modes, describes pagination ('next_offset' absent on last page), states limit range (1-50), and notes that invalid types produce an error. It does not explicitly state read-only nature or side effects, but the query nature is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense and long, but given the absence of schema descriptions and output schema, most content is necessary. It is front-loaded with the core purpose, though the paragraph style could be more structurally organized (e.g., bullet points).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 undocumented parameters, no annotations, and no output schema, the description is quite complete: it covers output formats, parameter meanings, scope rules, pagination, and error behavior. The main missing piece is explicit guidance on when to use this tool versus sibling listing tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate fully. It explains every parameter: type (empty vs. with type), limit (1-50), domain (covers subdomains and cross-listing, empty means whole project), offset (pagination via next_offset), and pinned (narrows to pins, accepts checkpoint/reasoning). This is thorough and leaves no ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific purpose: counting open items per category or listing headers for one category. It is clear what the tool does, but does not explicitly differentiate itself from siblings like search, list_by_domain, or list_recent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides follow-up guidance ('Open a header with get_memory(uid)'), but gives no guidance on when to choose this tool over alternatives such as search or list_by_domain. The agent must infer appropriate usage contexts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pulseA

Session warm-up: the latest checkpoint, what is pending, and what to read next.

Returns {project, latest_checkpoint, pending, pinned, read_next, scope}.

latest_checkpoint is picked by created_at DESC, never by similarity -- a similarity-ranked top-1 can return a stale checkpoint over a same-day one, which is exactly the failure mode this avoids. It is returned in full (that's the point of pulse), with its relations attached so linked memories are visible without a separate get_relations call, and carries est_tokens, what this response already spent on it.

pending is the categories list pending(domain) returns without a type: a count per category (task, anti_pattern, handoff, note, diagram), leaving out the empty ones. read_next is the instruction to follow with it: open tasks first, then pending(domain, type=...) for each other category, before acting. It is "" when nothing is pending. A pulse lists no memories besides the checkpoint; pending(domain, type=...) lists headers and get_memory(uid) opens one.

pinned counts the pins in scope the same way (see pending()); when it is non-empty read_next asks for them before anything else.

domain warms up a path and everything under it, so pulse('acme/x100') is the module-wide brief and pulse('acme/x100/p200') the routine's. A domain that names only the deep end of a path ('p200') is resolved to the branches it sits in -- scope.paths reports which, and an ambiguous name resolves to ALL of them.

scope is the rest of the brief: what the scope HOLDS. scope.by_type counts every memory per type and scope.subdomains says which level it is sitting in (own = filed there, subtree = with its descendants). Read them as the drill-down plan: search(query, domain=...) or list_by_domain(domain, type=..., limit=...) on the child that holds what you need. A pulse is the state of a scope, never its contents.

scope.stale is the one thing here about DECAY rather than contents: how many memories in the scope carry a review_after date that has passed. Present only when non-zero. It means somebody who knew the subject said when to look again and nobody has -- optimize_scan lists which ones, with their source_ref.

A scope holds what is CROSS-LISTED into it as well as what is filed there, so warming up an end-to-end flow brings back the routines that are steps of it wherever they live. scope.also counts how much of the brief arrived that way, and a subdomain carries its own also -- present only when non-zero, so a store that never cross-lists never sees the field.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and largely meets it: it discloses the ordering rule (created_at DESC, never similarity) and why, that the checkpoint is returned in full with relations attached, token cost via est_tokens, and that fields like stale/also appear only when non-zero. It never states auth/permission requirements or whether the call mutates anything, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-sentence purpose and the return-shape list, then organized field by field, so it is scannable despite its length. It is verbose for a one-parameter tool and repeats constructions like 'present only when non-zero' across pinned, stale, and also, which costs it the top score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must define the return payload -- and it enumerates every field (project, latest_checkpoint, pending, pinned, read_next, scope with by_type/subdomains/stale/also) and how to interpret each. Nothing an agent needs to consume the response is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single `domain` param is undocumented in the schema, so the description must compensate -- and it does in depth: domain warms up a path and everything under it, deep-only names are resolved to their branches with scope.paths reporting the result, and ambiguous names resolve to ALL branches.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a concrete verb-plus-resource framing ('Session warm-up: the latest checkpoint, what is pending, and what to read next') and immediately distinguishes itself from siblings by stating a pulse 'lists no memories besides the checkpoint' while pending/get_memory/search/list_by_domain do the listing. An agent can tell exactly what this returns versus neighboring tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit session-start trigger, then routes the agent onward: 'open tasks first, then pending(domain, type=...) for each other category, before acting,' with read_next codifying the sequence. It also names the alternatives and their division of labor (pending = headers, get_memory(uid) = the record, search/list_by_domain = contents).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

purge_memoryA

PERMANENTLY delete a memory + its edit history + relations. Irreversible.

Use forget() instead unless the user explicitly asked to permanently remove data -- forget() is reversible (archived, content kept), this is not. Guardrail: confirm_phrase must exactly equal "DELETE ", typed by the user in their own message. Do not construct this string yourself from an inferred "yes"/"confirm" -- it must come from the user actually stating the uid back.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
confirm_phraseYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses the destructive irreversible nature, the exact deletion scope, and the confirm_phrase requirement. However, it does not mention authorization needs or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a few sentences long, each adding value. It is well-structured with a warning and guidelines, though slightly verbose. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, no annotations, and only 2 parameters, the description is fairly complete. It covers purpose, usage, and parameter semantics. Missing information about return values or permissions, but still adequate for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description adds critical meaning: it explains that confirm_phrase must exactly equal 'DELETE <uid>' and must come from the user's own message, and that uid identifies the memory. This partially compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool permanently deletes a memory along with its edit history and relations, using specific verbs and resources. It distinguishes itself from the sibling 'forget' tool by highlighting irreversibility.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises using 'forget' instead unless permanent removal is requested, and gives a strict guardrail for the confirm_phrase parameter, preventing the agent from constructing the confirmation string itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reasoningA

Record an analysis worth keeping: what was thought, and what it settled.

For the PROCESS, not the fact it produced -- note() takes the fact. Stored as type='reasoning'; filter search/list_* with type='reasoning' to get these back. ONE analysis per memory: a second hypothesis tested in the same session is its own reasoning(). See note() on what a body holds and when it is two memories.

title: one line naming what this memory is about, in the words someone would look for it by. It is what a list shows instead of the opening of the body, and it outweighs every other field in search, so a title that repeats the type ("note about the parser") names nothing. At most 120 characters, and a name that needs more than that is summarizing the body instead of naming it.

hypothesis: what you believed going in, as a claim that could be wrong. reasoning: how you tested it -- what you read, ran or compared. result: what came back. The measurement, not the interpretation. revised_belief: what you believe now, and where it differs from the hypothesis. Say plainly when the hypothesis survived unchanged. next_time: what someone hitting this again should do differently.

also, review_after and source_ref behave as in note().

tags carries the synonyms the body never uses: retrieval is BM25 over content and tags, so a memory with none is reachable only by quoting itself. See note() for what belongs there.

ParametersJSON Schema
NameRequiredDescriptionDefault
alsoNo
tagsNo
titleYes
domainNo
resultYes
sessionNo
next_timeYes
reasoningYes
hypothesisYes
source_refNo
review_afterNo
revised_beliefYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does much of it: it discloses the storage type ('type=reasoning'), the retrieval mechanism ('BM25 over content and tags'), and search-ranking behavior ('a title ... outweighs every other field in search'). It omits auth/permission needs, error behavior, and any body-size limits, so it falls short of full behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and the note() routing are front-loaded, and the required-field explanations are laid out in sequence. It is on the long side — the title paragraph in particular runs several sentences — but nearly every sentence carries field-level or retrieval information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, 6-required mutation tool with no annotations and no output schema, the description supplies purpose, storage semantics, retrieval behavior, and field meanings. The gaps are domain and session semantics, and nothing about failure or permission behavior, but the core calling information an agent needs is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and largely does: it gives explicit semantics for all six required fields (title, hypothesis, reasoning, result, revised_belief, next_time) plus tags, and delegates also/review_after/source_ref to note(). domain and session, however, are never explained anywhere, leaving two of twelve parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Record an analysis worth keeping: what was thought, and what it settled') and immediately distinguishes itself from the closest sibling: 'For the PROCESS, not the fact it produced -- note() takes the fact.' An agent can route between reasoning() and note() 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (note()) and the condition that selects it, plus the cardinality rule ('ONE analysis per memory: a second hypothesis tested in the same session is its own reasoning()'). It also tells the agent how to retrieve these later (filter search/list_* with type='reasoning'), which is explicit when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recallA

Recall long-term knowledge saved with note() (type='note').

The dedicated verb for "bring back what I noted": a BM25 search scoped to type='note', ranked by relevance -- which is what you want for timeless facts/rules/decisions. This (or search(type='note')) is how notes come back by relevance; pending(type='note') lists the newest.

Returns {"results": [...], "est_tokens": N}. Content is snippet-truncated -- call get_memory(uid) for the full record; a result's est_tokens estimates what that full record costs, and the top-level est_tokens is the sum over the results.

domain scopes to a path and everything nested under it, and resolves a bare deep segment the same way search() does. Results carry the same succeeded_by / collapsed annotations search() explains.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
domainNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it names the retrieval mechanism (BM25 scoped to type='note', relevance-ranked), the return shape ({"results": [...], "est_tokens": N}), the truncation behavior of snippets, the meaning of both the per-result and top-level est_tokens, and the domain path-resolution semantics. That is substantially more than the structured fields provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and routing, then return format, then parameter notes. Mostly earns its length, though phrases like 'which is what you want for timeless facts/rules/decisions' are editorial filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations, so the description must supply everything, and it covers returns, truncation, token cost, and the follow-up tool for full records. The only gap is the unexplained `limit` parameter, which is minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It gives real meaning for `domain` (scopes to a path plus everything nested, resolves bare deep segments like search()) but says nothing about `limit` (default 10) or `query` syntax, leaving two of three parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('recall long-term knowledge saved with note()') and immediately distinguishes itself from siblings search(type='note') and pending(type='note'). An agent can tell exactly what this tool is for 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use this (or search(type='note')) to bring notes back by relevance, use pending(type='note') for newest, and use get_memory(uid) when the truncated snippet isn't enough. When-to-use and alternatives are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_confidenceB

Set a memory's confidence: unverified | confirmed | contradicted.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
confidenceYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided; description does not disclose behavioral traits such as whether the mutation is destructive, permissions required, or error handling. The tool modifies a memory, but side effects are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, direct and to the point, no redundant information. Efficiently conveys the core action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple mutation tool with no output schema or annotations, the description covers the basic purpose and allowed values. However, it lacks details on return value, error conditions, and behavioral context, leaving gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description must compensate. Description lists the three confidence values, aiding understanding of the 'confidence' parameter, but does not explain the 'uid' parameter (e.g., it identifies a memory). Provides partial semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool 'Set a memory's confidence' and lists the three allowed values (unverified, confirmed, contradicted). This distinguishes it from sibling tools like edit_memory or forget.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. Does not mention prerequisites (e.g., memory must exist) or scenarios where it is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_domain_caseA

Set the store's domain-casing policy. mode: 'preserve' | 'lower' | 'upper'.

'preserve' keeps free-text casing; 'lower'/'upper' coerce every domain written from now on to that case. This only governs new writes -- to bring already-stored domains into line, run the "Normalize domains" action in the admin dashboard (it previews collisions before merging variant spellings). Returns the stored {"mode": ...}.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden and does so: it discloses the forward-only scope ('only governs new writes'), the separate remediation path, the collision-preview behavior of that path, and the return value. This is rich behavioral context rarely seen.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb, then modes, then the critical caveat. Slightly longer than minimal but every clause carries new information about scope or remediation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation tool with no annotations and no output schema, the description supplies everything an agent needs: valid values, effect semantics, scope limitation, and return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and no enum is defined in the schema, so the description must define the parameter. It does precisely: lists all three legal values and explains the effect of each, compensating fully for the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Set the store's domain-casing policy') and enumerates the exact policy values. Clearly distinguishable from siblings like get_domain_case or list_domains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains what each mode does and, critically, the boundary condition: this only governs new writes, and existing domains require a separate admin action. It does not explicitly name a sibling alternative, but the constraint is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

taskA

Open a task: a goal and a checklist, kept until its items are closed.

Stored as type='task'. Work it with task_item(), grow it with task_add() and discuss it with task_comment(); it archives itself once every item is done or dropped, and pending() lists the open ones.

title: one line naming what this task delivers, in the words someone would look for it by. At most 120 characters.

goal: what done looks like, in a sentence or two.

items: one checklist item per line, blank lines ignored. At most 50 items of 300 characters each. Each gets a key (i1, i2, ...) that task_item() takes back.

also: other domain paths this belongs to, comma-separated -- the cross-cutting subjects beside the one it is filed under. See note().

tags carries the synonyms the body never uses. The type name is not added for you: a word every task carries ranks no task above another. See note() for what belongs there.

ParametersJSON Schema
NameRequiredDescriptionDefault
alsoNo
goalYes
tagsNo
itemsYes
titleYes
domainNo
sessionNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses storage ('type=task'), the auto-archive lifecycle ('archives itself once every item is done or dropped'), and generation of stable item keys (i1, i2) consumed by task_item(). It omits any mention of permissions, failure modes, or whether the task is visible to other sessions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and lifecycle, then parameter-by-parameter detail in short labeled blocks. A few asides (the repeated 'See note()', the remark about the type name not being auto-added) add length, but each carries actionable guidance rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter write tool with no annotations and no output schema, the description covers the creation semantics, limits, key generation, and lifecycle well. The two gaps are the undocumented domain and session parameters, which an agent would have to guess at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it documents five of seven parameters with real semantics: title (one line, ≤120 chars), goal, items (one per line, ≤50 items of ≤300 chars, keyed i1...), also (comma-separated cross-cutting domains), and tags (synonyms not in the body, with a rationale). It leaves domain and session entirely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and scope: 'Open a task: a goal and a checklist, kept until its items are closed.' It also names the sibling tools that operate on the created task (task_item, task_add, task_comment, pending), so an agent can distinguish it from those 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes follow-up work: 'Work it with task_item(), grow it with task_add() and discuss it with task_comment(); ... pending() lists the open ones.' This tells the agent both when to use this tool and which alternatives to use for the adjacent operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_addB

Append items to a task, one per line; a closed task reopens.

Returns the keys the new items got, and the progress.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
itemsYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and it does disclose two meaningful behaviors: items are appended rather than replacing (one per line) and a closed task reopens — an important side effect. It still omits permissions, ordering, and whether duplicate items are deduplicated, so it is partial rather than complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight, front-loaded sentences with no filler; the primary action leads and the return value follows. Slightly terse terms like 'keys' and 'progress' go undefined, which costs a point but the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers input format, the reopen side effect, and return values in place of a missing output schema, which is decent for a two-parameter tool. It still leaves the uid parameter and any sibling differentiation unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It clarifies the 'items' parameter format ('one per line,' implying a newline-separated string), which the bare schema does not, but leaves 'uid' entirely unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: 'Append items to a task,' and adds the notable qualifier that a closed task reopens. It is clear what the tool does, but it does nothing to distinguish itself from siblings like task, task_item, or task_comment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance or reference to alternatives. An agent choosing between task_add, task_item, and task_comment gets no routing help, only a description of mechanics once the tool is already selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_commentB

Comment on a task, or on one of its items when item names a key.

A comment never edits the task's content, so it carries what the checklist cannot: why an item is blocked, what a review said.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
bodyYes
itemNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses that a comment never edits task content (purely additive), but says nothing about permissions, whether comments are editable/removable, or how they are returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with purpose and scoping. The second sentence carries a slightly editorial tone but still earns its place by justifying the tool's distinct value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation-free tool with no annotations and no output schema, the description covers intent and the `item` selector but omits return behavior and any constraints on comment content or targets. Adequate but with clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It meaningfully explains the optional `item` parameter's role as a key targeting a checklist item, but `uid` and `body` semantics are left to name inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (comment) and resource (a task or one of its items), and clarifies the `item` selector. It is distinguishable from the sibling `task_item`/`task` tools, though it doesn't explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies when to use it — capture rationale the checklist can't hold, like why an item is blocked or what a review said. But there is no explicit when-not guidance or named alternative, so the routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

task_itemA

Update one item of a task: its state, a comment on it, memories linked to it.

item: the key task() returned, such as i3 or 3.

state: todo, doing, done or dropped. The write that closes the last open item archives the task (archived in the result); one that reopens an item reopens the task.

comment: a remark on this item -- what blocked it, what was decided.

related: comma-separated uids of memories this item produced or depends on. An unknown uid refuses the whole call, and nothing is written.

Give at least one of state, comment and related. They apply together, or not at all.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
itemYes
stateNo
commentNo
relatedNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the archival side effect of closing the last open item, the reopen-on-reopen behavior, and atomicity ('An unknown uid refuses the whole call, and nothing is written'). It omits permission/auth requirements and any return-shape detail beyond 'archived in the result'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then a compact per-parameter glossary that maps cleanly to the schema properties. Each sentence carries information; the only mild redundancy is restating 'They apply together, or not at all' after the unknown-uid atomicity note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter, unannotated, no-output-schema mutation tool the description is strong on state/comment/related semantics and side effects, but leaves the required uid parameter undefined and gives no sense of the returned payload beyond the 'archived' flag.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate; it thoroughly explains item (key format, examples i3/3), state (enum-like values), comment, and related (comma-separated uids, failure semantics). But the required parameter uid is never defined anywhere, leaving a required field undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Update one item of a task' and enumerates the three updatable facets (state, comment, related). An agent can tell it apart from task_add and task, though it never explicitly names or routes to the sibling task_comment, which overlaps with the comment facet.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a hard precondition ('Give at least one of state, comment and related') and describes the archival/reopen consequences of state transitions. However, it never states when to prefer this tool over task_comment or task_add, so selection guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

timelineA

What else was being written around one memory, in creation order.

For the question search cannot ask: not what mentions this record, but what was being written when it was. Neighbours are picked by time alone, so they come back whether or not they share a word with the anchor -- around a checkpoint, that is the notes and pitfalls of the same stretch of work.

One of uid or query is required. uid names the anchor outright; query searches for it and takes the top hit (the same search search() runs, scoped by domain/type). Give both and uid wins. The response reports anchored_by ('uid' or 'query') and the whole anchor record, so which record the timeline is built around is never a guess.

Returns {"anchored_by": ..., "anchor": {...}, "before": [...], "after": [...]}: before is the before records created immediately before the anchor and after the after records created immediately after it, both oldest first, so before + [anchor] + after reads straight down the clock. Neither list contains the anchor.

domain and type narrow the NEIGHBOURHOOD, not the anchor: a memory named by uid comes back as named, and the records around it are the ones matching the filters. domain covers a path and everything under it, plus what is cross-listed into it, and resolves a bare deep segment the way the other scoped reads do. Archived records are left out of the neighbourhood, as everywhere else by default.

Each record is snippet-truncated with est_tokens for its full content -- call get_memory(uid) to open one.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidNo
typeNo
afterNo
queryNo
beforeNo
domainNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and mostly succeeds: neighbour selection is by time only, archived records are excluded from the neighbourhood, output is snippet-truncated with est_tokens, and lists are ordered oldest-first with the anchor excluded. It does not mention permissions, error behaviour when query matches nothing, or limits, which keeps it short of 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and the returns block earns its place given no output schema, but the prose is leisurely and repeats the anchor/neighbour distinction in several forms ("Neighbours are picked by time alone," then "domain and type narrow the NEIGHBOURHOOD, not the anchor"). Reduce without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with no annotations and no output schema, the description covers the return shape (anchored_by, anchor, before, after), ordering, anchor inclusion/exclusion, filtering scope, archiving defaults, and truncation. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate and largely does: it defines before/after counts and ordering, the uid/query precedence, and clarifies that domain/type filter the neighbourhood rather than the anchor (including path-prefix, cross-listing, and bare-segment resolution). The `type` parameter's accepted values are never enumerated, leaving a gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource (the records created immediately around one anchor memory, in creation order) and explicitly separates itself from search: "not what mentions this record, but what was being written when it was." An agent can distinguish this from search/recall/list_recent 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the condition that selects this tool versus search (semantic neighbours vs temporal neighbours), specifies the uid-vs-query requirement and precedence ("Give both and uid wins"), and routes to get_memory for full content. Alternatives and exclusions are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unfile_domainA

Drop one of a memory's cross-listings. Does not touch where it is filed.

Matched on the exact path: dropping 'acme' leaves a separate membership in 'acme/x100' alone, because that is a different scope. Returns {"uid": ..., "also": [...]} with what remains.

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
domainYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the exact-path matching semantics ('acme' vs 'acme/x100' are separate scopes) and the return shape, which is meaningful behavioral context. It doesn't state reversibility or permission requirements, keeping it just short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then the scoping caveat, then the return shape. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param mutation with no annotations and no output schema, the description covers effect, matching semantics, scope examples, and return shape. Missing only permission/reversibility notes, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies that 'domain' is matched on exact path and gives a concrete example distinguishing scopes, which adds real meaning beyond the bare 'uid'/'domain' schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Drop') and resource ('cross-listings' / membership), and explicitly distinguishes from its inverse concept by saying it 'Does not touch where it is filed.' This separates it from move_to_project and link_memories.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clear context: removes a cross-listing without affecting primary filing. The 'Does not touch where it is filed' clause implicitly signals when-not-to-use (for moving, use move_to_project), but no sibling tool is named explicitly.

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. 7 tool updatesv0.6.0
    • Removedhandoff
    • Changedlist_by_domain1 field changed
      • addedInput schema / properties / status
        Added value: +{
        +  "default": "active",
        +  "title": "Status",
        +  "type": "string"
        +}
    • Addedpending
    • Addedtask
    • Addedtask_add
    • Addedtask_comment
    • Addedtask_item
  2. 24 tool updatesv0.1.1
    • Addedalso_domain
    • Changedanti_pattern6 fields changed
      • addedInput schema / properties / also
        Added value: +{
        +  "default": "",
        +  "title": "Also",
        +  "type": "string"
        +}
      • addedInput schema / properties / review_after
        Added value: +{
        +  "default": "",
        +  "title": "Review After",
        +  "type": "string"
        +}
      • addedInput schema / properties / source_ref
        Added value: +{
        +  "default": "",
        +  "title": "Source Ref",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "default": "",
        +  "title": "Tags",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "pattern",
        -  "why_wrong",
        -  "instead"
        -]New value: +[
        +  "title",
        +  "pattern",
        +  "why_wrong",
        +  "instead"
        +]
    • Changedcheckpoint4 fields changed
      • addedInput schema / properties / also
        Added value: +{
        +  "default": "",
        +  "title": "Also",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "default": "",
        +  "title": "Tags",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "intent",
        -  "established",
        -  "pursuing",
        -  "open_questions"
        -]New value: +[
        +  "title",
        +  "intent",
        +  "established",
        +  "pursuing",
        +  "open_questions"
        +]
    • Addeddiagram
    • Addeddiagram_edge
    • Addeddiagram_jump
    • Addeddiagram_link
    • Addeddiagram_node
    • Addeddiagram_relayout
    • Changededit_memory6 fields changed
      • addedInput schema / properties / mode
        Added value: +{
        +  "default": "replace",
        +  "title": "Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / new_content / default
        Added value: +""
      • addedInput schema / properties / source_ref
        Added value: +{
        +  "default": "",
        +  "title": "Source Ref",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "default": "",
        +  "title": "Tags",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "default": "",
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "uid",
        -  "new_content"
        -]New value: +[
        +  "uid"
        +]
    • Addedget_diagram
    • Addedget_domain_case
    • Changedhandoff4 fields changed
      • addedInput schema / properties / also
        Added value: +{
        +  "default": "",
        +  "title": "Also",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "default": "",
        +  "title": "Tags",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "content"
        -]New value: +[
        +  "title",
        +  "content"
        +]
    • Changedlist_by_domain2 fields changed
      • addedInput schema / properties / subtree
        Added value: +{
        +  "default": true,
        +  "title": "Subtree",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_by_domainOutput",
        -  "type": "object"
        -}New value: +null
    • Addedlist_projects
    • Changedlist_recent2 fields changed
      • addedInput schema / properties / subtree
        Added value: +{
        +  "default": true,
        +  "title": "Subtree",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "list_recentOutput",
        -  "type": "object"
        -}New value: +null
    • Addedmove_to_project
    • Changednote5 fields changed
      • addedInput schema / properties / also
        Added value: +{
        +  "default": "",
        +  "title": "Also",
        +  "type": "string"
        +}
      • addedInput schema / properties / review_after
        Added value: +{
        +  "default": "",
        +  "title": "Review After",
        +  "type": "string"
        +}
      • addedInput schema / properties / source_ref
        Added value: +{
        +  "default": "",
        +  "title": "Source Ref",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "content"
        -]New value: +[
        +  "title",
        +  "content"
        +]
    • Changedreasoning12 fields changed
      • addedInput schema / properties / also
        Added value: +{
        +  "default": "",
        +  "title": "Also",
        +  "type": "string"
        +}
      • removedInput schema / properties / content
        Removed value: -{
        -  "title": "Content",
        -  "type": "string"
        -}
      • addedInput schema / properties / hypothesis
        Added value: +{
        +  "title": "Hypothesis",
        +  "type": "string"
        +}
      • addedInput schema / properties / next_time
        Added value: +{
        +  "title": "Next Time",
        +  "type": "string"
        +}
      • addedInput schema / properties / reasoning
        Added value: +{
        +  "title": "Reasoning",
        +  "type": "string"
        +}
      • addedInput schema / properties / result
        Added value: +{
        +  "title": "Result",
        +  "type": "string"
        +}
      • addedInput schema / properties / review_after
        Added value: +{
        +  "default": "",
        +  "title": "Review After",
        +  "type": "string"
        +}
      • addedInput schema / properties / revised_belief
        Added value: +{
        +  "title": "Revised Belief",
        +  "type": "string"
        +}
      • addedInput schema / properties / source_ref
        Added value: +{
        +  "default": "",
        +  "title": "Source Ref",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "default": "",
        +  "title": "Tags",
        +  "type": "string"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "content"
        -]New value: +[
        +  "title",
        +  "hypothesis",
        +  "reasoning",
        +  "result",
        +  "revised_belief",
        +  "next_time"
        +]
    • Changedrecall2 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +10
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "recallOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsearch2 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -30New value: +10
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "items": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "title": "Result",
        -      "type": "array"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "title": "searchOutput",
        -  "type": "object"
        -}New value: +null
    • Addedset_domain_case
    • Addedtimeline
    • Addedunfile_domain
  3. 24 tool updatesv0.1.0
    • First observedanti_pattern
    • First observedcheckpoint
    • First observeddedup_scan
    • First observededit_memory
    • First observedforget
    • First observedget_memory
    • First observedget_relations
    • First observedhandoff
    • First observedhelp
    • First observedlink_memories
    • First observedlist_by_domain
    • First observedlist_domains
    • First observedlist_recent
    • First observednote
    • First observedoptimize_runs
    • First observedoptimize_scan
    • First observedoptimize_stage
    • First observedoptimize_status
    • First observedpulse
    • First observedpurge_memory
    • First observedreasoning
    • First observedrecall
    • First observedsearch
    • First observedset_confidence

TDQS

A3.7/5.0

Scored across 42 tools

Disambiguation4/5

Most tools target distinct resources/actions (memory CRUD, diagram lifecycle, task lifecycle, domain management, optimization workflow), and the unusually thorough descriptions explicitly explain when to prefer each. However, there are real overlaps: recall() is documented sugar for search(type='note'), pulse() embeds pending(), get_memory() includes relations that get_relations() also returns, and optimize_runs() substantially overlaps optimize_status()—all clarified in prose rather than eliminated by the surface.

Naming Consistency4/5

Every tool is snake_case, so the convention never breaks. The patterns vary in verb style—bare nouns for the core write verbs (search, note, checkpoint, diagram, reasoning, task) alongside prefixed families (get_/list_/set_/optimize_/diagram_)—but the groupings are coherent and predictable within each subsystem.

Tool Count3/5

42 tools is heavy, exceeding the 25-tool threshold where the surface starts to feel large even for a rich domain. The count is partly earned by genuinely distinct subsystems (memory, diagrams, tasks, relations, domains, projects, curation workflow), but several read/status tools (pending vs pulse, optimize_runs vs optimize_status, recall vs search) inflate it without adding clear capability.

Completeness5/5

Coverage is exemplary across every inferred sub-domain: full memory lifecycle (note/edit/forget/purge/get/search/recall), relations, complete diagram authoring and reading, complete task lifecycle, domain casing and cross-listing, project listing/movement, and a staged optimization/gardening workflow with scan/status/runs. Retrieval is also covered on multiple axes (keyword, recent, timeline, by-domain), leaving no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that provides persistent long-term memory for AI agents via local SQLite storage with low token overhead, enabling memory storage, retrieval, and management across sessions.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    A local memory server for AI agents that stores and retrieves information via MCP, keeping all data in SQLite on your machine.
    641 PyPI
    1
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for persistent, cross-session, local-first memory for AI agents, storing memories as Markdown files with SQLite indexing for hybrid search.
    24
    Apache 2.0