Skip to main content
Glama
oleksiijko

io.github.oleksiijko/pmb-ai

by oleksiijko

PMB

Local-first memory for your AI coding agent.

SQLite is the source of truth. No cloud, no API keys, no re-explaining.

Website PyPI CI Docs Python License MCP GitHub MCP Registry

Local-first memory, visualized. 3,800+ entities and 41,000+ connections, captured automatically as you work.

Website · Docs · Quickstart · Demo · Why PMB · How it works · FAQ

Your AI agent forgets everything between sessions. So you re-explain the same decisions, lessons and constraints over and over. PMB remembers them in one local workspace and feeds them back through MCP - no cloud, no API keys, no LLM call on the read path. And it tells you when memory is actually helping, instead of claiming "+X%".

Star the repo if PMB saves you a re-explanation.


PMB gives Claude Code, Cursor, Codex and the other MCP-aware agents a real memory: decisions you made last week, lessons you taught them, personal facts, project structure, PDFs. They survive every restart, every model upgrade, every agent switch - because they live in a local workspace you own, with SQLite as the durable source of truth and rebuildable search indexes beside it.

No API keys. No subscription. No LLM call on the read path. Just local files.

Quickstart

pip install pmb-ai                 # 1. install
pmb setup                          # 2. detect your agent + wire the MCP entry
pmb warmup                         # 3. preload the model (first recall is instant)
# 4. restart your agent, then just talk to it - memory is automatic
pmb stats                          # 5. see what's stored
pmb recall "auth decision"         # 6. search memory from the terminal
pmb doctor                         # 7. confirm everything is wired

That's it - your agent now remembers. No account, no keys, nothing leaves your machine.

Command name: the CLI is pmb. Via pip you also get the alias pmb-ai; via npm (npx pmb-ai setup) the command is pmb-ai and it installs the Python package first, then runs setup. Same tool - use whichever your install gave you.

Links: pmbai.dev (site) · docs.pmbai.dev (docs) · Getting started · Deleting memories.


Related MCP server: code-recall

Demo

What it feels like - same prompt, with and without memory:

▶ Click to play the 2-minute setup

You:    fix that LoadGuard pricing bug we hit last Tuesday

Agent:  prepare(message="fix LoadGuard pricing bug")
        ↓ (6 ms)
        → project_context: 12 events about LoadGuard,
          4 lessons (incl. "never lower NEGOTIATE/SKIP under 25%"),
          3 decisions, 2 open goals
        → active_arcs: "LoadGuard verdict-policy refactor (started Tue)"
        → lessons: 1 directly matches "pricing"
        → recent_activity: 8 commits this week

        Looking at src/engine/verdict-policy.ts (you opened it Tuesday
        14:32, last changed Wednesday). The pricing bug is on line 142
        where the bundle fallback tightened below the rate-floor. Per the
        lesson you saved, we never drop the threshold under 25% - restoring
        the guard there.

The agent didn't ask. It didn't guess. It read its memory in 6 ms and showed up already informed.


Why PMB

  • Local-first, zero-config. SQLite holds the durable memory; rebuildable search indexes stay local. No account, API keys, telemetry, or cloud to trust.

  • It actually gets used. On Claude Code / Codex, hooks inject the right memory before the model thinks - you never have to remember to call a tool.

  • Multilingual, no setup. The embedder covers 50+ languages; a Russian query finds an English fact. No per-language config.

  • MCP-native. One pmb connect wires Claude Code, Cursor, Codex, Windsurf, Zed, VS Code, and more.

  • Fast read path. Recall in ~35 ms warm; writes return in under a millisecond - no LLM call to remember.

  • Honest impact. The dashboard shows which lessons actually changed outcomes, instead of claiming "+X%".

  • Your data, in the open. pmb export dumps everything to Markdown/JSON. Apache 2.0.


See your memory

pmb dashboard opens a local, liquid-glass web UI on http://127.0.0.1:8765 over everything PMB captured - written automatically, just by working. It binds to 127.0.0.1 only, so nothing leaves your machine.

Map - every entity and connection in your project, as a live graph.

Timeline - your memory as a journal, newest first.

Nine tabs: Map (entity graph, live), Timeline (git-graph by project), Overview, Entities, Arcs (narrative threads), Lessons (per-rule follow-rate, dead-lesson detection), Duplicates (inline merge), Performance (per-tool latency), Recall (debug ranker).


