brain
A personal memory engine for storing, searching, and retrieving durable facts and past session knowledge using hybrid full-text (BM25) + semantic search.
recall— Search across your knowledge base with hybrid search:Query memories (curated facts), episodes (past Claude Code session transcripts), and summaries (session digests)
Filter by scope (
all,episodes,memories,summaries), project, or date range (since/untilas ISO date or relative like7d)Control result count with
k(default 6); results ranked by recency- and kind-weighted RRF score in(0, 1]
get_episode— Fetch full text and metadata for a specific recall hit by its stable ID (ep_…,mem_…, orsum_…); text capped at 8,000 characters.remember— Persist a new durable memory:Written as a markdown file, auto-committed to git, and immediately indexed
Classify by type:
user,feedback,project, orreferenceNear-duplicate detection prevents redundant writes (override with
force=true)Returns a stable
mem_…ID on success
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@brainwhat do I know about project onboarding?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
brain
A personal memory engine and MCP server: hybrid RAG (SQLite FTS5 + vector search) over a git-backed markdown store.
Replace
OWNERin the CI badge with your GitHub account once you push this to a repo.
Why
An LLM's context is amnesiac: everything it learns about you, your projects,
and your decisions evaporates when the session ends. brain fixes that by
persisting durable facts as plain markdown in git — the kind of store you can
read, edit, grep, and diff by hand — and making it recallable to any MCP
client through hybrid search. The markdown is the source of truth; the search
index is a rebuildable cache you can delete at any time.
Related MCP server: mem-persistence
Architecture
SOURCE OF TRUTH (markdown + git) DERIVED INDEX (rebuildable)
┌───────────────────────────────────┐ ┌─────────────────────────┐
│ memories/ curated facts │ │ cache/brain.db │
│ summaries/ session digests │─────▶│ ── FTS5 (BM25) │
│ ~/.claude/… ingested transcripts│ ingest ── sqlite-vec (256-d │
│ (episodes) │ │ nomic-embed vectors)│
└───────────────────────────────────┘ └───────────┬─────────────┘
▲ │
│ writes auto-commit │ hybrid recall
│ (optional push to a private remote) ▼
┌───────────┴───────────┐ ┌─────────────────────────┐
│ remember(fact,type) │◀──── MCP ────────▶│ recall(query,k,scope) │
│ │ (stdio) │ get_episode(id) │
└───────────────────────┘ └─────────────────────────┘
any MCP client (Claude Code, …)Three kinds of memory.
memories/*.mdare curated, durable facts (preferences, runbooks, per-project state notes).summaries/YYYY-MM/*.mdare per-session digests. Episodes are ingested Claude Code transcripts (read from~/.claude/projects/**.jsonl). The first two are git-tracked text you own; episodes derive from live transcripts — though on an emitting host, ingest also writes each episode as a git-tracked file underepisodes/YYYY/MM/, so a transcript-less machine can index them bygit pullalone (see Running across two machines).The index is a cache.
cache/brain.dbholds an FTS5 table and asqlite-vectable of 256-dimension nomic-embed-text-v1.5 vectors (Matryoshka-truncated from 768). It is always rebuildable and never committed — delete it freely andbrain-ingest --fullrecreates it.Hybrid recall. Each query runs both a lexical (FTS5/BM25) and a semantic (vector) leg; the two rankings fuse via reciprocal-rank fusion, then a prior re-weights by kind (a curated memory outranks a raw episode at equal evidence) and recency (exponential decay with a per-kind half-life, floored so age never fully erases relevance). Every hit carries a
scorein(0, 1]. The whole ranking surface is env-tunable — see Configuration.Durability & sync. Memory writes auto-commit, so a fact is safe the moment it is written. Point
originat any private git remote you control and the markdown store syncs across machines; the index never leaves the box. Sync is off unless you configure a remote, and hard-disabled withBRAIN_SYNC=0.
Quickstart
Requires uv and Python 3.12+. This repo ships a
tiny synthetic store under examples/ so you can try recall without any data
of your own.
uv sync # install deps into .venv
# Build the index over the shipped examples only.
# BRAIN_CLAUDE_PROJECTS points at an empty dir so no real transcripts are read;
# drop it to also ingest your own ~/.claude/projects transcripts.
BRAIN_DIR=$PWD/examples BRAIN_CLAUDE_PROJECTS=$(mktemp -d) \
uv run brain-ingest --full
# Hybrid recall from the shell.
BRAIN_DIR=$PWD/examples uv run brain-recall "postgres backup"Expected top hit:
scope=all
mem_… memory 2026-01-12 … score=0.67… How the demo acme-webapp Postgres database is backed up each night. …Register the MCP server with Claude Code (or any MCP client that speaks stdio):
claude mcp add brain -- uv run --directory "$PWD" brain-serverNeed a read-only server — e.g. behind a gate that requires every exposed tool to be auto-allowable? Register
brain-server-readonlyinstead; it exposes onlyrecall+get_episode, dropping therememberwrite that such a gate would reject.
Write a fact mid-session from the shell (brain-remember reads one JSON object
from stdin — only fact is required):
echo '{"fact": "Staging DB resets nightly at 03:00 UTC.", "type": "reference"}' \
| uv run brain-rememberFirst run downloads the embedding model (nomic-embed-text-v1.5, a few hundred MB) to
$FASTEMBED_CACHE_PATH(defaultcache/fastembed/, gitignored). Subsequent runs are instant. Everything runs locally — no API key, no external inference calls.
Commands
Every entry point is a console script; run it with uv run <name>.
Command | What it does |
| Incrementally index memories, summaries, and episodes — from live transcripts or committed episode files ( |
| MCP stdio server exposing |
| Read-only MCP stdio server: |
| Hybrid search / full-text fetch from the shell (no MCP needed). |
| Write a durable memory from the shell (dedup-guarded, auto-commits). |
|
|
| Recall/open telemetry report (feeds the consolidation pass). |
|
|
|
|
| Wrapper that triggers a headless consolidation pass when debt accrues. |
| Refreshes |
Memory file format
A memory is YAML frontmatter plus a markdown body (the same shape Claude Code uses for auto-memory), so it stays readable and hand-editable:
---
name: postgres-nightly-backup
description: How the demo acme-webapp Postgres database is backed up each night.
metadata:
type: reference
date: 2026-01-12
---
The acme-webapp production Postgres runs a nightly logical backup at 02:00 UTC…name— kebab-case slug (defaults to the filename).description— one line; indexed alongside the body.metadata.type— one ofuser(preferences),feedback,project(per-project living state notes),reference(facts/runbooks).date— optional ISO date; drives recency decay.
See examples/memories/ for one of each kind, and
examples/summaries/ for the session-digest format.
Configuration
All configuration is environment variables with sensible defaults — see
src/brain/config.py for the full surface. Highlights:
Variable | Default | Purpose |
| the repo root | Root of the markdown store + |
|
| Colon-separated list of transcript roots (each included only if it exists). |
|
| Episode source: |
| inherits | Comma-separated cwd/project substrings whose episodes get no git-tracked |
|
| Where the embedding model is cached. |
|
| Embedder inference batch size; lower it on small-RAM boxes (32 can OOM a 2 GB box). |
|
| onnxruntime intra-op thread cap for the embedder. |
|
| DB paging chunk size for the embedding backfill. |
| on (if remote set) |
|
| unset |
|
|
| Max freshness-audit refresh agents per run. |
|
| Per-refresh-agent timeout (seconds) in the freshness audit. |
|
| Reciprocal-rank-fusion damping constant. |
|
| Per-kind rank multipliers. |
|
| Per-kind recency half-lives. |
|
| Floor the recency factor decays toward. |
Optional integrations (Claude Code)
These are conveniences for a Claude Code workflow and are entirely optional —
the core (ingest + recall/remember + MCP server) has no dependency on
them.
Ambient auto-recall — a
UserPromptSubmithook (brain-hook) that runs a fast, read-only FTS pass on every prompt and silently injects the strongest matching memories as context.SessionStart injection —
brain-session-startinjects a project's rolling state note when a session opens, stamped with a freshness banner.Skills —
skills/reflect(consolidation pass),skills/catchup(deep resume), andskills/handoff.Reflect triggering — on a workstation, consolidation is triggered solely by the in-process reflection-debt spawn from the MCP server (no cron or scheduled job); on an always-on box, a systemd timer runs
brain-autoreflect --if-debt. See Running across two machines.
Design docs for these live under specs/.
How multi-machine sync works (optional)
The markdown store can sync across machines through any private git remote you control — there is nothing brain-specific about it:
git remote add origin <your-private-repo> # e.g. git@github.com:you/brain.git
git config user.name "Your Name" # any identity you like
git config user.email you@example.com
git push -u origin maincache/brain.db is rebuildable and never pushed. Sync auto-detects the
remote: with no origin, brain behaves exactly as a local-only store, zero
config. BRAIN_SYNC=0 disables it entirely regardless of remote. memories/
and proposals/ carry a merge=union attribute so concurrent edits from two
machines concatenate losslessly rather than conflict; the next consolidation
pass dedups them. See specs/git-sync.md for the full
design.
Memory commits record provenance as git trailers (Session, Project,
Host) so you can audit which machine and session produced each fact.
Running across two machines (split-host)
The store is built to run split across an emitting workstation and an always-on box (a small VM), both talking to the same markdown store through the private remote from How multi-machine sync works. They divide the labour:
The workstation emits. It has the live Claude Code transcripts, so its
brain-ingestparses them, writes new memories, and — the key part — emits one markdown file per episode underepisodes/YYYY/MM/<id>.md. Unlikecache/(gitignored),episodes/is git-tracked and committed (asbrain-ingest: emit N episodes) and pushed to the remote. The workstation runs its MCP server withBRAIN_NO_AUTOREFLECT=1, so it never spends a reflect itself — it delegates that to the box.The always-on box indexes. It has no transcripts of its own, so it
git pulls and indexes straight from the committed episode files, then runs the maintenance loops on a timer. It setsBRAIN_INGEST_SOURCE=episodesso ingest readsepisodes/**/*.mdonly and never scans, emits, or commits transcripts — important because the box accrues its ownclaude -preflect transcripts thatautowould otherwise wrongly index and re-emit.
Episode source selection (BRAIN_INGEST_SOURCE)
Value | Behaviour |
| If transcripts are present, transcript mode (parse + emit episode files); otherwise, if episode files are present, episode-file mode. |
| Index |
| Force transcript mode. |
A transcript-less box therefore stays current on episodes purely by git pull.
See specs/episodes-in-git.md.
reflect triggering
There is no nightly cron or scheduled OS job. reflect is triggered one way per host:
On the workstation, solely by the in-process reflection-debt spawn from the MCP server: when accrued debt crosses the threshold, the server spawns a headless consolidation pass.
BRAIN_NO_AUTOREFLECT=1disables it (as the split-host workstation does).On the always-on box, by a systemd timer running
brain-autoreflect --if-debt— a debt-gated reflect that only spends aclaude -p /reflectwhen reflection debt has actually accrued.
systemd timers (deploy/vm/)
The deploy/vm/ dir ships user-level systemd units (plus a README)
for the always-on box:
brain-reflect.timer(hourly, jittered) runsbrain-ingest, thenbrain-autoreflect --if-debt.brain-freshness-audit.timer(daily) runsbrain-ingest, thenbrain-freshness-audit: it sweeps thememories/*-state.mdproject notes, reuses the SessionStart STALE rule (repo drift or enough new episodes since the note was written) to find notes that have fallen behind their project, and dispatches one Opus refresh agent per stale note to rewrite it in-format and auto-land it. Runs are bounded byBRAIN_AUDIT_MAX_REFRESH(default 3) agents; contradictions, archival candidates, and filename mapping-failures are written out asproposals/needs-user-<date>-<note>.mdfor a human instead.
Scope & honesty
Single-user personal project. Extracted from a working personal system and published with fresh git history — not a hardened multi-tenant service.
Developed on macOS. The core is pure Python and portable. The only platform-specific pieces are optional deployment glue: the workstation runs on macOS, and the always-on box uses Linux user-level systemd units (
deploy/vm/).Local embeddings. Vectors are computed locally via fastembed — no API key and no external inference calls. (CI runs FTS-only, since the model download and native
sqlite-vecwheel may be unavailable on the runner; recall degrades gracefully to lexical-only when the vector table is absent.)Sync is bring-your-own and off by default. Nothing leaves your machine unless you add a private remote.
License
MIT.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Tools
Related MCP Servers
- Flicense-qualityCmaintenanceMCP server providing persistent memory for LLMs via semantic search over captures, structured facts with temporal tracking, and document ingestion. Enables any MCP-compatible client to maintain a searchable knowledge base across sessions.Last updated
- Alicense-qualityBmaintenancePersistent memory MCP server that stores and retrieves memories in Markdown files, enabling shared context across multiple AI agents with hybrid search and deduplication.Last updatedMIT
- AlicenseAqualityAmaintenanceA self-hosted MCP server that gives AI agents shared, long-term memory over a git-backed folder of markdown, enabling persistent knowledge search, read, and write without a database.Last updated16549MIT
- Alicense-qualityBmaintenanceMCP server that provides agentic memory management for markdown vaults, enabling hybrid search, governed writing, and maintenance of episodic, semantic, procedural, and working memories for LLM agents.Last updatedMIT
Related MCP Connectors
User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.
Local-first RAG engine with MCP server for AI agent integration.
Person-owned, portable AI memory as a remote MCP server, readable and writable by any MCP client.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sysangel/brain-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server