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, handoff, diagram — a pitfall is read back by the tool that asks for pitfalls, not found by luck among everything else.

  • 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, the open handoffs and anti-patterns filed anywhere under that path, the newest notes — that one among them — and a count of what the scope holds that the warm-up did not show.


Quickstart

python -m venv .venv
.venv/Scripts/pip install -e ".[dev]"   # .venv/bin/pip off Windows
npm ci && npm run build                 # the admin dashboard
.venv/Scripts/python -m pytest

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 and desktop UI alike

~/.claude.json, top-level mcpServers

claude mcp add --scope user memai <command>

Claude Desktop — the chat app

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 Claude Code 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, and run-admin.bat starts the dashboard (both activate .venv themselves; extra arguments pass through, e.g. run-admin.bat --port 8890). stop-mcp.bat and stop-admin.bat stop what is running.

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.


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, and where the diagrams are arranged.

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

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 on the dashboard's rail, 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:

page

what it covers

Storage

the tables, and what each one is the record of

Retrieval

BM25 keyword search, and what a result carries

Domains

paths, subtree reads, and belonging to more than one

Diagrams

documenting a routine as a graph, and reading it back

Curation

confidence, decay, staged suggestions, dedup

Tools

every MCP tool, and the sets that trim the schema cost

Hooks and the warden

the four hook events, the skills, and the subagent that consults the store on a session's behalf

Dashboard

every view, and export/import

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

24 tools
anti_patternC

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

Stored as type='anti_pattern'; open ones for a domain are surfaced by pulse().

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo
insteadYes
patternYes
sessionNo
why_wrongYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations exist. The description only states it records and stores as type='anti_pattern', with no disclosure of side effects, idempotency, permissions, or other behavioral traits.

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 two concise sentences with no extraneous content. It front-loads the core action.

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?

Given 5 undocumented parameters and no output schema, the description fails to provide sufficient context for the agent to correctly invoke the tool. It leaves parameter semantics and return behavior unclear.

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

Parameters1/5

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

With 0% schema coverage, the description adds no information about the 5 parameters (pattern, why_wrong, instead, domain, session). The agent must rely solely on parameter names, which are insufficient.

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 clearly states the tool records a mistake/temptation and the correct approach, and it mentions the stored type 'anti_pattern' and linkage to pulse(). This effectively communicates the purpose and distinguishes it from siblings like pulse.

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?

The description implies usage: record anti-patterns via this tool, retrieve them via pulse(). However, it does not explicitly state when to use this tool over alternatives or provide exclusions.

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. Stored as type='checkpoint'.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo
intentYes
sessionNo
pursuingYes
establishedYes
open_questionsYes

TDQS

A4.4/5.0
Behavior4/5

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

Discloses that data is stored as type='checkpoint', fields are free-length, and checkpoints are meant for bearing. However, it does not specify whether writing a checkpoint overwrites or creates a new entry, nor the role of optional parameters like domain and session. With no annotations, this is a minor gap.

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 concise sentences that front-load purpose, then provide usage guidelines and storage semantics. No redundant information; every sentence adds 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?

Covers main aspects: purpose, usage guidelines, parameter roles, and storage type. Missing details on optional parameters and persistence behavior (overwrite vs append) but adequate for a tool with no annotations or output schema. References to pulse() and note() provide useful context.

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?

The description lists the four required parameters and notes they are free-length and should be readable summaries. However, it does not explain the optional domain and session parameters, and schema description coverage is 0%. It partially compensates but leaves ambiguity about the optional fields.

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's purpose as snapshotting current working state with specific fields (intent/established/pursuing/open_questions). It distinguishes itself from sibling tools like note() by emphasizing that checkpoints are for bearing, not archives, and references pulse() for reading.

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 when to use (summary for next session) and when not to (timeless detail into note()). It also explains the consumption mechanism via pulse(). This differentiates from siblings effectively.

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.

