Skip to main content
Glama


🚀 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 projectmem

2. Find the projects you already have

pjm doctor

It 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 --fix

4. Point your AI at all of them with one config

"mcpServers": {
  "projectmem": {
    "command": "/absolute/path/to/python",
    "args": ["-m", "projectmem.mcp_server"]
  }
}

No --root, no cwd — that's what makes it serve everything. Per-client instructions (Claude Desktop, Claude Code, Cursor, Antigravity, Codex) are in MCP Integration; pjm init prints 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 doctor

Add --online if you also want it to tell you when a newer projectmem is out — projectmem makes no network calls otherwise, and --auto turns 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 init

Your 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

Complete setup guide

The full walkthrough on the web — install, MCP setup per client, pjm doctor, your first logged issue, and both dashboards. Every terminal output is captured from a real run.

TUTORIAL.md

15-minute step-by-step walkthrough — set up projectmem on your own project, watch the lifecycle, see the pre-commit warning fire.

CHANGELOG.md

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.

Research paper (arXiv:2606.12329)

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.

LICENSE

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 init

That'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. A pjm alias 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 project
log_issue(summary="stars come back empty", project="ossdrop")
→ Logged issue #0019 → ossdrop: stars come back empty

Every 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 FastMCP and left the old import path raising — since 2026-07-28 every new pip install projectmem got 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 dashboardpjm dashboard is one page over every project you've pjm 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 --serve for a tiny, ephemeral live server where the Refresh button re-reads your files — no background daemon, Ctrl+C stops it.

  • 🧬 Structure & relationspjm map --build (run automatically at pjm 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.md records what happened; plan.md records 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" / MCP get_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 .webm clip 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 the events.jsonl cylinder. 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 Warningspjm precheck warns 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"), and pjm precheck --snooze 2h silences 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 brief answers "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-md compiles 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 Injectionpjm 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 Scorepjm score outputs 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 visualize opens 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 --root server refuses to write outside its own. Existing single-project setups are untouched.

  • Global Dashboard (new in 0.2.0)pjm dashboard is one cross-project view over every repo you've pjm 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; --serve for an ephemeral live server (Ctrl+C to stop).

  • Code Structure + Judgment (new in 0.2.0)pjm map --build reads 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.md holds ideas and plans (what you mean to do), kept deliberately apart from the append-only event log (what happened). pjm plan, or the MCP get_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)

plan.md

🟡

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 memorypjm 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 get_summary(), then get_issue(id) only when relevant

pjm wrap (pre-injection)

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 od

Your agent picks the project per call:

log_issue(summary="stars come back empty", project="ossdrop")
→ Logged issue #0019 → ossdrop: stars come back empty

Every 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

--root at startup

A boundary, not a default. A pinned server refuses to write elsewhere, even when asked.

2

project="…" on the call

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

pjm project use <name>.

5

The working directory

Walks up looking for .projectmem/, like git.

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.

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 found

It 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 checks

