Projectmem
Projectmem provides a local-first memory and judgment layer for AI coding agents, exposing 14 MCP tools that allow an AI to become more 'experienced' by retaining project history, decisions, and failed approaches across sessions — with no cloud or telemetry required.
Read project intelligence:
get_instructions()— Load mandatory AI workflow rules at session startget_summary()— Access a distilled project memory summary (~500 tokens vs ~5,000 to re-derive from source)get_project_map()— Understand file layout, entry points, and ownership without scanning the filesystem
Prevent repeated failures:
precheck_file(path)— Surface failed past approaches, unresolved issues, and high-churn warnings before modifying any file
Retrieve specific context:
get_issue(id)— Read one issue's full history by IDsearch_events(query)— Plain-text search across all memory events by keywordget_context(tokens, focus)— Generate a focused memory block within a specified token budgetget_global_gotchas(library)— Retrieve library-specific lessons learned across all past projects
Log development activity:
log_issue(summary, location)— Open and track a bug before writing fix coderecord_attempt(summary, outcome, issue_id, location)— Log each fix attempt with an outcome ofworked,failed, orpartialrecord_fix(summary, location)— Close an issue after verifying the fix works
Preserve decisions and gotchas:
add_decision(summary, location)— Permanently record architectural or design decisionsadd_note(summary, location)— Capture warnings or gotchas; notes prefixed withgotcha:orlesson:are eligible for promotion to cross-project global memory
Track ROI:
get_score()— Returns an A+→F prevention grade with debugging hours saved, tokens prevented, and dollars protected
🚀 Start here — five minutes, once
*Five minutes if you follow along here. Want to be shown instead — every command, the exact output it prints back, and the dashboards at the end? Take the complete setup guide.*
New to projectmem, or upgrading from 0.1.x / 0.2.x? Since 0.3.0 one MCP server serves every project, so this is the last time you configure anything.
1. Install or update
pip install -U projectmem2. Find the projects you already have
pjm doctorIt looks where code lives —
~/Developer,~/code,~/projects, your cloud folders, and every drive on Windows — and lists projects with memory that aren't registered yet. Anything it missed, add by hand:pjm project register "/Users/you/Developer/repos/ossdrop"3. Register them
pjm doctor --fix4. Point your AI at all of them with one config
"mcpServers": { "projectmem": { "command": "/absolute/path/to/python", "args": ["-m", "projectmem.mcp_server"] } }No
--root, nocwd— that's what makes it serve everything. Per-client instructions (Claude Desktop, Claude Code, Cursor, Antigravity, Codex) are in MCP Integration;pjm initprints this block with your own Python path filled in. Then fully restart the client — MCP servers only load on a cold start.5. Check your work
pjm doctorAdd
--onlineif you also want it to tell you when a newer projectmem is out — projectmem makes no network calls otherwise, and--autoturns that into a once-a-day check if you prefer.Run it again after editing the config. It flags any client still pinned to a single repo — the most common reason a new project is invisible to your agent.
All green? You're done. From here on it is one command per repo:
pjm initYour agent reads what the project already learned instead of rediscovering it, and writes down what it finds. Fewer tokens, no repeated dead ends, memory that outlives the session.
Related MCP server: Memstate AI - Agent Memory System
What is coding agent memory?
Coding agent memory is a persistent record of what happened while building a project — the issues hit, the approaches attempted, the fixes that worked and the decisions made — stored so an AI coding agent can read it at the start of a new session. Without it every session begins from zero.
projectmem is an open-source agent memory layer built for that job. It is
local-first: memory lives in a plain .projectmem/ directory inside your
repository, with no cloud, no account and no telemetry — the only network call
it can make is an update check you turn on yourself. A native MCP server
exposes 17 tools to Claude Code, Claude Desktop, Cursor, Antigravity and Codex,
so your agent reads memory and logs its work on its own.
Unlike chat-history memory tools, projectmem stores typed events — issues, attempts, fixes, decisions, notes — which is what makes the one thing no other tool does possible: a pre-commit warning that fires before you repeat an approach that already failed.
pip install projectmem
cd your-project && pjm init🎬 Watch the demo
📚 Docs
Doc | What's in it |
The full walkthrough on the web — install, MCP setup per client, | |
15-minute step-by-step walkthrough — set up projectmem on your own project, watch the lifecycle, see the pre-commit warning fire. | |
Release history. Latest: v0.3.1 — opt-in update checks, on top of 0.3.0's global MCP mode, project registry and rebuilt dashboard. | |
PROJECTMEM: A Local-First, Event-Sourced Memory and Judgment Layer for AI Coding Agents — the peer-readable version: design, Memory-as-Governance framing, capability comparison, and the 207-event dogfooding study. | |
MIT |
The Problem
Every new AI session starts from zero. Claude, Cursor, Aider — they all forget yesterday's decisions, repeat failed debugging attempts, and burn millions of tokens reconstructing context from raw source files.
The model isn't the problem. The architecture is. Stateless models need a memory cortex.
The Solution
projectmem is the local-first memory + judgment layer that sits above your AI tools. It captures every failed attempt, decision, and gotcha — then injects that experience back into future AI sessions. Git tracks what changed. projectmem tracks why it changed, what was tried, and what failed.
Install
First time here? → The complete setup guide walks the whole path end to end: install, connecting Claude Desktop, Claude Code, Cursor, Codex or Antigravity, checking it with
pjm doctor, and reading your memory back through the dashboards — with the real terminal output at every step.
Three commands to a project that remembers:
pip install projectmem
cd your-project
pjm initThat's it. pjm init installs three git hooks (pre-commit warnings, post-commit classification, post-merge tracking), auto-starts a real-time file watcher, inherits cross-project memory if available, and creates .projectmem/. Capture is active from minute one.
The canonical command is
projectmem. Apjmalias is installed for speed.
✨ New in 0.3.1 — know when to upgrade
Both dashboards now show which version generated the page, with a check for
updates link beside it. The page makes no request until you click — PyPI's
public JSON is fetched straight from your browser and nothing about your machine
is sent. On the command line, pjm doctor --online checks once and
pjm doctor --auto remembers to check daily; both are off unless you ask.
✨ New in 0.3.0 — one server, many projects
Until now an MCP config was tied to one repository: eleven projects meant eleven
server entries and eleven restarts. 0.3.0 serves every registered project from
a single server. Paste the config once; every repo you pjm init afterwards is
reachable from it.
pjm project list # what this server can reach
pjm project use ossdrop # the default when a call names no projectlog_issue(summary="stars come back empty", project="ossdrop")
→ Logged issue #0019 → ossdrop: stars come back emptyEvery write names the project it landed in — in a shared server, the dangerous
failure is not "nothing works", it is a write that succeeds against the wrong
repo. Existing --root configs keep working untouched, and a pinned server now
refuses to write anywhere else even when asked.
Also in 0.3.0:
Fixed: the MCP server was broken on fresh installs. mcp 2.0 renamed
FastMCPand left the old import path raising — since 2026-07-28 every newpip install projectmemgot a server that died at import. Caught and fixed by @VIVAAN-DHAWAN.Security: stored XSS in
pjm visualize. Event summaries reached the DOM unescaped, and git commit messages become event summaries — so a crafted commit in a branch you pulled could run script in your dashboard. Every sink is escaped now.A rebuilt dashboard — a shareable Memory Card, case files with the full issue → attempt → fix chain, an effort treemap, per-file dossiers, and a global view that opens with where you left off.
Registry migration is automatic: the 0.2.x list of paths is converted on first
read, with a .bak kept beside it.
✨ New in 0.2.0 — the workspace release
0.1.6 made one project's memory something you could watch. 0.2.0 lifts that to your whole workspace — and closes the gap between what happened (memory) and what your code is (structure).
🌐 Global dashboard —
pjm dashboardis one page over every project you'vepjm init-ed: total issues captured, fixes confirmed, dead-ends prevented, tokens saved, a grade per project, and a "needs attention" list. Click any card to open that repo's own dashboard, generated fresh. It's a global view, not a global store — each repo's.projectmem/is aggregated at read time and never leaves its folder. Default is serverless (a static snapshot); add--servefor a tiny, ephemeral live server where the Refresh button re-reads your files — no background daemon, Ctrl+C stops it.🧬 Structure & relations —
pjm map --build(run automatically atpjm init) walks your codebase and, for Python, resolves imports into a real dependency graph. The Project Map's Graph and Flow views now render actual files and the import edges between them. The cache (structure.json) is derived from code, gitignored, and never committed — code is only ever read.🔥 Failure heat on structure (the combo) — the one view a pure code-grapher can't draw and a pure memory tool can't either: files with repeated failed attempts glow red, laid directly over the real import graph. Structure comes from the code, heat comes from your memory, and they meet only in the renderer.
🗂️
plan.md— a new editable intent file: ideas and plans, what you mean to do — deliberately not the event log.events.jsonl → summary.mdrecords what happened;plan.mdrecords what you intend. The AI reads it at session start and edits it directly; a plan never becomes an event.pjm plan/pjm plan "idea"/ MCPget_plan().
Everything stays 100% local — the global dashboard is a read-time aggregate, never a central honeypot of your code's history.
The visualization suite (shipped in 0.1.6)
Your project's memory is also something you can watch — and share.
🎬 Showoff — a dashboard tab with three animated story scenes, all rendered from your real event log: Story Replay (watch your project's history build itself, node by node), Orbit (files orbit the project, events orbit their file), and Universe (your project as a rotating galaxy — every bright star is a real issue, attempt, fix, or decision; click one for its full details).
⏺ Built-in recorder — hit REC (10–60 s) and Showoff downloads a
.webmclip of the animation, rendered 100% locally with a "made with projectmem" badge. Your debugging story, ready for a tweet or a standup.🗺️ Flow — the Project Map's default view: a layered flowchart reading
PROJECT → DIRECTORIES → FILES → WHAT HAPPENED → MEMORY. Files with repeated failures glow red along their path, every file shows its outcome chips, and everything flows into theevents.jsonlcylinder. Tree and Graph views are one click away.🧵 Time Spine — the Timeline's default view: a real-time axis you scroll, with problems branching left (issues, failed attempts) and knowledge branching right (fixes, decisions, notes). Hover any card and its whole issue thread lights up. The classic list remains as "Details".
Why You'll Love It
Pre-Commit Warnings —
pjm precheckwarns you before you commit if you're about to repeat a failed approach, modify a high-churn file, or touch an unresolved issue. No other AI tool does this — it requires the memory layer underneath. The warning now lists the dead ends themselves ("What already failed here: ✗ tried CSS contain:layout"), andpjm precheck --snooze 2hsilences it politely — the snooze is itself logged, so even the silence is audited.Stale-Memory Detection (new in 0.1.4) — other memory tools silently decay or delete old memories; projectmem never deletes. Every decision that cites a file is cross-checked against that file's git history — when the file has moved on, the memory is flagged ("predates 7 commits to auth.py — confirm or supersede") and a human decides. Retire it cleanly with
pjm decision "new way" --supersedes <id>: the old event stays in the log, tagged, forever.Session-Start Briefing (new in 0.1.4) —
pjm briefanswers "where was I?" in one screen: active warnings, possibly-stale memories, open issues, recent decisions, stack gotchas, and your prevention score with a week-over-week delta.Memory for agents without MCP (new in 0.1.4) —
pjm export --claude-mdcompiles live decisions, gotchas, and a "Do NOT retry — these already failed" list into a marked block in CLAUDE.md (or.cursorrules). Copilot, plain Claude, any agent that reads the file inherits your project's judgment.Smart Context Injection —
pjm wrap claude(or cursor/aider) injects a token-budgeted memory block into your AI before the session opens. Your AI starts experienced, not blank.Provable ROI Score —
pjm scoreoutputs a letter grade (A+ → F) backed by concrete numbers — debugging hours saved, tokens prevented, dollars protected. CI-friendly JSON output and shields.io badge for your README.Cross-Project Memory — Lessons learned in one repo follow you forever. Library gotchas, decisions, and patterns live in
~/.projectmem/global/and auto-inherit into every new project that matches your stack.Real-time File Watcher — Background daemon detects rapid edits to the same file (debugging sessions) between commits. Battery-aware, gitignore-aware, auto-started by
pjm init.Native MCP Server — Plugs into Claude Desktop, Cursor, Antigravity, Codex, and any MCP-compatible tool. 15 native tools force the AI to read context, check files for known failures, read your
plan.md, and log work automatically. Verified end-to-end against all four clients.Interactive Dashboard (expanded in 0.1.6) —
pjm visualizeopens a six-tab local dashboard: Overview, Story Map (failure heatmap with collapse/focus controls), ROI Dashboard, Project Map (Flow / Tree / Graph, now over your real code structure), Timeline (Time Spine / Details), and Showoff — animated story scenes with a built-in video recorder.One MCP server for every project (new in 0.3.0) — configure your client once instead of once per repository. Calls name their project (
project="ossdrop"), or fall back to the active one; every write reports which repo it landed in, and a pinned--rootserver refuses to write outside its own. Existing single-project setups are untouched.Global Dashboard (new in 0.2.0) —
pjm dashboardis one cross-project view over every repo you'vepjm init-ed: grades, issues, savings, and per-project drill-in. A global view, never a global store — each repo's memory is aggregated at read time and never leaves its folder. Serverless by default;--servefor an ephemeral live server (Ctrl+C to stop).Code Structure + Judgment (new in 0.2.0) —
pjm map --buildreads your codebase into a real import graph, and the Project Map overlays failure heat from your event log on top: the files that keep breaking, glowing red over the structure that actually connects them. The structure cache is derived from code and gitignored — never committed.Intent, separate from memory (new in 0.2.0) —
plan.mdholds ideas and plans (what you mean to do), kept deliberately apart from the append-only event log (what happened).pjm plan, or the MCPget_plan(); the AI edits it directly and a plan never becomes an event.100% Local — No cloud, no telemetry, no accounts. Your code, your memory, your machine.
How It Compares
Capability | projectmem | claude-mem | agentmemory | mem0 | Letta (MemGPT) |
Core focus | Memory + Judgment | Session capture | Memory engine | Chat memory | Agent framework |
Pre-commit failure warnings | ✅ unique | ❌ | ❌ | ❌ | ❌ |
Stale memory: flag, never delete | ✅ new in 0.1.4 | ❌ | ❌ silent decay | ❌ | ❌ |
Supersede without losing history | ✅ new in 0.1.4 | ❌ | ❌ | ❌ | ❌ |
Captures development history | ✅ typed events | 🟡 | 🟡 | 🟡 | 🟡 |
Records architectural decisions | ✅ | ❌ | 🟡 | ❌ | ❌ |
Memory for agents without MCP | ✅ CLAUDE.md export | ❌ | ❌ | ❌ | 🟡 |
Cross-project memory | ✅ library-scoped | 🟡 | 🟡 | 🟡 | 🟡 |
Provable ROI score | ✅ A+ → F + $ | ❌ | ❌ | ❌ | ❌ |
Plain-text, greppable store | ✅ events.jsonl | ❌ | ❌ | ❌ | 🟡 |
No persistent server or DB | ✅ stdio + files † | ❌ | ❌ | ❌ | ❌ server + DB |
No telemetry, no accounts | ✅ | ❌ default-on | ✅ | ❌ | 🟡 |
Native MCP server | ✅ 15 focused tools | ✅ | 🟡 53 tools | 🟡 | 🟡 |
Global dashboard (all repos) | ✅ read-time, local | ❌ | 🟡 central store | ❌ | ❌ |
Editable intent (plan ≠ memory) | ✅ | ❌ | ❌ | ❌ | 🟡 |
Price | ✅ Free · MIT | Free + paid tier | Free | Freemium | Free + cloud |
✅ yes · 🟡 partial · ❌ no — snapshot June 2026; design capabilities, not benchmark results. claude-mem runs a background worker (port 37777) and enables telemetry by default (v13.5+); agentmemory down-ranks and prunes old memories via decay, mem0 rewrites facts on update, Letta's memory blocks self-edit in place — projectmem never deletes: it flags staleness and lets you decide. Letta requires a running server (Postgres or cloud).
† There is no database and nothing you have to keep running: the MCP server is a stdio subprocess your AI client spawns, and everything else is plain files. The only server anywhere is the optional pjm dashboard --serve, an ephemeral local viewer you start and stop with Ctrl+C — never a background service.
🚧 Upcoming
Import your existing memory —
pjm import(planned for 0.3.3) will migrate history from mem0, agentmemory, Letta, and Claude session logs into projectmem. It maps only to the core event vocabulary — issues, attempts, fixes, decisions, notes — so signal comes in and another tool's clutter stays out. Your judgment history moves with you.
Want a source supported? Open an issue and tell us what you're migrating from.
How AI Reads Your Memory (Token Efficiency)
The architecture is built around one rule: AI reads small, distilled files. Tools generate them from the big raw log.
Access mode | Tokens / session | How it works |
No projectmem (baseline) | 5,000 – 20,000+ | AI re-reads source files every session |
Universal Mode (markdown) | ~2,500 | AI reads 3 small distilled files once |
MCP Mode (recommended) | ~800 – 1,500 | AI calls |
| 500 – 2,000 | Pre-generated, you set the budget |
AI never reads events.jsonl directly. That file is for tools (pjm score, pjm context, pjm wrap). Tools distill the raw log into compact AI-readable summaries.
One server, many projects
Since 0.3.0 a single MCP server serves every project you have registered. Paste
the config once and every repo you pjm init afterwards is reachable from it —
no second entry, no restart.
pjm project list # what this server can reach
pjm project use ossdrop # the default when a call names no project
pjm project alias ossdrop odYour agent picks the project per call:
log_issue(summary="stars come back empty", project="ossdrop")
→ Logged issue #0019 → ossdrop: stars come back emptyEvery write says where it landed. That echo is the point: in a one-project setup a misconfigured server simply fails, but a shared server can succeed against the wrong repository, which corrupts two audit trails at once. If the name in the reply is not the project you meant, stop.
How a call is routed, highest first:
Source | Notes | |
1 |
| A boundary, not a default. A pinned server refuses to write elsewhere, even when asked. |
2 |
| id, alias or path. An unknown name is an error. |
3 | The client's workspace root | Only when exactly one resolves. |
4 | The active project |
|
5 | The working directory | Walks up looking for |
6 | — | Refuses, and lists what is registered. It never guesses. |
Client roots outrank the active project on purpose: the root is where you are now, the active project is a mode you set days ago. When they disagree, the stale one is the wrong answer.
Single-repo setups are untouched — pjm init --mcp-config-single still prints
the pinned config, and an existing --root entry keeps working exactly as before.
MCP Integration (Recommended)
For: Claude Desktop, Cursor, Antigravity, Codex — and any tool with native MCP support. The MCP server forces the AI to read memory and log every action automatically.
Since 0.3.0 you configure this once, not once per repository. The block below has no --root: the server serves every project you have registered, and each call resolves its own. Paste it, and every repo you pjm init from then on is reachable — no second entry, no restart.
"mcpServers": {
"projectmem": {
"command": "/opt/anaconda3/bin/python",
"args": ["-m", "projectmem.mcp_server"]
}
}Upgrading with projects you already have? The registry only ever recorded
projects you ran pjm init on since it existed (0.2.0), so anything older is
missing — and global mode routes through the registry. One command sorts it out:
pjm doctor # what's unregistered, what's stale, what's still pinned
pjm doctor --fix # register what it foundIt looks in the places code actually lives — ~/Developer, ~/code, ~/src,
~/projects and friends, plus every fixed drive on Windows, where projects sit
on D:\ and E:\ as often as under your home folder. To point it somewhere
specific:
pjm doctor --path ~/work --path /Volumes/ssd --fix
pjm project scan D:\ E:\ --depth 3 # the same walk, without the other checksNothing is scanned until you run it, and nothing is written without --fix.
After an upgrade the CLI mentions pjm doctor once — a wheel install can't run
code, so the first command you type is the only place to say it.
With one project registered, that is the whole setup — there is only one place a call can go. With several, your AI passes project="<name>", or you set a default with pjm project use <name>. pjm init prints this block with your own Python path already filled in.
Upgrading from 0.2.x? Your existing --root entry keeps working exactly as before, and a pinned server now refuses to write outside its own repo even if asked. Replace it with the block above when you want one server for everything.
The 3-minute workflow (let your AI do the setup)
Install + init.
pip install projectmem, thencdinto your project and runpjm init— or simply ask your AI to run it.Ask your AI to set up the projectmem MCP server for you — it can edit the client's config file itself. (It needs permission to do that: use Auto / accept-edits mode, or approve the file edit when asked. The exact config per client is in the sections below if you'd rather paste it by hand.)
Restart the AI tool so the MCP server loads, then start your session with this prompt:
Hi — I use projectmem as this project's memory. Before anything else,
call get_instructions(), then get_summary(), then get_project_map() to
load what we already know. As we work, log issues, attempts
(failed/worked), fixes, decisions, and notes with the projectmem tools,
and call precheck_file(path) before you edit a file. Ideas and plans go
in plan.md via get_plan() — never as events.Strictly speaking this prompt is optional — with the MCP server installed correctly the AI discovers the memory on its own. But saying it makes capture noticeably more consistent, so we recommend it.
Repeat for every project:
pjm init+ the same kickoff prompt.Coming back after closing the window? Open with a one-line reminder — "Reminder: we use projectmem as memory here." — and the whole setup carries on where you left off.
Prefer to wire it up by hand? The exact, verified config for each client follows.
Claude Desktop
Easiest — open the config from the UI:
macOS: Claude menu →
Settings…→Developertab → Local MCP servers → Edit Config.Windows / Linux: same path expected (
Settings → Developer → Edit Config) — open an issue if your platform differs and we'll update this.
If you prefer the raw file path: ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows, ~/.config/Claude/claude_desktop_config.json on Linux (or $XDG_CONFIG_HOME/Claude/ if you have moved it). pjm init prints the right one for the machine you run it on.
Paste this block:
"mcpServers": {
"projectmem": {
"command": "/opt/anaconda3/bin/python",
"args": ["-m", "projectmem.mcp_server"]
}
}Two things to know about this block:
Use the absolute path to
python(e.g./opt/anaconda3/bin/python, or runwhich pythonto find yours). Claude Desktop subprocesses don't inherit your shellPATH, so bare"python"often fails.You no longer need the
cwdfield, and you never could rely on it. Claude Desktop's current build (with the Epitaxy / Cowork workspace system) silently ignorescwd— the server ends up running withcwd=/and can't find.projectmem/. That is why older releases needed--root. The registry replaces it: the server finds projects by name, not by where it happens to be running.
"mcpServers": {
"projectmem": {
"command": "/opt/anaconda3/bin/python",
"args": [
"-m", "projectmem.mcp_server",
"--root", "/absolute/path/to/your/project"
]
}
}A pinned server serves exactly that repository and refuses to write anywhere else, even when asked — the stricter choice if you want a hard boundary. pjm init --mcp-config-single prints this form.
Then fully quit Claude Desktop (Cmd+Q on Mac) and reopen — MCP servers only initialize on cold start.
Cursor
Two ways to register the MCP server — pick whichever fits your workflow:
Global (recommended): Cursor menu →
Settings…→ left sidebar Tools & MCPs → Installed MCP Servers → Add Custom MCP. Paste the JSON below.Per-project: drop the JSON into
<project-root>/.cursor/mcp.json— only active when that project is open.
{
"mcpServers": {
"projectmem": {
"command": "/opt/anaconda3/bin/python",
"args": ["-m", "projectmem.mcp_server"]
}
}
}Two things to know about this block (same gotchas as Claude Desktop):
Use the absolute path to
python(runwhich pythonto find yours). Cursor subprocesses don't reliably inherit your shellPATH.Don't bother with the
cwdfield. Cursor — like Claude Desktop — silently ignores it: the server ends up running withcwd=~. Since 0.3.0 that no longer matters, because projects are found by name in the registry rather than by where the server runs.
Registered globally, one entry covers every project. Per-project .cursor/mcp.json still works if you prefer the server to exist only when that repo is open — add "--root", "/absolute/path/to/your/project" to args there to pin it.
Then fully quit Cursor (Cmd+Q on Mac) and reopen. projectmem also auto-discovers .projectmem/ by walking up from CWD (like git does for .git/), and honors PROJECTMEM_ROOT and a --root <path> CLI argument.
Antigravity
Antigravity (Google's AI IDE) speaks standard MCP.
Easiest — open the config from the UI:
Open the Agent window (the chat panel on the right).
Click the ⋯ Additional Options button in the panel header.
Choose MCP Servers → Manage MCP Servers → Add new (or Edit Config).
The raw file is at ~/.gemini/antigravity/mcp_config.json if you prefer editing it directly.
Paste this block:
{
"mcpServers": {
"projectmem": {
"command": "python",
"args": ["-m", "projectmem.mcp_server"]
}
}
}Antigravity does honor the cwd field, so adding "cwd": "/absolute/path/to/your/project" works — but it ties the server to that one repo. Leave it out and the same entry serves every registered project.
Then fully quit Antigravity (Cmd+Q on Mac) and reopen — MCP servers only initialize on cold start. All 17 projectmem tools register identically to Claude Desktop / Cursor.
Codex
Codex stores MCP config as TOML (not JSON) in ~/.codex/config.toml. There's a UI form at Settings → MCP Servers → Add MCP Server, but during cross-client verification the form's Save button didn't reliably persist — the file-edit path is faster and more reliable.
Easiest — edit ~/.codex/config.toml directly:
Append this block (preserves any existing config):
[mcp_servers.projectmem]
command = "/opt/anaconda3/bin/python"
args = ["-m", "projectmem.mcp_server"]
cwd = "/absolute/path/to/your/project"Three things to know about this block:
Use the absolute path to
python(runwhich pythonto find yours). Codex subprocesses don't reliably inherit your shellPATH.You no longer need
--rootorcwd. Earlier releases passed--rootas defense in depth (thecwdfield does appear to work in Codex, unlike Claude Desktop and Cursor). Since 0.3.0 the registry makes both unnecessary — add"--root", "/absolute/path/to/your/project"toargsonly if you want this server locked to a single repo.Set your reasoning effort to
mediumor higher. On low-reasoning Codex skipsget_instructionsfrom the session-start trio, which can cause the AI to miss the Setup Mode workflow rules. Medium+ honors the full trio automatically.
Validate the TOML:
python -c "import tomllib; tomllib.load(open('/Users/<you>/.codex/config.toml','rb')); print('OK')"Should print OK. If not, the parser tells you the offending line.
Then fully quit Codex (Cmd+Q on Mac) and reopen. Same cold-start rule as every other MCP client. Codex MCP servers spawn lazily on the first tool call in a chat session — if you don't see the process in ps aux right after reopening, send any message to a Codex chat and check again.
Reasoning-effort note: Codex's mode selector is at the bottom of the chat input. Set it to medium (not low) for the full session-start trio behavior. Once set, it persists per-session.
First-run permission prompts
On first use in any MCP-capable client (Claude Desktop, Cursor, Antigravity, Codex), your AI will ask permission before each projectmem tool call. This is expected security behavior — MCP clients require explicit consent for every new tool. Approve each tool once and the prompt won't reappear for that session.
Other MCP Tools
Any MCP-compatible client works — point your tool at
python -m projectmem.mcp_server and either set cwd to your project
root or rely on the parent-walk auto-discovery.
MCP Tools Exposed
All 17 tools your AI can call. Every repo tool takes an optional
project argument — see One server, many projects:
Read-side (10 tools):
Tool | When to use |
| Start of every session — load workflow rules |
| Start and end — distilled project memory |
| Start — understand repo structure |
| Read |
| Before editing any file — surface failure history |
| Read one specific issue's full history by ID |
| Plain-text search across all logged events |
| Token-budgeted memory block with optional focus filter |
| A+→F prevention score + ROI numbers |
| Cross-project library lessons inherited from past repos |
Write-side (5 tools):
Tool | When to use |
| Immediately when encountering a bug |
| Immediately after each fix attempt (outcome: |
| After confirming a fix resolves the issue |
| When making architectural / design decisions; pass |
| When discovering gotchas, setup details, or constraints |
CLI Reference
Core memory
Command | Purpose |
| Initialize memory + auto-install hooks + inherit global memory |
| Start a new issue / debugging session |
| Record a fix attempt outcome |
| Record the confirmed fix and close the issue — |
| Record an architectural decision; optionally retire a prior one (old event stays in the log, tagged) |
| Record durable context or a gotcha |
| Print |
| Print the current summary |
| Plain-text search across all events; |
| One-screen session-start briefing: warnings, stale memories, open issues, decisions, score |
| Compile live memory into CLAUDE.md / .cursorrules for agents without MCP |
Intelligence layer
Command | Purpose |
| Real-time file churn watcher |
| Warn about repeating failed approaches before commit; snooze politely (audited) when needed |
| Inject token-budgeted memory into Claude/Cursor/Aider |
| Generate token-budgeted project context |
| Letter-grade prevention score |
| Manage cross-project memory |
Projects (global MCP)
Command | Purpose |
| Find unregistered projects, stale entries and pinned client configs. |
| Every project this server can reach, and which one is active (new in 0.3.0) |
| Walk for projects with memory and register them |
| Add a project that already has memory ( |
| Set the default project for calls that name none; omit the name to clear it |
| Give a project a shorter name |
| Tag a project |
| Forget a project — its repo and |
Visualization & utility
Command | Purpose |
| Open the six-tab local dashboard (Overview, Story Map, ROI, Project Map, Timeline, Showoff) |
| Cross-project global dashboard over every |
| Print the Project Map; |
| Token ROI summary in the terminal |
| Auto-populate memory from git history |
| Manage git hooks manually |
| Rebuild |
Use
--at "file.py:42"with any logging command to attach precise location metadata.
plan.md — intent, kept separate from memory
pjm init scaffolds a .projectmem/plan.md: your ideas and plans — what you mean to do, in plain Markdown (Ideas · Active plans · Next · Someday · Shipped). It's the one file that is deliberately not the event log:
events.jsonl → summary.mdrecords what happened (append-only, never rewritten).plan.mdrecords what you intend — and you (or the AI) edit it directly, likePROJECT_MAP.md.
Your AI reads it at session start via get_plan() and updates it in place: adding ideas, checking items off, moving finished work down to Shipped. A plan is never logged as an event, so intent stays cleanly out of your memory's audit trail. pjm plan prints it; pjm plan "auto-batch the exporter" appends an idea. It's committed (not gitignored) so intent is shared with your team.
Example: Pre-Commit Warnings in Action
$ git commit -m "switch auth to JWT"
projectmem: Pre-Commit Check
─────────────────────────────────────────────
src/auth/middleware.py
WARN What already failed here (2 attempts):
✗ tried switching to JWT middleware (2d ago)
✗ patched session timeout to 60min (5d ago)
WARN HIGH CHURN: 5 changes in last 30 days
WARN 1 possibly-stale memory cites this file
decision [evt_9db5a3f8…] "auth uses session
cookies, 30min timeout" — predates 7 commits
Confirm it still holds, or retire it:
pjm decision "..." --supersedes <id>
─────────────────────────────────────────────
3 warning(s). Review before committing.
~30 min re-debugging just saved.Need it quiet for a refactor sprint? pjm precheck --snooze 2h — warnings pause, the pause itself is logged, and every commit shows one dim line so silence is never mistaken for a clean check.
Privacy & Security
By default, projectmem commits the distilled files (summary.md, PROJECT_MAP.md, AI_INSTRUCTIONS.md, issues/) and gitignores the raw log + runtime files (events.jsonl, watch.pid, watch.log). This means your teammate's AI inherits your team's knowledge automatically — just git clone and the AI already knows what your team learned.
Want total privacy? Add a single line .projectmem/ to your .gitignore. Nothing leaves your machine.
Full security policy and threat model: SECURITY.md · Privacy & Security guide
Design Principles
Local-first — No network calls, no cloud, no telemetry. Your data never leaves your machine.
Project-scoped — Memory lives in the repo. When the code moves, the memory moves.
AI-tool-agnostic — Works natively via MCP, or universally via Markdown instructions. Any AI tool, any workflow.
Built With
projectmem stands on the shoulders of these excellent open-source projects:
Typer — the CLI framework that makes
pjmfeel ergonomicModel Context Protocol — Anthropic's open spec that lets AI agents talk to local tools
watchdog — cross-platform filesystem event monitoring (the heart of
pjm watch)D3.js — the interactive visualizations in
pjm visualize
Research & Citation
projectmem is described in a peer-readable research paper:
PROJECTMEM: A Local-First, Event-Sourced Memory and Judgment Layer for AI Coding Agents Ripon Chandra Malo, Tong Qiu — University of Utah arXiv:2606.12329 · cs.SE (cross-list cs.AI)
The paper introduces the Memory-as-Governance framing — memory that doesn't merely answer the agent but acts on its next action — and reports the design, the deterministic pre-commit judgment gate, a capability comparison against 12 contemporary memory systems, and a two-month, 207-event dogfooding study across 10 real projects.
If projectmem is useful in your research or writing, please cite:
@misc{malo2026projectmem,
title = {PROJECTMEM: A Local-First, Event-Sourced Memory and
Judgment Layer for AI Coding Agents},
author = {Malo, Ripon Chandra and Qiu, Tong},
year = {2026},
eprint = {2606.12329},
archivePrefix = {arXiv},
primaryClass = {cs.SE},
url = {https://arxiv.org/abs/2606.12329}
}License
MIT — free for personal, commercial, and enterprise use forever.
Help Us Reach More Developers
We don't need money. We need you.
projectmem is built by one developer for the open-source community. Every star, every share, and every contribution helps the project survive and grow.
Star the repo — takes one click, helps massively with discovery
Share on X / LinkedIn — tell other devs they don't have to keep paying AI to relearn their codebase
Open an issue — bug, feature request, or just feedback
Contribute code — PRs welcome, see contributing guide
Using
projectmemat work or in a commercial product? Reach out to support@projectmem.dev so we know who's shipping with us. It's free — we just love hearing about it.
Stars and shares matter more than money — but if you really want to: sponsor on GitHub →
Available Tools
15 toolsadd_decisionA
Record an architectural or product decision permanently.
Call when you make a choice that future sessions or contributors
should know about. Decisions show up in `summary.md` and in
`pjm wrap` context blocks.
Side effects: appends a `decision` event and updates summary.md.
Decisions are append-only — to revise, pass `supersedes` with the old
decision's event id instead of editing history.| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | One-line description of the architectural or product decision (e.g., 'use bcrypt rounds=12 for password hashing'). Becomes part of the project's permanent record — write it for a future contributor. | |
| location | No | Optional file path or scope where the decision applies (e.g., 'src/auth/' for a module-level choice). Helps precheck_file cite the decision when the file is later touched. | |
| supersedes | No | Optional event id (evt_...) of a prior decision this one retires. The old event stays in the log tagged (superseded); only the new decision appears in summary.md. Use when precheck_file flags a decision as possibly stale and you are revising it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully covers behavioral traits: side effects (appends event, updates summary.md), append-only nature, and the revision mechanism via 'supersedes'. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, front-loaded with purpose. Each sentence adds essential information: purpose, when to use, visibility, side effects, and revision policy. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (three parameters, all documented in schema) and presence of an output schema, the description covers all necessary context: purpose, trigger conditions, side effects, and how to handle revisions. Complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context beyond schema by explaining when to use 'supersedes' (when precheck_file flags a decision as stale) and advising on writing for future contributors. This extra guidance merits a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Record an architectural or product decision permanently.' It uses a specific verb (record) and resource (decision). The distinction from siblings like add_note and log_issue is implied by the emphasis on permanence and visibility in summary.md.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: 'Call when you make a choice that future sessions or contributors should know about.' It also explains where decisions appear (summary.md, pjm wrap context). However, it does not explicitly state when not to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_noteA
Record a gotcha, setup detail, or other durable context.
Use when you discover something important that doesn't fit as an
issue or decision. Notes survive across sessions and appear in
wrap context blocks.
Side effects: appends a `note` event. Notes prefixed `gotcha:`,
`lesson:`, or `warning:` are eligible for auto-promotion to
~/.projectmem/global/ for cross-project recall (L-046).| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | One-line description of the gotcha, setup detail, or context worth preserving. Prefix with 'gotcha:' or 'lesson:' to enable cross-project promotion — e.g., 'gotcha: bcrypt v4 silently truncates passwords longer than 72 bytes'. | |
| location | No | Optional file path or library this note applies to (e.g., 'bcrypt' for a library-specific gotcha). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effects (appends a note event), notes durability across sessions, and describes auto-promotion criteria for certain prefixes, which is beyond minimal annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences covering all essential aspects without redundancy. Front-loaded with purpose and usage, followed by side effects and details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All necessary information provided: purpose, usage, side effects, and additional context. Output schema exists, so return values need not be explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already has 100% coverage, but description adds value by explaining prefix usage for auto-promotion and giving an example, going beyond schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool records gotchas, setup details, or durable context. It uses specific verbs and resources, and distinguishes from siblings by noting it's for items that don't fit as issues or decisions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you discover something important that doesn't fit as an issue or decision,' providing clear context and implicit direction to use sibling tools for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextA
Generate a token-budgeted memory context block.
Use when you don't want to read the full summary. ``focus`` (e.g.
'src/auth/') biases the context toward a specific area.
Read-only; assembles a freshly-budgeted context block from
events.jsonl.| Name | Required | Description | Default |
|---|---|---|---|
| focus | No | Optional path prefix or keyword to bias selection toward (e.g., 'src/auth/'). When omitted, the context is project-wide. | |
| tokens | No | Approximate target token budget for the returned markdown (default 2000). Output may be slightly over or under as events are included as whole units. Recommended range: 500-8000. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description bears full responsibility. It declares the tool is read-only and assembles data from events.jsonl, and mentions token budgeting. However, it does not elaborate on edge cases (e.g., token limit behavior) or potential side effects, leaving some transparency gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of three sentences that efficiently convey purpose, usage, and behavior. It is front-loaded with the core function and contains no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and the tool's simplicity (two optional parameters), the description adequately covers the main aspects: what it does, when to use it, and a key behavioral trait (read-only). Minor omission: it does not explicitly mention the output format, but that is covered in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for both parameters (focus and tokens) with 100% coverage. The description adds a usage example for focus but does not significantly enhance understanding beyond the schema. Baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a token-budgeted memory context block, contrasting with reading the full summary. It mentions the focus parameter for biasing and identifies the data source (events.jsonl), distinguishing it from sibling tools like get_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this tool when you don't want to read the full summary, providing a clear usage scenario. However, it does not discuss when not to use it or mention alternative tools among siblings, which would strengthen the guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_global_gotchasA
Query cross-project library gotchas from ~/.projectmem/global/.
Returns lessons learned in past projects that apply to the libraries
you're about to use. Call whenever working with an unfamiliar library
or starting a new feature.
Read-only. Reads from ~/.projectmem/global/ (cross-project memory,
not this repo's .projectmem/).| Name | Required | Description | Default |
|---|---|---|---|
| library | No | Optional library name to filter by (case-insensitive substring match — 'react' also matches 'react-router'). When omitted, returns all gotchas across every library — useful when starting a new feature to scan for any relevant past lessons. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. Clearly states read-only behavior and specifies the exact file path, distinguishing from local project memory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences covering purpose, usage, and behavior. No redundant or unnecessary text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a single-parameter tool with output schema. Covers all essential aspects: function, usage, parameter semantics, and read-only nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds significant detail beyond schema: case-insensitive substring matching, behavior when omitted, and use case for scanning all gotchas. Schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries cross-project library gotchas from a specific file location. It distinguishes itself from sibling tools that focus on project-specific memory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to call when working with unfamiliar libraries or starting new features. Lacks explicit when-not-to-use, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_instructionsA
Read the project's mandatory AI instructions.
MANDATORY: call this at session start. The instructions describe the
workflow rules you MUST follow while working in this project — they
are not advisory.
Read-only; does not modify memory.| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description explicitly states 'Read-only; does not modify memory,' clearly disclosing behavioral traits. It also notes the instructions are mandatory and not advisory. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loading the purpose and then adding usage and behavioral context. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, output schema present), the description fully covers purpose, mandatory usage at session start, and read-only nature. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and 100% coverage, so the description does not need to add param details. It correctly provides no misleading or redundant param info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool reads the project's mandatory AI instructions. It uses a specific verb ('read') and resource ('project's mandatory AI instructions'), distinguishing it from sibling tools like get_context or get_summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'MANDATORY: call this at session start' and emphasizes that the instructions contain workflow rules to follow. This gives strong context, though it does not explicitly mention when not to use or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issueA
Read one specific issue's full history by ID (token-efficient).
Use this when you only need one issue's context instead of the whole
summary. Example: get_issue('0042').
Read-only.| Name | Required | Description | Default |
|---|---|---|---|
| issue_id | Yes | Zero-padded 4-digit issue ID returned by log_issue (e.g., '0042'). Numeric strings without padding (e.g., '42') are also accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Read-only' and 'token-efficient', disclosing behavioral traits. No annotations are provided, so the description carries the burden. It does not detail authentication or rate limits, but for a simple read tool it is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, extremely concise and front-loaded with the key action. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only one parameter, an output schema, and clear sibling differentiation, the description is complete enough. It covers purpose, usage, example, and read-only nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds no further parameter meaning beyond the schema, but it provides an example usage with '0042', which is helpful but does not significantly enhance semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads one specific issue's full history by ID, using the verb 'Read' and resource 'issue's full history'. It distinguishes from the sibling 'get_summary' by noting it provides individual context instead of the whole summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this when you only need one issue's context instead of the whole summary', providing clear usage context. It does not mention when not to use or alternative tools, but the context is sufficient for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_planA
Read plan.md — the project's INTENT file (ideas + plans).
Call this at session start alongside get_summary(). plan.md records what
the team MEANS to do (ideas, active plans, next steps) — distinct from
the event log, which records what HAPPENED. When the user shares an idea
or a plan, edit plan.md directly (add a bullet, check items off, move
done work to Shipped); do NOT log plans as events.
Read-only. Returns 'No plan found.' if plan.md hasn't been initialized.| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Declares read-only behavior and describes return value when uninitialized. No annotations provided, so description carries full burden; could mention any caching or side effects but read-only is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no wasted words. Structured logically: what, when, how.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers file purpose, usage context, empty case. Output schema exists so return values need not be described; this is complete for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; description adds meaning by explaining the file's purpose and content. Baseline 4 for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'Read' and resource 'plan.md', defines it as the project's INTENT file with ideas+plans. Contrasts with event log, distinguishing from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends calling at session start alongside get_summary(), explains distinction from event log, and gives guidance on when to edit plan.md vs logging events.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_mapA
Read PROJECT_MAP.md to understand the repo structure.
Call this at session start when structure matters (file layout,
entry points, ownership). Cheaper than scanning the filesystem.
Read-only. Returns 'No project map found.' if PROJECT_MAP.md hasn't
been initialized — run `pjm init` first if so.| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it is read-only, returns a specific error string if the map is absent, and is cheaper than scanning. No annotations exist, so the description fully carries the transparency burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: three short sentences each serving a distinct purpose. No wasted words, and the critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, output schema exists), the description covers purpose, usage, behavior, and error handling completely. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (schema coverage 100%), so baseline is 4. The description adds no parameter info, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: reading PROJECT_MAP.md to understand the repo structure. It uses a specific verb and resource, and implicitly distinguishes from siblings by focusing on repo structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises when to use the tool (at session start when structure matters) and what to do if the map isn't initialized (run pjm init). Also contrasts with the cost of scanning the filesystem.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scoreA
Get the project's failure-prevention score.
Returns an A+→F grade with concrete ROI numbers: debugging hours
saved, tokens prevented, dollars protected. Use when the user asks
about progress or value.
Read-only; computes the score from events.jsonl on each call.| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only nature and that it computes from events.jsonl each call. Lacks details on authentication, rate limits, or potential side effects, but annotations are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding value: purpose, output details, behavioral note. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, zero-parameter read-only tool with an output schema, the description covers purpose, usage, and behavior completely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters, so description doesn't need to add param info. Baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets the project's failure-prevention score, with a specific verb and resource. It distinguishes from siblings like get_context or get_issue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when the user asks about progress or value', providing clear context. No exclusions or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_summaryA
Read the project memory summary.
MANDATORY: call this BEFORE answering ANY question about the project.
Do NOT answer from conversation history alone.
Do NOT re-scan source files (package.json, README, src/) to understand
the project — `summary.md` is the distilled authoritative source and
costs ~500 tokens versus ~5,000 to re-derive.
Your prior assumptions about this project may be stale. Call this
cheaply at session start (and again before ending) to verify your
work is recorded.
Read-only; does not modify memory or trigger event logging.| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses read-only nature, no memory modification, no event logging, token efficiency (500 vs 5000 tokens), and potential staleness of prior assumptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with clear sections, but slightly verbose. However, every sentence serves a purpose, and the format aids readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description provides complete guidance on purpose, usage, and behavior. No gaps remain for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist (0 parameters, 100% coverage). Description adds meaning by mentioning the summary is a distilled authoritative source, which is useful context beyond the empty schema. Baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Read the project memory summary' with a specific verb and resource. Distinguishes from sibling tools like get_context or get_instructions by describing it as the authoritative source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mandates calling it before answering any question, advises against using conversation history or scanning files, and recommends calling at session start and before ending. Provides clear when, when-not, and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_issueA
Open a new issue. Returns the issue ID.
MANDATORY: call this IMMEDIATELY when you encounter a bug, regression,
or unexpected behavior — BEFORE writing fix code. Logging up-front
means the issue survives interruptions and session boundaries.
Side effects: appends an `issue` event to .projectmem/events.jsonl,
creates an issue file in .projectmem/issues/, updates summary.md,
and marks this issue as the active one for subsequent
record_attempt calls.| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | One-line description of the bug or unexpected behavior (~140 chars recommended). Becomes the issue title and is matched by search_events. | |
| location | No | Optional file path or component where the issue manifests (e.g., 'src/auth.py' or 'login/double-submit'). Used by precheck_file to surface this history later. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description bears full burden. It enumerates side effects: appends to events.jsonl, creates issue file, updates summary.md, marks active issue. This fully discloses behavioral impacts without contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is relatively concise with five sentences covering purpose, usage, and side effects. Front-loaded with core function. Could potentially be tightened, but no extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity (2 params, no nested objects, output schema exists), description adequately covers all aspects: purpose, usage, side effects, parameter details, and return value. No gaps identified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds value beyond schema: suggests ~140 chars for summary, states it becomes issue title and is searchable, and clarifies location is used by precheck_file. While helpful, it does not radically augment schema meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description explicitly states 'Open a new issue' and specifies the return value (issue ID). Verb 'log_issue' combined with description clearly indicates the action on a resource. Differentiates from sibling tools like 'get_issue', 'record_attempt', 'record_fix' by focusing on issue creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit directive: 'MANDATORY: call this IMMEDIATELY when you encounter a bug, regression, or unexpected behavior — BEFORE writing fix code.' This gives clear when-to-use context and emphasizes immediacy, leaving no ambiguity about the tool's purpose relative to other actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
precheck_fileA
Check a file's failure history BEFORE modifying it.
MANDATORY: call this BEFORE proposing any change to a file.
Surfaces failed past approaches, unresolved issues, and high churn
so you don't repeat known dead-ends. Cheap (~100 tokens) and prevents
expensive re-debugging cycles.
Read-only; does not modify memory.| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes | Project-relative or absolute file path to check (e.g., 'src/auth.py'). Matched against the `location` field of logged events — no file content is read from disk. Returns 'no warnings' if the file has no failure history. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only nature, cost (~100 tokens), and that no file content is read from disk, despite no annotations provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds value; well-structured from purpose to mandatory call to benefits to cost to read-only, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a single-parameter tool with output schema: explains what, why, how, and implications.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds value beyond schema by explaining matching against the `location` field and return behavior for files with no history; baseline 3 raised due to rich detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Check a file's failure history BEFORE modifying it' with a specific verb and resource, and distinguishes itself from sibling tools that log or record issues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly mandates use 'BEFORE proposing any change to a file' and explains benefits (avoid dead-ends, cheap cost), providing clear context for when to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_attemptA
Record a fix attempt on the current issue.
MANDATORY: call IMMEDIATELY after each distinct fix attempt — do NOT
batch multiple attempts into one call.
`outcome` must be 'worked', 'failed', or 'partial'. Pass `issue_id`
explicitly to attach to a specific issue; otherwise the attempt
attaches to the active issue. If no active issue exists, an implicit
parent issue is auto-created from this attempt's text (L-008).
Side effects: appends an `attempt` event and updates the issue file.
Does NOT close the issue — call record_fix for that.| Name | Required | Description | Default |
|---|---|---|---|
| outcome | No | Result of the attempt. Must be exactly one of 'worked', 'failed', or 'partial'. Defaults to 'failed' — the safer default when an outcome is uncertain. | failed |
| summary | Yes | One-line description of what you tried (e.g., 'tried contain: layout — preview still jumps'). | |
| issue_id | No | Optional zero-padded issue ID (e.g., '0042') to attach this attempt to. When omitted, attaches to the active issue; if no active issue exists, an implicit parent issue is auto-created from this attempt's text. | |
| location | No | Optional file path or component touched by this attempt. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses side effects: 'appends an attempt event and updates the issue file,' and states it does NOT close the issue. Mentions auto-creation of parent issue and a behavior code (L-008). Could mention idempotency or multiple call effects, but still strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with bold emphasis on key points (MANDATORY, IMMEDIATELY). Sentences are informative and front-loaded. Minor repetition about auto-creation from schema, but overall efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (not shown), the description need not detail return values. It covers purpose, usage guidelines, parameter details, side effects, and sibling differentiation. The behavior code L-008 adds specificity. Complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value beyond schema, especially for outcome (explains the default and rationale) and issue_id (clarifies active issue logic). This extra context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Record a fix attempt on the current issue,' specifying the verb and resource. It explicitly distinguishes from sibling tool record_fix by noting that it does NOT close the issue. This differentiates it effectively from other tools like log_issue and add_decision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit timing guidance: 'call IMMEDIATELY after each distinct fix attempt — do NOT batch multiple attempts into one call.' Also tells when to use record_fix instead for closing issues, and how issue attachment works (explicit id vs active issue vs auto-creation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_fixA
Record a confirmed fix and close an issue.
Only call AFTER you have evidence the fix works: test passes, error is gone,
or the user confirmed.
If `issue_id` is provided, the fix is attached to that specific issue.
If `issue_id` is omitted, the active issue is closed.
Side effects: appends a `fix` event and updates summary.md. The active-issue
marker is cleared only when the active issue is the issue being fixed.| Name | Required | Description | Default |
|---|---|---|---|
| summary | Yes | One-line description of the confirmed fix (e.g., 'guarded submit handler with isSubmitting ref'). | |
| issue_id | No | Optional zero-padded issue ID (e.g., '0042') to close. When omitted, closes the active issue. Numeric strings without padding are accepted. | |
| location | No | Optional file path or component where the fix was applied. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description fully discloses side effects: appending a 'fix' event, updating summary.md, and clearing the active-issue marker only when the active issue is the one being fixed. This gives the agent clear expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with four sentences, each adding meaningful information. It is front-loaded with the purpose, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 3 parameters (1 required) and an output schema, the description covers all essential aspects: purpose, usage conditions, parameter behavior, and side effects. No gaps are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying the behavior of `issue_id` (attach to specific vs. active issue), which goes beyond the schema's 'optional' description. However, it does not add significant detail for `summary` or `location` beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool records a confirmed fix and closes an issue, distinguishing it from siblings like 'record_attempt' (which logs attempts) and 'log_issue' (which logs issues). The verb 'record' and resource 'fix' are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to call only after evidence of a working fix (test passes, error gone, user confirmation). It also explains the behavior when `issue_id` is provided versus omitted, guiding the agent's choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_eventsA
Plain-text search across all logged events.
Token-efficient alternative to get_summary when you only need events
matching a keyword. Returns matching event summaries with type and
timestamp.
Read-only. Case-insensitive substring matching against each event's
summary and notes. Empty result returns a friendly message, not an
error.| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matching events to return (most recent first). Defaults to 10. Recommended range: 1-100. | |
| query | Yes | Case-insensitive substring matched against each event's summary and notes. Plain text only — no regex or boolean operators. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses read-only nature, case-insensitive substring matching, and empty result handling. Lacks details on performance or rate limits but covers key behaviors well given no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences covering purpose, usage alternative, and behavioral details. No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, alternatives, behavior, and return format ('matching event summaries with type and timestamp'). Output schema exists, so return details are complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description repeats some schema info but adds minimal new parameter-specific meaning beyond the schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Plain-text search across all logged events' and distinguishes from sibling tool get_summary by positioning itself as a token-efficient alternative for keyword matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names get_summary as the alternative and specifies when to use this tool: 'when you only need events matching a keyword'. Provides clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v0.2.0- Added
get_plan
1 tool update
v0.1.5- Changed
record_fix1 field changed- added
Input schema / properties / issue_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional zero-padded issue ID (e.g., '0042') to close. When omitted, closes the active issue. Numeric strings without padding are accepted.", + "title": "Issue Id" +}
1 tool update
v0.1.4- Changed
add_decision1 field changed- added
Input schema / properties / supersedesAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional event id (evt_...) of a prior decision this one retires. The old event stays in the log tagged (superseded); only the new decision appears in summary.md. Use when precheck_file flags a decision as possibly stale and you are revising it.", + "title": "Supersedes" +}
10 tool updates
v0.1.3- Changed
add_decision2 fields changed- added
Input schema / properties / location / descriptionAdded value: +"Optional file path or scope where the decision applies (e.g., 'src/auth/' for a module-level choice). Helps precheck_file cite the decision when the file is later touched." - added
Input schema / properties / summary / descriptionAdded value: +"One-line description of the architectural or product decision (e.g., 'use bcrypt rounds=12 for password hashing'). Becomes part of the project's permanent record — write it for a future contributor."
- Changed
add_note2 fields changed- added
Input schema / properties / location / descriptionAdded value: +"Optional file path or library this note applies to (e.g., 'bcrypt' for a library-specific gotcha)." - added
Input schema / properties / summary / descriptionAdded value: +"One-line description of the gotcha, setup detail, or context worth preserving. Prefix with 'gotcha:' or 'lesson:' to enable cross-project promotion — e.g., 'gotcha: bcrypt v4 silently truncates passwords longer than 72 bytes'."
- Changed
get_context4 fields changed- added
Input schema / properties / focus / descriptionAdded value: +"Optional path prefix or keyword to bias selection toward (e.g., 'src/auth/'). When omitted, the context is project-wide." - added
Input schema / properties / tokens / descriptionAdded value: +"Approximate target token budget for the returned markdown (default 2000). Output may be slightly over or under as events are included as whole units. Recommended range: 500-8000." - added
Input schema / properties / tokens / maximumAdded value: +20000 - added
Input schema / properties / tokens / minimumAdded value: +100
- Changed
get_global_gotchas1 field changed- added
Input schema / properties / library / descriptionAdded value: +"Optional library name to filter by (case-insensitive substring match — 'react' also matches 'react-router'). When omitted, returns all gotchas across every library — useful when starting a new feature to scan for any relevant past lessons."
- Changed
get_issue1 field changed- added
Input schema / properties / issue_id / descriptionAdded value: +"Zero-padded 4-digit issue ID returned by log_issue (e.g., '0042'). Numeric strings without padding (e.g., '42') are also accepted."
- Changed
log_issue2 fields changed- added
Input schema / properties / location / descriptionAdded value: +"Optional file path or component where the issue manifests (e.g., 'src/auth.py' or 'login/double-submit'). Used by precheck_file to surface this history later." - added
Input schema / properties / summary / descriptionAdded value: +"One-line description of the bug or unexpected behavior (~140 chars recommended). Becomes the issue title and is matched by search_events."
- Changed
precheck_file1 field changed- added
Input schema / properties / file_path / descriptionAdded value: +"Project-relative or absolute file path to check (e.g., 'src/auth.py'). Matched against the `location` field of logged events — no file content is read from disk. Returns 'no warnings' if the file has no failure history."
- Changed
record_attempt5 fields changed- added
Input schema / properties / issue_id / descriptionAdded value: +"Optional zero-padded issue ID (e.g., '0042') to attach this attempt to. When omitted, attaches to the active issue; if no active issue exists, an implicit parent issue is auto-created from this attempt's text." - added
Input schema / properties / location / descriptionAdded value: +"Optional file path or component touched by this attempt." - added
Input schema / properties / outcome / descriptionAdded value: +"Result of the attempt. Must be exactly one of 'worked', 'failed', or 'partial'. Defaults to 'failed' — the safer default when an outcome is uncertain." - added
Input schema / properties / outcome / patternAdded value: +"^(worked|failed|partial)$" - added
Input schema / properties / summary / descriptionAdded value: +"One-line description of what you tried (e.g., 'tried contain: layout — preview still jumps')."
- Changed
record_fix2 fields changed- added
Input schema / properties / location / descriptionAdded value: +"Optional file path or component where the fix was applied." - added
Input schema / properties / summary / descriptionAdded value: +"One-line description of the confirmed fix (e.g., 'guarded submit handler with isSubmitting ref')."
- Changed
search_events4 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of matching events to return (most recent first). Defaults to 10. Recommended range: 1-100." - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - added
Input schema / properties / query / descriptionAdded value: +"Case-insensitive substring matched against each event's summary and notes. Plain text only — no regex or boolean operators."
14 tool updates
v0.1.1- First observed
add_decision - First observed
add_note - First observed
get_context - First observed
get_global_gotchas - First observed
get_instructions - First observed
get_issue - First observed
get_project_map - First observed
get_score - First observed
get_summary - First observed
log_issue - First observed
precheck_file - First observed
record_attempt - First observed
record_fix - First observed
search_events
TDQS
Each tool has a clearly distinct purpose: adding vs reading, memory vs issues, etc. Even similar tools like get_summary and get_context serve different needs (full summary vs token-budgeted focused context).
All 14 tools follow a consistent verb_noun pattern in snake_case (e.g., add_decision, get_context, log_issue), making the set predictable and easy to navigate.
14 tools is well-scoped for project memory management, covering creation, retrieval, issue lifecycle, search, and cross-project memory without being overwhelming.
The tool surface comprehensively covers the domain: adding memory (decisions, notes), reading various views, full issue lifecycle (log, attempt, fix), search, and a precheck utility. Missing update/delete is intentional.
Maintenance
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
Shared memory for coding agents. Stop re-explaining your codebase every session.
Persistent cross-session memory shared by Codex, Claude Code, ChatGPT, and other AI agents.
Shared memory for AI coding agents. Save once, reuse from Cursor, Claude Code, Codex.
Persistent memory for AI agents — verbatim conversations, searchable by meaning.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceA robust server for managing long-term agent memory using Mem0, providing efficient storage and retrieval of agent memories with a lightweight Python-based implementation.-
- AlicenseAqualityDmaintenanceProvides versioned, structured memory for AI agents, allowing them to store facts, detect conflicts, and track knowledge history via a hosted SaaS platform. It enables efficient hierarchical information retrieval and semantic search while keeping token usage constant as memory scales.7248Apache 2.0
- AlicenseBqualityBmaintenancePersistent memory and session intelligence for AI coding assistants. Auto-tracks mistakes, decisions, and context via hooks. Mines your full session history for patterns, predictions, and cross-session search.2116MIT
- AlicenseNot gradedqualityBmaintenanceProvides a memory layer for AI coding agents with Git-powered version control, enabling automatic tracking of prompts, context, and code diffs.192MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/riponcm/projectmem'
If you have feedback or need assistance with the MCP directory API, please join our Discord server