Semantic (cosine over the embedded store) when vectors are available, lexical overlap otherwise -- each pair carries its method. 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainNo
thresholdNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It discloses method (semantic/lexical), exclusion of checkpoint pairs, and non-automatic nature. However, it does not explicitly state whether the tool is read-only or if it has side effects, leaving some ambiguity.

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 concise with a clear opening sentence and uses dash-separated points for additional details. It is front-loaded and avoids verbose repetition, though could be slightly more structured.

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 core purpose, method, and exclusions, but lacks parameter explanations. Given 0% schema coverage and 4 parameters, the description is incomplete. However, it does mention output includes method and score, which is useful.

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 description does not explicitly explain any of the four parameters (type, limit, domain, threshold). It only implies threshold via similarity score mention. This is insufficient for an agent to know how to set these 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?

The description clearly states the tool surfaces likely-duplicate/contradictory memory pairs, explains the method (semantic vs lexical), and notes exclusions. It distinguishes itself from sibling tools like link_memories, edit_memory, and forget by clarifying it is not an automatic merge.

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 explicitly says the tool returns candidate pairs for review, not an automatic merge, and mentions subsequent tools (link_memories, edit_memory, forget). It provides context on when checkpoint pairs are excluded and method selection, but does not explicitly state when not to use the tool.

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

edit_memoryB

Correct/update a memory's content, keeping the previous version in edit history.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
noteNo
new_contentYes

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 discloses that old content is preserved in edit history, but fails to mention required permissions, reversibility, or any side effects of the update, providing only partial behavioral clarity.

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 two sentences, with the first sentence delivering the core purpose concisely. It is front-loaded and efficient, though it could briefly mention key parameters without losing conciseness.

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?

Given the tool has 3 parameters, no output schema, and no annotations, the description lacks parameter descriptions and return value explanation, leaving significant gaps for an agent to use the tool confidently.

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

Parameters1/5

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

Schema description coverage is 0%, and the description adds no information about the parameters (uid, new_content, note), forcing agents to rely solely on parameter names without any additional context or examples.

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 'Correct/update a memory's content' with a specific verb and resource, and distinguishes from siblings like 'forget' (delete) and 'set_confidence' (modify confidence) by emphasizing preserving edit history.

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?

The description implies use for corrections while preserving history, but does not explicitly state when not to use this tool versus alternatives like 'forget' or 'purge_memory', leaving the agent to infer usage context.

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

forgetA

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 or recomputing its embedding).

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
reasonNo
superseded_byNo

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 fully carries the burden. It discloses that content is kept, embeddings are not recomputed, and a reason is recorded as an audit entry. It does not mention reversibility or side effects, but for a soft-delete action, the disclosed behaviors are sufficient.

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?

Two concise sentences with no wasted words. The first sentence states the core purpose, and the second adds behavioral detail. Front-loaded and efficient.

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?

The description is mostly complete for a simple tool given no output schema. It explains the key behavior and the `reason` parameter, but lacks explanation for `superseded_by` and could benefit from explicit usage context vs sibling tools. Still, adequate.

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% (no parameter descriptions), so the description must compensate. It explains the `reason` parameter (audit entry) and implies `uid` is the memory identifier, but does not explain `superseded_by`. This partial coverage earns a 4, as it adds meaning beyond the 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 tool archives a memory via soft delete, keeping content but excluding from default search/list. It also notes recording a reason as audit entry, providing a specific verb (archive) and resource (memory) that distinguishes it from siblings like purge_memory.

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 implies when to use this tool (when you want to exclude from results but retain data) by contrasting soft delete with default search/list behavior. However, it does not explicitly compare to sibling tools like purge_memory or set_confidence, and lacks when-not-to-use guidance.

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

get_memoryB

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

ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes

TDQS

B3.3/5.0
Behavior3/5

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

No annotations provided, so description must disclose behavioral traits. It describes output contents but omits safety guarantees (e.g., read-only, no side effects) and any error conditions.

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?

Single efficient sentence with key elements front-loaded. Could add minor context without inflation.

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?