Nothing 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)

  1. Install + init. pip install projectmem, then cd into your project and run pjm init — or simply ask your AI to run it.

  2. 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.)

  3. 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…Developer tab → Local MCP serversEdit 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 run which python to find yours). Claude Desktop subprocesses don't inherit your shell PATH, so bare "python" often fails.

  • You no longer need the cwd field, and you never could rely on it. Claude Desktop's current build (with the Epitaxy / Cowork workspace system) silently ignores cwd — the server ends up running with cwd=/ 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:

  1. Global (recommended): Cursor menu → Settings… → left sidebar Tools & MCPsInstalled MCP ServersAdd Custom MCP. Paste the JSON below.

  2. 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 (run which python to find yours). Cursor subprocesses don't reliably inherit your shell PATH.

  • Don't bother with the cwd field. Cursor — like Claude Desktop — silently ignores it: the server ends up running with cwd=~. 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:

  1. Open the Agent window (the chat panel on the right).

  2. Click the ⋯ Additional Options button in the panel header.

  3. Choose MCP ServersManage MCP ServersAdd 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 (run which python to find yours). Codex subprocesses don't reliably inherit your shell PATH.

  • You no longer need --root or cwd. Earlier releases passed --root as defense in depth (the cwd field 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" to args only if you want this server locked to a single repo.

  • Set your reasoning effort to medium or higher. On low-reasoning Codex skips get_instructions from 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

get_instructions()

Start of every session — load workflow rules

get_summary()

Start and end — distilled project memory

get_project_map()

Start — understand repo structure

get_plan()

Read plan.md — the ideas + plans (intent), separate from the event log

precheck_file(path)

Before editing any file — surface failure history

get_issue(id)

Read one specific issue's full history by ID

search_events(query)

Plain-text search across all logged events

get_context(tokens, focus)

Token-budgeted memory block with optional focus filter

get_score()

A+→F prevention score + ROI numbers

get_global_gotchas(library)

Cross-project library lessons inherited from past repos

Write-side (5 tools):

Tool

When to use

log_issue(summary, location)

Immediately when encountering a bug

record_attempt(summary, outcome)

Immediately after each fix attempt (outcome: failed/partial/worked)

record_fix(summary)

After confirming a fix resolves the issue

add_decision(summary, supersedes?)

When making architectural / design decisions; pass supersedes to retire a stale decision without losing history

add_note(summary)

When discovering gotchas, setup details, or constraints

CLI Reference

Core memory

Command

Purpose

pjm init

Initialize memory + auto-install hooks + inherit global memory

pjm log <text>

Start a new issue / debugging session

pjm attempt <text> [--failed|--worked]

Record a fix attempt outcome

pjm fix <text> [--issue <id>]

Record the confirmed fix and close the issue — --issue targets a specific one (new in 0.1.5)

pjm decision <text> [--supersedes <id>]

Record an architectural decision; optionally retire a prior one (old event stays in the log, tagged)

pjm note <text>

Record durable context or a gotcha

pjm plan ["idea"]

Print plan.md (ideas + plans); with text, append an idea. Intent, not an event (new in 0.2.0)

pjm show

Print the current summary

pjm search <query> [--failed-only]

Plain-text search across all events; --failed-only lists the project's dead ends

pjm brief

One-screen session-start briefing: warnings, stale memories, open issues, decisions, score

pjm export [--claude-md|--cursor]

Compile live memory into CLAUDE.md / .cursorrules for agents without MCP

Intelligence layer

Command

Purpose

pjm watch [--daemon|--stop|--status]

Real-time file churn watcher

pjm precheck [--snooze 2h|--unsnooze]

Warn about repeating failed approaches before commit; snooze politely (audited) when needed

pjm wrap <agent>

Inject token-budgeted memory into Claude/Cursor/Aider

pjm context [--tokens N]

Generate token-budgeted project context

pjm score [--format text|json|badge]

Letter-grade prevention score

pjm global <action>

Manage cross-project memory

Projects (global MCP)

Command

Purpose

pjm doctor [--fix] [--path P] [--online]

Find unregistered projects, stale entries and pinned client configs. --online also asks PyPI for the newest release; --auto remembers to check daily (new in 0.3.0)

pjm project list

Every project this server can reach, and which one is active (new in 0.3.0)

pjm project scan <dirs> [--depth N] [--dry-run]

Walk for projects with memory and register them

pjm project register [path] [--alias a]

Add a project that already has memory (pjm init registers automatically)

pjm project use [name]

Set the default project for calls that name none; omit the name to clear it

pjm project alias <name> <alias>

Give a project a shorter name

pjm project tag <name> <tag> [--remove]

Tag a project

pjm project remove <name>

Forget a project — its repo and .projectmem/ are untouched

Visualization & utility

Command

Purpose

pjm visualize

Open the six-tab local dashboard (Overview, Story Map, ROI, Project Map, Timeline, Showoff)

pjm dashboard [--serve] [--port N]

Cross-project global dashboard over every pjm init-ed repo; default writes a static snapshot, --serve runs an ephemeral live server (Ctrl+C to stop) (new in 0.2.0)

pjm map [--build]

Print the Project Map; --build (re)builds the code structure + import graph into structure.json (a derived, gitignored cache) (new in 0.2.0)

pjm stats

Token ROI summary in the terminal

pjm backfill

Auto-populate memory from git history

pjm hooks install|uninstall

Manage git hooks manually

pjm regenerate

Rebuild summary.md from events.jsonl

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.md records what happened (append-only, never rewritten).

  • plan.md records what you intend — and you (or the AI) edit it directly, like PROJECT_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 pjm feel ergonomic

  • Model 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 projectmem at 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 tools
add_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.
ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesOne-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.
locationNoOptional 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.
supersedesNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool's simplicity (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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds context 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.

Purpose5/5

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.

Usage Guidelines4/5

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesOne-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'.
locationNoOptional file path or library this note applies to (e.g., 'bcrypt' for a library-specific gotcha).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
focusNoOptional path prefix or keyword to bias selection toward (e.g., 'src/auth/'). When omitted, the context is project-wide.
tokensNoApproximate 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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/).
ParametersJSON Schema
NameRequiredDescriptionDefault
libraryNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description clearly states the tool queries 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.

Usage Guidelines4/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool's simplicity (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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
issue_idYesZero-padded 4-digit issue ID returned by log_issue (e.g., '0042'). Numeric strings without padding (e.g., '42') are also accepted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool has only 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.

Parameters3/5

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

Schema coverage is 100%, so baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

Given the tool's simplicity (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.

Parameters4/5

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.

Purpose5/5

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

