Skip to main content

2D graph visualization of a Python codebase

Epistemic Graph Memory

A local knowledge graph that gives AI coding agents long-term project memory.
5,000 lines of Python. Zero cloud dependencies. One pip install.

python -m pip install 'epistemic-graph-memory[all]'

PyPI License Tests Python


The problem

AI coding agents reconstruct project context from scratch every session. They re-read files they've already read, re-derive architecture they've already derived, and lose decisions made yesterday. Claude Code, Cursor, Codex, OpenCode — they all forget.

The solution

A SQLite-backed knowledge graph that lives in your project at .agents/graph_memory.sqlite. It ingests your codebase's AST (functions, classes, call graphs, imports), records agent decisions in an append-only ledger, detects when agents contradict each other, and produces deterministic snapshots that inject directly into agent system prompts — with byte-stable caching so prompt caches stay hot.

All 20 MCP tools, a 30-command CLI, lifecycle hooks for 9 agent harnesses, and a streamable HTTP endpoint for remote agents.


What it actually does

Code understanding. Parses Python, TypeScript, JS/JSX, Go, and Rust via Tree-sitter. Extracts signatures, docstrings, line ranges, call graphs, and inheritance. Cross-file call resolution wires stubs to real definitions across your entire repo. Batch ingestion processes this repo's 37 files in 0.45 seconds; unchanged re-ingests take 0.06 seconds (hash-skip).

Agent memory. Every decision an agent makes — what it changed, why, when — goes into an append-only Decision_Ledger. A reflection engine digests the last 30 days of real decisions into structured memory cards. When two agents disagree about a fact (different values for the same field), the contradiction is recorded and surfaced — no silent overwrites.

Trust decay. Facts decay over time with effective = base × 0.5^(days/30). Re-verifying a fact resets it to 100%. Derived facts re-verify themselves: if the source file is byte-identical to the hash recorded at ingest, the signature and call edges extracted from it are still true, so the lifecycle hooks refresh those nodes with no agent effort — and a node that owns no file (call stub, import target, MOC, project root) is refreshed only when everything feeding it is fresh, so an edited file correctly keeps its dependents decayed. Stale, unreferenced nodes get garbage-collected. This means the graph self-maintains — old assumptions fade, recent verifications stay sharp.

Prompt injection. graph-memory snapshot produces a deterministic, content-fingerprinted Markdown snapshot. If nothing changed, you get the exact same bytes — so Claude's prompt cache, Cursor's context cache, whatever — stays warm. Zero wasted tokens on unchanged context.

Transport. Runs over stdio MCP (Claude Desktop, Cursor, Codex) and streamable HTTP MCP (OpenCode, Docker, remote agents). One binary, both transports. Health check at /health.

Import / export. Migrating from mem0? graph-memory import-mem0 export.json. Have a CLAUDE.md? graph-memory import-md CLAUDE.md. Want a browsable Obsidian vault with [[wikilinks]] for every graph edge? graph-memory export-obsidian ~/vault.


Setup

python -m pip install 'epistemic-graph-memory[all]'

The core package is stdlib-only (SQLite, JSON, regex) and installs everywhere with zero compiled dependencies. Two optional extras add the heavy features:

Extra Adds
(none) Core graph, search, snapshot, Markdown/mem0 import, Obsidian export, reflection, hooks — stdlib only
[ast] Tree-sitter AST ingestion (Code understanding)
[mcp] MCP stdio transport
[http] MCP stdio + streamable HTTP transport (uvicorn + starlette)
[all] Everything
pip install epistemic-graph-memory                # core only, stdlib
pip install 'epistemic-graph-memory[ast]'         # + code ingestion
pip install 'epistemic-graph-memory[mcp]'         # + MCP stdio
pip install 'epistemic-graph-memory[http]'        # + MCP over HTTP
pip install 'epistemic-graph-memory[all]'         # + everything

Android / Termux: [mcp] pulls pydantic → pydantic-core, which has no Android wheel and tries to build Rust for a target rustup doesn't support — a multi-minute stall that ends in failure. pip install epistemic-graph-memory (core) finishes in seconds and gives you the graph, search, and Markdown import. AST and MCP need their extras and full toolchain support.

MCP configuration

Add to your agent's MCP config:

{
  "mcpServers": {
    "graph-memory": {
      "command": "graph-memory-mcp"
    }
  }
}

For remote-only agents (OpenCode, Docker):

graph-memory-mcp-http                    # http://127.0.0.1:8765/mcp

Then point your agent at http://127.0.0.1:8765/mcp.

Security (v3.8.0): The HTTP server defaults to localhost (127.0.0.1) and includes DNS rebinding protection. For remote deployment:

  • Set GRAPH_MEMORY_API_KEY environment variable to require authentication
  • Use a reverse proxy (nginx, Caddy) with TLS
  • Bind to 0.0.0.0 only behind a firewall/VPN
  • Never expose the server directly to the public internet (it provides full filesystem and database access)
GRAPH_MEMORY_API_KEY=your-secret-key graph-memory-mcp-http

One-command agent hooks

graph-memory hook install                 # auto-detect and configure all frameworks
graph-memory hook install --framework cursor
graph-memory hook status

This wires lifecycle capture into Claude Code, ZCode, Cursor, Codex, OpenCode, Antigravity, Qoder, and Hermes — PostToolUse triggers incremental AST ingest of edited files (<5ms), session-end distills transcripts into graph facts, and session-start refreshes all snapshots.


CLI

# Ingest entire codebase (polyglot AST + call graphs)
graph-memory ingest-code .

# Re-parse a single changed file (<5ms, skips if unchanged)
graph-memory ingest-file src/engine.py

# Generate prompt-cache-stable snapshot
graph-memory snapshot --max-tokens 600 --min-trust 0.7