What you can store

# Personal facts that change (time-travel: old values archived, never lost)
record_keyed_fact("user", "city", "Warsaw")

# Project structure - symbols, imports, .gitignore-aware
pmb index project .

# Why each file exists + the intent behind every commit (Haiku-summarised, local)
pmb track modules                # one-line purpose per indexed file
pmb track changes                # new commits: what changed and WHY

# PDFs (research papers, manuals, contracts)
pmb index pdf paper.pdf
pmb index pdf ~/docs --recurse

# Whatever your agent logs as it works: decisions, lessons, completed tasks, goals

PMB is content-agnostic. If it's text the agent will care about later, PMB remembers and retrieves it.

What the agent gets back

A single MCP call - prepare(message) - returns the right things at the right level of detail, in 4-16 ms:

Field

What it is

project_context

Full project overview if the message mentions a project: key facts, lessons (RULES to follow), decisions, open goals, related entities, the project's narrative arc

lessons

Procedural rules matching the query, each with a surface_id so the agent can confirm it followed the rule later

recent_activity

Last 24 h of decisions / edits / completions for session continuity

open_goals

In-progress goals so the agent knows what you're pursuing

active_arcs

Narrative arcs the project is currently living in

For everything else there's recall(query) (hybrid search, 35 ms warm) and 27 other tools in docs/reference/COMMANDS.md.


How it works

flowchart LR
    A[Your agent] -->|MCP stdio| B[PMB MCP server]
    B --> C[Engine]
    C -->|read 35 ms| R[Hybrid recall<br/>BM25 + vector + graph + rerank]
    C -->|write under 1 ms| W[Async embed queue<br/>SQLite first, vectors later]
    R --> D[(SQLite)]
    R --> E[(LanceDB)]
    W --> D
    W --> E
    style A fill:#dbeafe,color:#1e3a8a
    style B fill:#ede9fe,color:#5b21b6
    style C fill:#dcfce7,color:#14532d
  • Storage - every durable event lives in SQLite, the source of truth. Rebuildable vector indexes live in LanceDB beside it. The whole workspace stays on your disk and can be copied or exported anytime.

  • Recall - BM25 (lexical) + dense vector (semantic) + entity graph + optional cross-encoder rerank, fused via Reciprocal-Rank-Fusion.

  • Writes - async. The MCP tool returns in under a millisecond; the embed + LanceDB insert happen on a background thread.

  • Dedup - four layers: exact text match -> cosine >= 0.92 auto-merge -> cosine 0.80-0.92 borderline (LLM verify later) -> manual review in the dashboard. Old values are archived, never deleted; full history via keyed_fact_as_of(t).

  • Multilingual - no language packs. The default embedder (paraphrase-multilingual-MiniLM-L12-v2) covers 50+ languages, so где я живу finds a keyed-fact stored as user.city = Warsaw. Intent detection rides English semantic anchors that transfer cross-lingually, and the cold lexical path self-compiles from your own traffic. Recall stays strong across ~11 languages (top-3 ~= 0.9 on a 101-query eval; top-1 = 1.00 for en/fr/pt/ru). See docs/contributing/adding-a-language.md.


Install

The Quickstart above is all most people need. Other ways:

# From source
git clone https://github.com/oleksiijko/pmb.git && cd pmb
python -m venv .venv && source .venv/bin/activate
pip install -e .
pmb warmup                       # prime the ~450 MB embedder once

Wire one or more agents (all stdio - the server runs as a child of your agent; no network, no port, no token):

pmb connect claude-code   # also: codex · cursor · windsurf · gemini · vscode · zed · opencode · continue

Point several agents at one memory:

pmb connect claude-code --workspace personal
pmb connect cursor      --workspace personal   # both read/write the same workspace

Sharing one memory across machines or a team? That's an optional HTTP mode with bearer-token auth - see docs/guide/TEAM.md. Not needed for local use.

Running the tests? Use the venv's Python: .venv/bin/python -m pytest (or .venv\Scripts\python.exe -m pytest on Windows). Bare pytest outside the venv just reports missing numpy/fastmcp/typer.


CLI cheat sheet

# Memory
pmb stats                                   show counts and storage info
pmb recall "query"                          search with full debug
pmb dashboard                               web UI on port 8765 (graph, settings, errors)