The description clearly states the tool's purpose: 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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesOne-line description of the bug or unexpected behavior (~140 chars recommended). Becomes the issue title and is matched by search_events.
locationNoOptional 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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathYesProject-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

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
outcomeNoResult of the attempt. Must be exactly one of 'worked', 'failed', or 'partial'. Defaults to 'failed' — the safer default when an outcome is uncertain.failed
summaryYesOne-line description of what you tried (e.g., 'tried contain: layout — preview still jumps').
issue_idNoOptional 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.
locationNoOptional file path or component touched by this attempt.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value 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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesOne-line description of the confirmed fix (e.g., 'guarded submit handler with isSubmitting ref').
issue_idNoOptional zero-padded issue ID (e.g., '0042') to close. When omitted, closes the active issue. Numeric strings without padding are accepted.
locationNoOptional file path or component where the fix was applied.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by 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.

Purpose5/5

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.

Usage Guidelines5/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matching events to return (most recent first). Defaults to 10. Recommended range: 1-100.
queryYesCase-insensitive substring matched against each event's summary and notes. Plain text only — no regex or boolean operators.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. 1 tool updatev0.2.0
    • Addedget_plan
  2. 1 tool updatev0.1.5
    • Changedrecord_fix1 field changed
      • addedInput schema / properties / issue_id
        Added 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"
        +}
  3. 1 tool updatev0.1.4
    • Changedadd_decision1 field changed
      • addedInput schema / properties / supersedes
        Added 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"
        +}
  4. 10 tool updatesv0.1.3
    • Changedadd_decision2 fields changed
      • addedInput schema / properties / location / description
        Added 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."
      • addedInput schema / properties / summary / description
        Added 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."
    • Changedadd_note2 fields changed
      • addedInput schema / properties / location / description
        Added value: +"Optional file path or library this note applies to (e.g., 'bcrypt' for a library-specific gotcha)."
      • addedInput schema / properties / summary / description
        Added 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'."
    • Changedget_context4 fields changed
      • addedInput schema / properties / focus / description
        Added value: +"Optional path prefix or keyword to bias selection toward (e.g., 'src/auth/'). When omitted, the context is project-wide."
      • addedInput schema / properties / tokens / description
        Added 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."
      • addedInput schema / properties / tokens / maximum
        Added value: +20000
      • addedInput schema / properties / tokens / minimum
        Added value: +100
    • Changedget_global_gotchas1 field changed
      • addedInput schema / properties / library / description
        Added 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."
    • Changedget_issue1 field changed
      • addedInput schema / properties / issue_id / description
        Added value: +"Zero-padded 4-digit issue ID returned by log_issue (e.g., '0042'). Numeric strings without padding (e.g., '42') are also accepted."
    • Changedlog_issue2 fields changed
      • addedInput schema / properties / location / description
        Added 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."
      • addedInput schema / properties / summary / description
        Added value: +"One-line description of the bug or unexpected behavior (~140 chars recommended). Becomes the issue title and is matched by search_events."
    • Changedprecheck_file1 field changed
      • addedInput schema / properties / file_path / description
        Added 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."
    • Changedrecord_attempt5 fields changed
      • addedInput schema / properties / issue_id / description
        Added 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."
      • addedInput schema / properties / location / description
        Added value: +"Optional file path or component touched by this attempt."
      • addedInput schema / properties / outcome / description
        Added 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."
      • addedInput schema / properties / outcome / pattern
        Added value: +"^(worked|failed|partial)$"
      • addedInput schema / properties / summary / description
        Added value: +"One-line description of what you tried (e.g., 'tried contain: layout — preview still jumps')."
    • Changedrecord_fix2 fields changed
      • addedInput schema / properties / location / description
        Added value: +"Optional file path or component where the fix was applied."
      • addedInput schema / properties / summary / description
        Added value: +"One-line description of the confirmed fix (e.g., 'guarded submit handler with isSubmitting ref')."
    • Changedsearch_events4 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of matching events to return (most recent first). Defaults to 10. Recommended range: 1-100."
      • addedInput schema / properties / limit / maximum
        Added value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • addedInput schema / properties / query / description
        Added value: +"Case-insensitive substring matched against each event's summary and notes. Plain text only — no regex or boolean operators."
  5. 14 tool updatesv0.1.1
    • First observedadd_decision
    • First observedadd_note
    • First observedget_context
    • First observedget_global_gotchas
    • First observedget_instructions
    • First observedget_issue
    • First observedget_project_map
    • First observedget_score
    • First observedget_summary
    • First observedlog_issue
    • First observedprecheck_file
    • First observedrecord_attempt
    • First observedrecord_fix
    • First observedsearch_events

TDQS

A4.6/5.0
Disambiguation5/5

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).

Naming Consistency5/5

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.

Tool Count5/5

14 tools is well-scoped for project memory management, covering creation, retrieval, issue lifecycle, search, and cross-project memory without being overwhelming.

Completeness5/5

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

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    A robust server for managing long-term agent memory using Mem0, providing efficient storage and retrieval of agent memories with a lightweight Python-based implementation.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    7
    24
    8
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/riponcm/projectmem'

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