Server data from the Official MCP Registry
Persistent memory for AI coding agents — past bugs, decisions, and your corrections, in your repo.
Persistent memory for AI coding agents — past bugs, decisions, and your corrections, in your repo.
This is a well-designed local MCP server for persistent project memory with generally sound security practices. The codebase properly scopes permissions to local filesystem operations and environment variables, implements appropriate input validation via Zod schemas, and avoids dangerous patterns like shell execution of user input. Minor code quality concerns (broad error handling, unvalidated file paths in some contexts) and optional async embeddings that depend on an external model prevent a higher score, but the architecture is fundamentally safe for its intended use case. Supply chain analysis found 2 known vulnerabilities in dependencies (0 critical, 2 high severity). Package verification found 1 issue.
3 files analyzed · 9 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Set these up before or after installing:
Environment variable: PROJECT_MEMORY_ROOT
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-kaaustubh-project-memory-mcp": {
"env": {
"PROJECT_MEMORY_ROOT": "your-project-memory-root-here"
},
"args": [
"-y",
"@kaaustubh/project-memory-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
A small, local MCP server that gives AI agents (Claude Code, Cursor, …) a shared, persistent memory of the projects in a code folder — what each project is, decisions made, and every bug/issue faced during development.
It is stateless: every tool reads/writes plain files on disk, so multiple clients (and multiple machines) share one source of truth.
| Layer | Lives in | Auto-loaded into context? | For |
|---|---|---|---|
| Project memory | <project>/AGENTS.md | ✅ yes (via CLAUDE.md → @AGENTS.md) | identity, stack, run cmds, concise decisions/learnings — keep lean |
| Issue log | <project>/issues.jsonl | ❌ no | high-volume bug/issue history — fetched on demand |
Design rule: durable, low-volume facts go in AGENTS.md (auto-loaded). High-volume
history (bugs) goes in issues.jsonl (queried via search_issues). This keeps the
always-loaded context small while keeping everything searchable.
Some orgs disable third-party MCP servers via policy (e.g. GitHub Copilot's MCP allowlist enforcement). Because the memory is plain files, not a service, the core value survives that:
AGENTS.md is auto-loaded by the editor reading it —
no MCP call involved — so a project's identity, decisions, learnings, and preferences still
land in the agent's context.io.github.kaaustubh/project-memory-mcp).Only the interactive tools (log_issue, search_issues, …) go over the MCP channel; the
file-based memory keeps working without it.
list_projects, get_project, search_memory — read project memoryappend_decision, append_learning — append a dated bullet to AGENTS.mdremember_preference — turn a correction / stated habit into a remembered pattern (## Preferences in the root AGENTS.md for a global habit, or a project's for a local one); rides the auto-load, so it comes back next sessionlog_issue — record a bug/problem → issues.jsonlsearch_issues — "have we hit this before?" across all projects (field-scoped; optional tags filter)list_open_issues, resolve_issue — track / close bugssync_registry — reconcile the root AGENTS.md projects table with what's on disk (adds rows for new projects, flags stale ones)find_by_file — given a file path, surface the issues + decisions/learnings that touch it ("why is this code like this?")You don't call these directly — you talk to your agent in natural language and it picks the tool. See Using it day to day below for what to actually say.
Most of it runs itself: opening a project auto-loads its AGENTS.md (the agent already
knows the project), and capture is proactive (plus the optional Stop hook). Your job is
mainly to pull memory at the right moments. Just talk to your agent:
| When | Say something like | What fires |
|---|---|---|
| Before debugging anything | "Have we hit this before? <paste error>" | search_issues across all projects |
| Starting something you've done elsewhere | "How did I do Stripe webhook verification in any project?" | search_memory (cross-project) |
| Landing on confusing code | "Why is index.js like this? Check the memory." | find_by_file |
| You made a real decision / fixed a real bug | (nothing — it logs on its own and tells you) | append_decision / log_issue |
| You correct how the agent works | "No, always run the typecheck before committing — remember that." | remember_preference (global or per-project) |
| Triage | "What's still open across my projects?" | list_open_issues |
| A bug is fixed | "Resolve pulse_stripe-004 — fixed by …" | resolve_issue |
| Added a new project | "Sync the registry." | sync_registry |
The one habit that matters: make "have we hit this before?" reflexive before every debugging session. That's where a memory tool earns its keep; the rest the system handles.
Capture is confirming, not silent — when the agent logs something it tells you in one line. Correct it freely: "don't log that", or "actually, log this too."
Escape hatches: PROJECT_MEMORY_HOOK=off silences the Stop hook for one session;
uninstall-hook removes it entirely.
From your code/projects folder, run:
cd ~/code # the folder that holds your projects
npx -y @kaaustubh/project-memory-mcp install
That registers the server with Claude Code (user scope) and Cursor, using the current
directory as your projects root. Restart those apps, then ask your agent
"set up project memory for this folder" to scaffold AGENTS.md for each project.
No clone, no global install — the MCP config just runs
npx, which fetches and runs the latest version on demand.
git clone https://github.com/kaaustubh/project-memory-mcp.git ~/code/.memory-server
cd ~/code/.memory-server && ./install.sh
A common question: "once I install it, does it just start doing things?" Not quite — the server is passive. Here's the actual flow:
AGENTS.md (via CLAUDE.md → @AGENTS.md) into the model's context for you. This is
why the agent "just knows" what your project is — it's a built-in editor feature.Day one is empty. A fresh setup has no
AGENTS.mdfiles yet, so the auto-load has nothing to load andlog_issuewill refuse until a project's memory exists. Bootstrap once by asking your agent: "set up project memory for this folder" — it creates theAGENTS.mdfiles. After that, everything works.
In short: a convention (auto-loaded files) + a tool the agent chooses to use + a one-time setup. No magic, no daemon.
The server ships a standing capture policy (sent to the client on connect, plus directive tool descriptions), so the agent records things on its own instead of waiting for you to ask:
search_issues for a prior fix.log_issue.append_decision / append_learning.remember_preference, so the one-time correction becomes a pattern it brings back next session.It's proactive but not silent: the agent tells you in one line what it recorded, asks when unsure rather than logging noise, and skips trivia and secrets. You can always override — "log this", or "don't bother". The standing policy is best-effort (it depends on the model following it); for a hard guarantee, add the opt-in Stop hook below.
The standing policy can be forgotten mid-session. The Stop hook makes capture non-optional: when the agent tries to end a turn, it runs once and blocks the stop to ask for one capture pass when either (a) real work happened (file edits or a commit) and nothing was written to project memory, or (b) you corrected how it works and no preference was saved. If memory was already written, or nothing changed and you didn't correct it, the hook stays silent and lets the turn end.
npx -y @kaaustubh/project-memory-mcp install-hook # turn it on (then restart Claude Code)
npx -y @kaaustubh/project-memory-mcp uninstall-hook # turn it off
install does not add it; you enable it explicitly.stop_hook_active), then lets
the agent stop.PROJECT_MEMORY_HOOK=off to disable without uninstalling.Capture is only half the loop — the other half is remembering to look. The recall hook closes it: every time you submit a prompt, it matches your request against your issue history and decisions/learnings/preferences, and silently injects the strongest hits as context. So a prior fix or decision surfaces without you (or the agent) remembering to search — the "have we hit this before?" habit becomes automatic.
npx -y @kaaustubh/project-memory-mcp install-recall # turn it on (then restart Claude Code)
npx -y @kaaustubh/project-memory-mcp uninstall-recall # turn it off
@xenova/transformers) is installed, recall matches by meaning, so "the build is
broken" still surfaces an issue logged as "compile failure" even with no shared words.
Runs fully offline (the model is fetched once, then cached). Without it, recall falls back
to keyword matching automatically — no configuration, nothing breaks.install adds
neither hook.PROJECT_MEMORY_RECALL=off to disable without uninstalling.Warm the cache: after a big logging session (or once, after enabling recall) run
npx -y @kaaustubh/project-memory-mcp reindexto pre-embed everything, so the first recall isn't the one that pays for it. Vectors are cached per project in a derived.embeddings.json(safe to delete / git-ignore — the.jsonl+AGENTS.mdstay the source of truth).
Pair it with the Stop hook and the loop runs itself: the Stop hook guarantees things get saved, the recall hook guarantees they come back at the right moment.
The tool and your memory content sync separately:
npx always pulls the published version (or git pull
if you installed from source).AGENTS.md + issues.jsonl live inside that project's
own git repo, so cloning your projects brings their memory along. Nothing to copy.
issues.jsonlholds real bug details — only commit it into private repos.
For a new project under the root, create <project>/CLAUDE.md containing @AGENTS.md
and a <project>/AGENTS.md with ## What this is, ## Stack & layout,
## Run / build / test, ## Decisions, ## Learnings sections.
AGENTS.md auto-load) keeps working even where an org disables third-party MCP servers
(e.g. GitHub Copilot's MCP allowlist), since only the interactive tools use the MCP channel.Xenova/all-MiniLM-L6-v2 via the optional @xenova/transformers dependency); vectors are
cached per project in a derived .embeddings.json, keyed by content hash so edited/removed
items self-invalidate. If the model isn't installed it falls back to the previous keyword
matching automatically — nothing to configure, nothing breaks. New reindex subcommand
pre-embeds all memory so the first recall isn't slow. This completes the long-deferred
"semantic retrieval" lever behind both recall and search_issues; keyword remains the
zero-dependency floor.UserPromptSubmit hook). New install-recall / uninstall-recall
subcommands register a hook that keyword-matches every prompt against your issue history and
decisions/learnings/preferences and silently injects the strongest hits as context — so prior
fixes and decisions surface without anyone remembering to search. Closes the other half of the
capture↔recall loop. Silent on trivial/no-match prompts (generic filler words ignored),
current-project hits ranked highest, at most 4 lines injected. Off by default; per-session kill
switch PROJECT_MEMORY_RECALL=off.mcpName field (io.github.kaaustubh/project-memory-mcp) required to list
the server in the official MCP Registry. No functional change.remember_preference — corrections become remembered patterns. New tool that writes a
dated bullet under ## Preferences, either in the root AGENTS.md (scope global —
applies to every project) or a single project's. Because preferences live in the
auto-loaded AGENTS.md, recall is free: a one-time correction ("never add a co-author
trailer", "always typecheck before committing") comes back next session and is applied
instead of re-corrected. Closes the cross-session loop for how you like to work, not just
project facts.remember_preference after a correction, and the opt-in Stop hook scans the session for
behavioural-correction phrases ("from now on…", "no, don't…", "always use…"): if you
corrected the agent and no preference was saved, it blocks the stop once to ask — a second,
independent reason alongside the existing "code changed but nothing logged" check.mcp__project-memory__* tool calls, so editing AGENTS.md / issues.jsonl directly
(an endorsed capture path) still triggered the nag. It now also treats an Edit/Write
to a file ending in AGENTS.md or issues.jsonl as captured — eliminating the false
positive.append_decision/append_learning: no more duplicate sections. Heading matching was
whole-line (^## Learnings$), so a heading with trailing text (## Learnings (gotchas …))
wasn't found and a duplicate section got appended. Now matches the heading's leading word.install-hook / uninstall-hook
subcommands register a Claude Code Stop hook that forces a single capture pass when a
session changed code but recorded nothing to memory — turning the best-effort policy into
a hard guarantee. Off by default, fires at most once per turn (no loops), silent when
nothing changed or memory was already written, and disablable per-session via
PROJECT_MEMORY_HOOK=off.search_issues now matches only the text fields
(symptom/cause/fix/id/tags) instead of the raw JSON, so queries no longer get false hits
on field names. Added an optional tags filter; query is now optional (search by tags
alone).sync_registry. Reconciles the root AGENTS.md projects table with the projects on
disk — adds stub rows for projects missing from the table, flags rows whose directory is
gone, and reports live open-issue counts. Automates the previously manual "new project →
add a row" step. Hand-curated columns are preserved; apply=false reports drift only.find_by_file. Given a file path/fragment, returns the issues (via their files
field) and the decisions/learnings (via AGENTS.md bullets that mention it) touching that
file — code↔memory linking for "why is this code the way it is?".initialize and the write/search tool
descriptions are directive. It stays confirming (tells you what it logged), asks when
unsure, and skips trivia/secrets. Explicit calls still work as an override.npx … install failing with "command not found" — the bin is renamed to
project-memory-mcp to match the unscoped package name (npx resolution rule).AGENTS.md + issues.jsonl, 9 tools
(project memory + issue tracking), npx … install for Claude Code and Cursor, and the
push/pull memory model.Be the first to review this server!
by Modelcontextprotocol · Developer Tools
Web content fetching and conversion for efficient LLM usage
by Modelcontextprotocol · Developer Tools
Read, search, and manipulate Git repositories programmatically
by Toleno · Developer Tools
Toleno Network MCP Server — Manage your Toleno mining account with Claude AI using natural language.