Skip to main content
Glama
CodeAbra

iai-personal-memory-engine


iai-mcp

Independent Autistic Intelligence — a local memory layer for Claude (and other MCP-compatible assistants).

About the name

IAI stands for Independent Autistic Intelligence.

  • Independent. Fully local. The daemon runs on your machine, embeddings are computed locally, no telemetry, no cloud dependency. Your memory is your data and stays your data.

  • Autistic. Describes the memory style, not a diagnosis or a metaphor. The memory is built around verbatim recall, attention to specific cues, and refusal to smooth rare events into typical ones. Most memory systems compress and summarize aggressively, aiming to give the assistant a gist of the past. This one preserves what was actually said and surfaces it on a precise cue. The trade-off is intentional: more storage and a stricter retrieval interface, in exchange for not losing details.

  • Intelligence. Used in the systems sense, something that observes, adapts, and stays viable over time, not the marketing sense.


Related MCP server: local-agent-context

What it is

A local server that speaks the MCP protocol and gives Claude, and any other MCP-compatible assistant, a long-term memory. It captures every turn of every session verbatim, organizes those captures over time into a personal map of who you are, and serves a small slice of relevant memory back at the start of each new conversation. You never have to say "remember this" or "what did we say last time?".

I built this for myself. It worked. I've been running it daily for months, and now I'm sharing it. The benchmarks were mostly for my own curiosity. I wanted to know if it actually works or if I'd just gotten used to it.


Usage

You do not call iai-mcp directly during a session. Once it's connected:

Capture is automatic. Every turn, yours and the assistant's, is recorded verbatim with timestamps and session metadata. You don't say "remember this."

Recall is automatic. When a new session starts, the daemon assembles a small relevant slice of your history and injects it into the conversation prefix. You don't say "what did we say."

Consolidation runs idle. Between sessions, the daemon merges duplicates, strengthens recall pathways for things retrieved often, and prunes weak edges. The system gets quietly better at remembering you over time.

After a few weeks of regular use the difference becomes noticeable. The assistant stops asking the same orientation questions, references things you mentioned in passing, and adapts to your style without being told.


How it works

The daemon is a Python process that runs in the background. Your MCP client connects to it via a Unix socket. No network exposure.

Memory is stored in three tiers:

Episodic is verbatim, timestamped fragments of what was said. Write-once, never overwritten or rewritten.

Semantic is summaries induced from clusters of related episodes during idle-time consolidation.

Procedural is a small set of stable parameters about you, learned over time: preferences, style cues, recurring patterns. Eleven sealed knobs that shift based on what works.

A background pass runs periodically (sleep cycles): it clusters episodes, builds semantic summaries, decays old unreinforced connections, and reinforces frequently co-retrieved paths. Things you haven't revisited fade naturally. There's an optional "insight of the day" step that makes one Anthropic API call, but it's off by default.

Recall combines three signals: semantic similarity, graph-link strength, and recency. All ranked together.

All records are encrypted at rest with AES-256-GCM. The key lives in ~/.iai-mcp/.key (mode 0600). Back it up. Lose the key, lose the memories.

Everything lives at ~/.iai-mcp/. Embeddings are computed locally with bge-small-en-v1.5. The only data that leaves the machine is your normal conversation with whatever LLM API your client uses.

Claude Code  <--MCP-stdio-->  TypeScript wrapper  <--UNIX socket-->  Python daemon  <-->  LanceDB

Quick start

Prerequisites

  • macOS or Linux (Apple Silicon and x86_64 tested)

  • Python 3.11 or 3.12

  • Node.js 18+

  • Claude Code as the MCP host

  • ~500 MB free disk

Windows not supported. WSL2 untested.

Install

git clone https://github.com/CodeAbra/iai-mcp.git
cd iai-mcp
bash scripts/install.sh

The installer creates a Python venv, installs dependencies (LanceDB, sentence-transformers, torch-hd, NetworkX, igraph), builds the TypeScript MCP wrapper, pre-downloads the default embedding model (~130 MB), symlinks the CLI to ~/.local/bin/iai-mcp, and on macOS registers the daemon with launchd.

Make sure ~/.local/bin is on your PATH:

export PATH="$HOME/.local/bin:$PATH"  # add to ~/.zshrc or ~/.bashrc
iai-mcp --version

On Linux, install the systemd unit manually:

mkdir -p ~/.config/systemd/user
cp deploy/systemd/iai-mcp-daemon.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable iai-mcp-daemon
systemctl --user start iai-mcp-daemon

Install the Stop hook

This is what makes capture ambient. Without it you'd have to save memories by hand.

mkdir -p ~/.claude/hooks
cp deploy/hooks/iai-mcp-session-capture.sh ~/.claude/hooks/
chmod +x ~/.claude/hooks/iai-mcp-session-capture.sh

Register in ~/.claude/settings.json:

{
  "hooks": {
    "Stop": [
      {
        "matcher": "*",
        "hooks": [
          {
            "type": "command",
            "command": "$HOME/.claude/hooks/iai-mcp-session-capture.sh"
          }
        ]
      }
    ]
  }
}

Connect Claude

claude mcp add iai-mcp -- node "$(pwd)/mcp-wrapper/dist/index.js"

Or edit ~/.claude.json directly:

{
  "mcpServers": {
    "iai-mcp": {
      "command": "node",
      "args": ["/absolute/path/to/iai-mcp/mcp-wrapper/dist/index.js"]
    }
  }
}

Use the absolute path. ~ and $HOME won't expand here.

For Claude Desktop (untested), edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or the equivalent path on Linux.

Verify

iai-mcp doctor
iai-mcp daemon status

Restart Claude Code. Start a session, do some work, exit. Then:

tail ~/.iai-mcp/logs/capture-$(date -u +%Y-%m-%d).log

You should see a rc=0 line. That's your first memory.


