A local MCP server that gives any agent permanent memory across every Claude Code session.
Read tools for search and recall. Write tools for tags and threads. Audit log on by default. Rate-limited. Bound to 127.0.0.1. Built on the open Model Context Protocol so any MCP-aware agent can call it.
Install
Claude Code
Open Claude Code and run:
/plugin install claude-recallOne command. The MCP server auto-connects. No config files, no JSON editing.
Manual setup (any MCP client)
Add this to your MCP client config. Works with Claude Code, VS Code, Cursor, or any tool that speaks MCP:
{
"recall": {
"command": "npx",
"args": ["-y", "@clauderecallhq/cli", "mcp"]
}
}Tools the agent can call
33 tools total: 14 read (always available) and 19 write (require --allow-writes or RECALL_MCP_ALLOW_WRITES=1).
Read (14)
Core
list_projectsEvery Claude Code project with session/message counts and latest activity.list_sessionsRecent sessions with alias, tags, message counts; filters: project, tag, date range.list_tagsEvery tag with counts, most popular first.list_sessions_to_tagSurface untagged or partially-tagged sessions for review.apply_tagsAdd tags to a session (merge-mode, never deletes).searchFull-text search across sessions; supports inline #tag-name tokens; BM25 + optional vector fusion.find_similar_sessionsProFind semantically similar sessions using vector embeddings.semantic_statusProHealth snapshot of semantic search: model, worker, queue depth.get_sessionFetch full session metadata and ordered messages.context_for_sessionRender session as condensed markdown, ready to inject.recall_neighborhoodBundle parents/children/citations/similar sessions as one budget-bounded markdown blob.
Threads
thread_listAll threads, newest first; can exclude archived.thread_getFull thread detail with every session edge.thread_for_sessionReturn non-archived threads referencing a session.
Write (19)
Require --allow-writes flag. Rate-limited (default 60/min), zod-validated, and audited.
Metadata
add_tagApply single tag; normalized server-side.remove_tagRemove tag; recorded in append-only log.set_aliasSet human-friendly session alias; previous alias archived.append_noteAppend markdown to session note; separated by ---.create_collectionCreate new collection; optional parent, icon, color.add_session_to_collectionAdd session to collection; idempotent.remove_session_from_collectionRemove session; recorded in append-only log.
Threads
thread_createCreate thread, optionally seed with origin session.thread_add_sessionAttach session; role=origin or child.thread_set_parentChange parent within thread; null clears parent.thread_remove_sessionDetach session from thread.thread_renameChange thread display name.thread_closeMark thread as closed (sets closed_at).thread_reopenClear closed_at on closed thread.thread_archiveSoft-delete thread; hidden by default.thread_mergeMove all edges from source to dest, delete source.thread_splitPeel sessions into new thread.sync_active_sessionsCapture currently-active terminals in a repo into a thread (Captain Code Pattern).generate_thread_titlesGenerate coherent titles for sessions in thread DAG.
Write tools never delete user data. Tag removal and session detach are recorded in append-only logs. Three-layer durability holds for everything written through MCP, the same as for human writes.
Why MCP, not a wrapper API
MCP is the protocol Claude Code already speaks for tool use. Building Claude Recall as a first-class MCP server means agents call it the same way they call file edits or web fetches. No glue code. No custom adapter. No extra latency.
Audit log and rate limits
Every MCP call is appended to an on-disk audit log under ~/.recall/audit/. You can grep it. The MCP server enforces a per-tool rate limit so a runaway agent loop cannot saturate it. Default limits are conservative; configurable in the daemon settings.
Example agent prompt
Drop something like this into a fresh Claude Code session and the agent will reach into your history without you having to drive:
Find the session where I last touched the auth retry logic.
Pull condensed context for it. Tell me what I changed and what was still broken.The agent calls search, then context_for_session, and answers from the retrieved context. No human session-id juggling.
Privacy posture
- Bound to
127.0.0.1. Never on a public interface. - No outbound network calls.
- No telemetry on MCP usage.
- Audit log is local. We never see it.