To give Claude persistent memory across every conversation, keep the state outside the assistant and give it two operations against it: read what is known, and ask what has changed since it last looked.
Three things:
The transcript is what was said, and Claude handles it.
The dossier is the standing facts that should survive every session: your stack, your conventions, the corrections etc, which today lives in a CLAUDE.md that is scoped to one repo on one machine and exists only where you remembered to put it.
The diff is what changed since Claude last looked, and nothing in the assistant layer produces it, because producing it requires knowing when the last look happened and what has landed since.
You can build the crude version this afternoon with a dossier file at a path Claude reads first and a run log with a timestamp on every entry. The timestamp is the whole trick, since a memory system with no since parameter makes every session re-derive context it already had.
A read replica does not re-read the primary at startup; it reads the write-ahead log from its last known position and applies what it missed, which is why replication scales and why a full re-sync is the thing you page someone about.
Session memory today is the full re-sync, spending the context window on material it already processed last week and still missing whatever arrived through a channel it never watches.
The fix is to expose the log. Fulcra's MCP server does this with get_data_updates(start_time, end_time), which filters on when records synced rather than on the records' own timestamps (last night's sleep arrives this morning) and returns two keys: data_types, mapping each type that had records land in the window to a count, and file_changes, the files added, changed, or removed. Claude asks one question, gets back a short list of what is new, and reads only that.
https://docs.fulcradynamics.com/agent-get-started.txt into Claude Code and let it connect itself, or run the server locally over stdio:{
"mcpServers": {
"fulcra_context": {
"command": "uvx",
"args": ["fulcra-context-mcp@latest"]
}
}
}
OAuth2-capable clients can point at the hosted instance at https://mcp.fulcradynamics.com/mcp instead.
npx skills add fulcradynamics/agent-skills, or copy the folders into .claude/skills/. fulcra-prefs captures the corrections you make in passing, and fulcra-memory writes Claude's notes, identity, and daily logs as versioned files in Open Knowledge Format you can roll back.get_data_updates with the timestamp of the last one, work only the types that came back, and say nothing when nothing did.
Does this replace CLAUDE.md or Claude's built-in memory?
No, and keep both. Claude's memory handles the transcript, CLAUDE.md handles what is specific to that repo, and the store holds the standing facts plus the changes that never appeared in any conversation.
Am I trading one lock-in for another?
MCP is an open protocol rather than a private integration, the server source is public and runs locally over stdio with uvx fulcra-context-mcp@latest, and memory backups are written in an open format you can read with something else.
What is the fastest way to do this?
Paste docs.fulcradynamics.com/agent-get-started.txt into your agent, let it walk the connection, and sign up at fulcradynamics.com. If you would rather run it yourself, fulcra-context-mcp is the self-hosted route.
Connect the store tonight, then open tomorrow's session by asking Claude what changed while you were asleep.
Fulcra was designed by people who get privacy and know the importance of an infrastructure solution that can be the secure private datastore for the rest of your life. Here data is yours, under your control, and only shared with the people and tools you choose to share it with.