# Ingest
pmb index pdf paper.pdf                     extract + chunk + embed
pmb index pdf ~/docs --recurse              entire directory
pmb index project .                         scan codebase
pmb track changes                           summarise commit intent (why)
pmb track modules                           one-line purpose per module
pmb import chatgpt ~/Downloads/export.json  bring existing history

# Continuity & efficiency (opt-in)
pmb resume save                             write .pmb/resume.md (commit it)
pmb resume install                          refresh resume.md at every turn end
pmb health lessons-impact                   which lessons actually help outcomes
pmb memory ledger                           Memory Delta handles this session

# Maintenance
pmb regraph                                 rebuild entity graph
pmb consolidate                             run sleep pass (optional)
pmb compact                                 archive old events
pmb dedupe                                  resolve borderline duplicates

# Hooks (force-feed PMB at the protocol level - no model cooperation)
pmb hooks install claude-code               wire all lifecycle hooks
pmb hooks list                              show what's installed
pmb hooks capabilities                      ambient mechanism each agent supports
pmb hooks uninstall claude-code             remove them
pmb auto-context "fix bug in PMB"           preview per-turn injection
pmb session-restore -m 180                  preview post-compaction restore
pmb lesson-followcheck --dry-run            preview follow-through scoring

# Ambient memory (the write side - memory journals the agent's work)
pmb autowrite --dry-run                     preview ambient auto-write for this turn
pmb ambient-watch .                         ambient auto-write for MCP-only hosts (git observer)
pmb forget-auto                             drop memory the ambient layer wrote itself

# Config
pmb config list                             default tier (25 keys you care about)
pmb config list --pro                       every key, including 80 advanced knobs
pmb config set recall.ppr_enabled true      toggle a feature
pmb connect --rules-only                    refresh CLAUDE.md only

Step-by-step per agent: docs/guide/usage.md. Full reference: docs/reference/COMMANDS.md.


Hooks - memory that doesn't wait to be asked

The hard part of agent memory isn't storing - it's getting the agent to use what's stored. Soft instructions in a rules file get skipped. So PMB wires hooks at the protocol level (pmb hooks install claude-code), each removing a dependency on the model remembering to act:

  • UserPromptSubmit -> auto-recall. Every message is classified (regex, multilingual, sub-ms) and the matching memory - lessons, past decisions, recall hits, project overview - is injected before the model thinks. Trivial messages inject nothing.

  • PostToolUse -> ambient observe. Every tool the agent runs is appended to a lightweight action journal (a single SQLite INSERT, no model). Reads and ls are filtered out; edits, tests and commits are kept.

  • SessionStart -> session-restore. After a context compaction the agent rebuilds "where you left off" from what the session recorded, instead of re-asking you.

  • Stop -> follow-through + ambient auto-write. (a) It checks which surfaced lessons actually showed up in what the agent did and marks them followed, deterministically. (b) If the agent did NOT call a record_* tool, it synthesizes one activity entry from the observed actions - so real work is captured even when the agent stays silent.

Preview any without an agent: pmb auto-context "...", pmb session-restore -m 180, pmb lesson-followcheck --dry-run, pmb autowrite --dry-run.

Ambient memory - the write side

Auto-recall fixed the read side; ambient memory does the same for the write side - the memory journals the agent's work even when it forgets record_batch:

  • Coordinated. If the agent already called a record_* tool this turn, ambient stays silent; it only fills the gap.

  • Outcome-scored, not churn. A turn is journaled only if results clear a quality bar (tests passed, a failure fixed, a deploy ran), not by file count alone.

  • Honest + reversible. Every ambient entry is tagged source=autowrite, shown as auto in the dashboard, and removable with pmb forget-auto. On by default; disable with pmb config set autowrite.enabled false.

  • Works on every host. Claude Code (hooks), Codex (pmb codex-notify), MCP-only hosts like Cursor/Zed/VS Code (git observer, pmb ambient-watch .). Check yours with pmb hooks capabilities.

Synthesis is template-based by default (instant, no model). Opt into a local/API/CLI model summary with pmb config set autowrite.synthesizer llm:ollama or llm:openai (it has a timeout and falls back to the template).

Self-improvement loop

Every surfaced lesson carries a surface_id. Follow-through is recorded both ways: the agent confirms via mark_lesson_followed(surface_id, True), and the Stop hook infers it from recorded activity. The Lessons tab then shows, per rule: how often it was shown, how often it was followed, ★ USEFUL (followed >= 2x), ? UNVERIFIED (surfaced but unconfirmed), and 💀 DEAD only when a rule is repeatedly ignored (>= 2). You see which rules help and prune the ones that don't.