Adequately covers the tool's purpose and main output features but lacks details on exact return structure or edge cases; no output schema exists to compensate.

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 description does not explain the uid parameter beyond its role as an identifier; missing format instructions or origin guidance.

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 verb 'fetch', resource 'memory', and specifies inclusion of edit history and relations, distinguishing it from siblings like get_relations and recall.

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 explicit guidance on when to use this tool versus other retrieval siblings (recall, search, list_by_domain). The intended use case is implied but not clarified.

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.

handoffA

Leave a note for another agent/session picking up this work.

Stored as type='handoff'; open ones for a domain are surfaced by pulse().

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo
contentYes
sessionNo

TDQS

A3.6/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 discloses that notes are stored as type 'handoff' and that pulse() retrieves open ones, but does not discuss auth, rate limits, or 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.

Conciseness5/5

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

Two concise sentences: the first states the primary purpose, the second adds storage and retrieval details. No unnecessary words.

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 3 parameters, no output schema, and no annotations, the description covers the core functionality but lacks details on return values, parameter dependencies, and edge cases.

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?

With 0% schema description coverage, the description must add meaning. It hints at 'domain' and 'session' via the second sentence, but does not fully explain each parameter's purpose or default 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?

The description clearly states the action ('leave a note') and the resource ('for another agent/session picking up this work'). It also distinguishes from siblings like 'note' by specifying the handoff context and storage type.

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?

The description implies usage context (handing off work) but does not explicitly state when to use this tool versus alternatives such as 'note' or 'checkpoint'. No exclusions or when-not cases 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. With command='': that tool's full signature and docstring. The docs can't drift from behavior because they ARE the code's own docstrings, extracted at call time.

ParametersJSON Schema
NameRequiredDescriptionDefault
commandNo

TDQS

A4.5/5.0
Behavior4/5

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

Although no annotations are provided, the description adds important behavioral context: the docs are extracted live from code docstrings at call time, ensuring accuracy and preventing drift. This is a unique trait not otherwise disclosed. The description does not mention side effects or auth, but for a read-only help tool, this is sufficient.

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 four sentences long, each serving a purpose: stating the tool's role, explaining the two usage modes, and highlighting the benefit of live extraction. No information is redundant or extraneous, and the structure is front-loaded with the core purpose.

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 the tool's simplicity (one optional parameter, no output schema), the description covers the essential usage and behavioral aspects. It does not explicitly state the output format (likely plain text or markdown), but this is a minor gap. Overall, it is reasonably complete for a help tool.

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?

The input schema has one parameter 'command' with no description and 0% coverage. The description compensates by explaining its purpose: without arguments returns summaries of all tools, with 'command=<name>' returns that tool's full docstring. This fully defines the parameter's semantics.

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's purpose: to explain memai tools by reading their code docstrings. It distinguishes two modes of operation (with and without arguments), making the tool's function specific and different from sibling tools which are the actual tools being explained.

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 provides explicit guidance on when to use the tool with and without the 'command' argument. While it does not mention when not to use it, the context of a help tool makes that unnecessary. The absence of alternatives is acceptable since this is a meta-tool.

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 active memories for a domain, most recent first. Fallback when search misses.

Matches domain exactly -- see list_domains() for the real strings in use. Content is snippet-truncated per result -- call get_memory(uid) for the full record.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Discloses key behaviors: exact domain matching, snippet truncation, and ordering by recency. Since no annotations are provided, the description adequately covers behavioral traits.

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?

Three concise sentences, front-loaded with the main purpose. Every sentence serves a purpose, though could be slightly more structured.

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 the presence of an output schema, the description covers usage context, ordering, truncation behavior, and fallback role. Missing parameter info for 'type' is the only notable gap.

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?

Description explains domain as exact match and implies limit controls count, but completely omits the 'type' parameter. With 0% schema description coverage, it adds some value but leaves 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?