Doctor

iai-mcp doctor runs 14 checks against the daemon, the store, and the runtime state. Output is one line per check: PASS, WARN, or FAIL.

iai-mcp doctor

What it checks:

#

Check

What it means

a

Daemon alive

Is the daemon process running?

b

Socket fresh

Can the UNIX socket accept a connection?

c

Lock healthy

Is the process lock held correctly?

d

No orphan core

No leftover stdio core process without a daemon

e

State file valid

.daemon-state.json parses and has expected fields

f

LanceDB readable

Can the records table be opened and queried?

g

No duplicate binders

Only one process is bound to the socket

h

Crypto file state

Encryption key exists, correct permissions (0600)

i

Lance versions count

LanceDB version manifests aren't piling up

j

Lifecycle current state

Current FSM state is valid

k

Lifecycle history 24h

Recent lifecycle transitions look sane

l

Sleep cycle status

Last sleep cycle completed or is running normally

m

Heartbeat scanner

Wrapper heartbeat files are fresh

n

HID idle source

Idle detection source is available

14/14 PASS is healthy. 13/14 with check (b) failing during a sleep cycle is also normal (the socket is busy during consolidation). Multiple FAILs or a FAIL on (a) or (f) means something is actually wrong.


Notes for AI assistants helping with installation

If you're an AI model helping a user install or debug iai-mcp, read this before diagnosing anything.

The daemon has four FSM states: WAKE, TRANSITIONING, SLEEP, DREAMING. Separately, the wrapper-layer lifecycle has four states: WAKE, DROWSY, SLEEP, HIBERNATION. These are two different state machines in two different files. Don't confuse them.

Things that look broken but are not:

  • last_tick_at hasn't changed in hours. This is a sleep-cycle tick timestamp, not a process heartbeat. The daemon can be alive and healthy with a stale last_tick_at. Check iai-mcp daemon status instead.

  • fsm_state: DREAMING for hours. Normal. The daemon is running a sleep cycle. Wake transitions are event-driven (a new session arriving wakes it), not time-driven.

  • status: deferred in the capture log. This is the only path the Stop hook takes. It writes captures to ~/.iai-mcp/.deferred-captures/ and the daemon picks them up on its next tick. This is by design, not a failure.

  • iai-mcp doctor shows 13/14 PASS with check (b) "socket unreachable." Expected when the daemon FSM is in SLEEP or DREAMING. The socket is intentionally unresponsive during consolidation passes. This is healthy.

  • Cold start takes a few seconds. The daemon needs to initialize the LanceDB store and load the embedding model into memory. Don't kill it because it hasn't responded in 5 seconds.

Actual problems look like: iai-mcp daemon status returning ok: False, doctor showing multiple FAIL results, or the daemon process not existing at all (pgrep -f iai_mcp.daemon returns nothing).

When in doubt, run iai-mcp doctor and read what it says. The output is self-explanatory.


Benchmarks

I made these because I wanted honest numbers. Every harness ships in bench/. Run them on your machine, get your own results.

Metric

Target

Measured

Verbatim recall (byte-exact)

>=99%

>=99% at N=10k

Recall p95 latency

<100 ms

<100 ms at N=10k

RAM at steady state

<=300 MB

~150-300 MB

Session-start tokens (warm cache)

<=3,000

<=3,000

Session-start tokens (cold)

<=8,000

<=8,000

python -m bench.verbatim                     # verbatim fidelity
python -m bench.neural_map                   # recall latency
python -m bench.memory_footprint             # RAM usage
python -m bench.tokens                       # session-start cost
python -m bench.total_session_cost           # full 10-turn cost
python -m bench.trajectory                   # 30-session corpus
python -m bench.contradiction_longitudinal   # falsifiability
python -m bench.longmemeval_blind            # LongMemEval-S blind run

The LongMemEval-S run is blind on purpose. No dataset-specific tuning, no hyperparameter sweep. The numbers are what they are.


Configuration

Variable

Default

What it does

IAI_MCP_STORE

~/.iai-mcp/

Data directory

IAI_MCP_EMBED_MODEL

bge-small-en-v1.5

Embedding model. bge-m3 for multilingual at ~3x size.

Switching embedders requires re-embedding the store: iai-mcp migrate reembed.


Status and limitations

This is experimental. I built it for myself, it works on my machine, and I'm sharing it because it might be useful to you. No SLA, no support guarantee. Breaking changes are possible between versions. Pin a commit hash if you depend on stability.

Limitations worth knowing about:

  • The default embedding model is English-only. The assistant translates to English on the way into memory. The opt-in bge-m3 model removes this constraint at a cost of ~3x storage and slower indexing.

  • No cross-machine sync. The data lives where the daemon runs. Backup is cp -a ~/.iai-mcp/ somewhere safe.

  • No GUI. Inspection happens through CLI subcommands (iai-mcp doctor, iai-mcp daemon status, iai-mcp topology).

  • Cold start on a freshly booted machine takes a few seconds while the daemon initializes caches.

  • Recall quality on the first ~10 sessions is mediocre. The system needs material to consolidate before it gets useful.


Compatibility

Claude Code is the primary host, validated in daily use.

Claude Desktop should work (uses claude_desktop_config.json instead of ~/.claude.json) but hasn't been tested end to end.

Other MCP-over-stdio hosts speak the same protocol and should work in principle. Not tested.

If you get it running on something else, open an issue or PR.


Authors

By Areg Aramovich Noya, in collaboration with the team at lcgc.dev.

I built this because I needed it. It works for me. If it works for you, take it.

License

MIT

Contributing

Issues and PRs welcome. If your change touches retrieval, capture, or consolidation, include bench re-runs.

Available Tools

15 tools
claim_checkA
Read-onlyIdempotent