Settings - 25 you care about, 80 you don't

PMB has 105 tunables. The 25 that affect day-to-day quality are default-tier (pmb config list). The rest are internal weights and experimental flags, hidden behind --pro so the surface stays scannable. Every pro key still reads with pmb config get and writes with pmb config set - hidden from list, not gated.

Key

Default

What it does

recall.top_k

5

How many results recall returns

recall.bm25_weight

0.7

BM25 vs vector mix (1.0 = pure BM25)

recall.ppr_enabled

true

Multi-hop graph diffusion, gated by intent

recall.keyed_fact_boost

0.35

How hard personal-attr facts win on personal queries

recall.rerank

false

Always-on cross-encoder (regresses LoCoMo, keep off)

embedding.model

paraphrase-multilingual-MiniLM-L12-v2

The vector model

graph.extractor

regex

regex / spacy / llm:claude / llm:openai / llm:ollama / llm:codex

mcp.record_batch_async

true

Fire-and-forget writes (sub-ms return)

agent.apply_lessons

true

Agent surfaces lessons before acting

dedup.enable

true

All four dedup layers

decay.factor_per_day

0.985

Importance half-life

chat.model

haiku

Default model for pmb-chat


Numbers

Recall p50 / p95 warm

35 ms / 110 ms

prepare(message) warm

4-16 ms

record_batch_async

&lt; 1 ms

MCP cold boot

3.7 s

LoCoMo recall@10 (n=10)

94.5 %

Multilingual mega-stress top-10 (900 q)

99.2 %

# Reproduce locally
python scripts/benchmarks/benchmark_locomo.py --n-conversations 10
python scripts/benchmarks/mega_stress_test.py

Privacy

  • 100 % offline by default. No network calls from the engine, zero telemetry - there is no PMB server to call home to.

  • Workspace = a directory under ~/.pmb/<name>/. Copy it to Dropbox, push it to git, share it on a USB drive. Your call.

  • Secrets are auto-redacted at write time (OpenAI / Anthropic / AWS / Stripe / GitHub keys; configurable).

  • Apache 2.0 licensed. Forks welcome.


FAQ

Does PMB call an LLM? On read: never. On write: never by default. Optional: pmb consolidate can run a local Ollama, Claude CLI, Anthropic, or OpenAI pass to write short reflections - opt-in.

What about cost? $0. There is no PMB service.

Does the agent need to know about PMB? After pmb connect, the rules are appended to CLAUDE.md / AGENTS.md automatically. The default profile exposes 10 core MCP tools (including the prepare() read-first pattern); wider profiles exist for ingestion and admin.

Will it slow my agent down? Tools return in single-digit milliseconds for everything except recall (35-110 ms warm), which is below human perception.

Can two agents share one memory? Yes - point them at the same workspace. SQLite WAL + a 10 s busy-timeout handle concurrent writes.

Wipe a fact? pmb forget <ulid> archives it (excluded from recall, restorable). Hard-delete: pmb delete <ulid> --hard.

Windows? Yes - tested on Windows 11, macOS 14, Ubuntu 22.04. Cyrillic paths and console encoding are handled.

PDFs / code / Markdown? pmb index pdf paper.pdf, pmb index project ., pmb import markdown ~/notes/, pmb import chatgpt path.json.

Cold start is slow. First recall loads the embedding model (~3 s). Run pmb warmup once, or let the prewarm thread handle it in the background.

Roadmap? See docs/ROADMAP.md: litestream backup, optional cloud-sync (BYO bucket), tree-sitter project indexing, image OCR.


Contributing

Issues and PRs welcome. There's one full-time maintainer; please open a discussion before a large change so we can align on direction.

git clone https://github.com/oleksiijko/pmb.git && cd pmb
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest                  # full suite, ~4 minutes
pytest -k recall        # fast subset, ~12 s

Dev commands

bash scripts/test.sh                 # whole suite (CI-equivalent)
bash scripts/test.sh tests/recall    # a subset (any pytest args pass through)
bash scripts/codeql_local.sh         # run CI's CodeQL security-extended locally
bash scripts/install-dev-hooks.sh    # pre-commit hook: ruff + CodeQL before each commit

