Skip to main content
Glama

MCP Memory Graph

npm version npm downloads License: PolyForm Noncommercial Node CI MCP server Built for Claude Code Local-first · $0/token

A memory server for Claude Code and any other MCP client. It gives your AI assistant a permanent, searchable memory that lives in one SQLite file on your machine. Store a decision today, ask about it next month, and the answer comes back. Everything runs locally: the embedding model, the search index, the knowledge graph. No cloud account, no API key, no per-token cost.

License: source-available and free for noncommercial use (PolyForm Noncommercial 1.0.0): personal projects, hobby, study, research, charity, education, and government. Commercial use requires a paid license (COMMERCIAL.md).

Who it's for: developers who want Claude (or Cursor, Codex, any MCP client) to remember decisions across sessions. Solo builders and hobbyists use it free. Teams share a knowledge base over git. And anyone who wants to replace a cloud memory service (mem0, Zep, Letta, Supermemory) with something that runs entirely on their own machine.

What it looks like

Run npx mcp-memory-graph serve and you get a local web dashboard for browsing and searching your memory outside Claude.

The dashboard: memory counts, breakdowns by scope, department, and type, and the most recent memories

Search works by meaning, not keywords. The query below ("how do we handle payments") finds the Stripe, GDPR, and Postgres notes even though none of them contains that phrase — each result carries a confidence score and a match-type badge:

Semantic search results with confidence and match-type badges

Browse and sort the whole store in one table — scope, type, tags, quality score, and how often each memory has been read:

Sortable table of all stored memories

Related MCP server: CozoDB Memory MCP Server

How it compares

mem0, Zep, Letta, and Supermemory are the usual names for AI memory, and several of them have open-source cores. This one is built around a different default: nothing leaves your machine and there's no infrastructure to run.

MCP Memory Graph

Typical hosted memory service

Where it runs

One SQLite file on your machine

A managed cloud service (some also self-host)

Embeddings

Local model in Node (MiniLM), no API key

Usually a cloud embedding API

Cost per token

$0 — nothing is metered

Usage-based, or a server you operate

Extra infrastructure

None

Often Postgres/pgvector, Redis, or a Python service

Claude Code integration

First-class: hooks auto-capture and recall

Manual wiring

Benchmarks

Committed corpus + runner, reproducible locally

Mostly self-reported

The trade-off is honest: a single-process SQLite server tops out in the low hundreds of thousands of vectors (see Limitations), and a hosted service will scale past that without you thinking about it. If you're a solo developer or a small team who wants memory that's private, free, and zero-ops, that ceiling is rarely the thing you hit first.

Why this exists

AI assistants forget everything between sessions. Your decisions, your patterns, the bug you fixed last Tuesday: all gone when the conversation ends. This server fixes that.

  • Knowledge stored today is searchable tomorrow, next week, next year.

  • Search works by meaning, not just keywords. "contract notice period" finds "90-day renewal clause".

  • It improves itself. It tracks what gets used, scores quality, extracts learnings from your sessions, and cleans itself up on a schedule.

  • It stays private. Local embeddings, no cloud APIs, no telemetry. The one exception is the optional Stop hook, which sends your session transcript to your own locally installed Claude Code (claude -p) for learning extraction. You can turn that off with review_on_stop: false.

  • It works for any kind of knowledge. Engineers store architecture decisions, lawyers store contract patterns, accountants store audit procedures.

Quick start (about 5 minutes)

You need Node.js 20 or newer and Claude Code installed.

1. Get the server. From npm (easiest):

npm install -g mcp-memory-graph

Or from source:

git clone https://github.com/YonasValentin/mcp-memory-graph.git
cd mcp-memory-graph
npm install
npm run build

2. Register the server with Claude Code (optional — init in step 3 does this for you at user scope):

# npm install:
claude mcp add memory-server -- npx -y mcp-memory-graph

# from source:
claude mcp add memory-server node /path/to/mcp-memory-graph/dist/index.js

3. Install the hooks (recommended):

npx mcp-memory-graph init

This is the one command that wires everything up: it registers the MCP server (user scope), installs the auto-capture/recall hooks and the usage skill, writes config, and schedules a nightly cleanup. Answer the prompts, or pass --yes to accept the defaults. (Skip the auto-registration with --no-register if you manage claude mcp yourself.)

4. Try it. Open a Claude Code session and say:

Remember this: we use Postgres for the main app database. Decided 2026-06-01,
because we need JSONB and full-text search in one place.

Then, in a later session:

What database did we decide to use, and why?

Claude searches its memory and answers with the stored decision. That's the whole loop.

5. Verify the install. Ask Claude:

What memory tools do you have available?

It should list all 51 tools (45 memory_*, 3 vault_*, 3 core_memory_*).

The first time a memory tool runs, the embedding model (about 30 MB) downloads from HuggingFace and is cached at ~/.cache/huggingface/. Every start after that is instant.

To undo everything: npx mcp-memory-graph uninstall.

Upgrading

npm install -g mcp-memory-graph@latest   # or just let `npx -y mcp-memory-graph` pull it
npx mcp-memory-graph init                # re-run to refresh on-disk hooks + the nightly schedule

Upgrading the package updates the code that runs each session (hooks, tools, the server), so server-side fixes apply the next time a tool runs — nothing else needed for those.

But files that init wrote earlier are not rewritten by a package upgrade: the Claude Code hook registrations in settings.json and the macOS launchd plist at ~/Library/LaunchAgents/com.mcp-memory.consolidate.plist. If you installed before 2.6.3, that plist used a bare node that launchd (whose minimal PATH excludes nvm) could not run — so the nightly consolidation silently never fired. Re-run npx mcp-memory-graph init once after upgrading to regenerate it with an absolute node path and an output log. Verify it then runs:

launchctl start com.mcp-memory.consolidate
cat ~/.mcp-memory/consolidation.log      # should show a "Consolidation complete" report

To clear conflict noise that accumulated while the job wasn't running: npx mcp-memory-graph consolidate.

How it works, in plain terms

When you store a memory, the server turns the text into a vector (a list of 384 numbers that captures its meaning) using a small model that runs inside Node.js. It also indexes the text for keyword search. Both live in one SQLite file, by default at ~/.mcp-memory/memory.db.

When you search, the server runs both kinds of search at once, merges the rankings, and returns the best matches with a confidence label. A second model can then re-sort the top results for better precision (this is the reranker, on by default for MCP clients, and it costs about 200 ms).

On top of that sits a knowledge graph: memories link to entities and to each other, so the server can answer questions that need more than one hop, like "what does the payment service depend on?". A nightly "dream cycle" deduplicates, re-scores, prunes, and reports gaps.

The benchmarks, and how to read them

Every number below was produced locally: real embedding model, real production handlers, no network. You can rerun all of them on your own machine.

A quick primer if benchmarks are new to you. A gold set is a list of questions where the right answer is known in advance. Precision@1 asks: was the top result the right one? Recall@5 asks: was the right answer anywhere in the top 5? MRR (mean reciprocal rank) rewards putting the right answer near the top. The reranker is a second model that re-sorts the top 50 results; it is slower but noticeably more accurate.

Local gold set

precision@1

precision@3

MRR

search p95

Hybrid (RRF)

0.563

0.750

0.704

~4 ms

+ cross-encoder rerank (MCP default)

0.813

0.875

0.867

~230 ms

Reproduce with npm run bench. Full methodology, the gold set itself, and every miss are printed and documented in docs/BENCHMARKS.md.

Scale

With the real embedder and a file-backed SQLite database, retrieval p95 is 9.1 ms at 10,000 vectors and 30 ms at 50,000. The rerank pass adds a roughly constant 200 ms on top. Most memory products publish self-reported, cloud-hosted numbers; these are measured locally and reproducible from a committed corpus and runner.

Public benchmarks

Four public memory benchmarks, run untuned (stock MiniLM embedder, production handlers, zero benchmark-specific tweaks), matching or beating MemPalace on all four:

Benchmark

Our result

Comparison

LongMemEval-S

R@5 = 97.8%

vs 96.6% published

ConvoMem

R@10 = 93.5%

vs 92.9%

LOCOMO

session R@10 = 82.2%, R@50 = 100%

vs 60.3% baseline

MemBench

hit@5 = 78.7%

vs their 80.3% tuned

Run them yourself: npm run bench:longmemeval, bench:locomo, bench:convomem, bench:membench. The honest notes (where the reranker helps and where it hurts, the dedup floor on MemBench, gold-set size caveats) are in docs/BENCHMARKS.md.

Features

Core

  • 51 MCP tools: CRUD and retrieval, a confidence-tagged knowledge graph, a self-correcting write gate, signed provenance and verification, an event bus with SSRF-guarded webhooks, change propagation and advisor surfaces, resumable session state, expertise profiles, memory tiers, Obsidian vault round-tripping, and GDPR-grade forget and history. Full list below.

  • Hybrid search: vector similarity (meaning) plus keyword matching (exact terms), merged with Reciprocal Rank Fusion. rerank: true adds the cross-encoder pass. use_graph: true blends in HippoRAG Personalized PageRank multi-hop scores. as_of: <timestamp> searches the graph as it stood at a past moment.

  • Local embeddings: Transformers.js running all-MiniLM-L6-v2 (384 dimensions) inside Node.js. No Python, no cloud API, no GPU.

  • SQLite storage: one file, using better-sqlite3 with two extensions: sqlite-vec for vector nearest-neighbor search, FTS5 for keyword search with BM25 ranking.

  • Structure-aware chunking: text splits on paragraphs, markdown on headings (heading context preserved in each chunk), code on function and class boundaries, legal on sentences.

  • Scopes: organize memories into global, project, user, team, department.

  • Version history: every update saves the previous version. Full audit trail of who changed what, when.

  • Temporal decay: optional time-based scoring that favors recent memories (exponential or linear).

  • Confidence scoring: every result carries a 0 to 1 confidence and a plain label (high, medium, low).

  • Expiration: time-sensitive memories can carry an expiry date and drop out of search automatically.

