{
  "markdown": "# project-memory MCP server\n\nA small, local [MCP](https://modelcontextprotocol.io) server that gives AI agents\n(Claude Code, Cursor, VS Code / GitHub Copilot, …) a shared, persistent memory of the projects in a code folder —\nwhat each project is, decisions made, and **every bug/issue faced during development.**\n\nIt is **stateless**: every tool reads/writes plain files on disk, so multiple clients\n(and multiple machines) share one source of truth.\n\n[![kaaustubh/project-memory-mcp MCP server](https://glama.ai/mcp/servers/kaaustubh/project-memory-mcp/badges/score.svg)](https://glama.ai/mcp/servers/kaaustubh/project-memory-mcp)\n\n## The model\n\n| Layer | Lives in | Auto-loaded into context? | For |\n|---|---|---|---|\n| Project memory | `<project>/AGENTS.md` | ✅ yes (via `CLAUDE.md` → `@AGENTS.md`) | identity, stack, run cmds, concise decisions/learnings — **keep lean** |\n| Issue log | `<project>/issues.jsonl` | ❌ no | high-volume bug/issue history — fetched on demand |\n\n**Design rule:** durable, low-volume facts go in `AGENTS.md` (auto-loaded). High-volume\nhistory (bugs) goes in `issues.jsonl` (queried via `search_issues`). This keeps the\nalways-loaded context small while keeping everything searchable.\n\n### Works even where MCP is locked down\n\nSome orgs disable third-party MCP servers via policy (e.g. GitHub Copilot's\n[MCP allowlist enforcement](https://docs.github.com/en/copilot/reference/mcp-allowlist-enforcement)).\nBecause the memory is **plain files, not a service**, the core value survives that:\n\n- **The memory itself is just files.** `AGENTS.md` is auto-loaded by the editor reading it —\n  no MCP call involved — so a project's identity, decisions, learnings, and preferences still\n  land in the agent's context.\n- **The policy is Copilot-scoped and per-client.** It doesn't affect the same server in\n  Claude Code or Cursor, and orgs running *allowlist / registry-only* mode can permit it —\n  this server is published to the official MCP Registry (`io.github.kaaustubh/project-memory-mcp`).\n\nOnly the interactive **tools** (`log_issue`, `search_issues`, …) go over the MCP channel; the\nfile-based memory keeps working without it.\n\n## Tools\n\n- `list_projects`, `get_project`, `search_memory` — read project memory\n- `append_decision`, `append_learning` — append a dated bullet to `AGENTS.md`\n- `remember_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 session\n- `log_issue` — record a bug/problem → `issues.jsonl`\n- `search_issues` — \"have we hit this before?\" across all projects (field-scoped; optional `tags` filter)\n- `list_open_issues`, `resolve_issue` — track / close bugs\n- `sync_registry` — reconcile the root `AGENTS.md` projects table with what's on disk (adds rows for new projects, flags stale ones)\n- `find_by_file` — given a file path, surface the issues + decisions/learnings that touch it (\"why is this code like this?\")\n- `start_initiative`, `get_initiative`, `list_initiatives`, `update_initiative` — track a named, multi-session effort (a codename, a plan, an evolving todo list) so it's resumable from any future session by name, not just within the one that started it; see **Initiatives** below\n- `check_in`, `check_out` — stamp the start/end of the working day and record a standup summary composed from evidence harvested off disk (git commits across every repo, uncommitted WIP, memory writes, initiative progress); the next morning's `check_in` hands the summary back — that's your standup. Print it any time, no agent needed: `npx -y @kaaustubh/project-memory-mcp standup`\n\n> You don't call these directly — you talk to your agent in natural language and it picks\n> the tool. See **Using it day to day** below for what to actually say.\n\n## Using it day to day\n\nMost of it runs itself: opening a project auto-loads its `AGENTS.md` (the agent already\nknows the project), and capture is proactive (plus the optional Stop hook). Your job is\nmainly to **pull** memory at the right moments. Just talk to your agent:\n\n| When | Say something like | What fires |\n|---|---|---|\n| **Before debugging anything** | *\"Have we hit this before? `<paste error>`\"* | `search_issues` across all projects |\n| **Starting something you've done elsewhere** | *\"How did I do Stripe webhook verification in any project?\"* | `search_memory` (cross-project) |\n| **Landing on confusing code** | *\"Why is `index.js` like this? Check the memory.\"* | `find_by_file` |\n| **You made a real decision / fixed a real bug** | *(nothing — it logs on its own and tells you)* | `append_decision` / `log_issue` |\n| **You correct how the agent works** | *\"No, always run the typecheck before committing — remember that.\"* | `remember_preference` (global or per-project) |\n| **Triage** | *\"What's still open across my projects?\"* | `list_open_issues` |\n| **A bug is fixed** | *\"Resolve pulse_stripe-004 — fixed by …\"* | `resolve_issue` |\n| **Added a new project** | *\"Sync the registry.\"* | `sync_registry` |\n\n**The one habit that matters:** make *\"have we hit this before?\"* reflexive before every\ndebugging session. That's where a memory tool earns its keep; the rest the system handles.\n\n**Capture is confirming, not silent** — when the agent logs something it tells you in one\nline. Correct it freely: *\"don't log that\"*, or *\"actually, log this too.\"*\n\n**Escape hatches:** `PROJECT_MEMORY_HOOK=off` silences the Stop hook for one session;\n`uninstall-hook` removes it entirely.\n\n## Install (npm — recommended)\n\nFrom your code/projects folder, run:\n\n```bash\ncd ~/code            # the folder that holds your projects\nnpx -y @kaaustubh/project-memory-mcp install\n```\n\nThat registers the server, using the current directory as your projects root, with every\nclient that has an MCP config location on this machine:\n\n| Client | Config written |\n|---|---|\n| Claude Code | user scope, via `claude mcp add` |\n| Cursor | `~/.cursor/mcp.json` |\n| VS Code / GitHub Copilot Chat | user-profile `mcp.json` (applies to every workspace) |\n| GitHub Copilot CLI | `~/.copilot/mcp-config.json` (or `$COPILOT_HOME`) |\n| JetBrains Copilot plugin (IntelliJ, PyCharm, WebStorm, …) | `~/.config/github-copilot/intellij/mcp.json` |\n| Visual Studio (Windows) | `%USERPROFILE%\\.mcp.json` — global, all solutions |\n| Kimi Code CLI | `~/.kimi-code/mcp.json` (or `$KIMI_CODE_HOME`) |\n| Gemini CLI | `~/.gemini/settings.json` |\n| OpenAI Codex CLI | `~/.codex/config.toml` (the only non-JSON client — merged as TOML) |\n| Windsurf | `~/.codeium/windsurf/mcp_config.json` |\n\nEach write merges into the existing file (other MCP servers you've already configured are\nleft alone) and is independently best-effort — a client that isn't installed on this\nmachine is silently skipped, the rest still get registered. Restart whichever app(s) you\nuse, then ask your agent *\"set up project memory for this folder\"* to scaffold `AGENTS.md`\nfor each project.\n\n> **Copilot surfaces (VS Code, CLI, JetBrains, Visual Studio):** tools only run in\n> **Agent mode**, and config changes need a restart to take effect.\n\n> No clone, no global install — the MCP config just runs `npx`, which fetches and runs\n> the latest version on demand.\n\n> **Team memory (beta signup):** want this memory shared across your team instead of\n> just your machine? Register your interest: https://github.com/kaaustubh/project-memory-mcp/issues/1\n\n### From source instead\n\n```bash\ngit clone https://github.com/kaaustubh/project-memory-mcp.git ~/code/.memory-server\ncd ~/code/.memory-server && ./install.sh\n```\n\n## How it works (after install)\n\nA common question: *\"once I install it, does it just start doing things?\"* Not quite —\nthe server is **passive**. Here's the actual flow:\n\n1. **Restart your editor.** MCP servers are loaded at startup, so the server only\n   becomes available the next time you launch Claude Code / Cursor / VS Code.\n2. **Push layer (automatic, not the server):** when you open a project, the editor reads\n   `AGENTS.md` (via `CLAUDE.md` → `@AGENTS.md`) into the model's context for you. This is\n   why the agent \"just knows\" what your project is — it's a built-in editor feature.\n3. **Pull layer (the server, on request):** the server announces its tools and then\n   waits. It does nothing on its own. The agent calls a tool only when it's relevant —\n   e.g. you say *\"log this bug\"* or *\"have we hit this before?\"*, or the model decides a\n   tool is useful. There's no background process or scanning.\n\n> **Day one is empty.** A fresh setup has no `AGENTS.md` files yet, so the auto-load has\n> nothing to load and `log_issue` will refuse until a project's memory exists. Bootstrap\n> once by asking your agent: *\"set up project memory for this folder\"* — it creates the\n> `AGENTS.md` files. After that, everything works.\n\nIn short: **a convention (auto-loaded files) + a tool the agent chooses to use + a\none-time setup.** No magic, no daemon.\n\n## Proactive capture (you don't have to say \"log this\")\n\nThe server ships a standing **capture policy** (sent to the client on connect, plus\ndirective tool descriptions), so the agent records things on its own instead of waiting\nfor you to ask:\n\n- Before debugging a reported error → it checks `search_issues` for a prior fix.\n- After fixing a non-trivial bug → it calls `log_issue`.\n- After a real decision or a durable gotcha → `append_decision` / `append_learning`.\n- After you correct how it works or state a habit → `remember_preference`, so the one-time correction becomes a pattern it brings back next session.\n\nIt's **proactive but not silent**: the agent tells you in one line what it recorded, asks\nwhen unsure rather than logging noise, and skips trivia and secrets. You can always\noverride — \"log this\", or \"don't bother\". The standing policy is best-effort (it depends\non the model following it); for a hard guarantee, add the opt-in Stop hook below.\n\n## Guaranteed capture (opt-in Stop hook)\n\nThe standing policy can be forgotten mid-session. The **Stop hook** makes capture\nnon-optional: when the agent tries to end a turn, it runs once and blocks the stop to ask\nfor one capture pass when either (a) real work happened (file edits or a commit) and\n**nothing** was written to project memory, or (b) you **corrected how it works** and no\npreference was saved. If memory was already written, or nothing changed and you didn't\ncorrect it, the hook stays silent and lets the turn end.\n\n```bash\nnpx -y @kaaustubh/project-memory-mcp install-hook    # turn it on (then restart Claude Code)\nnpx -y @kaaustubh/project-memory-mcp uninstall-hook  # turn it off\n```\n\n- **Off by default** — plain `install` does not add it; you enable it explicitly.\n- **No loops** — it fires at most once per turn (guarded by `stop_hook_active`), then lets\n  the agent stop.\n- **Per-session kill switch** — set `PROJECT_MEMORY_HOOK=off` to disable without uninstalling.\n- **Cost** — it adds one extra model turn only on sessions that changed code but logged\n  nothing, or where you corrected the agent and no preference was saved; silent otherwise.\n\n## Automatic recall (opt-in UserPromptSubmit hook)\n\nCapture is only half the loop — the other half is *remembering to look*. The **recall hook**\ncloses it: every time you submit a prompt, it matches your request against your issue\nhistory and decisions/learnings/preferences, and silently injects the strongest hits as\ncontext. So a prior fix or decision surfaces **without you (or the agent) remembering to\nsearch** — the \"have we hit this before?\" habit becomes automatic.\n\n```bash\nnpx -y @kaaustubh/project-memory-mcp install-recall    # turn it on (then restart Claude Code)\nnpx -y @kaaustubh/project-memory-mcp uninstall-recall   # turn it off\n```\n\n- **Semantic matching (when available)** — if the optional embeddings model\n  (`@xenova/transformers`) is installed, recall matches by **meaning**, so *\"the build is\n  broken\"* still surfaces an issue logged as *\"compile failure\"* even with no shared words.\n  Runs fully offline (the model is fetched once, then cached). Without it, recall falls back\n  to keyword matching automatically — no configuration, nothing breaks.\n- **Silent unless relevant** — injects nothing for trivial prompts or when there's no match.\n- **Ranked & capped** — current-project hits rank highest; at most 4 lines are injected.\n- **Off by default** — like the Stop hook, it's opt-in (per-prompt cost). Plain `install` adds\n  neither hook.\n- **Per-session kill switch** — set `PROJECT_MEMORY_RECALL=off` to disable without uninstalling.\n\n> **Warm the cache:** after a big logging session (or once, after enabling recall) run\n> `npx -y @kaaustubh/project-memory-mcp reindex` to pre-embed everything, so the first recall\n> isn't the one that pays for it. Vectors are cached per project in a derived\n> `.embeddings.json` (safe to delete / git-ignore — the `.jsonl` + `AGENTS.md` stay the\n> source of truth).\n\n> Pair it with the Stop hook and the loop runs itself: the Stop hook guarantees things get\n> *saved*, the recall hook guarantees they come *back* at the right moment.\n\n## Initiatives (named, cross-session work tracking)\n\nDecisions/Learnings capture *finished* facts, and `issues.jsonl` captures bug history —\nneither has a home for a **named, in-flight, multi-session effort**: \"give this a codename,\ntrack the plan and todos, and let me resume it by name even in a session that's never seen\nit before.\" That's what `start_initiative` / `get_initiative` / `list_initiatives` /\n`update_initiative` are for.\n\n```\nyou: \"Let's call this HashGate. Track the plan and todos under that name.\"\n  → start_initiative(project, codename: \"HashGate\", plan: \"...\", todos: [...])\n\n(new session, days later)\nyou: \"Where did we leave off on HashGate?\"\n  → get_initiative(project, codename: \"hash gate\")   # case/spacing-insensitive match\nyou: \"Continue where I left off\" (no codename given)\n  → list_initiatives(project)                        # or omit project to search everywhere\n```\n\nEach initiative lives in its own file, `<project>/initiatives/<slug>.md` — a plan, a\ncheckbox todo list, and a dated progress log, all editable in place. A one-line pointer to\nevery **active** initiative is kept in sync under `## Active Initiatives` in the project's\n`AGENTS.md`, so a brand-new session sees what's in flight in its auto-loaded context,\nwith zero tool calls. Marking one `done` removes the pointer; the file itself stays as\nhistory, still reachable by name.\n\n## Across machines\n\nThe **tool** and your **memory content** sync separately:\n\n1. **Tool:** nothing to sync — `npx` always pulls the published version (or `git pull`\n   if you installed from source).\n2. **Content:** each project's `AGENTS.md` + `issues.jsonl` live inside that project's\n   own git repo, so cloning your projects brings their memory along. Nothing to copy.\n\n> `issues.jsonl` holds real bug details — only commit it into **private** repos.\n\n## New-project scaffold\n\nFor a new project under the root, create `<project>/CLAUDE.md` containing `@AGENTS.md`\nand a `<project>/AGENTS.md` with `## What this is`, `## Stack & layout`,\n`## Run / build / test`, `## Decisions`, `## Learnings` sections.\n\n## Changelog\n\n### v1.11.1\n- **Fix:** regenerated `package-lock.json` — it still declared `1.8.3` while `package.json`\n  had moved through 1.9.0/1.10.0/1.11.0, because the release convention bumped the version\n  in `package.json` + the `McpServer({version})` string but never refreshed the lock. Not\n  fatal to `npm ci` (verified on npm 10/11/12), but it's the same drift class that hard-broke\n  CI in v1.8.3.\n- **Fix:** `scripts/` is now in the `files` whitelist, so `npm test` works from an installed\n  package. Previously the smoke test wasn't in the published tarball, so a container build\n  spec doing `npm install && npm test` died with `MODULE_NOT_FOUND` — it only worked from a\n  repo clone.\n- **Fix:** added a `start` script (`node index.js`), so a build/deploy spec whose CMD is\n  `npm start` no longer fails on a missing script.\n- **Docs:** if you're building this in a container (Glama's Deploy build test, or your own\n  image), use **`npm ci --omit=optional`**. A full `npm ci` pulls **276 MB** of\n  `node_modules` for a 36 KB server — almost all of it the *optional* embeddings chain\n  (`onnxruntime-node`, `onnxruntime-web`, `@xenova/transformers`, `sharp`), which also\n  downloads prebuilt binaries during install and dies on a disk/time-capped or\n  network-restricted builder. `--omit=optional` gives **25 MB** and all 18 tools still\n  register; semantic recall simply falls back to keyword recall, as designed in v1.6.0.\n  Recommended spec: Node 20 · `npm ci --omit=optional` · CMD `node index.js`.\n\n### v1.11.0\n- **Feature: daily worklog — `check_in` / `check_out` tools + a `standup` subcommand.** Say\n  \"check in\" at the start of your day and \"checkout\" at the end. Checkout harvests the day's\n  EVIDENCE from disk — git commits across every repo under the root (with or without an\n  `AGENTS.md`; `.memory-server` itself included), uncommitted WIP per repo, memory writes\n  (issues/decisions/learnings/preferences) dated that day, and initiative files touched in\n  the window — then the agent composes a 3–6 bullet standup summary strictly from that\n  evidence and stores it (a two-pass tool protocol that works in any MCP client, since the\n  day usually spans sessions the closing agent never saw). The next morning's `check_in`\n  returns the LAST WORKING day's summary (Friday's, on a Monday) plus loose threads (active\n  initiatives with open todos, open issues), and `npx -y @kaaustubh/project-memory-mcp\n  standup [YYYY-MM-DD]` prints it straight to the terminal with no agent at all. Days live\n  in `ROOT/.worklog/YYYY-MM-DD.json` — local-time stamps with offset, multiple\n  check-in/checkout segments per day (lunch breaks), and a forgotten checkout is auto-closed\n  and reconstructed from timestamps at the next check-in. Entries are pruned after\n  `WORKLOG_KEEP_DAYS` (default 10): deliberately ephemeral, unlike the append-only memory files.\n\n### v1.10.0\n- **Feature:** `install` now also registers **Kimi Code CLI** (`~/.kimi-code/mcp.json`, or\n  `$KIMI_CODE_HOME` — not to be confused with the separate \"Kimi CLI\" product, which uses\n  `~/.kimi/mcp.json`), **Gemini CLI** (`~/.gemini/settings.json`), and **Windsurf**\n  (`~/.codeium/windsurf/mcp_config.json`) — all three match the existing `mcpServers`/no-\n  `type` schema `registerMcp` already handles for Cursor, so each was a one-line addition.\n  **OpenAI Codex CLI** (`~/.codex/config.toml`) needed real work: it's the first non-JSON\n  client, configured via TOML `[mcp_servers.<name>]` tables. Added `registerMcpToml`, a\n  text-based find-the-table/replace-or-append merge (same spirit as `appendBulletToFile`'s\n  heading match) rather than a TOML parser dependency — keeps the zero-hard-dependency\n  posture. Caught and fixed a real bug in it before shipping: the first version matched a\n  table's body as \"everything up to the next literal `[`,\" which truncates mid-table\n  because `args = [...]` arrays use `[` too — fixed to match \"up to the next line that\n  *starts* with `[`\" instead, verified idempotent across repeated `install` runs against a\n  pre-seeded config.toml with an unrelated table.\n\n### v1.9.0\n- **Feature: Initiatives.** Four new tools — `start_initiative`, `get_initiative`,\n  `list_initiatives`, `update_initiative` — track a named, multi-session effort (a\n  codename, a plan, an evolving todo list) so it's resumable by name from ANY future\n  session, not just the one that started it. Motivated by a real failure mode reported\n  using another agent's session-local \"codename\" convention: no persistent registry\n  mapping name → session, todos scoped to one session's private store, and discovery\n  requiring an exact-string match across raw transcripts. Fixed here by storing one\n  markdown file per initiative (`<project>/initiatives/<slug>.md` — mutable, so todo\n  checkboxes toggle in place) plus a synced pointer under a new `## Active Initiatives`\n  heading in the project's auto-loaded `AGENTS.md`, so a brand-new session sees what's in\n  flight with zero tool calls. Codename matching is case/spacing-insensitive (`slugify`\n  splits camelCase boundaries first, so `\"HashGate\"` and `\"hash gate\"` resolve to the same\n  initiative). `list_initiatives` searches across all projects when none is given, so\n  \"what was I working on?\" doesn't require remembering which repo it was in either.\n\n### v1.8.3\n- **Infra:** Added a real CI workflow (`.github/workflows/ci.yml`, Node 18/20/22 matrix)\n  backed by a new stdio smoke test (`scripts/smoke-test.mjs` — spawns the server, does the\n  `initialize` → `tools/list` handshake, asserts all 12 tools register), plus a CodeQL\n  workflow. Both were previously entirely absent, which is why Glama's quality page showed\n  \"CI status not available\" and \"No code scanning findings\" — those weren't clean bills of\n  health, they meant \"never measured.\"\n- **Fix:** Regenerated `package-lock.json` — it predated `@xenova/transformers` ever being\n  resolved with optional deps included, so `npm ci` failed on a clean CI runner. Also ran\n  `npm audit fix` (non-breaking), which cleared the `@modelcontextprotocol/sdk`-transitive\n  `hono`/`body-parser`/`fast-uri` advisories. **Known issue:** `@xenova/transformers`\n  (optional, powers semantic recall) still pulls in a critical + 4 high severity CVEs via\n  its `onnxruntime-web`/`protobufjs`/`sharp` chain; the only fix is a breaking downgrade to\n  `1.4.2`, deliberately not done yet — tracked as a follow-up.\n\n### v1.8.2\n- **Docs/meta:** Added `glama.json` (declares `maintainers`) to fix Glama's \"No glama.json\"\n  profile-completion check. Paired with cutting an actual **GitHub Release** for this\n  version (previously we only pushed git tags, which Glama's \"Has a release\" check doesn't\n  see — it reads the Releases API, not tags).\n\n### v1.8.1\n- **Docs:** Added the Glama quality-score badge to the README, per\n  [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)'s listing\n  requirement. Uses `/badges/score.svg` (a real SVG), not the plain `/badge` path — the\n  latter 200s but serves a 0-byte `image/png`, i.e. broken.\n\n### v1.8.0\n- **Feature:** `install` now also registers **GitHub Copilot CLI** (`~/.copilot/mcp-config.json`,\n  or `$COPILOT_HOME`), the **JetBrains Copilot plugin** (IntelliJ/PyCharm/WebStorm/…), and\n  **Visual Studio** on Windows (global `.mcp.json`) — rounding out every Copilot surface\n  alongside the VS Code registration added in 1.7.0. Each target merges into its existing\n  config (other servers are preserved) and is independently best-effort, so a client that\n  isn't installed is silently skipped rather than failing the whole install. Schemas differ\n  per client (`mcpServers` vs `servers` top-level key; `type: \"local\"` for the Copilot CLI\n  vs `type: \"stdio\"` for the IDE-embedded ones) — verified against each client's current\n  docs before implementing. The merge logic for all five targets was consolidated into one\n  `registerMcp()` helper.\n\n### v1.7.0\n- **Feature:** `install` now also registers the server with **VS Code / GitHub Copilot**\n  (user-profile `mcp.json`, so it applies to every workspace), alongside the existing\n  Claude Code and Cursor registration. Schema differs from Claude/Cursor (`servers` key,\n  `type: \"stdio\"` per entry) and Copilot tools only run in Chat's Agent mode.\n\n### v1.6.2\n- **Docs:** added a team-memory beta signup note (README install section + the `install`\n  subcommand's console output) — https://github.com/kaaustubh/project-memory-mcp/issues/1\n\n### v1.6.1\n- **Docs:** added \"Works even where MCP is locked down\" — clarifies that the file-based memory\n  (`AGENTS.md` auto-load) keeps working even where an org disables third-party MCP servers\n  (e.g. GitHub Copilot's MCP allowlist), since only the interactive tools use the MCP channel.\n\n### v1.6.0\n- **Semantic recall (optional local embeddings).** The recall hook now matches your prompt\n  against memory by *meaning*, not shared substrings — *\"the build is broken\"* surfaces an\n  issue logged as *\"compile failure\"*. Powered by a local, offline embedding model\n  (`Xenova/all-MiniLM-L6-v2` via the optional `@xenova/transformers` dependency); vectors are\n  cached per project in a derived `.embeddings.json`, keyed by content hash so edited/removed\n  items self-invalidate. If the model isn't installed it **falls back to the previous keyword\n  matching automatically** — nothing to configure, nothing breaks. New `reindex` subcommand\n  pre-embeds all memory so the first recall isn't slow. This completes the long-deferred\n  \"semantic retrieval\" lever behind both recall and `search_issues`; keyword remains the\n  zero-dependency floor.\n\n### v1.5.0\n- **Automatic recall (opt-in `UserPromptSubmit` hook).** New `install-recall` / `uninstall-recall`\n  subcommands register a hook that keyword-matches every prompt against your issue history and\n  decisions/learnings/preferences and silently injects the strongest hits as context — so prior\n  fixes and decisions surface without anyone remembering to search. Closes the other half of the\n  capture↔recall loop. Silent on trivial/no-match prompts (generic filler words ignored),\n  current-project hits ranked highest, at most 4 lines injected. Off by default; per-session kill\n  switch `PROJECT_MEMORY_RECALL=off`.\n\n### v1.4.1\n- Packaging: add the `mcpName` field (`io.github.kaaustubh/project-memory-mcp`) required to list\n  the server in the official MCP Registry. No functional change.\n\n### v1.4.0\n- **`remember_preference` — corrections become remembered patterns.** New tool that writes a\n  dated bullet under `## Preferences`, either in the **root** `AGENTS.md` (scope `global` —\n  applies to every project) or a single project's. Because preferences live in the\n  auto-loaded `AGENTS.md`, recall is free: a one-time correction (\"never add a co-author\n  trailer\", \"always typecheck before committing\") comes back next session and is applied\n  instead of re-corrected. Closes the cross-session loop for *how you like to work*, not just\n  project facts.\n- **Correction-aware Stop hook + capture policy.** The standing policy now nudges\n  `remember_preference` after a correction, and the opt-in Stop hook scans the session for\n  behavioural-correction phrases (\"from now on…\", \"no, don't…\", \"always use…\"): if you\n  corrected the agent and no preference was saved, it blocks the stop once to ask — a second,\n  independent reason alongside the existing \"code changed but nothing logged\" check.\n\n### v1.3.2\n- Docs: added a **\"Using it day to day\"** section — the natural-language prompts that map to\n  each tool, the one habit that matters (\"have we hit this before?\"), and the escape\n  hatches. Clarifies that you talk to the agent rather than calling tools directly.\n\n### v1.3.1\n- **Stop hook: count direct memory edits as capture.** The hook previously recognized only\n  `mcp__project-memory__*` tool calls, so editing `AGENTS.md` / `issues.jsonl` directly\n  (an endorsed capture path) still triggered the nag. It now also treats an `Edit`/`Write`\n  to a file ending in `AGENTS.md` or `issues.jsonl` as captured — eliminating the false\n  positive.\n- **`append_decision`/`append_learning`: no more duplicate sections.** Heading matching was\n  whole-line (`^## Learnings$`), so a heading with trailing text (`## Learnings (gotchas …)`)\n  wasn't found and a duplicate section got appended. Now matches the heading's leading word.\n\n### v1.3.0\n- **Guaranteed capture (opt-in Stop hook).** New `install-hook` / `uninstall-hook`\n  subcommands register a Claude Code `Stop` hook that forces a single capture pass when a\n  session changed code but recorded nothing to memory — turning the best-effort policy into\n  a hard guarantee. Off by default, fires at most once per turn (no loops), silent when\n  nothing changed or memory was already written, and disablable per-session via\n  `PROJECT_MEMORY_HOOK=off`.\n\n### v1.2.0\n- **Sharper issue search.** `search_issues` now matches only the text fields\n  (symptom/cause/fix/id/tags) instead of the raw JSON, so queries no longer get false hits\n  on field names. Added an optional `tags` filter; `query` is now optional (search by tags\n  alone).\n- **`sync_registry`.** Reconciles the root `AGENTS.md` projects table with the projects on\n  disk — adds stub rows for projects missing from the table, flags rows whose directory is\n  gone, and reports live open-issue counts. Automates the previously manual \"new project →\n  add a row\" step. Hand-curated columns are preserved; `apply=false` reports drift only.\n- **`find_by_file`.** Given a file path/fragment, returns the issues (via their `files`\n  field) and the decisions/learnings (via AGENTS.md bullets that mention it) touching that\n  file — code↔memory linking for \"why is this code the way it is?\".\n\n### v1.1.1\n- Docs only: publishes the changelog to the npm page for parity (no functional change).\n\n### v1.1.0\n- **Proactive capture.** The agent now records memory on its own instead of waiting for\n  \"log this\": a standing capture policy is sent on `initialize` and the write/search tool\n  descriptions are directive. It stays confirming (tells you what it logged), asks when\n  unsure, and skips trivia/secrets. Explicit calls still work as an override.\n- Docs: added \"How it works (after install)\" and \"Proactive capture\" sections.\n\n### v1.0.1\n- Fix `npx … install` failing with \"command not found\" — the bin is renamed to\n  `project-memory-mcp` to match the unscoped package name (npx resolution rule).\n\n### v1.0.0\n- Initial release: stateless MCP server over `AGENTS.md` + `issues.jsonl`, 9 tools\n  (project memory + issue tracking), `npx … install` for Claude Code and Cursor, and the\n  push/pull memory model.\n",
  "bytes": 29820,
  "sha": "4d5ea65227eab908e1828386e93acc9da35f5e086c58b5896dcdb55617b97787",
  "repo_slug": "kaaustubh/project-memory-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_kaaustubh_project_memory_mcp_a9692d8b/readme"
}