marm-memory
Local SQLite memory for coding agents, with recall, a code graph and a concept graph
Gives coding agents a persistent, searchable project memory stored locally in SQLite
By Gentleman-Programming Go Local · stdio Knowledge and memoryDeveloper tools
87 popularity score ★ 7.8k ↓ 5.7k/wk
Opens the app, which asks before it adds the server.
go install github.com/Gentleman-Programming/engram/v3/cmd/engram@latestclaude mcp add engram -- engram mcp{
"mcpServers": {
"engram": {
"command": "engram",
"args": [
"mcp"
]
}
}
}{
"mcpServers": {
"engram": {
"command": "engram",
"args": [
"mcp"
]
}
}
}{
"servers": {
"engram": {
"type": "stdio",
"command": "engram",
"args": [
"mcp"
]
}
}
}[mcp_servers.engram]
command = "engram"
args = ["mcp"]gemini mcp add --scope user engram engram -- mcpEngram gives a coding agent a memory that outlasts the session. It is a single Go binary that keeps observations in a local SQLite file with FTS5 search (~/.engram/engram.db unless ENGRAM_DATA_DIR points elsewhere). The same store is reachable four ways: a stdio MCP server started with `engram mcp`, a local HTTP API from `engram serve` on port 7437 by default, a CLI and a terminal UI.
The agent saves what is worth keeping, such as a finished bug fix or a decision, and searches for it later, including after its context has been compacted. Each memory belongs to a project. The project comes from the request, then `engram mcp --project` or ENGRAM_PROJECT, then a .engram/config.json, then the working directory.
At v3.6.0 the server registers 27 tools when started plainly. Passing `--tools=agent` cuts that to the 23 meant for agents, and you can also list tool names one by one. Of the remaining four admin tools, mem_delete and mem_merge_projects can remove or rewrite data. The header comment in internal/mcp/mcp.go still says 23 tools by default, but the registration code at that tag adds 27, the count DOCS.md gives.
Once the binary is installed, run `engram setup <agent>` to write the MCP entry for Claude Code, OpenCode, Gemini CLI, Codex and other clients. Memory stays on the machine unless you turn on Git Sync or the optional Engram Cloud replication. The npm package gentle-engram is a separate thing: it plugs the Pi agent into the same memory through native tools and is not an MCP server.
| Runtime | A prebuilt binary |
|---|---|
| Runs on | macOS, Windows, Linux |
Get the engram binary from GitHub Releases, `brew install gentleman-programming/tap/engram` on macOS or Linux, or `go install github.com/Gentleman-Programming/engram/v3/cmd/engram@latest` (go.mod at v3.6.0 names Go 1.26.10). The client then runs `engram mcp`. `engram setup <agent>` can write that entry for you.
A fit for a developer who uses one or more coding agents on the same repositories and wants decisions and fixes to carry over between sessions, without a hosted account. Everything sits in one local SQLite file, so it suits a single machine best. Sharing goes through Git Sync or the optional cloud service. If the agent should only read, start it with a narrower `--tools` list, since the default set includes delete and project merge. Pi users should install gentle-engram instead of registering the MCP server in Pi.
10 only read, 14 change things, 3 can delete or overwrite. A ? marks an optional parameter.
mem_current_projectdirectory?: stringcwd?: stringmem_list_projectsmem_contextproject?: stringscope?: stringmax_bytes?: numberolder_history?: booleancompact?: booleanmem_searchquery: stringtype?: stringproject?: stringall_projects?: booleanscope?: stringmatch_mode?: stringresponse_format?: stringlimit?: numbermem_search_promptsquery: stringproject?: stringall_projects?: booleanlimit?: numbermem_timelineobservation_id: numberbefore?: numberafter?: numberproject?: stringmem_get_observationid: numberinclude_history?: booleanhistory_cursor?: numberproject?: stringmem_save changestitle: stringcontent?: stringobservation?: stringtype?: stringsession_id?: stringscope?: stringtopic_key?: stringproject?: stringproject_choice_reason?: stringrecovery_token?: stringcapture_prompt?: booleanmem_update changesid: numberexpected_project: stringtitle?: stringcontent?: stringfind?: stringreplace?: stringtype?: stringscope?: stringtopic_key?: stringmem_suggest_topic_keytype?: stringtitle?: stringcontent?: stringmem_consolidate deletesmem_capture_passive changescontent: stringsession_id?: stringsource?: stringmem_save_prompt changescontent: stringsession_id?: stringproject?: stringproject_choice_reason?: stringrecovery_token?: stringmem_session_start changesid: stringdirectory?: stringmem_session_summary changescontent: stringsession_id?: stringproject?: stringproject_choice_reason?: stringrecovery_token?: stringmem_session_end changesid: stringsummary?: stringmem_session_finalize changesmem_pin changesid: numbermem_unpin changesid: numbermem_review changesaction: stringproject?: stringlimit?: numberobservation_id?: numberid?: numbermem_judge changesjudgment_id: stringrelation: stringreason?: stringevidence?: stringconfidence?: numbersession_id?: stringmem_judge_many changesjudgments: arraysession_id?: stringmem_compare changesmemory_id_a: numbermemory_id_b: numberrelation: stringconfidence: numberreasoning: stringmodel?: stringmem_doctorproject?: stringcheck?: stringmem_statsproject?: stringmem_delete deletesid: numberexpected_project: stringhard_delete?: booleanmem_merge_projects deletesfrom: stringto: string