# Search nodes (FTS5 + identifier substring fallback)
graph-memory search "effective_tr"
graph-memory search "trust decay"

# Decision audit trail
graph-memory query-history --agent Hermes --days 7

# Contradiction detection
graph-memory contradictions

# Stale-node garbage collection
graph-memory prune --days 60

# Mechanical re-verification (hash-stable AST facts; curated nodes via test suite)
graph-memory verify
graph-memory verify --tests

# Scheduled verification (launchd / systemd / Task Scheduler, no daemon)
graph-memory schedule install --interval 1d

# Import existing memories
graph-memory import-md CLAUDE.md
graph-memory import-mem0 memories.json

# Export to Obsidian vault
graph-memory export-obsidian ~/vaults/my-project

# HTML / 3D visualization
graph-memory export-html graph.html
graph-memory export-3d graph_3d.html

MCP tools

Tool What it does
get_active_snapshot Deterministic, cache-stable Markdown snapshot of high-trust graph state
distill_session Micro-compaction: distills raw transcript turns into structured graph facts
search_session_history FTS5 search across episodic session logs
query_decision_history Append-only decision ledger (who changed what, why, when)
search_nodes FTS5 + substring search across nodes
read_code_snippet AST-derived signature, docstring, line bounds, source snippet
verify_memory Mechanical re-verification: hash-stable AST facts, curated nodes via a passing test suite
ingest_file Incremental single-file AST re-parse (<5ms, hash-skip)
create_entities Create graph nodes with trust scores
create_relations Create directed edges between nodes
merge_entities Merge entities with canonical pointer redirect
open_nodes Serialize subgraphs around specific nodes
read_graph Serialize the complete knowledge graph
add_observations Append observations to entities without touching their facts
delete_entities Remove entities and all incident relations
delete_observations Remove specific observations from entities
delete_relations Remove relations by endpoint triple
generate_repo_wiki Hierarchical Markdown repo wiki (Qoder schema)
get_knowledge_cards Domain knowledge cards across 8 software domains
reflect_session_memory Digest the decision ledger into persistent memory cards

Architecture

graph_memory/
├── core/
│   ├── engine.py        # SQLite graph engine: CRUD, trust decay, ledger, search, batch upsert, contradictions, prune
│   ├── ingest.py        # Tree-sitter AST ingestion, batch pipeline, cross-file call resolution
│   ├── importers.py     # Markdown + mem0 import
│   ├── obsidian.py      # Obsidian vault export with [[wikilinks]]
│   ├── snapshot.py      # Deterministic, cache-stable snapshot generation
│   ├── memory.py        # Data-driven reflection engine
│   ├── lifecycle.py      # Harness-agnostic event dispatcher
│   ├── distill.py       # Session transcript micro-compaction
│   ├── knowledge.py     # Knowledge-card extraction + repo-wiki export
│   └── summarizer.py    # Optional: Gemini MOC summarization (opt-in, GEMINI_API_KEY)
├── mcp/
│   ├── server.py        # Stdio MCP server (20 tools)
│   └── http_server.py   # Streamable HTTP MCP transport
├── integrations/
│   ├── framework_hooks.py  # 9-framework auto-install + lifecycle wiring
│   └── scheduler.py     # OS-native scheduled verification (launchd/systemd/schtasks)
└── cli.py               # 30-command CLI

Storage: Single SQLite file per project at .agents/graph_memory.sqlite. WAL mode for concurrent safety. FTS5 for full-text search. No external databases, no servers, no cloud — the only network call anywhere is the opt-in summarize-mocs command, which uses Gemini via GEMINI_API_KEY.

Node types: Fact_Node (deterministic ground truth from AST/Git), Knowledge_Node (architecture, design decisions), Episode_Node (completed task sequences), Release_Node (published versions).

Trust model: Query-time decay — effective = base × 0.5^(Δdays/half_life). Re-verification resets to 100%. Stale, unreferenced nodes get soft-deleted by the prune command.


Numbers

Metric Value
Source code 6,541 lines Python
Test code 2,104 lines, 76 tests
MCP tools 20
CLI commands 30
Agent harnesses 9
AST languages 7 variants (Python, TS, TSX, JS, JSX, Go, Rust)
Dependencies 0 required (core is stdlib-only; MCP + AST are extras)
External services 0 required (opt-in summarize-mocs calls Gemini via GEMINI_API_KEY)

License

MIT — Divyansh Ailani

Metadata

Release files for epistemic-graph-memory 3.9.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for epistemic-graph-memory 3.9.1
File Size Uploaded Provenance
epistemic_graph_memory-3.9.1.tar.gz 100.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for epistemic-graph-memory 3.9.1
File Interpreter ABI Platform
epistemic_graph_memory-3.9.1-py3-none-any.whl Python 3 none any Details

Total release size: 186.4 kB

Release files / epistemic_graph_memory-3.9.1.tar.gz

Download URL epistemic_graph_memory-3.9.1.tar.gz
Size 100.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1a20685b103b8bb3afe8118f7779a5397e1972640fdc2cb7fc08c046906801d7
BLAKE2b-256 checksum
How to use checksums
b482b29ac48d9fed66b23df227ccd7f76ae699c549153471fa9d3e79a0d354b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / epistemic_graph_memory-3.9.1-py3-none-any.whl

Download URL epistemic_graph_memory-3.9.1-py3-none-any.whl
Size 86.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3267a2ccc2407ab6e7fd62549601c48975b2ffdca44acbb7a04500efec059ff3
BLAKE2b-256 checksum
How to use checksums
c03f2b4a360bd9acbffeb2fd4469cf7189a29bca051ab2c22cb798d06f0887f3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for epistemic-graph-memory 3.9.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

3.9.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page