Self-improvement

  • Access tracking: every search, get, and related-memory call records which memories were touched.

  • Quality scoring: automatic importance_score and confidence_score on every memory, from access frequency, recency, and content signals.

  • Learning extraction: at session end, a headless claude -p reviews the transcript and stores zero to five curated learnings. (This replaces the older type: "agent" Stop hook, which is silently broken on macOS; see anthropics/claude-code#39184.)

  • Dream cycle: scheduled or on-demand deduplication, re-scoring, pruning, expiry enforcement, and knowledge-gap detection.

  • Gap detection: searches that return nothing are logged, so you can see what knowledge is missing.

Claude Code hooks

Five opt-in hooks, installed by init:

Hook

When it fires

What it does

SessionStart

session begins

Status check (memory count, expired, stale docs) and surfaces the top memories for the project

UserPromptSubmit

each prompt that carries a task signal (a ticket/PR id or ≥2 keywords)

Keyword-searches the store and surfaces matching memories so you recall prior work before re-deriving it; stays silent on trivial prompts

PostToolUse

after a memory search

Tracks hits and misses to search-log.jsonl

PreCompact

before context compression

Optional learning extraction (off by default)

Stop

session ends

Spawns headless claude -p to review the session and store learnings

The Stop hook detaches in about 30 ms and reviews in the background for 10 to 60 seconds. It needs the claude CLI on $PATH (or $CLAUDE_BIN), authenticated. Turn it off with review_on_stop: false in ~/.mcp-memory/config.json.

Metadata on every memory

Field

Purpose

Examples

scope

Isolation level

global, project, user, team, department

namespace

Sub-scope grouping

"my-project", "legal-team", "q4-audit"

department

Organizational unit

legal, engineering, hr, sales, finance

document_type

Content classification

contract, policy, code, incident, decision, report

access_level

Data sensitivity

public, internal, confidential, restricted

tags

Flexible categorization

["renewal", "notice-period", "compliance"]

language

Content language (ISO 639-1)

"en", "da", "de"

source

Origin

file path, URL, system name

author

Creator

person or system name

metadata

Domain-specific JSON

{contract_type: "NDA", parties: ["A","B"]}

expires_at

Auto-expiration date

ISO 8601 timestamp

scope and namespace group content within one database. A shared-database MCP_API_NAMESPACE pin gives supported per-namespace multi-tenant isolation (schema v14); a separate database file per tenant is the strongest boundary. See docs/MULTI-TENANCY.md.

Knowledge graph and bi-temporal model

  • Bi-temporal validity: every memory carries valid-time (valid_from, valid_to) alongside transaction-time. Updates invalidate rather than delete: the prior fact gets a valid_to stamp instead of being overwritten, so history is never lost. Reads default to currently valid rows but accept as_of: <timestamp> for point-in-time recall. memory_history returns one memory's full timeline.

  • Confidence-tagged links: memories connect via wikilink, co-occurrence, and similarity edges, each with a confidence weight. memory_graph traverses entities and relationships up to 3 hops. memory_extract_entities stores LLM-extracted entities and relationships.

  • HippoRAG multi-hop: use_graph: true on search runs Personalized PageRank over the entity and link graph for associative retrieval.

  • Token-budgeted answers: memory_query answers a question with a tight subgraph. It seeds from hybrid search, walks the graph up to max_hops while avoiding hubs, and returns a token-budgeted context string instead of flooding the window.

  • Communities: memory_communities finds densely connected entity clusters, for "what are the main themes in here?" questions.

Self-correcting writes

  • Write gate: stores route through an ADD, UPDATE, DELETE, or NOOP decision (on_conflict), so new facts reconcile with existing ones instead of piling up duplicates.

  • Contradiction detection: a cross-encoder NLI model flags when an incoming memory contradicts something already stored.

  • Forgetting curve: memories carry a stability signal, so rarely reinforced knowledge slowly sinks in ranking, the way human memory fades.

Agent-OS memory

  • Core memory block: a small, bounded, always-in-context note per (scope, namespace) that the agent maintains itself (core_memory_get, core_memory_append, core_memory_replace). Appends that would overflow are refused, which forces deliberate compaction.

  • Tiers: memory_tiers reports a MemGPT-style hot / recall / archival distribution and lists the hot working set.

  • Reflection: memory_reflect gathers the most reflection-worthy memories and, in store mode, persists synthesized insights linked back to their sources.

Obsidian vault

  • Bidirectional sync: vault_sync reads a vault in. memory_export_vault writes memories out as .md files with YAML frontmatter that round-trips losslessly for every authored field (id, scope, namespace, tags, access_level, importance, timestamps). Two derived scores are not in the frontmatter and reset on re-import: confidence_score (to 0.6) and stability (to 1.0). Use memory_export (JSON) for a byte-perfect backup. One metadata key is reserved: metadata._vault holds internal sync bookkeeping and never appears in tool output or exported files.

  • JSON Canvas: memory_canvas exports the graph as a JSON Canvas 1.0 .canvas file that opens as a spatial board in Obsidian.

  • Read-only wiki: serve exposes /publish/:namespace (index, page, search, graph) as a read-only wiki. It is deliberately not behind bearer auth, but is hard-scoped to published access levels (MCP_PUBLISH_ACCESS_LEVELS, default public).

  • Session notes and templates: memory_session_note appends to one "daily note" per session. memory_template returns structured note scaffolds per document type.

Team and solo sharing (git)

  • memory init wizard: interactive setup (or --yes for defaults) that writes ~/.mcp-memory/config.json (or project-scoped config) plus the Claude Code wiring.

  • Committable graph artifact: memory export-graph writes a deterministic memory-graph.json you can commit and share. memory git-setup installs a .gitattributes entry and the memory-union merge driver so parallel commits merge instead of conflict.

  • Attribution: set MCP_AGENT_ID (or pass agent_id per store) and memory_attribution reports how many valid memories each agent wrote.

Trust and governance

  • Questions to ask: memory_questions surfaces what the graph is well placed to find: ambiguous links to confirm, frequently mentioned but under-documented entities, orphaned and stale memories.

  • GDPR-grade forget: memory_forget soft-deletes by default (a tombstone via valid_to, recoverable, still visible via as_of). With hard: true it returns a portability export first, then permanently erases. memory_delete is unchanged.

  • Output sanitization: every tool result passes through one chokepoint that strips ANSI and VT escapes, control characters, and zero-width or BiDi Trojan-Source spoofing before it leaves the server. Stored content stays raw at rest.

  • Hot reload: config changes apply without a restart.

Web dashboard

The server ships a browser dashboard for viewing and managing memories outside Claude. It runs on the same Express server as the MCP HTTP transport, so there is no separate process.

Six pages:

  • Dashboard: memory counts, content size, breakdowns by scope, department, and type, plus the 10 most recently updated memories.

  • Search: hybrid search with confidence and match-type badges, and instant fuzzy suggestions as you type.

  • Browse: sortable, paginated table of all memories with scope filtering and quality indicators.

  • Memory detail: full content, metadata, version history, related memories, inline edit and delete.

  • Knowledge graph: D3 force-directed view. Nodes sized by importance, colored by scope. Zoom, pan, drag, double-click to navigate.

  • Tools: a console for the full tool surface. It lists every tool the server advertises, renders a form from each schema, and runs it over the authenticated MCP endpoint. Destructive tools ask for confirmation first.

Tech: React 19, Vite, Tailwind CSS v4, shadcn/ui, Fuse.js, D3, Recharts.

Run it:

# Development (hot reload)
npm run build && npm run serve   # Terminal 1: server on :3100
npm run dev:web                   # Terminal 2: Vite on :5173 (proxies /api to :3100)

# Production (single process)
npm run build:all                 # Builds server + frontend
npm run serve                     # http://localhost:3100 serves both API and UI

Docker: the image includes the built frontend. After docker compose up, the dashboard is at http://<host>:3200 alongside the MCP endpoint. Team members can browse the shared store from any browser, no Claude Code required.

REST API (16 endpoints)

The REST surface is for reading and managing. Creating memories goes through MCP (memory_store over POST /mcp); there is deliberately no POST /api/memories.

Method

Path

Description

GET

/api/stats

Memory counts and breakdowns

GET

/api/search?q=...

Hybrid search with filters

GET

/api/memories

List with pagination and sorting

GET

/api/memories/:id

Single memory with metadata

GET

/api/memories/:id/versions

Version history

GET

/api/memories/:id/related

Semantically related memories

PATCH

/api/memories/:id

Update content or metadata

DELETE

/api/memories/:id

Delete a memory

GET

/api/graph

Nodes and edges for graph visualization

GET

/api/manifest

Integrity manifest (merkle root plus per-memory hashes)

GET

/api/insights

Trends and themes summary

GET

/api/health

Knowledge-gap report (recurring zero-result searches)

GET

/api/webhooks

List webhook targets (gated by MCP_WEBHOOKS)

POST

/api/webhooks

Register an SSRF-validated outbound target

DELETE

/api/webhooks/:id

Remove a webhook target

POST

/api/webhooks/dispatch

Drain the durable, HMAC-signed delivery queue

The first nine are what the dashboard uses. All REST endpoints call the same handlers as the MCP tools; no business logic is duplicated.

Self-improvement in detail

The server tracks how knowledge is used, scores quality, learns from sessions, and consolidates itself over time.

The learning loop

 ┌──────────────────────────────────────────────────────────┐
 │                    SESSION                                │
 │  Claude searches → access_count++ on matched memories     │
 │  Claude stores   → new memory with initial scores         │
 │  Zero results    → knowledge gap recorded                 │
 └─────────────┬────────────────────────────────────────────┘
               │
               ▼
 ┌──────────────────────────────────────────────────────────┐
 │            SESSION END (Stop command hook)                │
 │  Hook spawns detached `claude -p` headless review         │
 │  --allowedTools restricts to memory_store only            │
 │  Claude judges → 0-5 curated entries via memory_store     │
 │  Deduplicates against existing memories                   │
 └─────────────┬────────────────────────────────────────────┘
               │
               ▼
 ┌──────────────────────────────────────────────────────────┐
 │              DREAM CYCLE (nightly or manual)              │
 │  1. Score    : Recalculate importance from access data    │
 │  2. Expire   : Enforce expiration dates                   │
 │  3. Prune    : Remove low-quality, never-accessed items   │
 │  4. Dedup    : Merge near-duplicate memories              │
 │  5. Gaps     : Surface zero-result search patterns        │
 └──────────────────────────────────────────────────────────┘

Quality scoring

Every memory gets an importance_score between 0 and 1:

importance = 0.3 * current_score + 0.4 * normalized_access_frequency + 0.3 * recency_factor

Recency factor:

Age

Factor

< 7 days

1.0

< 30 days

0.7

< 90 days

0.4

> 90 days

0.1

Memories that are never accessed gradually lose importance. Auto-extracted memories start lower and get pruned if they never prove useful.

Note on access reinforcement. The formula above is the periodic recompute run by the consolidate Score stage. Each read (memory_get, memory_search, memory_related) also applies a small immediate boost (importance_score += 0.03, capped at 1.0), and search uses importance as a mild rank multiplier (1 + importance * 0.5). A memory read 20 or more times approaches the ceiling from reads alone, and consolidate re-baselines it on the next run. This popularity weighting is intentional. If you want a fixed value that reads don't drift, set an explicit importance_score on memory_store or memory_update.

Knowledge gap detection

When a search returns nothing, the query is logged. The dream cycle's gap stage surfaces these, so you can see what's missing from the store.

Installation reference

Prerequisites

  • Node.js 20+, for any client.

  • An MCP client. Claude Code is the first-class experience; the automatic capture and recall hooks are Claude-Code-only. Other MCP clients (Codex, Cursor, and the rest) get all 51 tools but drive them manually. See "Other MCP clients" below.

  • For the Stop hook only: the claude binary on $PATH (or $CLAUDE_BIN), authenticated without prompting. Optional; disable with review_on_stop: false.

What init does

npx mcp-memory-graph init                  # user scope: hooks apply to all projects
npx mcp-memory-graph init --scope project  # this project only

User scope writes hooks to ~/.claude/settings.json, so they fire in every Claude Code session. Project scope writes hooks to .claude/settings.json in the current directory and creates .mcp.json for automatic server discovery; collaborators who clone the project get the memory server registered automatically.

Init does seven things:

  1. Verifies the hook scripts exist in dist/hooks/.

  2. Registers the five hooks in settings.json.

  3. Creates the config file with sensible defaults: ~/.mcp-memory/config.json (user scope) or <project>/.mcp-memory/config.json (project scope; the generated .mcp.json pins it via MCP_MEMORY_CONFIG_PATH).

  4. Writes memory usage instructions to .claude/CLAUDE.md (project scope) or prints a snippet (user scope).

  5. Registers the MCP server with Claude Code — user scope runs claude mcp add -s user memory-server -- npx -y mcp-memory-graph for you (idempotent; best-effort — warns with the manual command if the claude CLI isn't on PATH; skip with --no-register). Project scope is registered via the committable .mcp.json instead. This makes step 2 of the Quick Start optional.

  6. Installs the mcp-memory-graph usage skill into ~/.claude/skills/ so Claude Code has inline guidance for all 51 tools, gotchas, and workflows. Skip with --no-skill.

  7. Sets up the nightly consolidation schedule (macOS: launchd, loaded immediately so it runs without a relogin; Linux: prints a cron suggestion; skipped for project scope).

Under a non-interactive shell (agent/CI) the wizard is bypassed: defaults are applied and a report is printed showing what was set and how to change each value. Passing --yes applies the defaults silently (no report).

Key flags: --scope user|project, --schedule HH:MM[,HH:MM] (nightly consolidation time, default 03:00), --vault <path> (enable Obsidian vault round-trip), --no-review-on-stop (disable the end-of-session learning review), --no-skill (skip skill install), --no-register (skip the user-scope claude mcp add), --remote <url> (team server mode).

npx mcp-memory-graph uninstall reverses everything init did: removes hooks, the nightly schedule, the CLAUDE.md block, and the installed skill.

Unattended setup (CI, provisioning, agents)

Every step is scriptable. There is no interactive-only path:

git clone https://github.com/YonasValentin/mcp-memory-graph.git
cd mcp-memory-graph
npm install && npm run build
npx mcp-memory-graph init --scope project --yes   # local: hooks + .mcp.json, no prompts
# or point at a shared self-hosted server instead:
# npx mcp-memory-graph init --remote https://memory.example.com --token-env MEMORY_MCP_TOKEN

Other MCP clients (Codex, Cursor, and more)

Claude Code gets the hooks; everyone else gets the same 51 tools, driven manually. The server is a standard MCP server, so any client works. A line in the client's rules file makes usage near-automatic.

Register the server. Example for Codex, in ~/.codex/config.toml (global) or .codex/config.toml (project, trusted only):

[mcp_servers.memory-graph]
command = "node"
args = ["/abs/path/to/mcp-memory-graph/dist/index.js"]
tool_timeout_sec = 180   # the first call downloads the ~30 MB model once; the 60s default can be tight

[mcp_servers.memory-graph.env]
MCP_MEMORY_DB_PATH = "/abs/path/to/.mcp-memory/memory.db"

# or a shared self-hosted server over HTTP (see Self-hosting below):
# url = "https://memory.example.com/mcp"
# bearer_token_env_var = "MEMORY_MCP_TOKEN"

Or codex mcp add memory-graph -- node /abs/path/to/mcp-memory-graph/dist/index.js. Cursor, Windsurf, and other clients use their own MCP config format, but the server command (node .../dist/index.js) and the HTTP option are the same.

Then nudge the agent in its instructions file (Codex: AGENTS.md; Cursor: project rules):

Before answering questions about architecture, decisions, patterns, or past fixes, call memory_search on the memory-graph server first; store new decisions, patterns, and fixes with memory_store.

Self-hosting and sharing a memory base

The server runs three ways, from a single-user cache to a knowledge base shared across many machines. All three are local-first: nothing leaves the machines you choose to run it on.

1. Local (single user), the default

npx mcp-memory-graph init registers a local stdio server plus the hooks. Memory lives in one SQLite file on your machine. Nothing else to run. Right choice for solo use.

2. Shared server (multiple machines or a group)

Run one server that many clients connect to over HTTP. Everyone shares the same memory base, live.

Start the server (pick one):

# From source: build the server (and the dashboard, if you want it) first
npm run build:all
MCP_AUTH_TOKEN=$(openssl rand -hex 32) MCP_BIND=0.0.0.0 npm run serve
# MCP at /mcp, REST at /api, dashboard at /, all on :3100

# Or with Docker (frontend included; publishes host port 3200 by default)
MCP_AUTH_TOKEN=$(openssl rand -hex 32) docker compose up -d

Set MCP_AUTH_TOKEN whenever the server is reachable beyond loopback. It is a shared bearer token, one secret for all clients. The server refuses to start unauthenticated on a non-loopback bind unless you set MCP_AUTH_OPTIONAL=1. Terminate TLS at a reverse proxy or tunnel for anything off-host.

Connect a client, one command per machine:

npx mcp-memory-graph init --remote https://memory.example.com --token-env MEMORY_MCP_TOKEN
export MEMORY_MCP_TOKEN=<the server token>     # in your shell or .env

For Claude Code this writes a project .mcp.json pointing at the shared server. The token is stored as an env-var reference ("Authorization": "Bearer ${MEMORY_MCP_TOKEN}"), so the committed .mcp.json never contains the secret. Non-Claude clients point at the same server through their own MCP config.

Flag

Effect

--token-env <NAME>

Reference this env var for the token (default MEMORY_MCP_TOKEN)

--token <value>

Inline a literal token instead (avoid committing it)

--no-auth

Omit the auth header (loopback or trusted network only)

In remote mode the local capture and recall hooks are not installed. The memory lives on the server, not in a local file the hooks could read. The agent uses memory_search and memory_store directly (the CLAUDE.md guidance is still written).

3. Git vault (async, version-controlled sharing)

Prefer your knowledge base in git, reviewed through pull requests, with no server to run? Export memories to plain Markdown and share the folder as a git repo:

npx mcp-memory-graph vault-init                    # make the vault a git repo (union merge driver + rebuild hook)
git add -A && git commit -m "memory snapshot" && git push
# collaborators, once after cloning:
#   npx mcp-memory-graph vault-init                # registers the union merge driver + post-merge hook in THEIR clone
# collaborators, thereafter: git pull && npx mcp-memory-graph rebuild

Each collaborator must run vault-init once in their own clone. The merge driver and post-merge rebuild hook live in local git config (.git/), not in the repo. A fresh clone without vault-init will hit raw conflict markers in .memory/graph.json on its first concurrent pull. Re-running vault-init is idempotent and does not clobber the committed sidecar.

Two recovery notes for team vaults:

  • After a merge you resolved by hand (the post-merge hook only fires on clean merges), memory rebuild can refuse with VaultIntegrityError because .memory/manifest.json is stale. Delete that file and re-run rebuild; it is derived state and regenerates.

  • Hand-edited a .md while your database has newer state? Import first (vault_sync or rebuild), then export (memory sync). A full export from a stale database overwrites vault files, including your hand edit.

Security notes

  • MCP_AUTH_TOKEN is a single shared secret, fine for a trusted group; rotate it by restarting the server with a new value. For per-key RBAC (one server, N keys, each pinned to a namespace set and an access-level ceiling) use memory keys create|list|revoke (schema v16). The legacy shared token still works and is checked first. See docs/MULTI-TENANCY.md.

  • Never commit a token. The --remote default keeps it in an env var by design.

  • Bind to 127.0.0.1 (the default) unless you front the server with a proxy that terminates TLS; then set MCP_BIND=0.0.0.0.

Building an org-wide AI brain? One server, a key per employee, an org chart the AI can traverse (people, teams, SOPs, and tools as typed graph nodes), with enforced who-sees-what. The recipe, built on existing primitives, is in docs/ENTERPRISE-BRAIN.md.

Configuration

Environment variables

Variable

Default

Description

MCP_MEMORY_DB_PATH

~/.mcp-memory/memory.db

Database file location. The directory is created automatically.

MCP_MEMORY_MODEL

Xenova/all-MiniLM-L6-v2

HuggingFace embedding model name. Must be an ONNX model compatible with Transformers.js.

MCP_MEMORY_DIMENSIONS

384

Embedding vector dimensions. Must match the model's output.

MCP_MEMORY_CONFIG_PATH

~/.mcp-memory/config.json

Override location for the configuration file.

The full env reference (auth, rate limits, webhooks, vault, publish) is in docs/ENV.md.

Custom database location

claude mcp add memory-server --env MCP_MEMORY_DB_PATH=/path/to/project/.memory.db node /path/to/dist/index.js

Alternative embedding models

# Swap the embedding model (same 384 dimensions; drop-in for the existing index
# AFTER a re-embed; see the warning below)
claude mcp add memory-server \
  --env MCP_MEMORY_MODEL=Xenova/bge-small-en-v1.5 \
  --env MCP_MEMORY_DIMENSIONS=384 \
  node /path/to/dist/index.js

Model identity is recorded and enforced. The database remembers which embedding model built it (schema_meta.embedding_model). Starting the server with a different MCP_MEMORY_MODEL fails loudly instead of silently degrading every search (same dimension does not mean same vector space). To switch models: set the new model and run memory rebuild (re-embeds from the vault), or export and re-import.

Configuration file

The config file controls self-improvement behavior, hook settings, and per-project overrides. Resolution order: MCP_MEMORY_CONFIG_PATH env, then <cwd>/.mcp-memory/config.json (project-scope init writes this), then ~/.mcp-memory/config.json. Created by npx mcp-memory-graph init, or write it by hand:

{
  "defaults": {
    "scope": "project",
    "namespace": "auto"
  },
  "projects": [
    {
      "path": "~/Documents/MyApp",
      "namespace": "my-app",
      "watch": ["README.md", "docs/**/*.md"]
    }
  ],
  "consolidation": {
    "similarity_threshold": 0.85,
    "prune_after_days": 30,
    "min_importance_to_keep": 0.1,
    "max_operations": 100,
    "schedule": [
      { "hour": 11, "minute": 30 },
      { "hour": 16, "minute": 0 }
    ]
  },
  "hooks": {
    "extract_on_compact": false,
    "extract_on_session_end": false,
    "track_searches": true,
    "review_on_stop": true
  },
  "extraction": {
    "categories": ["decision", "pattern", "error_fix", "convention"],
    "min_confidence": 0.4
  }
}

Section

Key

Default

Description

defaults

scope

"project"

Default scope for new memories

defaults

namespace

"auto"

Default namespace ("auto" derives from project directory name)

projects[]

path

Project root directory

projects[]

namespace

Namespace override for this project

projects[]

watch

Glob patterns for files to track for changes

consolidation

similarity_threshold

0.85

Cosine similarity threshold for deduplication (0.5-1.0)

consolidation

prune_after_days

30

Days before pruning low-quality memories

consolidation

min_importance_to_keep

0.1

Minimum importance score to survive pruning

consolidation

max_operations

100

Max operations per consolidation run

consolidation

schedule

[{ "hour": 3, "minute": 0 }]

One or more { hour, minute } entries (24-hour). Re-run init after changing to regenerate the launchd plist.

hooks

extract_on_compact

false

Mine transcript before context compression (regex-based, off by default)

hooks

extract_on_session_end

false

Extract learnings when session ends (regex-based, off by default)

hooks

track_searches

true

Log search hits and misses to search-log.jsonl

hooks

review_on_stop

true

Spawn headless claude -p at session end to review the transcript and store learnings. Set false to disable without removing the hook.

extraction

categories

["decision", "pattern", "error_fix", "convention"]

Learning categories to extract

extraction

min_confidence

0.4

Minimum confidence for extracted learnings

storage

db_path

scope-dependent

SQLite file location (~/.mcp-memory/memory.db for user scope, <project>/.mcp-memory/memory.db for project scope). MCP_MEMORY_DB_PATH overrides.

vault

path

unset

Obsidian vault root used by vault_sync, memory_export_vault, and rebuild when no explicit path is passed. MCP_VAULT_PATH and --vault <path> override.

vault

write_through

true

Mirror memory writes out to the vault as .md files when a vault is configured. MCP_VAULT_WRITE_THROUGH=0 overrides.

CLI commands

Command

Description

npx mcp-memory-graph

Start the MCP server on stdio (default)

npx mcp-memory-graph serve

Start the HTTP server: MCP transport, REST API, web dashboard

npx mcp-memory-graph init

Interactive setup wizard: hooks, config, nightly schedule (user scope). Add --yes/-y for non-interactive

npx mcp-memory-graph init --scope project

Setup for the current project only (creates .mcp.json and .claude/settings.json)

npx mcp-memory-graph uninstall

Reverse init: remove hooks and schedule

npx mcp-memory-graph consolidate

Run the dream cycle manually

npx mcp-memory-graph export-graph [--out <path>] [--scope <s>] [--namespace <n>]

Write a committable, deterministic memory-graph.json for git sharing

npx mcp-memory-graph git-setup

Install the .gitattributes entry and memory-union merge driver for conflict-free graph sharing

npx mcp-memory-graph merge-graphs <ours> <theirs> <out>

Git union merge driver for memory-graph.json (invoked by git, not by hand)

npx mcp-memory-graph vault-init [--vault <path>]

Make the vault a git repo: union merge driver, pull.rebase=false, post-merge and post-checkout rebuild hooks

npx mcp-memory-graph sync

Export all valid memories plus the graph sidecar to the vault (.md files)

npx mcp-memory-graph rebuild [--vault <path>]

Rebuild the SQLite index from the vault's .md files (collaborators run this after git pull)

npx mcp-memory-graph migrate

Upgrade the database to the current schema version

npx mcp-memory-graph backup [--out <path>]

WAL-safe online snapshot (retention: MCP_MEMORY_MAX_BACKUPS, default 10)

npx mcp-memory-graph keys create|list|revoke

Per-key RBAC: mint, inspect, revoke API keys (namespace set plus access ceiling)

Tools reference

1. memory_store

Store a new memory. The vector embedding is generated automatically.

Parameter

Type

Required

Default

Description

content

string

Yes

The text content to store

title

string

No

Short title for the memory

scope

enum

No

global¹

global, project, user, team, department

namespace

string

No

¹

Sub-scope (e.g., project name)

importance_score

number

No

computed

0-1 manual importance override

agent_id

string

No

MCP_AGENT_ID env

Attribution for memory_attribution rollups

on_conflict

enum

No

add

add, supersede, skip: write-gate behavior on near-duplicates

document_type

string

No

contract, policy, code, incident, decision, etc.

source

string

No

Where this content came from

author

string

No

Who created it

department

string

No

legal, engineering, hr, sales, finance

tags

string[]

No

Tags for categorization

access_level

enum

No

internal

public, internal, confidential, restricted

language

string

No

en

ISO 639-1 language code

metadata

object

No

Domain-specific key-value pairs

expires_at

string

No

ISO 8601 expiration date

¹ When omitted, a loaded config file's defaults.scope and defaults.namespace ("auto" = project directory name) apply first; the hardcoded fallback is global with no namespace.

Example prompt:

Store this memory with department=legal and tags=["compliance","gdpr"]:
"All customer data processing agreements must include a GDPR Article 28 addendum effective January 2025."

2. memory_search

Hybrid vector plus keyword search across stored memories.

How it works:

  1. Your query is embedded and compared against all stored vectors (semantic similarity).

  2. Your keywords are matched against memory text via FTS5 (exact matching).

  3. Both result lists merge using Reciprocal Rank Fusion.

  4. Optional temporal decay favors recent memories.

  5. Results get a confidence score and label.

  6. The access is recorded for quality scoring.

Parameter

Type

Required

Default

Description

query

string

Yes

Natural language query or keywords

scope

enum

No

Filter by scope

namespace

string

No

Filter by namespace

department

string

No

Filter by department

document_type

string

No

Filter by document type

tags

string[]

No

Filter: must contain ALL specified tags

access_level

enum

No

Filter by access level

language

string

No

Filter by language

limit

number

No

10

Max results (1-100)

offset

number

No

0

Pagination offset

search_mode

enum

No

hybrid

hybrid, vector, or keyword

temporal_decay

object

No

{type: "exponential", half_life_days: 30} or {type: "linear", max_age_days: 365}

date_from

string

No

Only memories after this date

date_to

string

No

Only memories before this date

min_confidence

number

No

Minimum confidence threshold (0-1)

Example prompts:

Search memories for "contract renewal notice requirements" in the legal department

Search memories for "authentication" with search_mode=keyword

Search memories for "deployment patterns" with temporal_decay={type:"exponential", half_life_days:60}

Each result includes the memory content and metadata, the combined RRF score, a normalized confidence (0-1), a confidence_level label (high at 0.7 and above, medium at 0.4 and above, low below that), and a match_type (hybrid, vector, or keyword).

The default detail_level: "summary" projection returns confidence_level but omits the numeric confidence and the full content, to save tokens. Pass detail_level: "full" when you need them.

3. memory_get

Retrieve a specific memory by ID. For ingested documents, optionally include all child chunks.

Parameter

Type

Required

Default

Description

id

string

Yes

Memory UUID

include_chunks

boolean

No

false

Include child chunks for ingested documents

4. memory_update

Update an existing memory. If content changes, the embedding regenerates automatically. The previous version is saved to history.

Parameter

Type

Required

Default

Description

id

string

Yes

Memory ID to update

content

string

No

New content (triggers re-embedding)

title

string

No

New title

metadata

object

No

Replacement metadata

tags

string[]

No

Replacement tags

expires_at

string/null

No

New expiry, or null to remove

changed_by

string

No

Who made this change

5. memory_delete

Delete memories by ID or by filter. At least one of id or filter is required.

Parameter

Type

Required

Description

id

string

No

Delete a specific memory

filter.scope

enum

No

Delete all in scope

filter.namespace

string

No

Delete all in namespace

filter.department

string

No

Delete all in department

filter.before_date

string

No

Delete older than date

filter.expired_only

boolean

No

Only delete expired memories

6. memory_list

Browse memories with filtering, pagination, and sorting.

Parameter

Type

Default

Description

scope

enum

Filter by scope

namespace

string

Filter by namespace

department

string

Filter by department

document_type

string

Filter by type

limit

number

20

Max results (1-100)

offset

number

0

Pagination offset

sort_by

enum

created_at

created_at, updated_at, or title

sort_order

enum

desc

asc or desc

7. memory_ingest

Ingest a full document: it is chunked by content type, each chunk is embedded, and everything is stored with parent-child relationships. Use this for large documents.

Parameter

Type

Default

Description

content

string

Full document text (required)

title

string

Document title

content_type

enum

text

Chunking strategy: text, markdown, code, legal, structured

chunk_size

number

512

Target chunk size in characters (~4 chars per token)

chunk_overlap

number

50

Overlap between chunks for context

source

string

Origin file or URL

document_type

string

Document classification

department

string

Department

author

string

Author

tags

string[]

Tags

metadata

object

Domain-specific metadata

Chunking by content type:

Type

Strategy

Splits on

text

Paragraph

Double newlines (\n\n)

markdown

Heading-aware

#, ##, ### headings

code

Function-aware

function, class, const, interface boundaries

legal

Sentence

Period, exclamation, question marks

structured

Paragraph

Double newlines (same as text)

8. memory_related

Find memories semantically related to a given one. Uses vector similarity, so it finds connections keyword search misses.

Parameter

Type

Default

Description

id

string

Memory ID to find related for (required)

limit

number

5

Max results (1-50)

min_similarity

number

Minimum similarity threshold (0-1)

9. memory_versions

View a memory's version history. Every update creates a version record.

Parameter

Type

Default

Description

id

string

Memory ID (required)

limit

number

10

Max versions (1-50)

10. memory_stats

Usage statistics about stored memories.

Parameter

Type

Description

scope

enum

Filter stats by scope

namespace

string

Filter stats by namespace

department

string

Filter stats by department

Returns totals for memories, documents, and chunks, breakdowns by scope, department, and type, storage size, and the expired count.

11. memory_export

Export current memory content as JSON for portability or migration. This is not a full backup: it serializes only currently live, top-level memories. It omits edit history, the knowledge graph, condense-undo originals, ingested child chunks, and soft-forgotten rows. For disaster recovery, copy the SQLite file (cp ~/.mcp-memory/memory.db ..., see the RUNBOOK); embeddings recompute deterministically on import.

Parameter

Type

Default

Description

scope

enum

Filter export

namespace

string

Filter export

department

string

Filter export

Max 1000 records per export.

12. memory_import

Import memories from JSON. Each item is embedded and stored.

Parameter

Type

Default

Description

data

array

Array of memory objects (required)

overwrite

boolean

false

Overwrite existing IDs

13. vault_sync

Scan an Obsidian vault, parse the markdown, embed and store. See Obsidian Vault Integration below.

14. vault_status

Sync status for a vault: files synced, pending, changed, and the last sync time.

15. vault_search

Hybrid search scoped to one vault's memories.

By default this searches the namespace named after the vault's folder name. Memories exported from another namespace keep their original namespace in frontmatter. If a search over a freshly synced vault returns nothing, pass an explicit namespace (and/or scope) override.

16. memory_consolidate

The dream cycle: deduplicate, score, prune, expire, and detect knowledge gaps.

Parameter

Type

Required

Default

Description

scope

enum

No

Limit consolidation to a scope

namespace

string

No

Limit consolidation to a namespace

similarity_threshold

number

No

0.85

Cosine similarity for dedup (0.5-1.0)

prune_expired

boolean

No

true

Remove expired memories

prune_low_quality

boolean

No

false

Remove memories below min importance

dry_run

boolean

No

false

Preview changes without applying

max_operations

number

No

100

Cap on total operations per run

Five stages run in order: Score (recalculate importance), Expire (enforce expires_at), Prune (drop low-quality when enabled), Dedup (merge near-duplicates), Gaps (surface zero-result searches). Returns a report with counts per stage.

Example prompts:

Run a dream cycle consolidation with dry_run=true to preview what would change

Consolidate memories in namespace=my-project with similarity_threshold=0.9

Run consolidation with prune_low_quality=true to clean up unused memories

17. memory_extract_learnings

Mine a session transcript for decisions, patterns, error fixes, and conventions using heuristic pattern matching. No external LLM needed.

Parameter

Type

Required

Default

Description

transcript

string

Yes

Session transcript text to mine

scope

enum

No

Scope for extracted memories

namespace

string

No

Namespace for extracted memories

department

string

No

Department for extracted memories

tags

string[]

No

Additional tags

source

string

No

Source attribution

categories

enum[]

No

all

Filter to decision, pattern, error_fix, convention

auto_store

boolean

No

true

Automatically store extracted learnings

Extraction looks for decision language ("we decided", "the fix was"), pattern language ("always use", "never do"), error fixes ("the problem was", "solved by"), and conventions ("our convention is", "standard practice"). Each hit is deduplicated against existing memories and stored with a lower initial confidence.

18-42. Graph, Agent-OS, vault round-trip, and governance tools

Parameters for the remaining tools are validated by Zod schemas in src/schemas/; each registration's full description lives in src/server.ts.

#

Tool

Purpose

18

memory_tiers

MemGPT-style hot / recall / archival tier distribution plus the hot working set

19

memory_export_vault

Write memories out to an Obsidian vault as .md files with YAML frontmatter (reverse of vault_sync)

20

memory_canvas

Export the graph as a JSON Canvas 1.0 .canvas for Obsidian

21

memory_manifest

Lightweight content-free index (titles, types, tags, scores) to discover what exists

22

memory_graph

Query the knowledge graph: entities, relationships, linked memories, multi-hop traversal (depth 1-3)

23

memory_extract_entities

Store LLM-extracted entities and relationships for a memory

24

memory_condense

Apply agent-generated summaries to condense old memories (original preserved)

25

memory_restore

Restore a condensed memory to its original content and re-embed

26

memory_query

Answer a question with a tight, token-budgeted subgraph instead of flooding context

27

core_memory_get

Read the pinned, always-in-context core-memory block for a (scope, namespace)

28

core_memory_append

Append to the core-memory block (refused if it would overflow char_limit)

29

core_memory_replace

Replace text in the core-memory block (used to update or compact it)

30

memory_reflect

Generative-Agents-style reflection: gather material, or store a synthesized insight

31

memory_communities

GraphRAG community detection over the entity graph for corpus-level themes

32

memory_template

Fetch a structured note scaffold per document type

33

memory_session_note

Per-session "daily note" (appends to one memory per session_id)

34

memory_attribution

Roll up how many valid memories each agent_id wrote

35

memory_questions

"Questions to ask" digest: ambiguous links, under-documented entities, orphans

36

memory_forget

GDPR-grade forget: soft-delete (recoverable) by default, or hard erase-after-export

37

memory_history

Point-in-time bi-temporal timeline plus edit-version history for one memory

38

memory_unlinked_mentions

Entity names mentioned in memory text with no graph edge yet (suggested links)

39

memory_query_structured

Exact metadata filter query over top-level memories (no semantic ranking)

40

memory_version_diff

Line-level diff between two stored versions of a memory

41

memory_version_restore

Roll a memory back to a previous version (snapshots the current one first)

42

memory_verify

Verify the signed provenance envelope of memories (ed25519 over content_hash plus origin): per-memory ok/unsigned/content_mismatch/bad_signature/untrusted plus a summary. Opt-in signing via MCP_SIGN_MEMORIES; multi-machine allowlist via MCP_TRUSTED_PUBKEYS / trusted_pubkeys

43-50. Active infrastructure and typed shapes

#

Tool

Purpose

43

memory_webhook

Manage the event bus (gated by MCP_WEBHOOKS): register, list, delete SSRF-validated outbound targets, or dispatch the durable, HMAC-signed delivery queue (retry, circuit breaker, dead letter). Mutations emit created/updated/superseded/deleted/forgotten events

44

memory_insights

Advisor digest: unresolved conflicts, stale memories, most-contradicted facts, evidence-less decisions

45

memory_health

Store health roll-up: live/retired/stale counts, aging buckets, unresolved conflicts, webhook delivery health

46

memory_revalidate

Change propagation: list stale memories, preview a change's blast radius (dry run), or confirm a memory is current

47

memory_session_state

Resumable "where was I" session state, save and resume (versioned)

48

memory_expertise

Per-user expertise profile: observe a topic, get the profile

49

memory_export_dataset

Export learnings and reflections as JSONL training pairs (pairs/chatml/alpaca) for fine-tuning

50

memory_lesson

Capture a structured lesson or incident in one call: fills the matching section template (incident → Symptom/Root Cause/Fix/Prevention; lesson → What/Why it matters/How to apply) from your field values and stores it through the normal deduped write path

Architecture

System overview

Claude Code ──stdio──> MCP Memory Graph
                            │
                    ┌───────┴───────┐
                    │               │
              Transformers.js   SQLite DB
              (embeddings)    (~/.mcp-memory/memory.db)
                                    │
                       ┌────────────┼────────────┐
                       │            │            │
                   memories    memories_fts  memories_vec
                   (data +     (FTS5 index)  (vec0 index)
                    scores)
                       │
              ┌────────┼────────┐
              │        │        │
        memory_    memory_    ingest_
        versions   access_    source_
                   log        tracking


Claude Code Hooks (opt-in)
    │
    ├── SessionStart ──> memory_stats (status check)
    ├── PostToolUse ───> search-log.jsonl (hit/miss tracking)
    ├── PreCompact ────> learning extraction (disabled by default)
    └── Stop ──────────> spawn detached `claude -p` headless review
                              │
                              └─> --allowedTools mcp__memory-server__memory_store
                                  Claude reviews transcript → memory_store calls

Nightly Schedule (opt-in)
    └── 3:00 AM ───────> memory_consolidate (dream cycle)

How hybrid search works

Query: "contract renewal notice"
         │
    ┌────┴────┐
    │         │
 Embed     Tokenize
    │         │
    ▼         ▼
 sqlite-vec  FTS5
 (semantic)  (keyword)
    │         │
    │  rank   │  rank
    │  1: A   │  1: A
    │  2: C   │  2: B
    │  3: B   │  3: D
    │         │
    └────┬────┘
         │
   Reciprocal Rank Fusion
   RRF(d) = Σ 1/(60 + rank)
         │
         ▼
   [A: 0.033, B: 0.026, C: 0.016, D: 0.016]
         │
   Temporal Decay (optional)
         │
   Confidence Scoring
         │
   Access Tracking (record hit)
         │
         ▼
   Final ranked results

Database schema

The SQLite database is at schema version 18, with automatic forward migration from any earlier version. The core tables:

  • memories: all memory data, TEXT primary key (UUIDs), parent-child support for document chunks, plus access_count, last_accessed_at, importance_score, and confidence_score.

  • memories_fts: FTS5 virtual table for keyword search with BM25 ranking, synced with the memories table.

  • memories_vec: vec0 virtual table for vector search. 384-dimension float32 embeddings with scope and namespace metadata for pre-filtering.

  • memory_versions: version history for every change.

  • memory_access_log: every search, get, and related-memory access, with timestamps and query context.

  • ingest_source_tracking: ingested files, for change detection on re-ingestion.

Later schema versions add the knowledge-graph tables (entities, links, conflicts, communities), webhooks, session state, and the RBAC api_keys table. Every mutation keeps the three core tables in sync atomically inside a SQLite transaction; the repository.ts layer enforces this, and nothing else touches the tables directly.

Project layout

src/
├── index.ts        # Entry point (stdio transport)
├── server.ts       # All 51 tool registrations
├── config/         # Config file loading + validation
├── db/             # Connection, schema, migrations, repository (three-table sync)
├── embeddings/     # Embedding providers (Transformers.js, registry, Ollama)
├── search/         # Hybrid search, reranker, temporal decay, scoring
├── chunking/       # Per-content-type chunking strategies
├── graph/          # Entities, links, PageRank, communities
├── vault/          # Obsidian round-trip, write-through, bookkeeping
├── tools/          # One handler per MCP tool
├── api/            # REST routes + security middleware
├── events/         # Webhook bus (SSRF guard, HMAC, retry)
├── cli/            # init, serve, vault, backup, keys, migrate, ...
├── hooks/          # Claude Code lifecycle hooks
└── schemas/        # Zod schemas for every tool input

Use cases by department

Engineering:

Store memory: "We chose event sourcing over CRUD for the order service because
we need full audit trail and the ability to replay events for debugging.
ADR-042, decided 2026-03-15."
department=engineering, document_type=decision, tags=["architecture","event-sourcing"]

Legal:

Ingest this contract template with content_type=legal, department=legal,
document_type=contract, tags=["template","nda","standard"]

Finance:

Store memory: "Q4 2025 revenue recognition policy change: SaaS contracts
over 12 months now recognized ratably per ASC 606 guidance."
department=finance, document_type=policy, tags=["revenue-recognition","asc-606"]

HR:

Ingest the employee handbook with department=hr, content_type=text,
document_type=policy, tags=["handbook","onboarding"]

Sales:

Store memory: "When prospect objects on price vs CompetitorX, lead with
our 99.9% uptime SLA and dedicated support. This converted 3 deals in Q1."
department=sales, document_type=pattern, tags=["objection-handling","pricing","competitorx"]

Obsidian Vault Integration

Point the server at a vault folder and every markdown file becomes a searchable memory, with frontmatter, tags, and wiki-links extracted. No Obsidian app needed; it reads the files straight from disk.

Tool

Description

vault_sync

Scan vault, parse files, embed and store. Incremental (mtime-based).

vault_status

Sync status: files synced, pending, changed, last sync time.

vault_search

Hybrid search scoped to a vault's memories.

What gets extracted:

Obsidian feature

Memory field

YAML frontmatter title:

title

YAML frontmatter tags: [...]

tags (merged with inline)

YAML frontmatter author:

author

YAML frontmatter (all fields)

metadata.frontmatter

Inline #tags in content

tags (merged with frontmatter)

[[wiki-links]]

metadata.links array

File path relative to vault

source

Vault directory name

namespace

Usage examples:

Sync my Obsidian vault at ~/Documents/my-vault

Check vault sync status for ~/Documents/my-vault

Search my vault for "meeting action items about hiring"

Sync vault but only the notes/ and projects/ folders:
  vault_sync with include_patterns=["notes/**", "projects/**"]

Force re-sync everything (ignore modification times):
  vault_sync with force=true

vault_sync parameters:

Parameter

Type

Default

Description

vault_path

string

Absolute path to vault directory (required)

chunk_size

number

1024

Target chunk size for large files

chunk_overlap

number

50

Overlap between chunks

force

boolean

false

Re-sync all files regardless of mtime

include_patterns

string[]

Only sync matching globs (e.g., ["notes/**"])

exclude_patterns

string[]

Skip matching globs (e.g., ["templates/**"])

How sync works: it scans the vault recursively for .md files (skipping .obsidian/, .trash/, .git/), compares modification times against the last sync, extracts frontmatter, wiki-links, and tags from new or changed files, embeds, and stores. Deleted files have their memories removed. Files larger than the chunk size are split with markdown-aware chunking. A second sync of an unchanged vault takes under a millisecond.

Security and privacy

  • No network calls after the one-time model download (cached locally).

  • No telemetry, no analytics, no tracking.

  • Hooks are opt-in. They are only installed when you run npx mcp-memory-graph init.

  • The nightly schedule is opt-in too, and removed by npx mcp-memory-graph uninstall.

  • Everything is one SQLite file: easy to back up, move, or delete.

  • access_level metadata (public, internal, confidential, restricted) for organizational awareness.

  • Data never leaves your machine.

Backup:

# WAL-safe online snapshot with retention
npx mcp-memory-graph backup

# Or a simple file copy
cp ~/.mcp-memory/memory.db ~/.mcp-memory/memory.db.backup

Reset:

# Delete the database to start fresh
rm ~/.mcp-memory/memory.db

Nightly consolidation

When installed via npx mcp-memory-graph init, a nightly job runs all five dream-cycle stages plus access-log rotation (entries older than 90 days are dropped).

On macOS, a launchd plist is created at ~/Library/LaunchAgents/com.mcp-memory.consolidate.plist, scheduled for 3:00 AM. On Linux, init prints a cron suggestion:

# Add to crontab -e
0 3 * * * /usr/local/bin/npx mcp-memory-graph consolidate

Run it manually any time:

npx mcp-memory-graph consolidate

Limitations

  • Scale ceiling. Vector search is an exact scan: 9.1 ms p95 at 10K vectors, about 30 ms at 50K, and it degrades linearly from there. Comfortable into the low hundreds of thousands; past that you want a dedicated ANN index, which this server does not have yet.

  • English-optimized. The default MiniLM model is English-only in practice; cross-language matching is weak. A multilingual model can be configured via MCP_MEMORY_MODEL (with a rebuild), but the shipped benchmarks only validate the default.

  • First-call cold start. Three to five seconds on first use while the embedding model loads. Cached after that.

  • Heuristic extraction. memory_extract_learnings uses pattern matching, not an LLM. It catches common phrasings and misses subtle ones. (The Stop hook's claude -p review is the LLM-quality path.)

  • One process. RBAC keys and revocation live in the server process. For horizontal scale you shard tenants across processes or give each tenant their own database file.

Roadmap

What's actually next, in rough order:

  • Multilingual embeddings, opt-in. Ship a multilingual ONNX model option (the embedder registry and the model-identity guard already exist, so a swap is safe and loud).

  • Office document ingestion. PDF, DOCX, XLSX, and friends as an ingest mode, with local extraction only.

  • Vault file watcher. Auto-rebuild on .md changes instead of manual rebuild.

  • as_of content reconstruction. Point-in-time queries currently reconstruct validity (which facts were live); reconstructing the content of edited memories at that instant is the remaining half.

  • ANN index for corpora past a few hundred thousand vectors.

  • Windows test suite port. The server runs on Windows, but the test suite carries POSIX path assumptions; the Windows CI leg is non-blocking until that's done.

Tech stack

Component

Package

Purpose

MCP SDK

@modelcontextprotocol/sdk ^1.29

Model Context Protocol server framework

Embeddings

@huggingface/transformers ^3.8

Local ONNX model inference in Node.js

Database

better-sqlite3 ^12.10

Synchronous SQLite with native bindings

Vector search

sqlite-vec 0.1.10-alpha.4

vec0 virtual table for KNN search

Validation

zod ^3.25

Schema validation for tool inputs

TypeScript

typescript ^5

Strict mode, ES2022 target

Frontend

React 19, Vite, Tailwind CSS v4

Web dashboard SPA

UI components

shadcn/ui

Accessible component primitives

Fuzzy search

fuse.js ^7

Client-side autocomplete suggestions

Graph viz

d3-force, d3-zoom, d3-drag

Knowledge graph layout

License

Source-available, not open source. Licensed under the PolyForm Noncommercial License 1.0.0: free for any noncommercial purpose (personal projects, hobby, study, research, charitable, educational, public-research, and government use). Commercial use requires a paid license; see COMMERCIAL.md.

If you're unsure whether your use counts as commercial, check the safe harbors in the license or just ask: yonasmougaard@gmail.com.

Keywords

MCP memory server · Model Context Protocol · Claude Code memory · persistent AI memory · LLM long-term memory · AI agent memory · local-first memory · $0/token memory · hybrid vector + keyword search · semantic search · knowledge graph · bi-temporal memory · HippoRAG / Personalized PageRank · cross-encoder reranking · RAG memory · SQLite vector database · sqlite-vec · FTS5 / BM25 · local embeddings (all-MiniLM-L6-v2, Transformers.js) · Obsidian vault sync · JSON Canvas · GDPR forget · signed provenance · self-hosted memory.

Also searched as: a self-hosted, privacy-first alternative to mem0, Zep, Letta, Cognee, and Supermemory · long-term memory for Claude / Cursor / Codex · an Obsidian-backed knowledge base for AI agents · a local knowledge-graph memory that never leaves your machine.

Available Tools

51 tools
core_memory_appendA

Append text to the pinned core-memory block (newline-separated when non-empty). If the result would exceed char_limit the write is refused (error: core_memory_full) so you compact via core_memory_replace instead of silently overflowing.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolationglobal
namespaceNoNamespace within scope (e.g., project name, team name)
textYesText to append to the pinned core-memory block (newline-separated when the block is non-empty). Refused if it would exceed char_limit — compact via core_memory_replace instead.

TDQS

A4.6/5.0
Behavior4/5

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

Discloses refusal behavior on exceeding char_limit and suggests alternative. Lacks explicit mention of mutation or state change, but 'append' implies it. Annotations are minimal (only openWorldHint=false), so description adds useful behavioral context.

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

Conciseness5/5

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

Two sentences, front-loaded purpose, no fluff. Every word contributes to understanding.

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?

Adequate for a simple append tool. Mentions error case but does not describe success return. No output schema, but for a tool with clear side effects, this is acceptable. Could mention success confirmation.

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

Parameters4/5

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

Schema description coverage is 100%; description adds meaning beyond schema by explaining newline separation and the overflow condition. Enhances understanding of text parameter 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?

Clear verb 'Append' and resource 'pinned core-memory block', with specific detail 'newline-separated when non-empty'. Distinguishes from sibling core_memory_replace by mentioning the alternative for overflow.

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 states when to use: append text, and when not: if exceeding char_limit, use core_memory_replace instead. Also provides error condition 'core_memory_full'.

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

core_memory_getA
Read-only

Read the pinned "core memory" block for a (scope, namespace) — a small, bounded, always-in-context note the agent maintains about who it is and what matters now. Returns content, char_limit, and used (character count).

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolationglobal
namespaceNoNamespace within scope (e.g., project name, team name)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description adds value by detailing return fields (content, char_limit, used count) and constraints (bounded, always-in-context). No contradictions 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?

Single sentence that is efficient and front-loaded with the verb and object. Every word contributes to understanding.

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 no output schema, the description adequately covers return values (content, char_limit, used) and explains the tool's role (pinned core memory). Sufficient for a read operation.

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 baseline is 3. The description does not add meaningful parameter-specific details beyond what the schema provides; it only contextualizes the overall tool purpose.

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 specifies a clear verb ('Read'), resource ('pinned core memory block'), and scope ('for a (scope, namespace)'). It distinguishes from siblings by focusing on the 'pinned' and 'always-in-context' core memory, contrasting with other memory tools like memory_get.

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 alternatives like memory_get or core_memory_append/replace. The description implies a read operation for core memory but does not specify when not to use it or suggest alternatives.

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

core_memory_replaceA

Replace the first occurrence of old_text with new_text in the pinned core-memory block. Returns error: not_found if old_text is absent, or core_memory_full if the result would exceed char_limit. Use this to update or compact the block.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolationglobal
namespaceNoNamespace within scope (e.g., project name, team name)
old_textYesSubstring to find (first occurrence) in the core-memory block
new_textYesReplacement text for the first occurrence of old_text

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only provide openWorldHint=false, so the description carries the burden. It discloses replacing the first occurrence, possible errors (not_found, core_memory_full), and hints at persistence ('pinned core-memory block'). However, it does not specify if the operation is atomic or if any side effects occur beyond the replacement.

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 sentences: first explains the core operation, second adds error information and usage hint. Every word serves a purpose with no fluff. Front-loaded and efficient.

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

Completeness3/5

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

Lacks output details for success (e.g., returns nothing or updated block?). No output schema exists. The description covers errors but leaves the agent guessing about success behavior. Adequate for a replace operation but 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?

Input schema has 100% description coverage, so every parameter's meaning is already documented. The tool description does not add further semantic value beyond what schema provides, meeting the baseline for high coverage.

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 'Replace the first occurrence of old_text with new_text in the pinned core-memory block', specifying verb and resource. It also mentions error conditions (not_found, core_memory_full) and a usage hint ('update or compact the block'), which distinguishes it from sibling tools like core_memory_append or core_memory_delete.

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 phrase 'Use this to update or compact the block' provides some guidance on when to use, but it does not explicitly contrast with alternatives like core_memory_append or core_memory_get. No when-not-to-use scenarios are mentioned, leaving room for ambiguity in tool selection.

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

memory_attributionA
Read-only

Multi-agent / team attribution rollup. Returns how many currently-valid top-level memories each agent (agent_id, set at store time) wrote — { by_agent, by_author, total } — distinct from author (the human/source). Memories stored without an agent_id are bucketed under "unattributed". Optional scope/namespace filters scope the rollup.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds valuable behavioral context: it only counts 'currently-valid top-level memories', handles unattributed memories by bucketing them, and describes the return structure in detail, which goes 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 two sentences, front-loading key functionality and structure. Every sentence adds essential information 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?

Given the tool has only two optional parameters and no output schema, the description fully explains the return structure and filtering. It covers all necessary aspects for an agent to correctly use the tool.

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%, with each parameter described (scope: 'Memory scope for isolation', namespace: 'Namespace within scope'). The description mentions optional filters but adds no new meaning beyond the schema, 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?

The description clearly states the tool returns an attribution rollup of top-level memories by agent, with specific fields (by_agent, by_author, total). It distinguishes itself by noting the difference between agent and author, and mentions unattributed memories, which sets it apart from sibling tools like memory_stats.

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 usage for multi-agent/team attribution and includes optional filters, but does not explicitly state when to avoid this tool or mention alternatives. It provides clear context but lacks explicit guidance on when not to use it.

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

memory_canvasA

Export the memory graph as a JSON Canvas 1.0 .canvas — opens as a spatial board in real Obsidian. Each currently-valid top-level memory becomes a text node on a deterministic grid; memory_links become labeled, arrow-tipped edges. Optionally filter by scope/namespace and cap with limit. When vault_path is given the canvas is written there (confined under the vault) and its path returned; otherwise only the canvas object.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
limitNoMaximum memories to include as canvas nodes (default 50)
vault_pathNoAbsolute path to an Obsidian vault directory (created if missing). When given, the canvas is written there as a .canvas file (confined under the vault) and its path is returned; otherwise only the canvas object is returned.
nameNoFilename stem for the written .canvas (default "memory-graph"). Sanitized — path separators and ".." can never escape the vault.

TDQS

A4/5.0
Behavior4/5

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

Beyond the minimal annotations (title, openWorldHint=false), the description adds key behavioral details: output is a deterministic grid with labeled arrow-tipped edges, vault_path confines writing, and filenames are sanitized. This provides good transparency for a read-only export operation.

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 tightly written (~80 words), front-loads the purpose, and every sentence adds unique value. No redundant or extraneous 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 5 optional parameters, no output schema, and moderate complexity, the description covers core behavior (what becomes nodes/edges, filtering, file writing). The return value when vault_path is omitted is explained as 'canvas object,' which is somewhat vague but acceptable. Performance or size limitations are not mentioned.

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 context on output structure ('memory_links become labeled, arrow-tipped edges') but does not enhance parameter meaning beyond what schema descriptions already provide.

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 exports the memory graph as a JSON Canvas 1.0 .canvas file, which opens as a spatial board in Obsidian. This specific verb and resource distinguishes it from sibling tools like memory_export, memory_export_dataset, and memory_export_vault.

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 mentions optional filtering and two modes (return object or write file) but does not explicitly state when to use this tool versus alternative export tools. Usage context is implied but not contrasted with siblings.

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

memory_communitiesA
Read-only

GraphRAG global sensemaking (agent-driven, no LLM in the server). Detects communities (densely-connected entity clusters) over the entity graph on demand via weighted label propagation, and returns each community's top entities + linked memories. This is the corpus-level view that chunk-level search can't give — synthesize named themes from the communities to answer "what are the main themes?".

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum communities to return, largest first (default 20)
min_sizeNoDrop communities with fewer than this many entities (default 1)

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true (safe read). The description adds that the process is agent-driven with no LLM in the server (deterministic algorithm), and that it runs on demand via weighted label propagation. This provides useful behavioral context 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?

Three sentences with no redundant words. The first sentence explains what it does and how, the second describes the output, and the third gives usage context. Information is front-loaded and every part 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?

Given the complexity of community detection and lack of output schema, the description explains the algorithm, output contents, and usage context well. It could mention potential computational cost or size limits, but overall it is complete enough for an agent to decide when to use.

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% with both parameters (limit, min_size) clearly described. The description does not add any additional semantic information about parameter usage or defaults beyond what the schema provides, 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?

The description clearly states the tool detects communities over the entity graph via weighted label propagation and returns top entities with linked memories. It distinguishes itself from chunk-level search by providing a corpus-level view, making its purpose specific and distinct from siblings.

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

Usage Guidelines4/5

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

Explicitly contrasts with chunk-level search and advises using it to synthesize named themes for global questions like 'what are the main themes?'. However, it does not explicitly list when not to use or mention specific sibling alternatives beyond the implicit contrast.

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

memory_condenseA

Apply agent-generated summaries to condense old memories. Preserves original content for later restoration. Use after consolidation reports flag condensation candidates.

ParametersJSON Schema
NameRequiredDescriptionDefault
memoriesYesBatch of memories with agent-generated summaries
target_levelNoTarget condensation levelsummary

TDQS

A4.2/5.0
Behavior4/5

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

The description adds important behavioral detail: 'Preserves original content for later restoration.' This goes beyond the minimal annotations (only title and openWorldHint=false) by clarifying the non-destructive nature of the operation. It also mentions that it is for old memories and after consolidation reports, providing 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 two sentences with no wasted words. The first sentence clearly states the primary action, and the second adds important context. It is 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?

For a tool with 2 well-documented parameters and no output schema, the description covers the core purpose, usage trigger, and a key behavioral aspect (preservation). It is sufficiently complete for an agent to understand when and how to use it, though it omits potential return values or error states.

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 has 100% coverage, with detailed descriptions for all parameters including the batch structure and target_level enum. The tool description does not add significant new meaning beyond summarizing what the schema already states, so a 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 indicates the tool applies agent-generated summaries to condense old memories, with the specific verb 'condense' and resource 'old memories'. It also distinguishes itself by noting it preserves original content for later restoration, setting it apart from destructive operations like memory_delete.

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: 'Use after consolidation reports flag condensation candidates.' This clearly indicates when to use the tool. However, it does not explicitly list alternatives or when not to use it, though the context implies it is for condensing rather than other operations.

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

memory_consolidateA

Run the "dream cycle": find and merge near-duplicate memories, prune expired/low-quality entries, and update quality scores based on access patterns. Use dry_run=true to preview changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
similarity_thresholdNoCosine similarity threshold for duplicate detection (0.5-1.0)
prune_expiredNoRemove memories past their expires_at date
prune_low_qualityNoRemove memories with both low importance and low confidence
dry_runNoIf true, report what would be done without making changes
max_operationsNoMaximum number of merge/prune operations per run
forgetting_floorNoOpt-in spaced-repetition prune. When set (0-1), remove weakly-held memories whose retention e^(-Δt/stability) has decayed below this floor. Omit to disable.

TDQS

A3.7/5.0
Behavior3/5

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

The description discloses that the tool modifies memory by merging, pruning, and updating scores, implying destructive potential. However, it lacks detail on side effects like irreversible deletion or impact on related data. The dry_run hint partially compensates.

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: two sentences that front-load the core purpose and end with a key usage tip. Every sentence is meaningful, with no redundancy or fluff.

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 adequately explains what the tool does and hints at preview via dry_run, but it does not describe the output format (e.g., report structure, returned data). Given no output schema and 8 parameters, more detail on return values would improve completeness.

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 8 parameters are fully described in the schema (100% coverage), so the description adds limited value beyond a usage hint for dry_run. The description does not explain parameter interactions or complex constraints, meeting the baseline for high schema coverage.

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 it runs a 'dream cycle' to merge near-duplicates, prune expired/low-quality entries, and update quality scores. The verb 'consolidate' matches the purpose, and it distinguishes from sibling tools like memory_condense or memory_forget that focus on single aspects.

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 notes using dry_run=true to preview changes, which provides usage direction, but does not explicitly state when to use this tool over alternatives like memory_condense or memory_forget, nor does it specify when not to use it.

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

memory_deleteB
Destructive

Delete memories by ID or by filter criteria (scope, department, before_date, expired_only). Provide at least one of id or filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoDelete a specific memory by ID
filterNoDelete memories matching filter criteria

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already indicate destructiveHint=true. The description adds that it deletes by ID or filter, which is minimal beyond what annotations convey. No additional behavioral traits like irreversibility or authorization needs are disclosed.

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 of 15 words, front-loaded with verb and object. Every word is necessary; no waste.

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 complexity of the nested filter object and the destructive nature, the description is too minimal. Missing details on what happens when both id and filter are provided, behavior on no matches, or return value. Output schema is absent.

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 parameters. The description merely lists filter criteria already present in the schema, adding no extra meaning.

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 'Delete memories' and specifies two modes: by ID or by filter criteria. However, it does not differentiate from sibling tool 'memory_forget', which may also delete memories, reducing clarity.

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 provides a constraint ('Provide at least one of id or filter') but lacks explicit guidance on when to use this tool versus alternatives like memory_forget, prerequisites, or when not to use it.

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

memory_expertiseA

Adaptive per-user expertise profile. action=observe records demonstrated knowledge of a topic (level rises on a saturating curve, never collapses other topics); action=get returns the profile. The agent supplies the classified topic — the server just tracks evidence over time.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoobserve demonstrated knowledge of a topic | get the profileget
topicNoThe topic (required for observe; optional filter for get).
scopeNoScope (default 'user').
namespaceNoNamespace within scope (e.g., project name, team name)
weightNoEvidence increment for observe (default 1).

TDQS

A3.8/5.0
Behavior4/5

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

The description discloses key behavioral traits: a saturating curve for level increases, no collapsing of other topics, and the role of the agent in providing classified topics. This goes beyond the minimal annotations, which only set openWorldHint=false. It lacks details on auth or rate limits but 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 two sentences, front-loaded with the core purpose, and no superfluous text. Every sentence contributes to understanding the tool's function and behavior.

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 explains the core mechanism and actions well, but it does not describe the output format of the profile (no output schema). With 5 parameters and no output schema, a brief mention of what 'get' returns would improve completeness. Still, it covers essential aspects.

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 the schema already describes all parameters. The tool description adds some context for action semantics but does not provide meaning significantly beyond the schema. 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 clearly states the tool is an adaptive per-user expertise profile with two actions: observe (record demonstrated knowledge) and get (return profile). It uses specific verbs and resource, and the focus on per-user expertise distinguishes it from sibling memory tools.

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 does not provide when to use this tool versus alternatives. It explains the actions but offers no guidance on when not to use or comparisons to other memory tools. The agent is left 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.

memory_exportB
Read-only

Export memories as JSON for backup or migration. Supports filtering by scope, namespace, and department. Max 1000 records per export.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
limitNoMaximum memories to export in this page (live, top-level only)
offsetNoPagination offset; use with has_more to export a large corpus in pages

TDQS

B3.2/5.0
Behavior2/5

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

The description contradicts the explicit limit parameter definition in the input schema: the description states 'Max 1000 records per export' while the schema defines default=1000 and maximum=10000. This inaccuracy could mislead an agent about the tool's capacity. Annotations correctly mark it as read-only, but the description adds conflicting information.

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 single concise sentence covering purpose, filtering, and a constraint. It wastes no words, though the limit inaccuracy detracts slightly from its effectiveness.

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 the output format (JSON) and basic filtering, but fails to mention pagination (offset/has_more) which is available in the schema, and does not describe the response structure or differentiate from similar export siblings. Given no output schema, more detail on return values would be beneficial.

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?

Since schema description coverage is 100%, the baseline is 3. The description adds little beyond restating the filter parameters (scope, namespace, department) and introduces a potentially misleading limit of 1000, which is already expressed more precisely in the schema.

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 it exports memories as JSON for backup or migration, specifying the output format and high-level use case. However, it does not distinguish itself from sibling tools like memory_export_dataset or memory_export_vault, missing an opportunity to clarify unique scope.

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 mentions filtering by scope, namespace, and department, giving context on when to use it. However, it fails to provide guidance on when not to use it or alternatives, and the mention of 'Max 1000 records per export' is an oversimplification given the schema allows up to 10000.

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

memory_export_datasetA
Read-only

Export high-signal rows (auto-extracted learnings + agent reflections) as instruction→output training pairs (pairs/chatml/alpaca) for a project LoRA/distillation flywheel. Read-only, quality-filtered by importance/confidence. Training stays out of the repo — this only emits the JSONL.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
formatNoOutput shape: {prompt,completion} | ChatML messages | Alpaca instruction/output.pairs
min_importanceNoQuality floor on importance_score.
min_confidenceNoQuality floor on confidence_score.
limitNoMax training pairs to emit.

TDQS

A4/5.0
Behavior4/5

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

Annotations provide readOnlyHint=true and no destructive hint. Description adds that it is read-only, quality-filtered by importance/confidence, and emits JSONL without modifying state. This adds value beyond annotations, though could mention pagination or behavior on empty results.

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 sentences with no wasted words. First sentence states core purpose and output shape, second clarifies safety and output file format. Highly concise and front-loaded.

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 read-only export tool with 6 parameters and no output schema, the description covers purpose, filters, output format, and safety. It doesn't detail output field structure or edge cases, but is sufficient for an agent to invoke 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 coverage is 100% with clear descriptions. The description reinforces the meaning of min_importance/min_confidence and format, but does not add new information beyond the schema. 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 states a specific verb ('export'), resource ('high-signal rows...as instruction→output training pairs'), and differentiates from siblings by focusing on training data generation for LoRA/distillation. It clearly identifies the tool's intent.

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 (generating training data) and contrasts with the generic 'memory_export' sibling, but lacks explicit when-not-to-use guidance or alternative recommendations. Usage context is clear but not exhaustive.

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

memory_export_vaultA

Write memories OUT to an Obsidian vault as .md files with YAML frontmatter — the reverse of vault_sync. Each currently-valid top-level memory becomes a plain markdown file a human can open and edit; namespaced memories land under //. Lossless: written files parse back via the vault parser. Optionally filter by scope/namespace.

ParametersJSON Schema
NameRequiredDescriptionDefault
vault_pathYesAbsolute path to the target Obsidian vault directory (created if missing). Memories are written as .md files with YAML frontmatter — the reverse of vault_sync.
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)

TDQS

A3.9/5.0
Behavior4/5

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

The description explains the write behavior: it creates .md files per memory, handles namespaced memories under subdirectories, and claims losslessness. It also notes the vault_path directory is created if missing. It lacks explicit mention of overwrite behavior if files already exist, but overall provides good behavioral context beyond the minimal 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 only three sentences, front-loaded with the core purpose in the first sentence. Every sentence adds value: purpose, structural detail, and filtering option. No redundancy or fluff.

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 the parameter count and schema coverage, the description is adequate but lacks completeness in differentiating from similar export siblings (e.g., memory_export). It does not explain return behavior or error handling, and the absence of an output schema shifts burden to the description, which it partially meets.

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 has 100% coverage of parameter descriptions, so the description adds little extra meaning. The vault_path description reiterates the purpose, and scope/namespace are described for filtering. No additional semantic enrichment beyond the schema is provided.

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 'write', resource 'memories to Obsidian vault', and specifies the output format (.md with YAML frontmatter). It distinguishes itself from vault_sync by calling itself 'the reverse', providing clear purpose and differentiation.

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 mentions it's the reverse of vault_sync and optional filtering by scope/namespace, which hints at when to use it. However, it does not explicitly state when not to use it or compare it to other sibling export tools like memory_export or memory_export_dataset, leaving ambiguity.

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

memory_extract_entitiesB

Store LLM-extracted entities and relationships for a memory. The calling agent should analyze memory content and provide structured entity/relationship data. This enables knowledge graph queries.

ParametersJSON Schema
NameRequiredDescriptionDefault
memory_idYesMemory ID to associate extracted entities with
entitiesYesEntities extracted from the memory content
relationshipsNoRelationships between entities

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations (only openWorldHint, not behavioral), the description carries full burden. It only says 'Store... for a memory,' which indicates a write operation but reveals no side effects (e.g., overwriting existing entities, permissions required, or any destructive behavior). For a mutation tool, this is insufficient 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 extremely concise: two sentences, front-loaded with the core action. Every word adds value, with no redundancy. The structure is clear and efficient.

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 a complex nested input schema, many sibling tools, and no output schema, the description is too minimal. It lacks context on prerequisites (e.g., memory existence), return values, how the tool fits into the larger system of memory tools, and what happens if relationships are omitted. The sentence about knowledge graph queries hints at purpose but doesn't compensate for the missing completeness.

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 each parameter is well-described in the schema itself. The description adds no additional semantics beyond what the schema provides (e.g., no explanation of how memory_id must be valid, or behavior on duplicate entities). Baseline score of 3 is appropriate as the schema does the heavy lifting.

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 action 'Store LLM-extracted entities and relationships for a memory.' It specifies what the tool does (store structured entity/relationship data) and its benefit (enables knowledge graph queries). However, it does not explicitly distinguish this from siblings like 'memory_extract_learnings' or 'memory_store', which also deal with extraction or storage, missing an opportunity for differentiation.

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 provides some guidance: 'The calling agent should analyze memory content and provide structured entity/relationship data.' This implies the tool is for storing extracted data after analysis. However, it does not state when to use this tool versus alternatives (e.g., memory_store for raw text, or memory_extract_learnings for patterns), nor does it mention prerequisites like the memory needing to exist or not.

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

memory_extract_learningsA

Extract decisions, patterns, error fixes, and conventions from a session transcript using heuristic analysis. Deduplicates against existing memories and optionally auto-stores.

ParametersJSON Schema
NameRequiredDescriptionDefault
transcriptYesSession transcript or conversation text to extract learnings from
scopeNoMemory scope for isolationglobal
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
tagsNoTags for categorization
sourceNoSource identifier for the session (e.g., "session-2026-03-26")
categoriesNoWhich categories of learnings to extract (default: all)
auto_storeNoIf true, automatically store extracted learnings as memories

TDQS

A3.9/5.0
Behavior4/5

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

The description discloses key behaviors: heuristic analysis, deduplication against existing memories, and optional auto-store. Since annotations only provide openWorldHint, this adds significant behavioral context beyond what annotations offer.

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 that efficiently conveys the core functionality and key features, with no wasted 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 8 parameters and no output schema, the description covers the main action but does not explain what is returned (e.g., whether extracted learnings are returned or only stored). It adequately describes the process but leaves some ambiguity about output.

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 descriptions cover 100% of parameters with clear definitions. The tool description provides overall context but does not add additional meaning beyond the schema details, meeting the baseline for high coverage.

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 extracts decisions, patterns, error fixes, and conventions from a session transcript using heuristic analysis. It also mentions deduplication and optional auto-store, distinguishing it from siblings like memory_extract_entities or memory_ingest.

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 for extracting learnings from transcripts but does not explicitly state when to use this tool over alternatives, nor does it provide exclusionary guidance. It is adequate but lacks context for tool selection.

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

memory_forgetA
Destructive

GDPR-grade forget (additive — does NOT replace memory_delete). hard:false (default) soft-deletes/tombstones: stamps valid_to so the memory is excluded from default retrieval but stays queryable via as_of and is recoverable. hard:true erases for real: returns a portability "export" copy FIRST (data-subject access), THEN permanently deletes (irreversible, cascades). Returns { forgotten, mode, recoverable, export? }.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID to forget
hardNoErasure mode. false (default): soft-delete/tombstone — stamps valid_to so the memory is excluded from default retrieval but remains queryable via as_of and is recoverable. true: hard erase — returns a portability export copy FIRST (data-subject access), THEN permanently deletes (irreversible, cascades). Additive — the existing memory_delete tool is unaffected.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already indicate destructiveHint=true, but the description adds substantial behavioral details: for hard:true it returns a portability copy before permanent deletion, irreversible and cascading; for hard:false it is recoverable and stamps valid_to. 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.

Conciseness4/5

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

Description is moderately concise; each sentence contributes useful information. It is front-loaded with general purpose then explains modes. A slight reduction in length could improve conciseness, but overall it is well-structured.

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 has two modes (soft/hard), no output schema, and requires understanding of recovery and portability, the description covers all aspects: return object shape, behavior differences, and GDPR compliance. It is complete for an agent to use correctly.

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 100% so baseline is 3, but the description adds significant meaning beyond schema: it explains the effect of each mode in detail (e.g., soft-delete stamps valid_to, hard erases after export), which enhances agent understanding.

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 it is a 'GDPR-grade forget' operation that is additive to memory_delete. It specifies verb 'forget' on resource 'memory', and distinguishes itself from memory_delete by noting it does NOT replace it.

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 explains when to use soft vs hard delete modes and mentions GDPR context. It implies this tool is for data subject access/erasure, while memory_delete is for regular deletion. However, it does not explicitly state when not to use it.

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

memory_getA
Read-only

Retrieve a specific memory by its ID. Optionally include child chunks for ingested documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID to retrieve
include_chunksNoIf true, also return child chunks for ingested documents

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so safety is known. Description adds the behavioral detail about including child chunks, but does not disclose other traits like return structure or pagination.

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 sentences, front-loaded with the core action, no wasted words. Efficient and clear.

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 simplicity of the tool (2 params, no output schema, full annotations), the description is mostly complete. However, it could mention what the return value is (the memory object) to be fully self-contained.

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 both parameters have descriptions. The description adds minimal additional meaning beyond the schema field descriptions for 'id' and 'include_chunks'.

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 uses specific verb 'Retrieve' and identifies the resource ('specific memory by its ID'). Clearly distinguishes from sibling tools like memory_search, memory_delete, etc. Optional include_chunks adds further clarity.

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?

Usage is implied: use when you need to fetch a memory by its exact ID. No explicit alternatives or exclusions provided, but the context of the tool name and siblings makes it reasonably clear.

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

memory_graphA
Read-only

Query the knowledge graph: find entities, their relationships, and linked memories. Use entity name to start traversal, or browse all entities by type. Supports multi-hop traversal (depth 1-3).

ParametersJSON Schema
NameRequiredDescriptionDefault
entityNoEntity name to start graph traversal from
entity_typeNoFilter entities by type
depthNoGraph traversal depth (1-3 hops)
include_memoriesNoInclude linked memories in the response
limitNoMaximum entities to return

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the description's addition of traversal depth and entity browsing provides useful context. However, it does not describe failure behavior (e.g., entity not found) or pagination beyond the limit parameter. With annotations carrying the read-only signal, the description adds modest behavioral detail.

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: two sentences, front-loaded with the primary purpose. No redundant phrases. Slightly more structure could help, but it is efficient.

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

Completeness3/5

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

The description covers the essential functionality but lacks details about the response format (e.g., how relationships and memories are structured). With no output schema, additional context about return fields would improve completeness. Adequate for basic understanding.

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 the description adds marginal value beyond schema descriptions. It clarifies the role of entity and entity_type (start traversal vs. browse by type) and restates depth range. 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 clearly states the tool queries the knowledge graph to find entities, relationships, and linked memories. It specifies starting with an entity name or browsing by type, and supports multi-hop traversal. This sets it apart from sibling tools that focus on CRUD or other specific operations.

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 for graph traversal queries but does not explicitly state when to use this tool versus alternatives like memory_search or memory_get. No when-not-to-use or exclusion criteria are provided.

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

memory_healthA
Read-only

Store health report: live/retired/stale counts, aging buckets, unresolved conflicts, and webhook delivery health, rolled up to a single ok|attention status with reasons. Read-only; optionally scoped.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the read-only nature is clear. The description adds that the output is a rolled-up status with reasons, but does not disclose additional behavioral traits like authentication needs, rate limits, or side effects. Context is adequate but not rich.

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 purpose and lists key components clearly. No wasted words or redundant information.

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

Completeness4/5

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

Given the tool has no output schema, the description effectively conveys the return value (counts, buckets, conflicts, webhook health, status with reasons). It covers the essential aspects for a simple tool with two optional parameters. Minor gap: does not explain the 'reasons' in detail, but still sufficient.

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 has 100% description coverage for both parameters (scope and namespace), so the description adds minimal new meaning: it hints at optional scoping but does not elaborate beyond schema. 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 it is a health report for memory, listing specific metrics (live/retired/stale counts, aging buckets, unresolved conflicts, webhook delivery health) and notes it rolls up to a status. This distinguishes it from sibling tools like memory_stats, which is more general.

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 alternatives. With many sibling tools, such as memory_stats or memory_insights, the description does not provide context for when this tool is preferred or when not to use it.

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

memory_historyA
Read-only

Point-in-time history surface for one memory: its current bi-temporal timeline (created_at/updated_at/valid_from/valid_to/tx_expired/superseded_at/version) plus the full memory_versions edit history. Returns { memory_id, exists, timeline, versions } or { memory_id, exists:false }.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID to get the bi-temporal timeline + version history for

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds transparency about the return format (two possible shapes) and lists the timeline fields. No contradictions; the description enriches the behavioral understanding beyond 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, well-structured sentence that front-loads the tool's purpose and efficiently lists key details and return types without any 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 tool's simplicity (one parameter, no output schema), the description fully covers the needed context: what it does, what it returns, and how it differs from similar tools. No gaps are apparent.

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 schema has 100% description coverage for the single parameter, and the tool description reiterates the parameter's purpose. While clear, the description adds minimal new meaning beyond the schema's param description.

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 returns a bi-temporal timeline and version history for a memory, using specific verbs like 'returns' and listing the fields. It distinguishes from siblings like memory_get and memory_versions by focusing on the combined timeline and 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?

Usage context is implied by the description (detailed history retrieval), but there is no explicit guidance on when to use this tool over alternatives like memory_get or memory_versions, nor when not to use it.

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

memory_importA
Destructive

Import memories from JSON. Each item is embedded and stored. Use overwrite=true to update existing memories by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesArray of memory objects to import (max 500 per batch)
overwriteNoIf true, overwrite existing memories with same ID

TDQS

A3.7/5.0
Behavior3/5

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

Annotations indicate destructiveHint=true, which aligns with the overwrite behavior mentioned. However, the description does not explain behavior when overwrite=false and an ID already exists (likely error), nor does it mention the batch size limit of 500 max items noted in the schema. It also omits return value or error handling.

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 two concise sentences that front-load the primary action ('Import memories from JSON') and add key context about overwrite. No extraneous words or repetition.

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 tool has many optional fields in the data object, but the schema covers them. The description does not mention output, error scenarios, or the batch limit of 500 items. Given the complexity and number of siblings, more context would help, but the description is minimally adequate.

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% with all properties described. The description adds context about the overwrite parameter's purpose ('update existing memories by ID'), but otherwise does not significantly extend the meaning beyond what the schema already provides. 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 clearly states 'Import memories from JSON' and specifies the action of embedding and storing. It distinguishes from siblings like memory_export, memory_append, and memory_update by indicating batch import with optional overwrite.

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 provides guidance on using overwrite=true for updating existing memories, but it does not explicitly differentiate when to use this tool versus alternatives like memory_store (single store) or memory_append (append to existing). No when-not-to-use advice is given.

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

memory_ingestA

Ingest a full document: automatically chunks it based on content type (text, markdown, code, legal), embeds each chunk, and stores with provenance. Use this for large documents.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesFull document content to ingest
titleNoDocument title
sourceNoOrigin of the content (e.g., file path, URL, system name)
document_typeNoType of document (e.g., contract, policy, code, incident, decision)
scopeNoMemory scope for isolationglobal
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
authorNoWho created this content
access_levelNoAccess classification level
tagsNoTags for categorization
metadataNoDomain-specific metadata (e.g., {contract_type: 'NDA', parties: ['A','B']})
content_typeNoContent type determines chunking strategytext
chunk_sizeNoTarget chunk size in characters (~4 chars per token)
chunk_overlapNoOverlap between chunks in characters for context preservation

TDQS

A3.9/5.0
Behavior4/5

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

Annotations provide minimal behavioral hints (only openWorldHint=false). Description adds important details: automatic chunking by content type, embedding, and provenance storage. 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?

Two efficient sentences: first defines core behavior, second adds usage context. No redundancy.

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

Completeness3/5

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

Covers ingestion flow and usage context but omits what is returned (e.g., success confirmation, document IDs). Lacks expected output 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 covers all 14 parameters with descriptions (100% coverage). Description does not add parameter-specific meaning beyond what schema provides.

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?

Specifically describes ingesting a full document with automatic chunking, embedding, and provenance storage. Clearly differentiates from sibling memory tools that handle smaller operations.

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?

States 'Use this for large documents' but does not explicitly exclude other scenarios or mention alternative tools for smaller documents. 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.

memory_insightsA
Read-only

Active advisor digest: what in the store needs ATTENTION now — unresolved conflicts, memories flagged stale by change-propagation, most-contradicted facts, and decisions recorded with no supporting evidence. Complements memory_questions (what to capture next). Read-only; optionally scoped.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
limitNoMaximum number of insights to return (default 20)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true. The description adds specific behavioral details about the types of insights returned (conflicts, stale memories, contradicted facts, unsupported decisions) and notes scoping is optional. This provides useful context beyond annotations, though it does not cover performance or rate limits.

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 two sentences, front-loaded with key information, and contains no fluff. Every phrase adds value: it specifies the content, notes the complementary tool, and declares read-only and scoping.

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 explains the content of insights and complementarity, but does not mention the return format or structure, which is important since there is no output schema. Given the tool's complexity (read-only, optional scoping, three parameters), the description is adequate but leaves room for improvement regarding output 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?

The input schema has 100% coverage with descriptions for all parameters (scope, namespace, limit). The description only mentions 'optionally scoped,' which aligns with the scope parameter but adds no new detail about parameter usage or syntax. Baseline 3 is appropriate since the schema does the heavy lifting.

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 provides a digest of items needing attention: unresolved conflicts, stale memories, contradicted facts, and decisions without evidence. It differentiates from the sibling 'memory_questions' tool, which captures next actions, making the purpose distinct and specific.

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 complements memory_questions, indicating when to use this tool over that alternative. It also notes that it is read-only and optionally scoped, but does not list exclusions or provide a full decision tree for when to use versus other tools.

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

memory_lessonA

Capture a structured lesson or incident in one call: fills the matching section template (incident → Symptom/Root Cause/Fix/Prevention; lesson → What/Why it matters/How to apply) from your field values and stores it through the normal write path (deduped — a repeat capture is a NOOP). Unknown document_types use a generic scaffold.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_typeNoSection template to fill: lesson | incident | decision | bug-fix | meeting | session. Unknown types use a generic Summary/Details/Notes scaffold.lesson
fieldsYesSection values keyed by section name (snake_case ok), e.g. {symptom, root_cause, fix, prevention} for an incident or {what, why_it_matters, how_to_apply} for a lesson. Omitted sections keep a placeholder.
titleNoOptional title (auto-derived from the first field value when omitted)
scopeNoMemory scope for isolationglobal
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
tagsNoTags for categorization
sourceNoOrigin of the content (e.g., file path, URL, system name)
access_levelNoAccess classification levelinternal
importance_scoreNoManual importance 0–1 (higher surfaces first in reflection/recall)

TDQS

A3.9/5.0
Behavior4/5

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

The description discloses key behaviors: deduplication (repeat capture is a NOOP), template filling based on document_type, and a generic scaffold for unknown types. Annotations provide no destructiveHint or readOnlyHint, so the description carries the burden and meets it reasonably.

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 sentences with no wasted words. The first sentence packs purpose, template behavior, and dedup, while the second handles edge cases. Front-loaded with the most important information.

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

Completeness4/5

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

For a tool with 10 parameters (1 required) and no output schema, the description covers core behavior well. It explains template usage and dedup. However, it doesn't mention return values or error conditions, which could be helpful.

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 100%, so baseline is 3. The description adds value by explaining how fields map to sections and that omitted sections get a placeholder, which is beyond the parameter descriptions in the schema.

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 captures a structured lesson or incident by filling a section template. It distinguishes from generic memory tools by specifying template mapping and dedup behavior, but doesn't explicitly differentiate from siblings like memory_append or memory_store.

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

Usage Guidelines3/5

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

Usage context is implied: use when capturing lessons or incidents with structured fields. The description notes that repeat captures are NOOP, which guides against redundant calls, but doesn't explicitly state when not to use or provide alternatives.

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

memory_listA
Read-only

Browse memories with filtering and pagination. Supports sorting by creation date, update date, or title.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
document_typeNoType of document (e.g., contract, policy, code, incident, decision)
limitNoMaximum results to return
offsetNoSkip this many results for pagination
sort_byNoField to sort results bycreated_at
sort_orderNoSort directiondesc
as_ofNoISO 8601 point-in-time: return memories that were valid at this instant (bi-temporal). Defaults to currently-valid memories when omitted. Must be a full ISO-8601 timestamp (date + time + zone); a date-only or non-padded value is rejected to avoid a silently-wrong lexicographic slice.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, indicating safe read-only behavior. The description's 'Browse' aligns with this. However, the description does not add further behavioral context beyond what annotations provide, such as potential performance implications or the bi-temporal nature of the 'as_of' parameter. The openWorldHint=false is not explained. Since the description does not contradict annotations, a score of 3 is appropriate (baseline, no added value).

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, front-loaded, and every word adds value. It efficiently conveys core functionality. However, it could be slightly expanded to mention the bi-temporal or pagination behavior without losing conciseness. Still, it is well-structured and avoids fluff.

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 9 parameters, no output schema, and the complexity of bi-temporal filtering, the description is incomplete. It does not explain the return format (e.g., list of memory objects with fields), nor the effect of 'as_of' on results. For a tool of this complexity, the description should provide more context to aid 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?

The input schema has 100% coverage with descriptions for all 9 parameters. The description's mention of 'filtering and pagination' adds no detail beyond the schema. For example, 'as_of' is a complex parameter but the schema already explains it. Baseline 3 is correct since the schema does the work.

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: 'Browse memories with filtering and pagination.' It specifies supported sorting fields and implies list retrieval, which distinguishes it from sibling tools like memory_get (single retrieval) and memory_search (likely full-text search). The verb 'browse' and resource 'memories' are specific and unambiguous.

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 for browsing and filtering memories but provides no explicit guidance on when to use this tool versus alternatives. It does not mention exclusions or when not to use it. Among 52 sibling tools, there are many memory listing/search tools, so explicit differentiation would be helpful. Without such guidance, the description is adequate but not exemplary.

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

memory_manifestA
Read-only

Get a lightweight index of all memories — titles, types, tags, and scores without content. Use this to discover what knowledge exists before running expensive searches.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
document_typeNoType of document (e.g., contract, policy, code, incident, decision)
limitNoMaximum entries to return (default 500)
offsetNoSkip this many entries for pagination

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true; description adds that no content is returned, reinforcing non-destructive behavior. 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?

Two sentences, front-loaded with purpose and usage guidance. No extraneous information, highly concise.

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?

Description lacks details on return structure, pagination behavior, and how parameters like scope/namespace interact. Given 6 parameters and no output schema, more completeness is needed.

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 description adds little beyond schema. Baseline 3 is appropriate as it provides overall context but no parameter-level 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?

Description clearly states 'Get a lightweight index of all memories' with specifics (titles, types, tags, scores) and contrasts with expensive searches, distinguishing it from siblings.

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

Usage Guidelines4/5

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

Explicitly recommends using this tool before expensive searches, providing clear context. However, it does not explicitly mention when not to use or list alternatives.

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

memory_queryA
Read-only

Answer a question with a TIGHT, relevant subgraph instead of flooding context. Seeds from hybrid search, walks the memory graph (hub-avoiding) up to max_hops, and returns a token-budgeted "context" string plus structured nodes — with an actionable hint when truncated.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe question to answer. Seeds from hybrid search, then walks the memory graph to return a tight, relevant subgraph instead of flooding context.
max_tokensNoApproximate token budget for the rendered context (~4 chars per token). Nodes are rendered until the budget is hit, then truncated with a hint.
max_hopsNoHow many hops to walk out from the seed memories (1-4).
seed_limitNoMaximum seed memories from the initial search. A gap cutoff drops seeds scoring below 20% of the top seed to keep the traversal focused.
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)

TDQS

A4/5.0
Behavior4/5

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

Annotations already mark the tool as read-only (readOnlyHint: true). The description adds substantial behavioral context: hybrid search seeding, hub-avoiding graph walk, token budget, truncation with actionable hint. No contradiction observed.

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?

A single, dense sentence that packs all key information: purpose, mechanism, and return format. No wasted words, front-loaded with the core verb. Every phrase 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 the tool's complexity (graph walk, token budget, truncation) and absence of output schema, the description covers the main aspects: seeds from hybrid search, hub avoidance, max_hops, token budget, and return of 'context string plus structured nodes' with truncation hint. Slightly vague on the exact structure of nodes, but overall sufficient.

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 explains each parameter thoroughly. The description only briefly mentions max_hops and token-budgeted, adding little extra meaning beyond the schema's existing 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 answers a question with a tight, relevant subgraph from memory, explicitly distinguishing it from flood-fetch alternatives. It mentions hybrid search, graph walking, and token budgeting, which differentiates it from siblings like memory_query_structured or simple 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 Guidelines3/5

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

The description implies usage for concise memory queries but does not explicitly state when to use this tool over alternatives like memory_query_structured or when not to use it. No exclusions or comparisons to siblings are provided.

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

memory_query_structuredA
Read-only

Structured query over memory PROPERTIES (the agent's "Bases/Dataview"): filter currently-valid, top-level memories by scope/namespace/department/document_type/language/tags (AND)/min_importance/created_at range, sort by created_at|updated_at|importance_score|title, paginate, and project specific fields. Exact, deterministic retrieval that complements fuzzy memory_search — use it for "all decision memories in namespace=acme with importance>0.7, newest first".

ParametersJSON Schema
NameRequiredDescriptionDefault
filterNo
sortNo
limitNo
offsetNo
fieldsNoReturn only these fields (projection)

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the bar is lower. The description adds useful behavioral context: it operates on 'currently-valid, top-level memories', is 'exact, deterministic', and lists filtering criteria. It does not contradict annotations and provides additional transparency about the tool's scope and nature.

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 two sentences with no wasted words. The first sentence is comprehensive but well-structured, and the second provides usage guidance. It front-loads the purpose and uses clear, direct language.

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 complexity (5 parameters, nested objects, no output schema), the description covers the main capabilities well. It explains filtering, sorting, pagination, and field projection. It does not describe the return format, but that is partially mitigated by the schema's lack of output schema. Overall, it is sufficiently complete for an agent to understand and use the 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 description coverage is low (20%), but the description compensates by listing the filter criteria (scope, namespace, department, document_type, language, tags with AND, min_importance, created_at range) and sort options (created_at, updated_at, importance_score, title). It also mentions pagination and projection. The description adds significant meaning beyond the schema's minimal 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 it's a structured query over memory properties, listing specific operations (filter, sort, paginate, project) and distinguishing from fuzzy memory_search. It uses specific verbs and resources, and the distinction from siblings is explicit.

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 guidance: 'Exact, deterministic retrieval that complements fuzzy memory_search' and gives a concrete example ('all decision memories in namespace=acme with importance>0.7, newest first'). It clearly tells when to use this tool versus the sibling 'memory_search'.

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

memory_questionsA
Read-only

Active "questions to ask" digest. Surfaces open questions / gaps the graph is uniquely positioned to find so you know what to verify or learn next: AMBIGUOUS inferred links to confirm (verify), frequently-mentioned but barely-documented entities (gap), and disconnected memories that may be stale or mis-scoped (orphan). Returns { questions: [{ question, type, evidence }], count } over currently-valid top-level memories. Optional scope/namespace filters and limit (default 20).

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
limitNoMaximum number of questions to return (default 20)

TDQS

A4/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true, but the description adds behavioral context: it operates over 'currently-valid top-level memories', returns structured questions with evidence, and supports optional filters. No contradictions 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.

Conciseness4/5

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

The description is dense and front-loaded with the core purpose. It earns each sentence by explaining what the tool returns and the types of questions. Could be slightly more structured, but it is efficient and clear.

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 has no output schema, the description fully explains the return format ({ questions: [{ question, type, evidence }], count }) and mentions the optional scope/namespace filters and limit. It is complete for safe, effective use.

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 parameter descriptions already exist. The description restates the optional filters and default limit, which adds marginal value beyond the schema. No additional syntax or format details are provided beyond what the schema covers.

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 open questions and gaps (ambiguous links, gaps, orphans) from the memory graph, using specific verbs like 'surfaces' and 'digest'. It distinguishes from sibling tools by its unique output format and purpose.

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 for verification and learning ('so you know what to verify or learn next') but does not explicitly contrast with other analytical tools like memory_insights or memory_search. No when-not-to-use or alternative guidance is provided.

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

memory_reflectA

Generative-Agents-style reflection (agent-driven, no LLM in the server). mode:"gather" (default) returns the most reflection-worthy memories (high importance × recent) as material plus an instruction to synthesize 1–3 higher-level insights. mode:"store" persists a synthesized insight (provenance="reflection") and "derived_from"-links it to its source memories.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNo"gather" (default): the server SELECTs the most reflection-worthy memories (high importance × recent) as material for you to synthesize. "store": persist a synthesized insight back, linked to its source memories.gather
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
limitNogather: max reflection-material rows to return (default 10)
insightNostore: the higher-level insight you synthesized from the gathered material
titleNostore: optional short title for the stored insight
source_idsNostore: ids of the source memories this insight was derived from (linked via "derived_from"; non-existent ids are skipped)

TDQS

A4.3/5.0
Behavior4/5

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

The description adds significant behavioral context beyond the minimal annotations (only openWorldHint). It discloses the selection criteria (high importance × recent), the linking mechanism ('derived_from'), and the provenance marking, which are critical for understanding the tool's operation. No contradictions 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.

Conciseness4/5

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

The description is a single, well-structured sentence that front-loads the key concept and efficiently covers both modes. It is concise with no fluff, though the dense structure could be slightly improved for readability.

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 7 parameters (0 required), full schema coverage, and no output schema, the description provides adequate context for the core functionality. It covers the selection algorithm, storage mechanics, and linking. It lacks details about error handling or edge cases, but for this complexity level, it is sufficiently complete.

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?

Although schema coverage is 100%, the description enhances understanding by explaining the role of each mode and how parameters like 'mode', 'insight', and 'source_ids' interact. It clarifies the 'gather' output (material + instruction) and 'store' behavior (persist with provenance). This adds value beyond the basic 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 defines the tool as a 'Generative-Agents-style reflection' with two distinct modes ('gather' and 'store'). It specifies the resource (memories) and action (reflection), effectively distinguishing it from sibling tools like memory_condense or memory_insights by emphasizing its agent-driven, no-LLM-in-server approach.

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 when to use each mode: 'gather' for retrieving reflection-worthy material and 'store' for persisting synthesized insights. While it doesn't explicitly state when not to use this tool or mention alternatives, the context is clear and the dual-mode design provides direct usage guidance.

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

memory_restoreA

Bring a memory back: un-tombstones a soft-forgotten memory (memory_forget {hard:false}) by clearing valid_to/tx_expired so it re-enters default recall, AND/OR restores a condensed memory to its original full content. Both are applied when both apply. Returns reinstated/uncondensed flags.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID to bring back — un-tombstones a soft-forgotten memory and/or restores condensed content to original full text

TDQS

A4/5.0
Behavior3/5

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

The description reveals that the tool clears valid_to/tx_expired and restores content, and returns flags. It does not mention any destructive side effects, reversibility, or authorization requirements. With no annotations beyond title, the description provides moderate behavioral context but lacks depth.

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 (three sentences), front-loaded with 'Bring a memory back', and structured to explain two operations clearly. No unnecessary 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?

The description explains the tool's behavior and return flags, compensating for the lack of output schema. It addresses the two main use cases but could clarify whether the id must belong to a currently soft-forgotten or condensed memory.

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 restates the schema's parameter description without adding new meaning. The schema already covers the parameter purpose adequately, so the description offers no additional 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 clearly states the tool restores a memory, specifying two distinct actions: un-tombstoning a soft-forgotten memory and/or restoring condensed content. It uses specific verbs and distinguishes from siblings like memory_forget and memory_condense.

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 when to use the tool (on soft-forgotten or condensed memories) and implies it is the inverse of memory_forget with hard:false and memory_condense. However, it does not explicitly exclude other states or provide alternative tool names for different scenarios.

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

memory_revalidateA

Change-propagation surface. action=list: memories flagged needs_revalidation (a source they were derived from changed). action=preview: the blast radius of a change to id (which dependents WOULD be flagged) without mutating anything. action=confirm: clear id's stale flag after re-verifying it.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNolist stale memories | preview the blast radius of a change to `id` (dry-run) | confirm `id` is currentlist
idNoMemory id (required for preview/confirm).
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
limitNoMax stale memories to list.

TDQS

A3.9/5.0
Behavior4/5

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

With no readOnlyHint or destructiveHint annotations, the description takes responsibility. It clearly states that preview is non-mutating and confirm clears the stale flag (mutation). However, it does not disclose potential side effects, permissions, or rate limits.

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 (3 sentences), front-loaded with 'Change-propagation surface', and uses structured listings for each action. No superfluous words; every sentence earns its place.

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 the tool's moderate complexity (3 actions, 5 parameters, no output schema), the description covers core purpose and action behaviors. However, it lacks details on return format, scope/namespace effects, and fails to specify how results from 'list' are structured.

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 the schema already describes each parameter well (e.g., action enum values). The tool description adds narrative context but does not significantly enhance parameter understanding beyond what the schema provides.

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 defines the tool as a change-propagation surface with three distinct actions (list, preview, confirm), each with a specific verb and resource. It differentiates from siblings like memory_list by focusing on flagged memories needing revalidation.

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 contexts (e.g., list to see stale memories, preview to check impact, confirm to clear), but lacks explicit guidance on when to use this tool vs alternatives like memory_list or memory_verify. No when-not-to-use advice.

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

memory_session_noteA

Frictionless per-session capture ("daily note for agents"). Keyed by source "session:": the first call creates one session memory (document_type "session"); every later call for the same session_id appends to that same memory (newline-joined, re-embedded and versioned). Different session_ids stay isolated. Returns { memory_id, created, appended }.

ParametersJSON Schema
NameRequiredDescriptionDefault
session_idYesSession identifier. The note is keyed by source "session:<session_id>" — the first call creates the memory, later calls append to that same one.
textYesText to capture (created as content, or appended newline-joined to the session note).
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
titleNoOptional title used only on create (defaults to "Session <session_id>").

TDQS

A4.3/5.0
Behavior4/5

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

Annotations provide minimal (openWorldHint=false), but description adds key behavioral traits: first-call creation, appending, isolation by session_id, return fields, re-embedding, and versioning. No contradictions 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?

Description is two sentences, front-loaded with core purpose, no wasted words. Each sentence adds value.

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

Completeness5/5

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

No output schema, but description explains return values. It covers creation/append logic, isolation, versioning, and scope/namespace context. Complete for a tool with 5 parameters and no nested objects.

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 schema already documents parameters. Description reinforces keying behavior and title usage but adds no new semantics beyond what schema provides. 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 clearly states the tool does 'per-session capture' with a specific keying mechanism and explains create vs append behavior, distinguishing it from general memory tools like memory_store. It uses specific verbs and resources.

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 clear context for when to use ('daily note for agents', session-specific notes) and implies when not to use (for non-session or overwriting needs). However, it doesn't explicitly name alternative sibling tools or state exclusion criteria.

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

memory_session_stateA

Save or resume a resumable session-state ("where was I"): structured summary/next_steps/open_questions/files_touched/branch keyed by session_key. save upserts (versioned, so you can diff sessions via memory_version_diff); resume returns the latest. Bypasses the dedup write-gate so an incremental save always persists.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNosave the current session state | resume the latestresume
session_keyNoStable key for the work thread (defaults to branch, else "default").
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
summaryNoWhere things stand right now.
next_stepsNoOrdered list of what to do next.
open_questionsNoUnresolved questions.
files_touchedNoFiles in flight.
branchNoGit branch this session is on.
extraNoAny additional caller-defined state fields.

TDQS

A4.6/5.0
Behavior5/5

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

Discloses that save upserts are versioned and diffable, and that resume returns latest. Also notes bypassing dedup write-gate, which is beyond annotation's openWorldHint=false.

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 sentences: first states purpose and structure, second explains key behavioral traits. Front-loaded and no unnecessary 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?

Provides sufficient context for a 10-parameter tool with no output schema: mentions versioning, diff capability, and bypassing dedup. Could optionally describe return format, but not required.

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 has 100% description coverage for parameters; description adds meaning by explaining action enum values, session_key default, and the overall state structure.

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 'Save or resume a resumable session-state' with specific fields (summary, next_steps, etc.). Differentiates from siblings by mentioning versioning and bypassing dedup write-gate.

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

Usage Guidelines4/5

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

Explicitly describes when to save vs resume, and notes that it bypasses dedup for incremental saves. Does not provide explicit 'when not to use' or alternative tools, but context is clear.

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

memory_statsA
Read-only

Get usage statistics: total memories, chunks, documents, breakdowns by scope/department/type, storage size, and expired count.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds valuable details about what statistics are returned (breakdowns, storage, expired count). No contradiction with annotations. Description enhances understanding of the tool's behavior beyond mere read-only nature.

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, well-structured sentence that front-loads the purpose ('Get usage statistics') and efficiently enumerates key outputs. 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?

Although no output schema is provided, the description adequately lists the types of statistics returned. Parameters are well documented. For a read-only stats tool, the description is sufficiently complete for an agent to understand its function and outputs.

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?

Input schema covers all 3 parameters with descriptions (scope, namespace, department). Baseline 3 is appropriate. The description mentions breakdowns by scope/department/type, which adds some context about parameter usage, but does not significantly expand 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?

Description clearly states the tool retrieves usage statistics, listing specific metrics (total memories, chunks, documents, breakdowns, storage size, expired count). Distinguishes from numerous sibling tools that perform other operations like appending, getting, or replacing memories.

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

Usage Guidelines4/5

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

Implied usage for obtaining summary statistics, but no explicit guidance on when to use vs. alternatives like memory_get or memory_insights. Context is clear enough for an agent to differentiate, but lacks direct exclusions or when-not recommendations.

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

memory_storeA

Store a new memory with content, metadata, and automatic vector embedding. Use this to save information, decisions, patterns, or knowledge for later semantic retrieval.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe text content to store as a memory
titleNoShort title for the memory
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
document_typeNoType of document (e.g., contract, policy, code, incident, decision)
sourceNoOrigin of the content (e.g., file path, URL, system name)
authorNoWho created this content
departmentNoDepartment (e.g., legal, engineering, hr, sales, finance)
tagsNoTags for categorization
access_levelNoAccess classification levelinternal
languageNoContent language (ISO 639-1 code)en
metadataNoDomain-specific metadata (e.g., {contract_type: 'NDA', parties: ['A','B']})
agent_idNoIdentifier of the writing agent for multi-agent attribution
expires_atNoFull ISO-8601 expiration timestamp, e.g. 2026-03-01T00:00:00Z (memory auto-excluded from search after this)
importance_scoreNoExplicit importance 0-1 (governance/criticality). When omitted it is derived from content; min_importance filters operate on this value.
on_conflictNoWrite policy when a near-match exists. "add" (default): insert as new, except an exact duplicate is skipped (NOOP) — identical to prior behaviour. "update": merge content into the existing match (append + re-embed + version bump). "supersede": retire (invalidate) the conflicting match and add this as the current one.add
volatilityNoOverride the auto-derived volatility class. Omit to auto-classify from content + document_type (volatile deploy/status facts warn sooner on recall).
verification_tierNoHow well this fact is verified: source_verified > tool_verified > asserted > unverified. Lowers groundedness for unverified claims. Omit ⇒ neutral.
verification_detailNoFree text: how/when/by-what the fact was verified (e.g. "checked live UAT DB 2026-06-18").

TDQS

A3.6/5.0
Behavior3/5

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

Annotations provide only openWorldHint=false, so the description carries the burden. It adds 'automatic vector embedding' but omits details on side effects, write policies (on_conflict), or permissions.

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?

A single, front-loaded sentence that efficiently conveys purpose and usage 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?

Despite 19 parameters and no output schema, the description is minimal. It omits crucial behavioral context like conflict resolution, expiration, volatility, and return value, leaving the agent to infer from the schema alone.

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% with detailed descriptions for each parameter. The tool description does not add extra meaning beyond summarizing 'content, metadata, and automatic vector embedding'. 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 clearly states the verb 'Store' and the resource 'a new memory', and distinguishes from sibling tools like memory_search and memory_delete by emphasizing saving for later retrieval. It also mentions automatic vector embedding, a key feature.

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 tells when to use the tool ('to save information, decisions, patterns, or knowledge for later semantic retrieval') but does not explicitly exclude scenarios or mention alternatives like core_memory_append or memory_update for handling conflicts.

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

memory_templateA
Read-only

Fetch an Obsidian-style note scaffold for a document_type so stored memories stay structurally consistent. Returns a markdown template with ## Section headers (e.g., decision → Context/Decision/Consequences; incident → Symptom/Root Cause/Fix/Prevention; also learning, bug-fix, meeting, session). Unknown types get a generic Summary/Details/Notes scaffold (known:false). Read-only: fill the scaffold, then store it via memory_store.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_typeYesDocument type to fetch a note scaffold for (e.g., decision, incident, learning, bug-fix, meeting, session). Unknown types get a generic Summary/Details/Notes scaffold (known:false).

TDQS

A4.7/5.0
Behavior5/5

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

The description explicitly states the tool is read-only, matching the readOnlyHint annotation. It adds behavioral context beyond annotations by detailing the return format (markdown with section headers for known types) and behavior for unknown types (generic scaffold with known:false). 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 two sentences, front-loaded with purpose, and every sentence adds value. It avoids redundancy and is efficiently structured.

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 single parameter, full schema coverage, and presence of annotations, the description covers all necessary context: what it does, output format, behavior for known/unknown types, and read-only nature. No gaps remain.

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 100% and the schema description covers the parameter. The description adds value by listing example types (decision, incident, etc.) and explaining the generic behavior for unknowns, enhancing semantic understanding beyond the schema alone.

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 fetches an Obsidian-style note scaffold for a document_type to maintain structural consistency. It uses the specific verb 'fetch' and identifies the resource as a note scaffold, distinguishing it from sibling tools that store or retrieve actual memories.

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

Usage Guidelines4/5

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

The description provides clear guidance: fetch the scaffold, then store it via memory_store. It implies when to use (prior to storing structured notes) but does not explicitly mention when not to use or list alternatives, though the sibling tools include memory_store and others.

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

memory_tiersA
Read-only

Show the MemGPT-style tier distribution (hot / recall / archival) of currently-valid, top-level memories and list the hot working set. Tiers are derived from access recency + frequency — hot = frequently or recently accessed, archival = old and rarely touched, recall = everything in between. Read-only; optional scope/namespace filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description reinforces this and explains how tiers are derived (access recency + frequency). It adds value beyond annotations with 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?

Two sentences, front-loaded with the core action and output. No redundant words; each sentence adds essential information.

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

Completeness4/5

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

The description covers the main output (tier distribution, hot working set) and scope filters. With no output schema, it provides enough context for an agent to understand the result. Could mention that it's a snapshot or list, but sufficient.

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 the schema documents both parameters fully. The description mentions 'optional scope/namespace filter' but adds no new semantic detail beyond what the enum and description in the schema provide.

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 shows 'MemGPT-style tier distribution (hot / recall / archival)' and 'list the hot working set'. It specifies the resource (memories) and action (show/list), distinguishing it from sibling tools like memory_get or memory_stats.

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 mentions it's read-only and has optional scope/namespace filters, giving context on when to use. However, it does not explicitly exclude other tools or provide when-not guidance, which could be helpful given the many sibling tools.

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

memory_unlinked_mentionsA
Read-only

Surface "unlinked mentions" for a memory — other memories that are semantically related (vector-near + shared entities) but that you have NOT explicitly linked yet. This is Obsidian's killer feature, automated: instead of matching note titles as literal text, it uses embeddings + the entity graph to propose latent connections the agent never made. Auto "similar_to" suggestions are surfaced; existing wikilink/co-occurrence/typed links are excluded. Use it to discover and then confirm real connections (e.g. via memory_extract_entities or a stored link).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID to surface unlinked mentions for
limitNoMaximum number of unlinked mentions to return
min_similarityNoMinimum cosine similarity for a mention (0-1)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations indicate readOnlyHint=true, consistent with the read-only nature of surfacing mentions. The description adds behavioral details: uses embeddings + entity graph, excludes existing links, and proposes latent connections. It does not contradict annotations and provides useful algorithmic context, though it does not cover return format or pagination.

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 three sentences long and front-loads the main purpose in the first sentence. It is well-structured and information-dense, though slightly verbose in the second sentence. Overall, it is concise and easy to parse.

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 has no output schema, the description explains the output type (auto 'similar_to' suggestions) and excludes existing links. It also suggests next steps, making it complete for a discovery tool. No major gaps are apparent.

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 covers all three parameters with descriptions (100% coverage). The description does not add significant new parameter semantics; it mentions the algorithm but not parameter-specific details. With high schema coverage, the baseline is 3, and the description does not elevate it.

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 unlinked mentions for a memory, which are semantically related but not explicitly linked. It distinguishes itself from typical text matching by using embeddings and entity graph, and the resource (memory) and verb (surface) are specific. The description differentiates it from siblings like memory_related or memory_query.

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 clear guidance on when to use the tool: to discover latent connections that the agent never made. It also suggests a workflow after discovery, such as using memory_extract_entities or storing a link, implying the tool is for discovery, not confirmation. It does not explicitly list when not to use it, but the context makes it clear.

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

memory_updateA

Update an existing memory. If content changes, the vector embedding is automatically regenerated. Previous versions are preserved in history.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID of the memory to update
contentNoNew content (will re-generate embedding)
titleNoNew title
metadataNoUpdated metadata (replaces existing)
tagsNoUpdated tags (replaces existing)
expires_atNoNew full ISO-8601 expiration timestamp (e.g. 2026-03-01T00:00:00Z), or null to remove
changed_byNoWho made this change (for version history)
importance_scoreNoReassign importance 0-1 (governance/criticality)
verification_tierNoSet/upgrade the verification tier after the fact (the main post-hoc use case — you verify a stored claim against live state later). Raises/lowers groundedness.
verification_detailNoFree text accompanying a verification_tier change.
volatilityNoManual override of the auto-derived volatility class.

TDQS

A3.5/5.0
Behavior4/5

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

Discloses key side effects: automatic embedding regeneration on content change and preservation of previous versions in history. Annotations do not contradict; 'openWorldHint: false' is compatible. This provides useful beyond-schema 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?

Three sentences that front-load the core purpose and then add behavioral details with no extraneous words. Every sentence serves a purpose.

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?

Covers the main behavioral aspects but lacks comparative guidance against a large set of sibling tools. Does not describe return value or error states, though no output schema exists. Adequate for a basic update tool.

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% with detailed parameter descriptions. The description adds minimal extra per-parameter info (only the embedding regeneration tied to 'content'). Baseline 3 is appropriate.

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 'Update an existing memory' with a specific verb and resource. It adds behavioral details (embedding regeneration, versioning) that differentiate it from similar tools, but does not explicitly contrast with siblings like 'memory_replace' or 'memory_append'.

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 such as 'core_memory_replace' or 'core_memory_append'. The description omits prerequisites, context for choosing this tool, or when not to use it.

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

memory_verifyA
Read-only

Verify the signed provenance envelope of memories: recomputes each content_hash and ed25519-checks the signature against THIS machine's trusted signing key (not the row's self-embedded key). Verify one by id, or a batch by scope/namespace. Returns per-memory status (verified / unsigned / tampered / untrusted) + a summary {verified, unsigned, tampered, untrusted}. "untrusted" = validly signed but by a non-trust-root key (e.g. a teammate on a synced vault) — distinct from "tampered". Read-only. Signing is enabled by MCP_SIGN_MEMORIES.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoVerify a single memory by id. Omit to verify a batch by scope/namespace.
scopeNoMemory scope for isolation
namespaceNoNamespace within scope (e.g., project name, team name)
limitNoMax memories to verify in batch mode (default 100)
trusted_pubkeysNoAdditional trusted signer public keys (SPKI PEM) for multi-machine/team vaults — a memory signed by any of these (or by MCP_TRUSTED_PUBKEYS, or this machine's own key) verifies instead of reading 'untrusted'.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description reinforces that it is 'Read-only'. It also discloses important behavioral details: the verification uses the machine's trusted signing key (not the embedded key), and explains the four possible statuses (verified, unsigned, tampered, untrusted) with a definition of 'untrusted'. This provides transparency beyond 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 four sentences, front-loaded with the main action. Each sentence contributes unique information: the verification process, modes, return format, and read-only nature. No redundant or vague phrasing; it is efficient and well-structured.

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 value (per-memory status + summary dict). All 5 parameters are covered in the schema, and the description adds context for batch mode and key trust. Given the tool's complexity, this is complete and leaves no ambiguity.

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 100%, so baseline is 3. The description adds value by explaining that omitting 'id' triggers batch verification, and it clarifies the 'trusted_pubkeys' parameter as 'additional trusted signer public keys ... a memory signed by any of these ... verifies instead of reading untrusted'. This gives semantic meaning beyond the schema's brief 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 begins with 'Verify the signed provenance envelope of memories: recomputes each content_hash and ed25519-checks the signature against THIS machine's trusted signing key', which is a specific verb and resource. It clearly distinguishes from siblings by focusing on cryptographic verification, unlike other memory tools that perform different actions (e.g., query, update, delete).

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 states 'Verify one by id, or a batch by scope/namespace', providing clear usage modes. It explains the distinction between 'untrusted' and 'tampered' statuses, offering context for interpreting results. However, it does not explicitly state when not to use this tool or mention alternatives, but this is not critical given its unique purpose.

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

memory_version_diffA
Read-only

Show a line-by-line diff between two revisions of a memory (Obsidian-Sync-grade trust). to defaults to the current version. Use it to audit exactly what an edit changed — added/removed lines plus a summary count.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID
fromYesVersion number to diff from
toNoVersion to diff to (defaults to current)

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, so the description does not need to reiterate safety. It adds value by explaining the output format ('added/removed lines plus a summary count') and noting that 'to' defaults to the current version. No contradictions 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?

The description is only two sentences, with every word contributing. The first sentence states the core purpose with a trust metaphor, and the second gives usage guidance and output summary. No wasted text.

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 no output schema, so the description must convey return format. It mentions 'added/removed lines plus a summary count', which is adequate but could be more precise (e.g., format of the diff). Still, the description suffices for an agent to understand the tool's behavior.

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

Parameters4/5

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

All three parameters are documented in the schema (100% coverage). The description adds meaning by stating that 'to defaults to the current version', which is not in the schema. This provides clarity beyond the schema alone.

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 shows a line-by-line diff between two revisions of a memory, using a specific verb ('Show') and resource ('diff'). It distinguishes itself from sibling tools like memory_history, memory_versions, and memory_version_restore by focusing on detailed comparison for auditing.

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 'Use it to audit exactly what an edit changed', providing clear usage context. However, it does not mention when not to use it or directly contrast with alternative tools (e.g., memory_versions for listing, memory_history for history).

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

memory_version_restoreB
Destructive

Roll a memory back to a prior version's content. The restore is itself a versioned, re-embedded edit (the pre-restore state is snapshotted, the vault file re-mirrored) — never a destructive overwrite. Returns the restored memory.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID
versionYesVersion number to restore content from
changed_byNoWho performed the restore

TDQS

B3.3/5.0
Behavior1/5

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

The description contradicts the annotation destructiveHint=true by claiming 'never a destructive overwrite'. This is a serious inconsistency. Additionally, while the description adds context about versioned edits and snapshots, the contradiction undermines 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 two sentences, front-loaded with the purpose, and contains no unnecessary words. It efficiently communicates the key action and behavioral nuance.

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 the restore action, versioned nature, and return value, but the contradiction with annotations reduces completeness. Without output schema, it does not explain what the restored memory object contains, and it lacks any mention of prerequisite or side effects beyond the annotation conflict.

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 description does not add any parameter-level meaning beyond what is already in the schema. The parameters are well-documented in the schema, 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?

The description clearly states the verb 'roll back' and resource 'memory to a prior version', explicitly distinguishing from destructive actions and noting the versioned nature. It differentiates from sibling tools like 'memory_restore' by focusing on version restoration and non-destructive behavior.

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 for restoring a specific prior version, but it does not explicitly state when to use this tool versus alternatives like 'memory_restore'. No direct exclusions or when-not-to-use guidance is provided.

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

memory_versionsA
Read-only

View the version history of a memory, showing all past edits with timestamps and who made each change.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMemory ID to get version history for
limitNoMaximum number of versions to return

TDQS

A3.5/5.0
Behavior3/5

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

The description adds behavioral context beyond the readOnlyHint annotation by detailing that timestamps and author information are included. However, it does not disclose potential limitations like pagination behavior or what happens if the memory has no history.

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?

A single sentence that is front-loaded with the core purpose, containing no extraneous words. Every word is necessary.

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 read-only tool with two parameters and no output schema, the description covers the main purpose but does not describe the return format or how to interpret the history data. It is adequate but lacks some completeness.

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% for both parameters (id and limit). The description does not add additional meaning beyond what the schema already provides, 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 clearly states the verb ('View'), the resource ('version history of a memory'), and what is shown ('all past edits with timestamps and who made each change'). This distinguishes it from sibling tools like memory_version_diff and memory_version_restore.

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 provides no guidance on when to use this tool versus alternatives such as memory_version_diff or memory_version_restore. It does not specify prerequisites or when not to use it.

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

memory_webhookA

Manage the active-infrastructure event bus (gated on MCP_WEBHOOKS). register an outbound webhook target (URL is SSRF-validated — public http(s) only), list targets (secrets never returned), delete a target, or dispatch the durable delivery queue now. Mutations to memories (created/updated/superseded/deleted/forgotten) enqueue HMAC-signed deliveries that this tool drains with retry + circuit-breaker + dead-letter.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoregister a target | list targets | delete a target | dispatch the queue nowlist
urlNoTarget URL (action=register). Validated against the SSRF guard: public http(s) only.
secretNoOptional HMAC-SHA256 signing secret; sent as X-Memory-Signature on each delivery.
eventsNoComma-separated event types or '*' (default all): memory.created/updated/superseded/deleted/forgotten.
scopeNoOnly deliver events for memories in this scope.
namespaceNoOnly deliver events for memories in this namespace.
idNoTarget id (action=delete).

TDQS

A4.3/5.0
Behavior5/5

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

The description discloses significant behavioral traits including SSRF validation, HMAC signing, enqueueing, retry, circuit-breaker, and dead-letter mechanisms. These go beyond the annotations (which only have openWorldHint) and provide critical safety and performance context.

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 single dense paragraph that efficiently covers key behaviors and actions. While no fluff, it could be slightly improved with bullet points or more structured layout for better scannability.

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 7 parameters and 4 actions, the description covers functional behavior well. However, it lacks details on return values, error handling, and authentication requirements, leaving some gaps for complete understanding.

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 100%, so baseline is 3. The description adds context about SSRF validation, HMAC secret signing, and event types, enhancing understanding beyond the parameter 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 it manages an event bus for webhooks, listing actions (register, list, delete, dispatch) and the context of memory mutations. It distinguishes itself from sibling tools that focus on memory operations rather than webhook management.

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 mentions it is 'gated on MCP_WEBHOOKS' implying a feature flag, but does not explicitly state when to use this tool versus alternatives like those for direct memory operations. There is no guidance on preconditions or 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.

vault_statusA
Read-only

Check the sync status of an Obsidian vault: total files, synced/pending/changed counts, last sync time, and memory count.

ParametersJSON Schema
NameRequiredDescriptionDefault
vault_pathYesAbsolute path to the Obsidian vault directory

TDQS

A4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, and the description confirms a read-only operation ('Check the sync status'). The description adds detail about the returned data (counts, times, memory count), providing useful context beyond what annotations convey. 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 a single sentence that efficiently conveys purpose and output without any wasted words. It is front-loaded with the action and resource, making it easy to parse.

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

Completeness4/5

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

With one parameter, no output schema, and readOnlyHint provided, the description adequately covers the tool's behavior and return values. It could mention potential errors or prerequisites (e.g., vault must exist), but for a simple status check it is sufficiently 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 coverage is 100% with a single parameter 'vault_path' described as 'Absolute path to the Obsidian vault directory'. The description does not add further meaning beyond the schema, so 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 uses specific verb 'Check' and resource 'sync status of an Obsidian vault', listing exact data returned (total files, synced/pending/changed counts, last sync time, memory count). This clearly distinguishes from siblings like vault_sync (which performs sync) and memory_stats (different scope).

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 tool is for checking sync status, but provides no explicit guidance on when to use it versus alternatives (e.g., vault_sync for performing sync, or memory_stats for different stats). No when-not-to-use or context exclusions are mentioned.

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

vault_syncA

Sync an Obsidian vault to memory. Scans for markdown files, extracts frontmatter/tags/wiki-links, embeds content, and stores as searchable memories. Uses incremental sync based on file modification times.

ParametersJSON Schema
NameRequiredDescriptionDefault
vault_pathYesAbsolute path to the Obsidian vault directory
chunk_sizeNoTarget chunk size in characters for large files (~4 chars per token)
chunk_overlapNoOverlap between chunks in characters for context preservation
forceNoIf true, re-sync all files regardless of modification time
include_patternsNoOnly sync files matching these glob patterns (e.g., ["notes/**", "projects/**"])
exclude_patternsNoSkip files matching these glob patterns (e.g., ["templates/**", "daily/**"])

TDQS

A3.6/5.0
Behavior3/5

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

Annotations are sparse (only title and openWorldHint=false), so the description carries the burden. It explains the tool is incremental, scans, extracts, and stores, but does not disclose potential overwrite behaviors or idempotency. 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.

Conciseness4/5

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

The description is two sentences, front-loaded with purpose, and concise. It covers the main aspects without unnecessary detail.

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 explains the process but does not mention the return value or output, which is notable given no output schema. For a sync operation with 6 parameters, more completeness about outcomes would be beneficial.

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 baseline is 3. The description adds context about the sync process but does not provide additional meaning beyond the schema for individual parameters. No compensation needed.

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 syncs an Obsidian vault to memory, specifying the verb 'sync' and the resource 'Obsidian vault to memory'. It details actions like scanning markdown files, extracting frontmatter/tags/wiki-links, and storing as searchable memories, distinguishing it from sibling tools like vault_search and vault_status.

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 mentions incremental sync based on file modification times and a force parameter, but does not explicitly state when to use this tool versus alternatives like memory_import or other memory ingestion tools. No when-not or alternative guidance is provided.

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 updatesv2.9.1
    • Addedmemory_link_check
    • Changedmemory_search1 field changed
      • addedInput schema / properties / auto_decay
        Added value: +{
        +  "description": "When true and no explicit temporal_decay is given, derive decay per result from its volatility class (volatile facts decay fast, stable facts not at all). Down-ranks stale volatile facts without hand-tuning a half-life.",
        +  "type": "boolean"
        +}
    • Changedmemory_store3 fields changed
      • addedInput schema / properties / verification_detail
        Added value: +{
        +  "description": "Free text: how/when/by-what the fact was verified (e.g. \"checked live UAT DB 2026-06-18\").",
        +  "type": "string"
        +}
      • addedInput schema / properties / verification_tier
        Added value: +{
        +  "description": "How well this fact is verified: source_verified > tool_verified > asserted > unverified. Lowers groundedness for unverified claims. Omit ⇒ neutral.",
        +  "enum": [
        +    "source_verified",
        +    "tool_verified",
        +    "asserted",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / volatility
        Added value: +{
        +  "description": "Override the auto-derived volatility class. Omit to auto-classify from content + document_type (volatile deploy/status facts warn sooner on recall).",
        +  "enum": [
        +    "volatile",
        +    "normal",
        +    "stable"
        +  ],
        +  "type": "string"
        +}
    • Changedmemory_update3 fields changed
      • addedInput schema / properties / verification_detail
        Added value: +{
        +  "description": "Free text accompanying a verification_tier change.",
        +  "type": "string"
        +}
      • addedInput schema / properties / verification_tier
        Added value: +{
        +  "description": "Set/upgrade the verification tier after the fact (the main post-hoc use case — you verify a stored claim against live state later). Raises/lowers groundedness.",
        +  "enum": [
        +    "source_verified",
        +    "tool_verified",
        +    "asserted",
        +    "unverified"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / volatility
        Added value: +{
        +  "description": "Manual override of the auto-derived volatility class.",
        +  "enum": [
        +    "volatile",
        +    "normal",
        +    "stable"
        +  ],
        +  "type": "string"
        +}
  2. 50 tool updatesv2.6.4
    • First observedcore_memory_append
    • First observedcore_memory_get
    • First observedcore_memory_replace
    • First observedmemory_attribution
    • First observedmemory_canvas
    • First observedmemory_communities
    • First observedmemory_condense
    • First observedmemory_consolidate
    • First observedmemory_delete
    • First observedmemory_expertise
    • First observedmemory_export
    • First observedmemory_export_dataset
    • First observedmemory_export_vault
    • First observedmemory_extract_entities
    • First observedmemory_extract_learnings
    • First observedmemory_forget
    • First observedmemory_get
    • First observedmemory_graph
    • First observedmemory_health
    • First observedmemory_history
    • First observedmemory_import
    • First observedmemory_ingest
    • First observedmemory_insights
    • First observedmemory_lesson
    • First observedmemory_list
    • First observedmemory_manifest
    • First observedmemory_query
    • First observedmemory_query_structured
    • First observedmemory_questions
    • First observedmemory_reflect
    • First observedmemory_related
    • First observedmemory_restore
    • First observedmemory_revalidate
    • First observedmemory_search
    • First observedmemory_session_note
    • First observedmemory_session_state
    • First observedmemory_stats
    • First observedmemory_store
    • First observedmemory_template
    • First observedmemory_tiers
    • First observedmemory_unlinked_mentions
    • First observedmemory_update
    • First observedmemory_verify
    • First observedmemory_version_diff
    • First observedmemory_version_restore
    • First observedmemory_versions
    • First observedmemory_webhook
    • First observedvault_search
    • First observedvault_status
    • First observedvault_sync

TDQS

A3.7/5.0
Disambiguation3/5

Many tools have overlapping purposes, such as multiple search/query tools (memory_search, memory_query, memory_query_structured, vault_search) and multiple memory operations (core_memory_* vs memory_*). While descriptions help, the large number of similar-sounding tools can cause confusion for an agent.

Naming Consistency4/5

All tools use snake_case and share a consistent prefix pattern (memory_, core_memory_, vault_). However, the naming mixes action verbs (memory_store, memory_delete) with nouns (memory_canvas, memory_insights), breaking the verb_noun pattern in several cases.

Tool Count3/5

With 50 tools, the server is on the heavy side. The broad domain might justify some specialization, but many tools could be consolidated (e.g., three export tools, multiple analytical tools). The count feels slightly beyond optimal for agent usability.

Completeness5/5

The tool set is exceptionally thorough, covering CRUD operations, versioning, import/export, vault sync, knowledge graph queries, analytics, reflection, consolidation, and even GDPR compliance. No obvious dead ends or missing operations for the stated purpose of memory management.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Persistent memory for Claude Code. Automatically indexes every conversation and provides production-grade hybrid search (BM25 + vectors + reranker) via MCP tools. 100% local, zero config, zero API keys, zero invoice.
    16
    57
    7
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Local-first memory for your AI agent. One SQLite file you own — offline, no API key. Plugs straight into Claude Code.
    Apache 2.0
  • A
    license
    A
    quality
    A
    maintenance
    Durable, local-first memory for AI coding agents over MCP — zero-dependency (pure Python + SQLite/FTS5), curated and semantically de-duped. Works with Claude Code, Codex and any MCP host, and you own the data as plain rows.
    6
    21
    AGPL 3.0

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/YonasValentin/mcp-memory-graph'

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