Check a claim (e.g. 'X is not done') against memory. Returns hits + anti_hits + a freshness verdict in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
cueYesThe claim to check, e.g. 'the dashboard is not built yet'.
session_idNoCurrent session id; gets written into provenance. Omit to use '-'.
budget_tokensNoSoft token budget for the underlying recall (default 1500).

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNo
_sourceNo
verdictNo
anti_hitsNo
verdict_reasonNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already signal read-only, idempotent, non-destructive behavior. The description adds value by disclosing that the call returns both supporting (hits) and contradicting (anti_hits) evidence plus a freshness verdict, and that this is combined into one call. It does not discuss failure modes or edge cases, but the output schema covers the return shape and the operation is simple.

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?

One sentence packs the action, the example, the result summary, and the one-call characteristic with no filler. The key behavior is front-loaded before the details.

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 simple three-parameter tool with full schema descriptions, read-only/idempotent annotations, and an output schema, the description is sufficient: it tells the agent what claim checking means and what to expect. Nothing critical for calling the tool correctly is missing.

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 100%, so the schema already documents all three parameters. The description adds no parameter-level meaning beyond labeling the primary input as a claim, and the schema already gives an example for cue. Baseline 3 is appropriate.

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 names a specific verb ('Check') and resource ('claim ... against memory'), and the expected result ('hits + anti_hits + a freshness verdict in one call') makes it distinguishable from raw memory search/recall siblings. It goes beyond the tool name to define what a claim check actually produces.

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 purpose statement implies when to use this tool: when an agent has a claim to verify and wants evidence plus a freshness assessment in a single call. However, it does not name sibling alternatives (e.g., memory_search, memory_recall) or state when to prefer those instead, so the routing guidance is only implicit.

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

curiosity_pendingA
Read-onlyIdempotent

List pending curiosity questions queued by the sleep daemon. Read-only. Filter by session_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoOnly return questions from this session. Omit to return questions from every session in the queue.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
questionsNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds context that the questions are 'queued by the sleep daemon' and are 'pending,' which is extra context beyond the annotations, but not extensive. It does not contradict annotations.

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 extremely concise: three short sentences, front-loaded with the main action, then read-only note, then filter instruction. Every word earns its place with no redundancy or 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?

For a simple list tool with one optional parameter, a rich set of annotations, and an output schema, the description is complete. It specifies the source (sleep daemon), state (pending), and filtering option, covering all necessary 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?

Schema description coverage is 100% (session_id has a clear description). The description mentions 'Filter by session_id' but does not add meaning beyond the schema. Baseline of 3 applies since the schema already documents the parameter well.

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 a specific action and resource: 'List pending curiosity questions queued by the sleep daemon.' It also notes the tool is read-only and can be filtered by session_id, distinguishing it from sibling tools focused on memory operations.

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 on what the tool does (lists pending curiosity questions) and how to narrow results (filter by session_id). It lacks explicit alternatives or when-not-to-use guidance, but the read-only nature and filtering hint are useful.

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

episodes_recentA
Read-onlyIdempotent

Returns the N most-recent user-turn records, time-desc. Optional session_id filter. GLOBAL across all projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoHow many turns to return (default 10, max 1000).
session_idNoFilter to a specific session UUID.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
turnsNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only and idempotent behavior. The description adds valuable context beyond that: the "GLOBAL across all projects" scope, which could be surprising for users expecting project isolation, and the time-desc ordering. However, it does not disclose potential rate limits, pagination, or what happens when n exceeds the max, though those are partially covered by 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.

Conciseness5/5

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

The description is a single, well-structured sentence that front-loads the core functionality, then adds the optional filter and global scope. Every clause adds value with no redundancy or filler.

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 simple read-only list tool with two optional parameters and a rich output schema, the description covers the essential behavior, scope, and ordering. The annotations and schema fill in safety and parameter details, making this sufficiently complete for a correct invocation.

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 100% (n and session_id are fully described). The description only reiterates "Optional session_id filter," which adds no new meaning beyond the schema. It does not clarify edge cases like n=0 or negative values, but the schema already provides defaults and bounds.

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 "Returns" with a specific resource: "N most-recent user-turn records," including ordering (time-desc) and an optional filter. It also distinguishes itself by declaring "GLOBAL across all projects," setting it apart from project-scoped siblings.

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 implicitly communicates when to use it (for recent user-turn records globally) but provides no explicit guidance on when not to use it or what alternatives might be better (e.g., memory_search for semantic recall, events_query for event logs). It lacks explicit exclusions or alternative tool references.

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

events_queryA
Read-onlyIdempotent

Query user-visible events (kind whitelist). Read-only. Optional since (ISO-8601), severity, limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesEvent kind. Must be in the whitelist (s4_contradiction, trajectory_metric, ...).
limitNoMaximum events returned (default 100, capped at 1000 by the daemon regardless of the value supplied).
sinceNoISO-8601 timestamp; only events at or after this are returned. Omit to return events from the start of the log.
severityNoOptional severity filter. Omit to return all severities.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNo
eventsNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive. The description adds context about 'user-visible events' and the 'kind whitelist', which are meaningful behavioral constraints beyond the annotations. No contradiction.

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 concise sentence that front-loads the primary purpose and lists key filters. Every word earns its place; 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?

With full schema, annotations, and an output schema present, the description is sufficiently complete for a read-only query tool. It communicates the essential scope and filters; return format is handled by output schema.

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 100%, so baseline is 3. The description merely lists the optional parameters without adding details beyond what the schema already provides (e.g., ISO-8601 for since, enums for severity). No extra 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?

The description uses a specific verb 'Query' with a clear resource 'user-visible events' and scope ('kind whitelist'). This distinguishes it from sibling tools like memory_recall or episodes_recent.

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 clearly indicates this is the tool for querying events, with optional filters (since, severity, limit) and a whitelist constraint. It does not explicitly compare to alternatives, but the context is clear and there are no exclusions mentioned.

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

