The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Memex listing page.
A protocol-neutral engineering-context layer for AI coding agents. memex builds a bitemporal knowledge graph of your repository — modules, symbols, decisions, problems, evidence, and code evolution — and exposes bounded, provenance-aware context through Hermes MemoryProvider or MCP.
A daemon and MCP server that turns commits and file changes into structured engineering knowledge. Agents can receive relevant repository context before a task, with freshness and provenance preserved, without making memex a source of personal memory or raw session state.

Restart your Claude Code session.
The v0.9 Hermes integration is read-only. Hermes retains personal memory, raw
session state, and execution state. memex supplies repository engineering
context through a bounded ContextPacket; it does not ingest Hermes
state.db, transcripts, prompts, or tool results.
Add the memex provider to Hermes' profile configuration:
If Hermes is not installed, use the same context selector through the MCP
get_engineering_context tool. Both paths share the protocol-neutral memex
core and fail open when retrieval is unavailable.
| Channel | Command |
|---|---|
| Claude Code marketplace | /plugin install memex-mcp@stifler-marketplace |
| npx (no install) | npx stifler-memex-mcp <cmd> |
| uv | uv add memex-mcp |
| pip | pip install memex-mcp |
| source | git clone github.com/STiFLeR7/memex && uv sync |
For a shared team setup (one Neo4j + one memex-server, auth on by default, Neo4j's ports never exposed to the host):
See docker/TEAM-DEPLOY.md for the full flow, capturing the
initial admin key, and the down -v footgun to avoid.
| Property | Value |
|---|---|
| Output | A Neo4j graph populated continuously from your repo |
| Storage | Neo4j via Graphiti. Bitemporal — every edge has created_at and optional expired_at |
| Context | Bounded, ranked, provenance-aware ContextPacket |
| Integrations | Hermes MemoryProvider, MCP resources/tools, Claude Code, Cursor, Codex, Gemini CLI |
| Failure mode | Fail-open; agent execution continues without memex |
| Granularity | Scales from 50 to 5000+ modules via hierarchical Leiden clusters |
| Synthesis | Gemini Flash distills commits into Decision nodes; Pro for grounded synthesis |
| Confidence | Computed at query time. Two-regime decay (validated half-life ~139d, unvalidated stale at 30d) |
| Write governance | Per-node-type ACL, intent-confirmation on agent writes, explicit corroborates / supersedes semantics |
| Goal 10 evidence | 8/8 valid paired runs, 0 treatment failures, 0 treatment regressions |
14 tools — eight read, four write, two analytic.
| Tool | When |
|---|---|
get_project_context | Session start. Returns a cluster-level briefing under 1500 tokens regardless of repo size |
get_symbol_context | Before editing a function or class. Returns callers, callees, linked decisions |
get_recent_decisions | Last N days of architectural decisions, optionally module-scoped |
get_open_problems | Active bugs and tech debt, sorted by severity |
search_context | Hybrid search: semantic × keyword × graph traversal × RRF merge |
get_stale_context | Edges whose composite confidence dropped below threshold |
explain_change | Given a commit SHA, cross-references the diff with linked Decision/Problem nodes and asks Gemini Pro for a grounded explanation |
predict_impact | Given a file path, returns a ranked list of modules likely affected based on graph coupling (no LLM call) |
| Tool | When |
|---|---|
record_decision | After making a technical choice. Supports corroborates (reinforce) and supersedes (replace) |
record_problem | When discovering a bug or piece of tech debt |
resolve_problem | When a tracked problem is fixed |
invalidate_edge | When a stored fact is no longer true |
Confidence is not a stored number that mutates. It is computed at query time from base_confidence, validation status, time since last reinforcement, and access count.
| Property | Value |
|---|---|
| Validated half-life | ~139 days |
| Unvalidated stale threshold | 30 days (composite < 0.3) |
| Recency τ | 90 days (exponential decay) |
| Composite formula | conf × recency × (1 + rehearsal_w × log(1 + access_count)) |
| Conflict similarity threshold | 0.4 (below this + overlapping validity = conflict) |
| Intent-confirmation threshold | 0.85 (MCP write similarity check) |
memex cluster runs hierarchical Leiden over a hybrid edge graph:
| Edge type | Weight |
|---|---|
| Directory co-location | 1.0 |
| Module imports | 2.0 |
| Symbol calls | log(1 + calls) |
| Property | Value |
|---|---|
| Algorithm | graspologic.partition.hierarchical_leiden with fixed seed |
| Naming | TF-IDF top-3 over module docstrings + symbol names, parent-dir fallback |
| ID pinning | Jaccard ≥ 0.5 across reruns (cluster names stay stable through renames) |
| User overrides | .memex/clusters.yaml — any assignment can be locked |
| Context budget | get_project_context stays under 1500 tokens whether your repo has 50 or 5000 modules |
memex tracks token reduction metrics and human review actions locally in a SQLite database (~/.config/memex/telemetry.db).
You can query your savings at any time using the CLI:
Or view the raw JSON payload:
Or target a specific repository scope:
This returns an aggregation of:
today, last 7 days, last 30 days, and lifetime.The same statistics are exposed via the HTTP MCP transport:
Marketplace install above does this for you. Manual wiring in .claude/settings.json:
Add to ~/.cursor/mcp.json:
Add to ~/.gemini/settings.json:
Add to ~/.codex/config.toml:
memex can back Claude's native memory tool — agents read from a per-session graph projection plus a writable scratch zone.
| # | Principle | The bet |
|---|---|---|
| 1 | Bitemporal, never destructive | Edges are expired, not deleted. WHERE r.expired_at IS NULL filters live state |
| 2 | Confidence is computed, not stored | Mutating a number invites silent drift. Recompute every read |
| 3 | Two regimes for decay | Validated facts decay slowly; unvalidated facts must earn their place by being accessed |
| 4 | Human in the loop | memex review queues lowest-confidence Decision nodes for explicit validation |
| 5 | Write governance | Per-node-type ACL. Decision.policy = open, Module.policy = locked. Intent-confirmation on similar-content writes |
| 6 | Tokens are budgeted | get_project_context stays under 1500 tokens at any repo size via Leiden clusters |
| 7 | Synthesis only on commits | The watcher batches by debounce window. Gemini Flash is not in the hot path of a tool call |
| 8 | Pro for synthesis, Flash for extraction | explain_change uses Pro because grounding matters. Everything else uses Flash |
| 9 | Multi-repo aware | One watcher + one MCP server can manage hundreds of repos. --repo switches scope |
| 10 | Local-first | Neo4j runs in your Docker. Gemini is the only outbound call, and only on commits |
| Use it when | Skip it when |
|---|---|
| Multi-week or multi-month project | One-shot script, throwaway prototype |
| You work across multiple agents (Claude, Cursor, Codex) and want shared context | You only ever pair with one agent on one task |
| Architectural decisions are made over time and need to be remembered | The whole project fits in a single 200k-token context window |
| You want to query "what did we decide about X" from any session | Your repo is already small enough to paste into the prompt |
| Multiple developers using AI agents on the same codebase | Solo work where you never /clear |
| Command | What it does |
|---|---|
memex init | Extract baseline graph state, run first cluster pass |
memex watch | Daemon that listens for file + git events and writes to Neo4j |
memex serve | Run the MCP server (stdio, HTTP, or both) |
memex review | TUI that walks lowest-confidence decisions for human validation |
memex graph --output graph.html | Self-contained D3 force layout with cluster overlays |
memex cluster [--rerun] [--dry-run] | Run Leiden over the hybrid edge graph; pin cluster IDs by Jaccard ≥ 0.5 |
memex memory-tool serve | Back Anthropic's memory_20250818 tool with a graph projection |
memex stats [--json] [--repo <path>] | Show context token savings and telemetry stats |
MIT. See LICENSE.
Hill Patel (@STiFLeR7)
Open an issue or PR. uv sync --all-extras installs the development toolchain.
Run uv run pytest -m "not integration" for the offline suite and uv run ruff check . before opening a PR. Version bumps must update pyproject.toml,
npm/package.json, server.json, and the team Docker image tag together.
The v0.9 release record is in CHANGELOG.md, with the
architecture and evaluation evidence under docs/architecture/v0.9/.
Vannevar Bush, 1945: "Consider a future device for individual use, which is a sort of mechanized private file and library. It needs a name, and to coin one at random, memex will do."