Atlas / MCP servers / engrammemory / Engram Memory

Engram MemoryBLOCK

mcp/engrammemory/engram-memory-1

The highest-scoring AI memory system ever benchmarked that isn't reliant on LLM reranking. And it's free & burns less tokens.

Verdict
BLOCK
Grade
F
Trust score
58 /100
Exposed tools
17 15r · 1w · 1d
Transport
stdio · streamable-http
License
NOASSERTION
Stars
36
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Three-Tiered Brain for AI agents. Self-hosted. Zero API costs.

Docs · Quickstart · Dashboard · Cloud SDKs

Engram gives your AI agent persistent memory across sessions. Store, search, recall, and forget memories using semantic embeddings — all running on your own hardware. No API keys, no cloud dependencies, no data leaving your machine.

One container bundles Qdrant, FastEmbed, and the MCP server. One command to install. Works with Claude Code, Cursor, Windsurf, VS Code, OpenClaw, or anything else that speaks MCP.

The Problem

Every AI agent on the market forgets everything when the session ends. You spend 30 minutes explaining your codebase, your preferences, your architectural decisions. You close the tab. Tomorrow you start over.

The current solutions are all bad in different ways. OpenAI's memory is a black box you don't control. Mem0 and Zep charge $19–$249/month for managed cloud memory — your data goes through their servers. Local alternatives (LangChain memory, SQLite stores) don't scale past a few thousand memories and treat every memory equally regardless of how often you access it.

Engram exists because there should be a third option: a serious memory system that runs on your own hardware, costs nothing, and gets faster the more you use it.

How It Works

The Three-Tiered Brain

Most memory systems do one thing: vector search across everything. That's slow at scale and wast

Read from source at commit 13bf92e75651OBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add engrammemory-ai --env ENGRAM_API_KEY=${ENGRAM_API_KEY} --env GRANT_KEY_PREFIX=${GRANT_KEY_PREFIX} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "engrammemory-ai": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ENGRAM_API_KEY": "${ENGRAM_API_KEY}",
        "GRANT_KEY_PREFIX": "${GRANT_KEY_PREFIX}"
      }
    }
  }
}
03

Exposed tools (17)

15 read · 1 write · 1 destructive. Blast radius: 1 tool can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
get_communityreadGet all nodes in a community by community ID.
get_neighborsreadGet all direct neighbors of a node with edge details.
get_nodereadGet full details for a specific node by label or ID.
god_nodesreadReturn the most connected nodes - the core abstractions of the knowledge graph.
graph_statsreadReturn summary statistics: node count, edge count, communities, confidence breakdown.
memory_connectreadDiscover cross-category connections for a memory via the entity graph
memory_consolidatewriteFind and merge near-duplicate memories
memory_feedbackreadReport which search results were useful. Improves future search accuracy at zero cost.
memory_forgetdestructiveDelete a memory from all tiers (hot cache, hash index, and vector store)
memory_getreadFetch full details for specific memory IDs. Use after memory_search to get complete content.
memory_graphreadRender an interactive HTML visualisation of memories. Pass a host-LLM-built {nodes, edges} spec; returns the path to a self-contained graph.html (vis.js, no server required). Pair with the
memory_recallreadRecall relevant memories for context injection (higher threshold, designed for auto-recall)
memory_searchreadSearch memories using three-tier recall. Results include match_context to help identify the most relevant result.
memory_storereadStore a memory with semantic embedding (indexed into hot-tier cache and hash index)
memory_timelinereadBrowse recent memories chronologically. Returns compact results sorted by creation time.
query_graphreadSearch the knowledge graph using BFS or DFS. Returns relevant nodes and edges as text context.
shortest_pathreadFind the shortest path between two concepts in the knowledge graph.
04

Trust audit

BLOCKgrade F · trust 58/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (4 observation(s))
Network
declared (8 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (17)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/recall/multi_head_hasher.py:342
state = pickle.load(f)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
vendor/graphify/graphify/security.py:19
_BLOCKED_HOSTS = {"metadata.google.internal", "metadata.google.com"}
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHPrompt injection · prompt.hide_from_user · CWE-94, CWE-1427
docs/integrations/cursor.md:99
comes back, proceed without it — don't tell the user you checked.
Why it matters. asks the agent to act without the user's knowledge
HIGHPrompt injection · prompt.hide_from_user · CWE-94, CWE-1427
docs/integrations/windsurf.md:86
comes back as background context. Don't tell the user you
Why it matters. asks the agent to act without the user's knowledge
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
vendor/graphify/graphify/__init__.py:26
mod = importlib.import_module(mod_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
vendor/graphify/graphify/extract.py:656
mod = importlib.import_module(config.ts_module)
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
memory_forget
Why it matters. 1 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
context/cli/context_manager.py:413
content_hash = hashlib.md5(content.encode('utf-8')).hexdigest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
context/tools/semantic_search.py:155
content_hash = hashlib.md5(content.encode('utf-8')).hexdigest()
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/migrate_collection.py:55
idx = int(hashlib.md5(token.encode()).hexdigest()[:8], 16) & 0x3FFFFFFF
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/recall/recall_engine.py:132
idx = int(hashlib.md5(token.encode()).hexdigest()[:8], 16) & 0x3FFFFFFF
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/recall/recall_engine.py:970
query_hash = hashlib.md5(query.encode()).hexdigest()[:12]
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
uuid, @types/node, @types/uuid, typescript
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/mcp-server-node/package.json
@modelcontextprotocol/sdk, typescript, tsx, @types/node
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
requirements.txt
qdrant-client, requests, numpy, click, pyyaml, httpx, kuzu, scikit-learn
Why it matters. 11 requirement(s) not pinned with ==
Fix. pin exact versions
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
sdks/typescript/package.json
typescript, @types/node
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/integrations/claude-code.md:122
each other's memories. Access is scoped by API key — if your key
Why it matters. asks the agent to read credentials

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 13bf92e75651full audit observations/trust-audit/mcp-server/engrammemory__engram-memory-1.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-0813bf92e75651BLOCKF58first audit
06

Questions

What is the Engram Memory MCP server?

The highest-scoring AI memory system ever benchmarked that isn't reliant on LLM reranking. And it's free & burns less tokens.

What tools does Engram Memory expose?

17 in total: 15 read-only, 1 that write, and 1 that can delete or overwrite (memory_forget). Every one is listed on this page with its risk.

Is Engram Memory safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (58/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 1 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does Engram Memory need?

It reads ENGRAM_API_KEY and GRANT_KEY_PREFIX from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Engram Memory run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as engrammemory-ai at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (13bf92e75651), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement