Skip to main content
Glama
README.md
# recollect

**Local, cross-agent memory for AI coding agents.** One SQLite file on your machine, shared by Claude Code, Codex CLI, Gemini CLI, Cursor — anything that speaks MCP. Start a task in one agent, finish it in another.

- **Local-first** — a single file at `~/.recollect/memory.db`. No cloud, no Docker, no daemon.
- **Cross-agent** — every agent spawns the same stdio MCP server against the same database (SQLite WAL handles concurrency).
- **Sessions + facts** — resumable work sessions (summary, decisions, open threads, running log) and durable long-term memories.
- **Fast keyword search** — SQLite FTS5, works offline, zero extra dependencies.
- **Never trapped** — `recollect export` dumps everything to plain Markdown.

## Install

```bash
# Claude Code
claude mcp add recollect -- npx -y recollect-mcp

# Codex CLI
codex mcp add recollect -- npx -y recollect-mcp

# Gemini CLI, Cursor, Windsurf, Cline, … (JSON config)
{
  "mcpServers": {
    "recollect": { "command": "npx", "args": ["-y", "recollect-mcp"] }
  }
}
```

That's it. Each agent gets the same tools; they all read and write the same database.

## Tools

| Tool | Purpose |
|---|---|
| `memory_save` | Store a durable fact (preference, convention, decision, gotcha). Dedupes; supports superseding old facts. |
| `memory_search` | FTS5 keyword search, most relevant first. Project scope includes globals. |
| `memory_list` | Browse recent memories, paginated. |
| `memory_update` | Edit content/tags/importance in place. |
| `memory_delete` | Remove a memory. |
| `session_start` | Open a work session for the current task. |
| `session_log` | Append a progress note to the active session. |
| `session_end` | Close with a handoff-quality summary, decisions, and open threads. |
| `session_resume` | **The handoff primitive** — recent sessions (active first) with logs, from any agent. Leads with the project brief. |
| `session_search` | FTS across session metadata *and* individual log entries. |
| `project_brief` | Your standing instructions for a project (stack, conventions, do-not-touch), curated in the web UI. |
| `context_resume` | **One-call startup**: brief + recent sessions + recent memories together. |

Plus a `resume-work` MCP prompt and a `memory://recent/{project}` resource for clients that support them.

Memories and sessions are scoped to a **project**, identified by the normalized git remote (`github.com/user/repo` — identical on every machine that clones the repo), falling back to the git root or directory name; `RECOLLECT_PROJECT` overrides. Global memories surface everywhere.

**Secrets:** memories are plaintext and may sync across machines. Agents are instructed never to store credentials, and `memory_save` (plus the CLI and UI) rejects content matching well-known secret formats — store a pointer to your password manager instead.

## Web UI

```bash
recollect ui          # opens http://127.0.0.1:7777
```

Browse every project, search memories and session logs, add/edit/delete memories, and — most usefully — write a **project brief**: a description plus standing notes ("Laravel 11 API, deploys via Forge, never touch the billing module"). Agents receive the brief through `project_brief` and at the top of `session_resume`, so anything you write there becomes permanent instructions for every agent. Loopback-only by design.

## Multiple machines

Run one recollect as the shared hub on any small server (a Forge box, a VPS, a home machine on Tailscale):

```bash
recollect serve --http --port 8787 --token "$RECOLLECT_TOKEN"
```

Then pick a mode per machine:

**Synced (recommended)** — local-first with invisible background sync. Agents keep using the fast local database (and keep working offline); recollect syncs with the hub on start, shortly after every write, and immediately when a session ends. Deletes propagate; conflicts resolve last-write-wins.

```bash
recollect connect https://memory.example.dev --token "$RECOLLECT_TOKEN"
# that's it — every agent on this machine now shares the hub's memory
recollect sync          # manual sync, if you want one
recollect disconnect    # back to local-only
```

**Remote** — agents talk to the hub directly over streamable HTTP (zero local state, online-only). See [docs/remote.md](docs/remote.md) for per-agent connection snippets.

Sync design details (ULID ids, tombstones, clock-skew-safe cursors): [docs/sync.md](docs/sync.md).

## CLI

The same binary doubles as a CLI — so agents *without* MCP support (or you, in a terminal) can still use the memory:

```bash
recollect search "auth refactor"          # search memories
recollect search --sessions "webhooks"    # search sessions
recollect save "Deploys go via Forge" --tags deploy --importance 4
recollect sessions --project api          # recent sessions
recollect export                          # dump everything to Markdown
recollect stats                           # what's in the database
```

## Configuration

| Env var | Default | Purpose |
|---|---|---|
| `RECOLLECT_DB` | `~/.recollect/memory.db` | Database file location |
| `RECOLLECT_PROJECT` | cwd basename | Default project scope |
| `RECOLLECT_AGENT` | MCP client name | Attribution recorded on writes |

## Why not …?

**OpenMemory / mem0** — great, but Docker + Postgres + Qdrant for personal memory is a lot of machinery. This is one file. **Markdown handoff files** — portable but unsearchable and per-project; recollect gives you FTS across everything you've ever done. **Built-in agent memory** — lives inside one vendor's tool; the whole point here is that memory belongs to *you*, not the agent.

## Development

```bash
npm install
npm run lint     # typecheck
npm test         # vitest
npm run build    # tsup → dist/
node dist/index.js help
```

Test the MCP surface interactively:

```bash
npx @modelcontextprotocol/inspector node dist/index.js
```

## Roadmap

Optional semantic search (local embeddings via Ollama + sqlite-vec), Markdown import, memory decay/dedupe heuristics, TUI browser.

## License

MIT