scripts/codeql_local.sh auto-installs the CodeQL bundle on first run and runs the exact suite CI uses, so security findings are caught locally instead of on a push. The pre-commit hook bypasses with git commit --no-verify (or skip just the scan with SKIP_CODEQL=1).

License: Apache 2.0.

Available Tools

10 tools
find_lessonsA

Standalone 'what procedural rules apply to X'. find_lessons(query, project?) → lessons with surface_id; project scope excludes explicit lessons from other projects while retaining generic rules. FOLLOW them, then mark_lesson_followed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNomax lessons to return (default 5)
queryNotopic to filter by (empty = recent lessons across all projects)
projectNooptional project name; explicit lessons from other projects are excluded while generic cross-project rules remain

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden but only partially satisfies it: it discloses the project-scoping behavior (excludes other projects' explicit lessons while retaining generic rules) and the workflow step of marking followed. It does not describe return limits, pagination, or the read-only nature, though 'find' implies a read operation.

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 short and front-loaded with purpose, and the follow-up instruction is direct. It earns efficiency, though the phrase 'Standalone' and the use of 'surface_id' as unexplained jargon slightly reduce clarity.

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 simple schema (3 optional params), an output schema, and clear sibling context, the description is reasonably complete. It covers the core behavior, project scoping nuance, and the expected follow-up action, leaving only minor gaps like parameter details that the schema already fills.

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 covers 100% of parameters, so the baseline is 3. The description adds minimal meaning beyond the schema by restating query and project semantics, but it does not clarify the limit parameter or provide additional context beyond what the schema already explains.

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

Purpose4/5

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

The description states the tool's purpose as 'what procedural rules apply to X' and specifies find_lessons(query, project?) returns lessons with surface_id. This clearly distinguishes it from sibling tools like recall or project_overview, though the phrasing is somewhat informal and the term 'standalone' is ambiguous.

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 the tool by framing it as a lookup for procedural rules and adds a follow-up instruction ('FOLLOW them, then mark_lesson_followed'). However, it does not explicitly state when not to use it or mention alternative tools that might be preferable in other contexts.

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

list_goalsA

List open goals. list_goals(status='in_progress'). For 'what are my goals/what's in flight'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. It indicates a read operation and gives an example with status='in_progress', but it does not clarify what 'open' means, the default behavior when status is null, or pagination/limit behavior. This is a moderate gap for a list tool.

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: a clear statement, a practical example, and a usage phrase. Every segment adds value and nothing is redundant.

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?

With an output schema present, return values need not be explained. However, the description leaves ambiguity about the default status behavior and the definition of 'open goals'. For a simple list tool, this is acceptable but not complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It only provides an example for 'status' but does not explain the 'limit' parameter or the meaning of status values (e.g., what other statuses are valid). The default behavior of status is also unclear.

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 'List open goals' with a specific verb and resource, and provides an example invocation. It does not explicitly differentiate from sibling tools, but 'open goals' implies a subset, making the purpose reasonably clear.

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 phrase 'For what are my goals/what's in flight' provides clear usage context. It does not mention when not to use it or point to alternatives, but the intended use case is well conveyed.

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

mark_lesson_followedA

Report whether a surfaced lesson changed your behaviour. mark_lesson_followed(surface_id, followed=True|False, note='...', applicable=True|False). Use applicable=False when the lesson was irrelevant, not followed=False. Call after acting on a lesson - powers the self-improvement loop.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNooptional one-line explanation (esp. useful for ignored)
followedNoTrue if you followed the lesson, False if ignored
applicableNoFalse if the lesson was unrelated to this task
surface_idYesthe `surface_id` field returned with the lesson

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description explains the tool's role in the self-improvement loop and clarifies the semantic difference between followed and applicable. It omits details on idempotency or side effects, but for a simple feedback tool the described behavior 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?

Two sentences, front-loaded with purpose, includes signature and crucial usage tip, no redundant words.

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

Completeness5/5

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

Given the simple parameter set, full schema coverage, and presence of an output schema, the description covers the when, why, and how-to-use nuances. The only missing aspect is return value description, which is handled by the output schema.

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 already covers all 4 parameters at 100%, but the description adds a concrete function signature and, more importantly, resolves the ambiguity between followed and applicable through explicit usage rules, which is beyond the schema.

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

Purpose5/5

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

The description states a clear verb-resource pairing: 'Report whether a surfaced lesson changed your behaviour.' It distinguishes from siblings like find_lessons (retrieval) by focusing on post-hoc feedback, and the signature example reinforces the tool's role.

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 instructs 'Call after acting on a lesson' and provides a key disambiguation: 'Use applicable=False when the lesson was irrelevant, not followed=False.' This gives direct when-to-use guidance relative to alternatives.

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

prepareA

READ-FIRST bundle at the start of work on a known project. prepare(message=<the user's message>) returns project_context, surfaced lessons (each with surface_id - FOLLOW them, then mark_lesson_followed), recent_activity and open_goals in one ~10ms call. Replaces several recall() calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that it returns multiple data components, that lessons have surface_id and should be followed and marked with mark_lesson_followed, and that it is fast (~10ms). However, it doesn't mention whether the call is read-only or has side effects, nor error handling for unknown projects.

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 compact, front-loaded with the READ-FIRST key phrase, and packs multiple pieces of information (returned items, lesson follow-up, performance) into two sentences without fluff.

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

Completeness4/5

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

For a tool with one parameter and an output schema, the description gives a good overview of the returned components and the lesson-follow-up workflow. It could add a note about behavior for unknown projects, but overall it's sufficiently complete 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.

Parameters4/5

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

The schema has a single 'message' parameter with no description (0% coverage). The description compensates by showing prepare(message=<the user's message>) and explaining that message is the user's message, which adds semantic meaning beyond the bare 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 this is a READ-FIRST bundle for the start of work on a known project, returning project_context, surfaced lessons, recent_activity, and open_goals. It also says it replaces several recall() calls, which distinguishes it from the recall sibling.

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

Usage Guidelines5/5

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

It explicitly says to use it at the start of work on a known project, and notes it replaces several recall() calls. This provides clear when-to-use context and directly names an alternative (recall).

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

project_overviewA

One-call full context for a NAMED project at the start of work. project_overview(name) → lessons (rules to follow), decisions, open goals, recent activity, related entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYescase-insensitive substring match against entity names. Picks the highest-mention entity that matches.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of explaining behavior. It lists the data returned, which is helpful, but it does not disclose whether the operation is read-only, how it handles ambiguous matches, or what happens if no project is found. The parameter schema covers matching behavior, but the description itself lacks these nuances.

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, compact sentence with an input→output notation. Every element is informative, and it is front-loaded with the key purpose. No redundancy or filler.

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

Completeness4/5

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

Given the tool's simplicity (one parameter) and the presence of an output schema, the description sufficiently covers the core function and usage context. It could mention edge cases like no match or error handling, but for a one-call overview tool, the current level is 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?

The input schema provides a thorough description of the 'name' parameter (case-insensitive substring match, picks highest-mention entity), giving 100% coverage. The description only restates 'NAMED project' without adding new semantics, so it meets the baseline but does not exceed 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 provides 'full context' for a named project, listing specific content areas (lessons, decisions, open goals, recent activity, related entities). This distinguishes it from siblings that focus on narrower aspects like find_lessons or list_goals.

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 phrase 'at the start of work' gives a clear use case, and 'one-call' implies an efficiency advantage. However, it does not explicitly mention when not to use it or name alternatives among sibling tools, though the contrast is implicit.

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

recallA

Search memory for anything about the user/past/project. recall(query, top_k=5). Returns results + auto-attached lessons (read & FOLLOW them) + project_context. Trust results with score>0.2 as the user's recorded reality.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
top_kNo
projectNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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

No annotations are provided, so the description must carry the burden. It discloses that results include 'auto-attached lessons' and instructs to 'read & FOLLOW them,' which is a significant behavioral directive. It also provides a trust threshold for interpreting results. However, it does not state whether the tool is read-only or what happens with the project parameter, so it is transparent but not exhaustive.

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 concise sentences, front-loaded with the core action. The call format, return list, and trust threshold are all packed into a tight paragraph without waste.

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

Completeness3/5

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

The description covers core usage, return composition, and the important 'follow lessons' directive. The output schema presumably handles return structure, so that is not a gap. However, the project parameter is never mentioned, and there are no error handling or limit notes, so completeness is moderate.

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

Parameters2/5

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

Schema description coverage is 0% and the description only provides the call format 'recall(query, top_k=5).' It does not explain the meaning of top_k (number of results) or the project parameter, which is entirely omitted. This is a clear gap given the schema has three parameters.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Search memory for anything about the user/past/project.' This clearly distinguishes it from sibling write tools like record_keyed_fact and from the more specific find_lessons. The call format reinforces the 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 this is the general memory search tool by saying 'anything about the user/past/project.' It includes operational guidance like the trust threshold but does not explicitly state when to prefer it over find_lessons or session_brief, nor any when-not conditions. Thus, usage is implied rather than explicit.

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

record_batchA

⚡ PREFERRED for any message with multiple memories - stores N atomic items in ONE call (each ~3-5s of agent thinking saved vs separate record_* calls). items: list of dicts, each with a type: fact{content,importance} | fact_tree{main,subfacts[],importance} | lesson{content,project?} | goal{title,status,due_at} | plan{title} (future intent) | activity{content,kind} | milestone{chain_name,title,state}. ONE record_batch per turn; use ABSOLUTE dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior3/5

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

No annotations mean the description carries the transparency burden. It adds useful constraints like 'use ABSOLUTE dates' and the efficiency benefit, but does not describe return behavior, error handling, or durability. It's 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.

Conciseness4/5

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

The description is dense and efficient, front-loading the usage preference with '⚡ PREFERRED' and then detailing item types. It could benefit from line breaks, but every sentence contributes 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?

The description provides complete item type specs and usage rules (e.g., one per turn, absolute dates). Since an output schema exists, return values don't need explanation. It's fully sufficient for a batch write tool.

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

Parameters5/5

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

With 0% schema coverage, the description fully compensates by specifying the items parameter: a list of dicts, each with a type (fact, fact_tree, lesson, goal, plan, activity, milestone) and their individual fields. This goes far beyond the sparse schema.

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

Purpose5/5

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

The description clearly states the tool 'stores N atomic items in ONE call', identifying it as a batch recording operation. It differentiates from sibling record_* tools by labeling it 'PREFERRED' for messages with multiple memories.

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

Usage Guidelines5/5

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

Explicitly says 'PREFERRED for any message with multiple memories' and 'ONE record_batch per turn', providing clear when-to-use guidance. It also contrasts with separate record_* calls, making the alternative usage clear.

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

record_keyed_factA

Upsert a mutable personal attribute. record_keyed_fact(subject, attribute, value) - e.g. user/city/Tampa. A new value SUPERSEDES the old under one canonical key instead of piling up.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesthe current value as a short string ('Warsaw').
subjectYeswho/what the fact is about ('user', 'user_dog', 'company_xyz', etc.). Lowercased internally; spaces ok.
attributeYesthe attribute name ('city', 'employer', 'phone', 'name'). Lowercased internally.
importanceNo0..1, default 0.85 (high because personal attrs are usually significant).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the transparency burden. It clearly discloses the supersede behavior ('A new value SUPERSEDES the old') and the canonical-key semantics, which are important for a write operation. It also communicates the mutable nature. It misses some details (e.g., auth, return value), but the core behavioral trait is covered.

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 three short sentences, each earning its place: the purpose/verb, the signature with example, and the critical supersede behavior. It is front-loaded with the action word 'Upsert' and wastes no words.

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

Completeness4/5

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

For a simple write operation, the description covers the essential: what it does, how parameters map, and the distinguishing supersede behavior. An output schema exists (per context), so return values need not be documented in the description. It does not discuss usage conditions or prerequisites, but that is not necessary for a low-risk tool with complete parameter documentation.

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

Parameters4/5

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

The input schema already has 100% parameter coverage with clear descriptions. The description adds value by restating the signature in a callable form (record_keyed_fact(subject, attribute, value)) and giving a concrete example that maps the parameters together. This makes the parameter semantics clearer than 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 opens with the specific verb 'Upsert' and a clear resource: 'a mutable personal attribute.' It goes on to give the exact function signature with example (user/city/Tampa) and explains the keyed supersede behavior, which distinguishes it from a generic 'record' or sibling tools like record_batch that might append rather than replace.

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: call this when updating a mutable personal attribute that should have one canonical value. However, it does not explicitly contrast with alternatives such as record_batch or recall. The inclusion of 'instead of piling up' hints at a distinction but does not name a specific alternative or give 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.

session_briefA

Re-orient after YOUR context compacted. session_brief() → what THIS session decided/built. Don't re-ask the user.

ParametersJSON Schema
NameRequiredDescriptionDefault
minutesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full transparency burden. It implies a read-like informational tool ('Re-orient', 'what THIS session decided/built') but does not explicitly state side effects, return format, or any prerequisites. It provides some behavioral context but not full disclosure.

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

Conciseness5/5

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

The description is three concise sentences, front-loaded with the primary use case. Each sentence adds value, including a clear directive, 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?

The tool is simple with one optional parameter and an output schema exists, which reduces the need to explain return values. However, the parameter semantics are entirely unexplained, and the description lacks guidelines on how to interpret or use the brief, leaving a notable completeness gap.

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

Parameters2/5

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

The single parameter 'minutes' has no schema description and the description text does not mention it. Schema coverage is 0%, so the description fails to compensate. The name 'minutes' suggests a time span but its exact role remains ambiguous.

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's purpose with specific language ('Re-orient after YOUR context compacted') and defines what it returns ('what THIS session decided/built'). It distinguishes from general recall but does not explicitly differentiate from sibling tools by name.

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 a clear usage context (after context compaction) and a direct directive ('Don't re-ask the user'). However, it does not mention alternative tools or list exclusions, leaving some ambiguity about 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.

update_goalA

Move a goal's status/progress. update_goal(goal_ulid, status='in_progress'|'done', progress=0-100, note='...'). Records a goal_update event so the goal's history is preserved.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
statusNo
progressNo
goal_ulidYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

The description discloses that it 'Records a goal_update event so the goal's history is preserved,' providing side-effect context. With no annotations, this is valuable, but it does not explain behavior when optional parameters are omitted (e.g., whether status is cleared or unchanged).

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: a clear purpose, an inline signature, and a side-effect note. It is front-loaded with no filler or 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?

The description covers the main action and side effect, but leaves ambiguity about omitted optional parameters and the requirement of an existing goal. It also doesn't discuss error conditions. For a simple 4-parameter tool, this is a visible gap.

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

Parameters4/5

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

The signature adds semantics not in the schema: status enum ('in_progress'|'done') and progress range (0-100). This compensates for 0% schema coverage. However, it does not define the meaning of null defaults or whether omitted params are ignored.

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 'Move a goal's status/progress' with a specific verb and resource. The inline function signature and allowed values further clarify its purpose, distinguishing it from siblings like list_goals and record_batch.

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 usage is implied: to update a goal's status or progress. However, there is no explicit comparison to alternative tools, exclusions, or prerequisites. It lacks a clear 'use when' vs. 'use instead' statement.

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

Tool Schema Changelog

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

  1. 10 tool updatesv1.2.2
    • First observedfind_lessons
    • First observedlist_goals
    • First observedmark_lesson_followed
    • First observedprepare
    • First observedproject_overview
    • First observedrecall
    • First observedrecord_batch
    • First observedrecord_keyed_fact
    • First observedsession_brief
    • First observedupdate_goal

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation3/5

Multiple tools surface project context and lessons (prepare, project_overview, recall, find_lessons, session_brief), and their triggers overlap. Descriptions help clarify but an agent could misselect, especially between prepare and project_overview.

Naming Consistency3/5

Tool names mix verb_noun patterns (record_keyed_fact, find_lessons, update_goal, list_goals) with noun-only names (prepare, session_brief, project_overview) and bare verbs (recall). Inconsistent style reduces predictability.

Tool Count5/5

10 tools is a reasonable scope for a personal memory/project management server, balancing specialized functions without excessive granularity.

Completeness3/5

The surface covers recording, recalling, goal listing/updating, and project context, but lacks explicit delete/archive operations for memories or goals, and goal creation is only available via the batch API. This leaves some dead ends for long-term maintenance.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

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
    Not graded
    quality
    Not graded
    maintenance
    Provides AI coding agents with persistent, long-term memory through local semantic search and SQLite storage. It enables agents to save and retrieve architectural decisions or project context across different conversation sessions without requiring cloud services.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Gives AI coding agents persistent memory by storing observations, decisions, and learnings in a local SQLite database with vector search, full-text search, and a rules engine.
    4
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides long-term memory for LLMs via local SQLite storage with hybrid search (BM25, vectors, recency decay), enabling AI coding agents to persist and recall memories across sessions without cloud or API keys.
    53
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Persistent memory for AI coding agents, storing learned architecture decisions, patterns, and bug fixes in a local SQLite database with full-text search, enabling agents to recall information across sessions.
    6
    65
    1
    MIT