Clearly states it lists active memories for a domain, sorted most recent first. Also explicitly differentiates from sibling search by calling itself a fallback when search misses.

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 context: use as fallback when search fails, and advises to consult list_domains for exact domain strings. However, it doesn't explicitly mention when not to use the tool.

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

list_domainsA

List distinct domains with their memory count and latest activity.

Warm-up discovery. domain is free text and drifts over time (e.g. 'PROJ-1042' vs 'proj-1042'), and pulse/list_by_domain match it exactly -- this surfaces the real strings so you target the right one instead of guessing. Ordered by most recent activity.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Given no annotations, the description adds behavioral context: domain drift over time, exact matching by siblings, and ordering by most recent activity. It does not discuss side effects or permissions, but as a read-only list tool, this is adequate. The output schema exists to cover return values.

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 concise with 5 sentences, each adding value. It is front-loaded with the core purpose and provides necessary context. Could be slightly more streamlined, but overall efficient.

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 zero-parameter tool with an output schema, the description covers purpose, use case, and ordering. It lacks detail on authentication or potential empty results, but these are minor. Overall, it is complete enough for effective use.

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?

There are no parameters, and schema coverage is 100%. The description adds meaning by explaining what the list contains (distinct domains with memory count and latest activity), which is valuable 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 'List distinct domains with their memory count and latest activity', specifying the verb and resource. It distinguishes itself from siblings by explaining its role in warm-up discovery to get exact domain strings that pulse and list_by_domain match exactly.

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?

The description explicitly advises using this tool for warm-up discovery before using pulse or list_by_domain, which require exact matching. It tells when to use the tool and implies alternatives, providing clear guidance.

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.

Content is snippet-truncated per result -- call get_memory(uid) for the full record.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
domainNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, description defines behavior (lists active memories, snippet-truncated). However, it does not disclose potential side effects, rate limits, or authentication needs, leaving gaps for an agent.

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?

Two concise sentences front-load the purpose and provide a key behavior note. No unnecessary words.

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 three optional parameters, no annotations, and no sibling differentiation, the description is functional but lacks details on 'active' semantics, default behavior, and how results are ordered. Output schema exists, so return structure is covered.

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 description adds value by explaining optional filtering by type/domain. However, it does not define valid values or mention the limit parameter, so meaning is incomplete.

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?

Describes listing recent active memories with optional filters. While clear, it doesn't explicitly differentiate from sibling 'list_by_domain', which may also filter by domain but without recency emphasis.

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?

Mentions snippet truncation and points to get_memory for full records, but lacks explicit guidance on when to use this tool over siblings (e.g., list_by_domain) or prerequisites.

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

noteB

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')); pulse() also shows the few most recent ones as warm-up breadcrumbs.

tags: comma-separated keywords/synonyms -- write generously; tags feed both the keyword index and the embedding, so they make the memory findable even when the vector side is unavailable.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
domainNo
contentYes
sessionNo

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided. The description discloses that tags feed both keyword index and embedding, and that memories are retrieved by relevance. However, it does not mention whether saving overwrites existing notes, authorization needs, or side effects, leaving gaps in behavioral transparency.

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 brief, uses bullet points effectively for tags, and front-loads the main purpose. Every sentence adds value without unnecessary words.

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?

With no annotations, no output schema, and 0% schema description coverage, the description should provide comprehensive context. It explains tags and retrieval but omits details on domain and session parameters, return values, error scenarios, or creation vs. update behavior, leaving the tool incompletely documented.

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%. The description explains the 'tags' parameter in detail (comma-separated keywords, feeds indexing and embedding) and implies that 'content' is the memory content. But 'domain' and 'session' parameters are not explained, so the description adds partial value.

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 clearly states 'Save a general long-term memory (fact, decision, finding). Stored as type='note'.' This specifies the action and resource, and implicitly differentiates from retrieval siblings like recall and search, but does not explicitly contrast with other memory-saving tools.

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?