memory_captureA

Capture a verbatim turn (auto-dedups near-duplicates). Use for corrections, not for minting standing-order directives.

ParametersJSON Schema
NameRequiredDescriptionDefault
cueNoShort natural-language cue used for embedding + dedup lookup. If empty, `text` itself is embedded.
roleNoWho produced this turn — tags the record for filtering.user
textYesVerbatim text to capture (user utterance, Claude decision, or observation). Min 12 chars, max 8000 (longer is truncated).
tierNoMemory tier. Default 'episodic' (verbatim user utterances). Use 'semantic' for induced summaries, 'procedural' for learned behaviour notes.episodic
focusNoOptional current point of attention for the live session task. Folded verbatim onto this session's own working-tier entry after the capture completes, alongside next_action.
agent_idNoOptional id of a background agent this capture is spawning or completing. Combine with agent_role and agent_expected_artifact to register a pending agent; combine with agent_complete_id on a later call to mark it done.
agent_roleNoOptional role of the spawned background agent (for example 'research' or 'implement'). Required alongside agent_id and agent_expected_artifact to register a spawn; omitted otherwise.
session_idNoCurrent session id for provenance.
agent_modelNoOptional model label for the spawned background agent, recorded on the registry entry when agent_id/agent_role/agent_expected_artifact register a spawn.
next_actionNoOptional immediate next step for the current live session task. Folded verbatim onto this session's own working-tier entry after the capture completes; surfaces at the next session start and on every subsequent turn until updated again.
salience_levelNoCaller-declared salience level for a decision, correction, or load-bearing preference marked in-turn. Additive rank-fusion boost only -- never a merge/drop lock. Omit for 'unflagged' (default, no behavior change). A value outside the enum is coerced to 'unflagged' server-side, never rejected.unflagged
epistemic_statusNoCaller-declared epistemic status. Omit for 'unknown' (default, no behavior change). A value outside the enum is coerced to 'unknown' server-side, never rejected.unknown
agent_complete_idNoOptional id of a previously spawned background agent to mark complete on this call.
agent_expected_artifactNoOptional artifact the spawned background agent is expected to produce. Required alongside agent_id and agent_role to register a spawn; omitted otherwise.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNo
statusNo
record_idNo

TDQS

A4/5.0
Behavior3/5

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

The description discloses one useful behavioral trait beyond the annotations: 'auto-dedups near-duplicates.' However, it does not explain side effects, persistence, merge/drop behavior, or response semantics. The annotations are all false, so they provide no additional safety or behavior hints, leaving the description with more responsibility than it fully carries.

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, front-loaded sentence with no filler. It states the core behavior, a key behavioral detail, and usage guidance, all in under 20 words.

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 14 parameters and several conditional agent-spawning fields, the text description is brief. The rich 100%-coverage schema and presence of an output schema compensate substantially, but the description itself does not hint at the background-agent registration/completion capabilities, so it is not fully complete.

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 100%, so all 14 parameters already have detailed descriptions. The tool description adds no new parameter-level meaning, and with full schema coverage the baseline of 3 is appropriate.

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 states a specific action ('Capture a verbatim turn') and a precise resource/scope ('verbatim turn'), and it even carves out what it is not for ('not for minting standing-order directives'). This clearly distinguishes it from sibling memory tools like memory_recall or memory_consolidate.

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 gives explicit when-to-use guidance ('Use for corrections') and an explicit exclusion ('not for minting standing-order directives'). It stops short of naming an alternative tool to use for directives, so it lacks the full when/when-not/alternatives triad.

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

memory_consolidateA
Idempotent

Trigger sleep-cycle consolidation: schema induction, FSRS decay, Hebbian pruning. Mutates store; idempotent in one sleep window.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idNoOptional session id used for provenance tagging on the consolidate event. Defaults to '-' when omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeNo
tierNo
decay_resultNo
schema_candidatesNo
summaries_createdNo

TDQS

A4/5.0
Behavior4/5

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

Description adds value beyond annotations by stating 'Mutates store' (aligning with readOnlyHint: false) and specifying 'idempotent in one sleep window' (extending the idempotentHint). It also discloses the internal processes involved. No contradiction with annotations.

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 essential information front-loaded. Every word earns its place, with no redundancy or 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 tool with one optional parameter, an output schema, and annotations covering safety/idempotency, the description provides sufficient context about purpose and effects. It could include more about when consolidation is appropriate, but the current level is adequate for selection and invocation.

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 100% and the single parameter (session_id) has a complete description in the schema. The tool description adds no additional semantic meaning about the parameter, so baseline 3 is appropriate.

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's function: 'Trigger sleep-cycle consolidation' and specifies three distinct processes (schema induction, FSRS decay, Hebbian pruning). This specific verb+resource combination distinguishes it from sibling tools like memory_recall or memory_reinforce.

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 when to use this tool (when triggering sleep-cycle consolidation) but does not explicitly state when not to use it or mention alternatives. Clear context but no exclusions or comparisons to sibling tools.

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

memory_contradictA

Mark a record contradicted; new fact stored as a NEW record (old NEVER deleted). Mutates store.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUUID of the record being contradicted.
new_factYesThe updated verbatim fact. Stored as a new record; the old record is preserved (episodic write-once) and linked via a `contradicts` edge.
cue_embeddingNoOptional pre-computed embedding vector for the contradicting fact (EMBED_DIM=384 floats; bge-small-en-v1.5). When omitted, the daemon embeds new_fact server-side.
epistemic_statusNoCaller-declared epistemic status of the corrected fact. Omit for 'unknown' (default, no behavior change). A value outside the enum is coerced to 'unknown' server-side, never rejected.unknown

Output Schema

