Engram

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

Connect your client

Local (from source)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

FirstTerminal
go install github.com/Gentleman-Programming/engram/v3/cmd/engram@latest
Claude CodeTerminal
claude mcp add engram -- engram mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "engram": {
      "command": "engram",
      "args": [
        "mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "engram": {
      "command": "engram",
      "args": [
        "mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "engram": {
      "type": "stdio",
      "command": "engram",
      "args": [
        "mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.engram]
command = "engram"
args = ["mcp"]
Gemini CLITerminal
gemini mcp add --scope user engram engram -- mcp

What it does

Engram 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.

What it needs

RuntimeA prebuilt binary
Runs onmacOS, 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.

Limits

  • Platform Released Windows binaries have been flagged by antivirus tools and blocked by Smart App Control; the docs suggest go install on Windows.
  • Limit Keep the database on a local disk. The docs warn against a network filesystem and tell you to move the db, wal and shm files together.
  • Not covered mem_consolidate, mem_session_finalize and mem_judge_many are Go MCP only. The Pi extension gentle-engram does not offer them.
  • Early release Release candidates are prerelease builds. The docs point production use at the latest stable release.
  • Limit With ENGRAM_HTTP_TOKEN set, the local HTTP API still lets observation PATCH through without the token.

Who it suits

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.

Tools 27

10 only read, 14 change things, 3 can delete or overwrite. A ? marks an optional parameter.

mem_current_project
Report which project memories will go to and how it was resolveddirectory?: stringcwd?: string
mem_list_projects
List every known project with its counts
mem_context
Pull recent session history for the project, within a byte budgetproject?: stringscope?: stringmax_bytes?: numberolder_history?: booleancompact?: boolean
mem_search
Full-text search over saved observations, scoped to one project or allquery: stringtype?: stringproject?: stringall_projects?: booleanscope?: stringmatch_mode?: stringresponse_format?: stringlimit?: number
mem_search_prompts
Search stored user prompts, 10 results by defaultquery: stringproject?: stringall_projects?: booleanlimit?: number
mem_timeline
Show the observations recorded before and after a given oneobservation_id: numberbefore?: numberafter?: numberproject?: string
mem_get_observation
Fetch one observation in full, optionally with its edit historyid: numberinclude_history?: booleanhistory_cursor?: numberproject?: string
mem_save changes
Store a fix, decision, discovery or convention as an observationtitle: stringcontent?: stringobservation?: stringtype?: stringsession_id?: stringscope?: stringtopic_key?: stringproject?: stringproject_choice_reason?: stringrecovery_token?: stringcapture_prompt?: boolean
mem_update changes
Change fields of an existing observation by ID, or find and replace in its textid: numberexpected_project: stringtitle?: stringcontent?: stringfind?: stringreplace?: stringtype?: stringscope?: stringtopic_key?: string
mem_suggest_topic_key
Propose a stable topic key so a recurring subject updates one memorytype?: stringtitle?: stringcontent?: string
mem_consolidate deletes
Merge several observations into one new one, previewing first and deleting the sources only on confirmation
mem_capture_passive changes
Pull the items under a Key Learnings heading out of text and save each onecontent: stringsession_id?: stringsource?: string
mem_save_prompt changes
Keep the user's original request on recordcontent: stringsession_id?: stringproject?: stringproject_choice_reason?: stringrecovery_token?: string
mem_session_start changes
Register a new sessionid: stringdirectory?: string
mem_session_summary changes
Store an end-of-session handoff: goal, findings, next steps, filescontent: stringsession_id?: stringproject?: stringproject_choice_reason?: stringrecovery_token?: string
mem_session_end changes
Mark a session as finishedid: stringsummary?: string
mem_session_finalize changes
Save a summary and close an already registered session in one transaction
mem_pin changes
Pin an observation so it comes first in context (local to the device, not synced)id: number
mem_unpin changes
Remove a pinid: number
mem_review changes
List observations past their review date, or mark one as reviewedaction: stringproject?: stringlimit?: numberobservation_id?: numberid?: number
mem_judge changes
Settle a pending conflict between two memories with a relation and reasonjudgment_id: stringrelation: stringreason?: stringevidence?: stringconfidence?: numbersession_id?: string
mem_judge_many changes
Apply 1 to 32 judgments in order in one call; each stands or fails alonejudgments: arraysession_id?: string
mem_compare changes
Record a verdict on how two memories relate, with confidence and reasoningmemory_id_a: numbermemory_id_b: numberrelation: stringconfidence: numberreasoning: stringmodel?: string
mem_doctor
Run read-only checks on project and store healthproject?: stringcheck?: string
mem_stats
Count sessions, observations, prompts and projectsproject?: string
mem_delete deletes
Delete an observation by ID: soft delete unless hard_delete is trueid: numberexpected_project: stringhard_delete?: boolean
mem_merge_projects deletes
Fold project name variants into one canonical project namefrom: stringto: string

Similar servers