The description explains retrieval using recall(), search(), and pulse(), but does not provide explicit guidance on when to use this tool versus siblings like anti_pattern, checkpoint, or reasoning. The usage context is implied rather than clearly stated.

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. Returns every memory's curation-relevant fields, the relation edges among them, and dedup-candidate pairs as a starting hint. Read this, then decide what to compact/reword/retag/redomain/set_confidence/archive/link/merge/ distill and stage it with optimize_stage.

The listing is slim on purpose so a few-hundred-memory store fits one response: content is a ~120-char snippet plus content_len (tags cut at ~100 with tags_len); empty/default fields are omitted (incl. confidence 'unverified' -- stats keeps the aggregate); created_at drops sub-second precision. Pass full=True for whole bodies, or fetch one with get_memory(uid) when a snippet is not enough. A page also ends early if its serialized size hits an internal budget, so one response ALWAYS fits the host's output cap. truncated: true means the listing stopped before the corpus ended -- page onward with offset = offset + count (stats.total is the whole corpus).

On a grown store, prefer INCREMENTAL curation over full-corpus passes: since limits the scan to memories created or updated at/after an ISO timestamp or date ('2026-07-01'), so a recurring "optimize my memories" only reviews the delta since the last run (optimize_runs shows when that was). Cross-window collisions are still caught: dedup_hints probe FROM the new memories against the whole store (a new memory duplicating an old one outside the window surfaces; old x old pairs are skipped), and domain_hints report any store-wide domain cluster the delta touches. Combine with domain/type to curate one slice at a time. Also included:

  • stats: totals for the whole filtered corpus (by_type, by_confidence, by_domain, empty_domain) -- computed regardless of limit,

  • domain_hints: clusters of domain-string variants that likely mean the same thing (case/separator drift, ticket-id spellings), with a suggested canonical -- ready-made redomain candidates,

  • anchors: per memory, the verifiable references found in its FULL content (URLs, file paths, table/field identifiers, constants), space-joined -- the things to go check against live facts.

Before proposing any change, CHECK IT AGAINST LIVE FACTS -- do not rewrite or archive something that was true then but stale now, and do not "correct" something that is still true:

  • cross-check newer memories already in this corpus (supersession / contradiction),

  • for code/config memories, verify the anchors against the live repo,

  • for world-facts, web-check current truth. Record what you verified in each suggestion's verified field -- destructive suggestions (archive, set_confidence=contradicted) are rejected without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNo
typeNo
limitNo
sinceNo
domainNo
offsetNo
include_archivedNo

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, so the description bears full responsibility. It thoroughly discloses behavioral traits: compact format, truncation logic, 'truncated' flag, pagination, omission of empty/default fields, precision drops, and constraints on output size. It also explains the content of the response (stats, domain_hints, anchors) and the verification workflow.

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 lengthy but well-organized, with clear sections for purpose, format, usage, parameters, and verification. Every sentence adds value, though it could be slightly more concise without losing information. The front-loading of the purpose is effective.

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 complexity (7 parameters, no output schema, many sibling tools), the description is exceptionally complete. It explains the full structure of the response, pagination behavior, and integrates workflow guidance. It even includes verification instructions for downstream actions, leaving no ambiguity.

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?

The schema has 0% coverage, but the description compensates by explaining the role of each parameter: 'full' for full bodies, 'since' for delta scans, 'domain' and 'type' for filtering, 'limit' and 'offset' for pagination. It provides concrete examples (e.g., ISO timestamp or date for 'since') and explains how parameters affect output.

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's purpose: 'Dump the memory corpus compactly so you can plan a curation pass.' It distinguishes this tool from siblings by positioning it as the first step in an 'optimize my memories' workflow and by specifying its unique output (memories, edges, dedup hints).

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 provides explicit context on when to use this tool (step 1 of workflow) and when to use alternatives (e.g., fetching a single memory with get_memory). It advises on incremental curation vs full passes using the 'since' parameter. It does not explicitly list exclusions, but the context is well covered.

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. Writes the suggestions to a new optimization run; they are NOT applied here -- the user reviews and applies/rejects each one in the admin dashboard's Optimization tab, where a backup is taken before the first apply and every applied change can be undone.

Each suggestion is an object: {"kind": ..., "target_uid": ..., "payload": {...}, "rationale": "why", "verified": "what live-facts check you did"}

Kinds and their payload: compact / reword {"new_content": str} retag {"tags": str} comma-separated redomain {"domain": str} set_confidence {"confidence": "unverified|confirmed|contradicted"} archive {"reason": str} soft/reversible; never hard-deletes link {"from_uid", "to_uid", "relation_type", "note"?} merge {"keep_uid", "drop_uid", "note"?} links supersedes + archives drop distill {"source_uids": [uid, ...], "new_type": "note|reasoning|anti_pattern", "new_content": str, "tags"?, "domain"?}

distill extracts the durable knowledge out of one or MORE source memories into a newly authored one: creates it, links it supersedes each source and archives the sources (all reversible). Use it to retire closed-ticket checkpoints without losing what they taught, or as an n-ary merge when the survivor needs synthesized content.

link/merge derive target_uid from the payload (from_uid / drop_uid) and distill creates its target -- omit target_uid for those kinds. Destructive suggestions (archive, set_confidence=contradicted, distill) require a non-empty verified describing the live-facts check that justifies them.

Invalid suggestions are skipped and reported in errors; the rest are staged. Returns {run_id, staged, errors}.

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 provides extensive behavioral details: suggestions are not applied here, backups are taken, changes are reversible, destructive suggestions require verification, invalid suggestions are reported. No contradictions.

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 well-structured with clear sections and bullet points, but is somewhat verbose. Given the complexity of the tool, the length is justified, but there is some redundancy (e.g., repeated explanation of reversibility).

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 explains the return structure (run_id, staged, errors). It covers workflow context, suggestion kinds, error handling, and behavioral guarantees, making it highly complete for the tool's complexity.

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?

The description adds immense semantic value beyond the minimal schema (array of objects with additionalProperties). It fully specifies the structure of suggestion objects, including kinds, payloads, required fields, and examples. The 'note' parameter is not described, but the suggestions parameter is richly documented.

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's purpose: 'Stage a batch of curation suggestions for human review in the dashboard.' It specifies it's step 2 of a workflow and distinguishes it from siblings like optimize_scan and optimize_status by explaining the staging role.

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 explains the tool's role as part of a workflow ('Step 2 of the optimize my memories workflow'), but does not explicitly list alternatives or when not to use it. The context of sibling tools and the detailed kind descriptions indirectly guide usage.

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.

pulseA

Session warm-up: latest checkpoint + open handoffs/anti-patterns + recent notes.

Picks the checkpoint 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. latest_checkpoint 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. handoffs and anti_patterns are notes left for whoever resumes; recent_notes are the newest note()'d facts, as recency breadcrumbs -- for relevance-ranked recall use recall()/search(). Those three lists are snippet-truncated -- call get_memory(uid) for one in full.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo

TDQS

A4.2/5.0
Behavior5/5

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

With no annotations provided, the description carries full burden. It discloses that it picks checkpoint by created_at DESC, returns latest_checkpoint in full with relations, truncates other lists snippets, and recommends get_memory for full records. This is comprehensive 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.

Conciseness5/5

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

The description is concise, well-structured with a clear introductory sentence followed by detailed explanation of behavior and caveats. Every sentence provides unique value, and it is appropriately sized.

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 output schema and multiple return components (checkpoint, handoffs, anti-patterns, notes), the description explains the output well but omits the input parameter 'domain' entirely. This leaves a gap in completeness.

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

Parameters1/5

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

The single parameter 'domain' has 0% schema description coverage, but the description does not mention it at all. The description adds no meaning beyond the schema, leaving the agent guessing about the parameter's purpose or effect.

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's purpose: 'Session warm-up: latest checkpoint + open handoffs/anti-patterns + recent notes.' It uses a specific verb-resource combination with scope, and distinguishes from siblings like recall/search and get_memory.

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?

The description explicitly states when to use pulse (session warm-up, to get latest checkpoint by created_at DESC) and when not ('similarity-ranked top-1 can return stale checkpoint'). It also provides alternatives: use recall/search for relevance-ranked recall, get_memory for full items.

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.

reasoningB

Record a reasoning trace / analysis worth keeping (not a fact, a thought process).

Stored as type='reasoning' -- filter search/list_* with type='reasoning' to get these back.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo
contentYes
sessionNo

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden. It does not disclose behavioral traits such as whether the operation is destructive, requires permissions, or has rate limits. The description is minimal and lacks 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?

The description consists of two short, front-loaded sentences that convey the core purpose efficiently. While it lacks depth, it is well-structured and free of redundancy, earning a high score for conciseness.

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?

Given the tool has 3 parameters, no output schema, and no annotations, the description is incomplete. It does not cover parameter usage, return values, or behavioral details. An agent would lack necessary context for correct invocation.

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

Parameters1/5

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

The input schema has 3 parameters (domain, content, session) with 0% description coverage. The tool description does not mention or explain any parameters, failing to add meaning beyond the schema. The description should compensate but does not.

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 'Record' and the resource 'a reasoning trace / analysis', distinguishing it from factual storage by explicitly noting it is a thought process, not a fact.

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 when to use the tool (for thought processes) and how to retrieve the stored traces via filtering by type='reasoning'. It does not explicitly mention when not to use it or provide alternatives, but the distinction from siblings like 'note' is implied.

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 hybrid search (BM25 + vectors) scoped to type='note', ranked by relevance -- which is what you want for timeless facts/rules/decisions. note() has no recency warm-up hook the way checkpoints have pulse(); this (or search(type='note')) is how notes come back. Content is snippet-truncated -- call get_memory(uid) for the full record.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
domainNo

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 fully covers behavioral traits: hybrid search, scoping to type='note', relevance ranking, snippet-truncated output, and the need to call get_memory for full records. No contradictions.

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 concise with three sentences, front-loaded with the primary purpose. Every sentence adds value without fluff.

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 complexity and presence of an output schema, the description adequately covers the tool's behavior, output format (snippet-truncated), and relationship to siblings. It provides sufficient context for correct invocation.

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 description does not explicitly explain the individual parameters (query, limit, domain). While the purpose implies query is the search term, limit and domain are left unspecified. With 0% schema coverage, the description should compensate, but it largely omits parameter details.

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's purpose: recalling long-term knowledge saved with note(). It specifies the scope (type='note'), the search method (hybrid BM25 + vectors), and explicitly differentiates from sibling tools like search and get_memory.

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?

The description explicitly provides guidelines on when to use this tool ('dedicated verb for bring back what I noted'), contrasts with search(type='note') as an alternative, and explains the recency behavior difference from checkpoints with pulse().

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 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.8/5.0

Scored across 24 tools

Disambiguation5/5

Each tool targets a distinct action or memory type. Even though there are multiple retrieval tools (e.g., get_memory, list_by_domain, recall, search, pulse), their specific purpose (single record, domain-listing, note-only, hybrid, session warm-up) is clearly differentiated. No two tools overlap in functionality.

Naming Consistency4/5

Most tools follow a verb_noun pattern (e.g., edit_memory, list_domains), but a few are bare nouns (anti_pattern, checkpoint, handoff, note, reasoning) or verbs (forget, help, pulse). While the pattern is not perfectly uniform, it remains predictable and readable.

Tool Count4/5

With 24 tools, the server is on the upper end of the typical range, but the scope—comprehensive memory management with CRUD, search, linking, optimization, and curation—justifies the number. It is well-scoped, and each tool adds clear value.

Completeness5/5

The tool set covers the full lifecycle of memory management: writing various types (note, reasoning, checkpoint, anti_pattern, handoff), reading via multiple methods, updating (edit, link, set_confidence), deleting (soft and hard), deduplication, optimization workflow, and help. No obvious gaps are present.

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.
    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