ParametersJSON Schema
NameRequiredDescription
tsNo
edge_typeNo
original_idNo
new_record_idNo

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already show this is a mutating, non-destructive operation. The description adds valuable behavioral clarity by explicitly stating that the old record is NEVER deleted and that the store is mutated. This goes beyond the raw annotation flags and sets correct expectations about data preservation.

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 front-loaded sentence that immediately states the action, the key side effect, and the safety guarantee. Every clause earns its place; there is no redundant or vague filler.

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 rich input schema, annotations, and presence of an output schema, this description is sufficient. It covers the essential behavioral contract—mutation, preservation of old records, and creation of a new contradicted record—without needing to restate schema details.

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 100%, and each parameter including id, new_fact, cue_embedding, and epistemic_status already has a detailed schema description. The tool description contributes no additional parameter-level nuance, so the baseline of 3 is appropriate.

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 and resource: 'Mark a record contradicted' and clearly states the core effect—new fact stored as a NEW record while the old is never deleted. This differentiates the tool from siblings like memory_capture or memory_reinforce without needing to 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?

The description implies the usage—contradicting a record while preserving the old fact—but gives no explicit guidance about when to prefer this over memory_capture, memory_reinforce, or other alternatives. There are no stated exclusions or conditional routing cues.

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

memory_recallA
Read-onlyIdempotent

Recall verbatim memories by cue — decisions, preferences, prior discussion, rationale. Call before a repository search. Returns hits + anti_hits.

ParametersJSON Schema
NameRequiredDescriptionDefault
cueYesNatural-language query to match against stored memories. Embedded server-side via bge-small-en-v1.5 (384d) unless `cue_embedding` is supplied.
languageNoOptional ISO-639-1 language hint for the sleep-suggestion path (8 supported: en/ru/ja/ar/de/fr/es/zh). Defaults to 'en' when omitted. Hot-path retrieval is language-agnostic; this key only affects the sleep-suggestion regex pre-screen.
session_idNoCurrent session id; gets written into every recalled record's provenance. Omit to use '-'.
budget_tokensNoSoft token budget for the response (default 1500). Hits are appended until the next would exceed this budget; at least one hit is always returned.
cue_embeddingNoOptional pre-computed embedding vector for the cue (EMBED_DIM=384 floats; bge-small-en-v1.5). When omitted, the daemon embeds the cue server-side. Used by memory_contradict and tests that need byte-stable embeddings.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNo
hintsNo
cue_modeNo
anti_hitsNo
budget_usedNo
ann_path_usedNo
pask_teachbackNo
activation_traceNo
overnight_digestNo
patterns_observedNo
exact_authority_usedNo

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds that recall is 'verbatim' and that it 'Returns hits + anti_hits,' providing behavioral expectations beyond the annotations. It does not contradict annotations and adds context.

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 only two sentences, front-loaded with the action ('Recall'), and each clause carries distinct information: what it recalls, when to call it, and what it returns. No filler or redundancy.

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 complete schema, output schema, and rich annotations, the description covers purpose, usage timing, and a return-shape hint. It could mention anti_hits semantics or caveats, but the schema and output schema fill those gaps. It is sufficient for a tool of this complexity.

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?

All 5 parameters are fully described in the schema (100% coverage), so the baseline is 3. The description identifies the 'cue' as the matching mechanism and mentions return behavior, but provides no additional parameter semantics beyond what the schema already offers.

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 uses a specific verb ('Recall') and resource ('memories by cue') and lists content types ('decisions, preferences, prior discussion, rationale'). It distinguishes itself from siblings via 'verbatim' and the 'Call before a repository search' directive, though it doesn't explicitly name alternative tools.

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 context: 'Call before a repository search.' This tells when to use it but does not explicitly state when not to use it or name alternatives. Per rubric, that's a 4 (clear context, no exclusions).

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

memory_recall_structuralA
Read-onlyIdempotent

Structural recall via TEM role->filler bindings (BSC hypervectors). Read-only. Prefer over memory_recall for role-filler queries.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_recordsNoHard cap on records scanned after fetch (default 5000, max 50000). Prevents accidental full-corpus scans from `{}`.
budget_tokensNoSoft token budget for the response (default 2000). Hits are appended until the next would exceed this budget.
structure_queryNoOptional role->filler map, e.g. {"agent": "agent_name"}. Each value is hashed to a filler hypervector. When omitted or empty, query HV is zero-filled and every row with structure_hv is scored (expensive at large N).

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNo
anti_hitsNo
budget_usedNo
activation_traceNo
structural_query_sizeNo

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds minimal behavioral context beyond the annotations, such as the TEM role->filler binding mechanism and the 'Read-only' statement, but these do not significantly enrich the agent's understanding of operational behavior. It does not contradict the annotations, though it also does not disclose return format or side effects beyond what annotations already imply.

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 extremely concise, consisting of three short phrases that convey purpose, safety, and usage preference. Every word adds value, and it is front-loaded with the core concept. No unnecessary filler or repetition exists.

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 tool has a detailed input schema with all parameters documented, a rich output schema, and strong annotations. The description covers the core purpose and usage differentiation. It does not explain return values, but the output schema presumably handles that, and the overall definition is comprehensive enough for an agent to select and invoke the tool 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 100%, and the parameter descriptions are detailed, including hard caps, budget behavior, and the meaning of omitted structure_query. The description text itself does not add further parameter semantics beyond relating the tool to 'role-filler queries', which is already evident from the schema. Therefore the baseline score of 3 is appropriate.

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 performs structural recall via TEM role->filler bindings (BSC hypervectors), giving a specific mechanism and resource. It also explicitly distinguishes itself from the sibling tool memory_recall by noting it is preferred for role-filler queries, making its purpose unambiguous.

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 provides explicit usage guidance: 'Prefer over memory_recall for role-filler queries' directly tells when to use this tool over an alternative. The parameter schema further explains when structure_query is omitted, warning of an expensive full-corpus scan, which supplements the when-to-use context.

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

