Cross-session memory for Claude over MCP β prioritised briefs, supersession, cross-project recall.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Your agent's memory between sessions. Persistent, cross-project hand-off for Claude over the Model Context Protocol β it remembers the goal, the decisions, the dead-ends, and what's next, so the next session never starts from zero.
Claude forgets everything between sessions. handoff-mcp gives it a memory that
survives the context window: it tracks the progress of your work β goals,
decisions and their rationale, dead-ends, open questions, the next step β and at
the boundary of a session produces a prioritised, token-budgeted brief so the
next session resumes already knowing where you left off.
It is not a context dump. Two things make it different from similarity-based memory stores (mem0 / OpenMemory style):
Status: v0.4, early. The core (vault, brief, supersession, keyword search, cross-project recall) is tested and stable; the semantic, consolidation, importer, and multi-device sync layers are optional and newer. It leans on the agent calling the tools at the right moments β see Limitations for the honest edges.
It is also cross-project: one vault, namespaced per project. The brief is
project-scoped (where did I leave off here), but search_memory recalls across
all projects β so when you say "in one of my projects we did X", Claude can
find and pull that decision out of another project.
python examples/two_sessions_demo.py β session 1 works and stops; session 2 is
a fresh process that resumes from the brief alone.
Session 1 logs its progress (and changes its mind once):
Session 2 calls get_brief() and gets back only the current state β the
retracted JSON decision is gone:
The retracted "flat JSON file" decision never appears. The graph-linked
[[Architecture]]note is pulled in automatically. The brief is ~170 tokens.
And cross-project recall β search_memory("timeout chunking", scope="all") pulls
a decision out of a different project:
Two offline, deterministic benchmarks β no LLM, no network β so they regenerate
identically anywhere and are pinned by tests/test_benchmark.py. Full numbers,
methodology, and how to reproduce: benchmarks/RESULTS.md.
1. Supersession in isolation (benchmarks/supersession_benchmark.py). A
project's decisions evolve across 8 statements over 4 topics; each has one decision
a later one retracts (JSONβSQLite, cookiesβJWT, β¦). Retrieved by decision (so
every stale fact is reachable), the flat log vs the active view:
| mode | stale leaked | current kept |
|---|---|---|
| supersession OFF (flat log) | 4 / 4 | 4 / 4 |
| supersession ON (active view) | 0 / 4 | 4 / 4 |
Supersession removes exactly the retracted decisions while keeping every current one β and scoring current kept too means an empty answer can't pass as a win. A similarity store with no notion of one fact retiring another behaves like the OFF row.
2. Brief vs naive dump (benchmarks/brief_reconstruction.py). What a resuming
session actually reads β the budgeted, supersession-aware brief vs pasting back the
whole log. As history grows the dump balloons and keeps carrying every retraction;
the brief stays bounded (a soft cap) and contradiction-free while retaining all
key items (e.g. at 228 events: 3063β217 tokens, 14Γ, 3 contradictions β 0).
These measure the mechanism honestly rather than staging a head-to-head against another store β a fair cross-system run needs both under identical retrieval plus an LLM endpoint we can't reproduce in CI (see ADR-0008).
"Tokens" here and elsewhere in this README are estimated as
len(text) / 4(model-agnostic), not counted with a real tokenizer.
The markdown vault is the source of truth β human-readable, openable in Obsidian, your data on your disk. The SQLite + FTS5 index is derived from the vault and can be rebuilt at any time; it powers ranking, the token budget, and cross-project full-text search.
See docs/architecture.md and the
ADRs for the design rationale.
| Tool | When Claude calls it |
|---|---|
get_brief(project?, token_budget?) | At session start β load where the last session left off. |
log_event(type, content, importance?, supersedes?, supersedes_query?, project?) | As work happens β record goals, decisions, dead-ends, files, questions, next steps. supersedes retires a prior event by id; supersedes_query retires the best-matching active event of the same type when you don't have its id (ADR-0007). |
search_memory(query, scope=current|all, limit?) | When the user references past or other-project work. limit caps the number of results (default 10). Each hit includes the event id, feedable straight into log_event's supersedes. |
note_entity(name, content, project?) | To record durable project knowledge (architecture, conventions, components). |
checkpoint(summary?, project?) | At session end β finalise the session and emit the brief. Pass the same project you logged under (defaults to the session's project). |
consolidate(project?, older_than_days?) | To compress old sessions into durable notes (opt-in, needs an LLM). |
sync(remote_url?) | To sync memory across devices β pull, commit, and push the vault's private git remote (opt-in). First call with a repo URL configures it; then a bare call syncs. See Multi-device sync. |
Also exposed: an MCP resource session://brief and a prompt resume for
auto-loading the brief at the top of a session.
log_event types: goal, decision, deadend, file, question, next_step.
No subscription. No required API keys. The core is free and fully local β your memory is plain files on your disk, and handoff-mcp never phones home (no hosted service, no telemetry).
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/handoff)<a href="https://allmcps.com/mcp/handoff"><img src="https://allmcps.com/api/badge/handoff?style=directory" alt="Handoff on AllMCPs" /></a>