memory_reinforceA
Idempotent

Boost Hebbian edges among co-retrieved record ids. Mutates edge weights. Use when two records co-answered.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesRecord UUIDs that were co-retrieved in the current context. Edges between every pair are incremented; identical pair sets are idempotent within one session.
session_idNoSession identifier for correlating this reinforcement with the session's retrieval history. Optional; omit for old clients.

Output Schema

ParametersJSON Schema
NameRequiredDescription
new_weightsNo
edges_boostedNo

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses the mutation semantics ('Mutates edge weights') and reinforces the Hebbian reinforcement idea, which adds detail beyond the readOnlyHint=false annotation. It does not contradict the annotations; idempotency is already declared in the schema and annotation.

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, meaningful sentences: the action, the mutation effect, and the usage condition. No fluff or repetition that wastes tokens.

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 simple two-parameter tool with an output schema and annotations, the description plus schema provide enough to invoke it correctly. It could be more explicit about when not to use it relative to memory_recall or memory_consolidate, but this is not a critical 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?

Schema description coverage is 100%, so the baseline is 3. The description adds only contextual meaning to 'ids' via 'co-retrieved record ids' but does not add parameter-level details that the schema already lacks.

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 ('Boost') with a clear resource ('Hebbian edges among co-retrieved record ids') and states the core effect ('Mutates edge weights'). It distinguishes this from sibling memory tools by focusing on edge-weight reinforcement rather than search, capture, 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 Guidelines4/5

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

It explicitly says 'Use when two records co-answered', giving a clear trigger condition. It does not name exclusions or alternative sibling tools, so it does not fully meet the 5-level bar.

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

memory_temporal_recallA
Read-onlyIdempotent

Time-travel recall: as_of bounds records, changed_since filters events. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cueNoOptional natural-language cue. If omitted, the records side returns recency-ordered rows bounded by as_of.
as_ofNoISO-8601 timestamp. Bounds the records side: records.created_at <= as_of.
limitNoMaximum items per side (default 10).
changed_sinceNoISO-8601 timestamp. Bounds the events side: events.ts > changed_since (strict).

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsNo
_scopeNo
changed_since_eventsNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the 'Read-only' phrase is redundant. However, the description adds valuable behavioral detail by explaining that as_of bounds the records side and changed_since filters the events side, clarifying the dual-sided temporal semantics beyond the annotations.

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

Conciseness5/5

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

The description is a single, efficient sentence with a colon introducing the key mechanics. Every phrase carries meaning, and the front-loaded 'Time-travel recall' immediately conveys the tool's niche. No wasted words.

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 output schema exists, return value details are not needed. The description covers the core behavior (the two bounds) and mentions the read-only nature, which aligns with annotations. It omits discussion of cue and limit, but the schema provides those. Overall, it is complete for a read-only temporal query 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?

The schema already covers all parameters (100% coverage), giving a baseline of 3. The description adds meaning by mapping as_of to the records side and changed_since to the events side, helping the agent understand how these parameters relate to the two outputs. This semantic grouping exceeds the schema's individual 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's purpose with a specific verb ('recall') and resource ('records' and 'events') while uniquely specifying temporal scoping via 'as_of bounds records, changed_since filters events'. This distinguishes it from siblings like memory_recall and memory_search by emphasizing its temporal nature.

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 temporal use cases but does not explicitly state when to use this tool over siblings like memory_recall or events_query. No exclusions or alternative recommendations are provided, leaving the agent to infer usage context from the temporal keywords.

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

profile_get_setA
Idempotent

Read or write a profile knob (10 sealed: 9 AUTIST + wake_depth). operation get|set; returns knob value.

ParametersJSON Schema
NameRequiredDescriptionDefault
knobNoKnob name. Omit on 'get' to retrieve all live + deferred knobs. Required on 'set'.
valueNoNew value when operation='set'. Any JSON-serialisable type matching the knob's declared type in the sealed registry.
operationYesWhether to read or write a knob. 'get' with no `knob` returns all live + deferred knob values; 'set' requires both `knob` and `value`.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

The annotations already disclose readOnly=false, destructive=false, and idempotent=true; the description adds that the knobs are sealed and that get/set returns a value. It does not describe set-side effects such as validation, persistence, or deferred knob behavior, but the annotations carry the core safety profile.

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 plus a compact clause, with each component earning its place: purpose, knob inventory, operation mode, and return behavior. There is no filler or repetition of schema content.

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 3 parameters, an output schema, and complete schema coverage, this description is sufficient: it states the resource, operation, knob list, and return. It could mention error cases or dynamic/deferred knob behavior, but the schema and annotations already cover much of the operational 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?

Schema description coverage is 100% and the schema already documents operation, knob, and value with rich details, including 'get' with no knob returns all live+deferred values and set requires both fields. The tool description adds no new parameter detail, so the baseline score is appropriate.

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 'Read or write a profile knob' and names the two operations, get and set. It further specifies the exact sealed knob set (9 AUTIST + wake_depth), which makes the purpose concrete and distinguishes it from the unrelated sibling tools.

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 clear context that the tool is used to access/update profile knobs and that 'operation' selects read vs write. It doesn't explicitly name alternatives or when-not-to-use cases, but the tool's domain is narrow enough that no sibling overlap is apparent.

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

schema_listA
Read-onlyIdempotent

List induced schemas (Tier-0 + Tier-1) from sleep consolidation. Read-only. Filter by domain and confidence_min.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoOnly return schemas tagged with this domain (e.g. 'coding'). Omit to return schemas across all domains.
confidence_minNoMinimum parsed confidence (0.0-1.0). Default 0.0 returns all schemas; raise to 0.5+ to filter out low-evidence candidates.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalNo
schemasNo

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context about the source (sleep consolidation) and the Tier-0 + Tier-1 restriction, but it does not disclose any further behavioral traits such as return format or side effects. This aligns with the calibration example where annotations carry the main burden and the description adds moderate value.

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 extremely concise, with the core action and scope front-loaded in the first sentence. The second sentence adds the read-only note and filter parameters with no wasted words.

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 (two optional parameters, full schema descriptions, an output schema, and rich annotations), the description adequately covers the essential aspects: what it lists, the source, safety, and filtering. No significant information is missing for an agent to select and invoke the tool 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?

The input schema already provides 100% coverage for both parameters, including defaults and semantics. The description only echoes 'Filter by domain and confidence_min' without adding any additional meaning beyond what the schema provides, so the baseline 3 is appropriate.

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' with a clear resource 'induced schemas' and narrows scope to 'Tier-0 + Tier-1 from sleep consolidation.' This not only states what it does but also distinguishes it from sibling memory tools like memory_recall or memory_search.

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 clearly indicates the tool is read-only and mentions the two filter dimensions (domain and confidence_min), which provides clear context for when to use it. However, it does not explicitly name alternatives or exclusion criteria compared to sibling tools, 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.

topologyA
Read-onlyIdempotent

Snapshot of memory-graph topology: N, C, L, sigma, community_count, regime. Read-only diagnostic; sigma never toggles retrieval.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
CNo
LNo
NNo
sigmaNo
regimeNo
community_countNo
rich_club_ratioNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds a specific behavioral guarantee that 'sigma never toggles retrieval', which is useful context beyond the annotations. It also clarifies the read-only nature without contradicting annotations.

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, information-dense sentence. It front-loads the core purpose, lists the key output components, and adds a critical behavioral note all in one concise statement with no filler.

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?

With an output schema present and zero parameters, the description sufficiently covers the tool's purpose and behavior. The mention of 'sigma never toggles retrieval' addresses a potential concern, and the read-only diagnostic label sets accurate expectations. No significant gaps are apparent.

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 has zero parameters, so the baseline score is 4. The description needs no parameter explanations; it appropriately focuses on output fields 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?

The description clearly identifies the tool as providing a snapshot of memory-graph topology, listing the specific fields (N, C, L, sigma, community_count, regime). It differentiates itself from sibling memory tools by being a read-only diagnostic, not a retrieval or mutation tool.

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 labels it as a 'read-only diagnostic', making the intended use case (inspecting topology) clear. It does not mention explicit alternatives, but the context is sufficient given the tool's simplicity and zero parameters.

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. Dates show when Glama detected each change.

  1. 4 tool updatesv3.1.0
    • Addedclaim_check
    • Changedmemory_capture9 fields changed
      • addedInput schema / properties / agent_complete_id
        Added value: +{
        +  "description": "Optional id of a previously spawned background agent to mark complete on this call.",
        +  "type": "string"
        +}
      • addedInput schema / properties / agent_expected_artifact
        Added value: +{
        +  "description": "Optional artifact the spawned background agent is expected to produce. Required alongside agent_id and agent_role to register a spawn; omitted otherwise.",
        +  "type": "string"
        +}
      • addedInput schema / properties / agent_id
        Added value: +{
        +  "description": "Optional id of a background agent this capture is spawning or completing. Combine with agent_role and agent_expected_artifact to register a pending agent; combine with agent_complete_id on a later call to mark it done.",
        +  "type": "string"
        +}
      • addedInput schema / properties / agent_model
        Added value: +{
        +  "description": "Optional model label for the spawned background agent, recorded on the registry entry when agent_id/agent_role/agent_expected_artifact register a spawn.",
        +  "type": "string"
        +}
      • addedInput schema / properties / agent_role
        Added value: +{
        +  "description": "Optional role of the spawned background agent (for example 'research' or 'implement'). Required alongside agent_id and agent_expected_artifact to register a spawn; omitted otherwise.",
        +  "type": "string"
        +}
      • addedInput schema / properties / epistemic_status
        Added value: +{
        +  "default": "unknown",
        +  "description": "Caller-declared epistemic status. Omit for 'unknown' (default, no behavior change). A value outside the enum is coerced to 'unknown' server-side, never rejected.",
        +  "enum": [
        +    "fact",
        +    "estimate",
        +    "hypothesis",
        +    "opinion",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / focus
        Added value: +{
        +  "description": "Optional current point of attention for the live session task. Folded verbatim onto this session's own working-tier entry after the capture completes, alongside next_action.",
        +  "type": "string"
        +}
      • addedInput schema / properties / next_action
        Added value: +{
        +  "description": "Optional immediate next step for the current live session task. Folded verbatim onto this session's own working-tier entry after the capture completes; surfaces at the next session start and on every subsequent turn until updated again.",
        +  "type": "string"
        +}
      • addedInput schema / properties / salience_level
        Added value: +{
        +  "default": "unflagged",
        +  "description": "Caller-declared salience level for a decision, correction, or load-bearing preference marked in-turn. Additive rank-fusion boost only -- never a merge/drop lock. Omit for 'unflagged' (default, no behavior change). A value outside the enum is coerced to 'unflagged' server-side, never rejected.",
        +  "enum": [
        +    "unflagged",
        +    "notable",
        +    "critical"
        +  ],
        +  "type": "string"
        +}
    • Changedmemory_contradict1 field changed
      • addedInput schema / properties / epistemic_status
        Added value: +{
        +  "default": "unknown",
        +  "description": "Caller-declared epistemic status of the corrected fact. Omit for 'unknown' (default, no behavior change). A value outside the enum is coerced to 'unknown' server-side, never rejected.",
        +  "enum": [
        +    "fact",
        +    "estimate",
        +    "hypothesis",
        +    "opinion",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
    • Changedmemory_reinforce1 field changed
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "Session identifier for correlating this reinforcement with the session's retrieval history. Optional; omit for old clients.",
        +  "type": "string"
        +}
  2. 1 tool updatev3.0.3
    • Removedcamouflaging_status
  3. 15 tool updatesv3.0.0
    • Addedcamouflaging_status
    • Addedcuriosity_pending
    • Addedepisodes_recent
    • Addedevents_query
    • Addedmemory_capture
    • Addedmemory_consolidate
    • Changedmemory_contradict1 field changed
      • changedInput schema / properties / cue_embedding / description
        Previous value: -"Optional pre-computed embedding vector for the contradicting fact (its dimension must match the current store). When omitted, the daemon embeds new_fact server-side."New value: +"Optional pre-computed embedding vector for the contradicting fact (EMBED_DIM=384 floats; bge-small-en-v1.5). When omitted, the daemon embeds new_fact server-side."
    • Addedmemory_recall
    • Addedmemory_recall_structural
    • Addedmemory_reinforce
    • Addedmemory_search
    • Addedmemory_temporal_recall
    • Addedprofile_get_set
    • Addedschema_list
    • Addedtopology
  4. 14 tool updatesv2.6.1
    • Removedcamouflaging_status
    • Removedcuriosity_pending
    • Removedepisodes_recent
    • Removedevents_query
    • Removedmemory_capture
    • Removedmemory_consolidate
    • Removedmemory_recall
    • Removedmemory_recall_structural
    • Removedmemory_reinforce
    • Removedmemory_search
    • Removedmemory_temporal_recall
    • Removedprofile_get_set
    • Removedschema_list
    • Removedtopology
  5. 2 tool updatesv2.3.1
    • Changedmemory_contradict1 field changed
      • changedInput schema / properties / cue_embedding / description
        Previous value: -"Optional pre-computed embedding vector for the contradicting fact (EMBED_DIM=384 floats; bge-small-en-v1.5). When omitted, the daemon embeds new_fact server-side."New value: +"Optional pre-computed embedding vector for the contradicting fact (its dimension must match the current store). When omitted, the daemon embeds new_fact server-side."
    • Changedmemory_recall2 fields changed
      • changedInput schema / properties / cue / description
        Previous value: -"Natural-language query to match against stored memories. Embedded server-side via bge-small-en-v1.5 (384d) unless `cue_embedding` is supplied."New value: +"Natural-language query to match against stored memories. Embedded server-side by the configured provider unless `cue_embedding` is supplied."
      • changedInput schema / properties / cue_embedding / description
        Previous value: -"Optional pre-computed embedding vector for the cue (EMBED_DIM=384 floats; bge-small-en-v1.5). When omitted, the daemon embeds the cue server-side. Used by memory_contradict and tests that need byte-stable embeddings."New value: +"Optional pre-computed embedding vector for the cue (its dimension must match the current store). When omitted, the daemon embeds the cue server-side. Used by memory_contradict and tests that need byte-stable embeddings."
  6. 3 tool updatesv2.0.0
    • Addedmemory_search
    • Addedmemory_temporal_recall
    • Changedtopology4 fields changed
      • changedOutput schema / properties / C / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / L / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / rich_club_ratio / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / sigma / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
  7. 2 tool updatesv1.0.3
    • Changedmemory_capture1 field changed
      • changedInput schema / properties / session_id / description
        Previous value: -"Current session id for provenance (MEM-05)."New value: +"Current session id for provenance."
    • Changedmemory_recall1 field changed
      • changedInput schema / properties / session_id / description
        Previous value: -"Current session id; gets written into every recalled record's provenance (MEM-05). Omit to use '-'."New value: +"Current session id; gets written into every recalled record's provenance. Omit to use '-'."
  8. 2 tool updates
    • Addedepisodes_recent
    • Changedmemory_recall_structural1 field changed
      • changedInput schema / properties / structure_query / description
        Previous value: -"Optional role->filler map, e.g. {\"agent\": \"alice\"}. Each value is hashed to a filler hypervector. When omitted or empty, query HV is zero-filled and every row with structure_hv is scored (expensive at large N)."New value: +"Optional role->filler map, e.g. {\"agent\": \"agent_name\"}. Each value is hashed to a filler hypervector. When omitted or empty, query HV is zero-filled and every row with structure_hv is scored (expensive at large N)."

TDQS

A3.9/5.0
Disambiguation3/5

Several tools are recall-like and could be confused: memory_search, memory_recall, claim_check, memory_recall_structural, memory_temporal_recall, and episodes_recent. The descriptions add strong usage cues and preferences, but the number of overlapping retrieval modes still creates meaningful misselection risk.

Naming Consistency3/5

The memory_ prefix unifies core operations, but other tools use inconsistent styles: claim_check, schema_list, events_query, curiosity_pending, topology, episodes_recent. Modifier placement also varies between memory_recall_structural and memory_temporal_recall, so the set is readable but not patterned.

Tool Count4/5

15 tools is at the upper edge of a reasonable scope, but each tool maps to a distinct memory function: capture, recall variants, consolidation, schemas, events, topology, and profile control. A few recall modes could arguably be parameterized into one tool, but the count is not excessive for the domain.

Completeness4/5

Core memory lifecycle is covered: capture, recall, contradiction, reinforcement, consolidation, diagnostics, and profile control. There is no direct get-by-id or update-record operation, and search hints may require follow-up verification, but the append-only design and diagnostic tools fill most agent workflows.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    An MCP server that gives AI assistants persistent memory across sessions. It stores project context, decisions, and progress in structured markdown files as well as a knowledge graph and sequential thinking for better memory storage.
    36
    14
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A local MCP memory server that gives AI assistants durable project memory across coding sessions, storing context, changes, and decisions.
    3
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/CodeAbra/iai-personal-memory-engine'

If you have feedback or need assistance with the MCP directory API, please join our Discord server