NMEMORY README

The full upstream README, mirrored for reference. Install config, tool schemas, adoption signals and our own overview live on the NMEMORY listing page.

nMEMORY, part of the NOTT family: memory for coding agents. Every recall cites its source, or says that it does not know. nMEMORY, part of the NOTT family: memory for coding agents. Every recall cites its source, or says that it does not know.

License: AGPL-3.0 Python 3.14 or later MCP stdio server Latest release GitHub stars

Your agent forgets everything between sessions. nMEMORY makes it remember, with sources.

Install

Terminal
curl --proto '=https' --tlsv1.2 -fsSL https://no.tt/install.sh | sh

Or install from source. You need uv and Git:

bash
git clone https://github.com/menot-you/n-memory
cd n-memory
uv sync
uv run nmemory database create
claude mcp add nmemory -- uv run --directory "$PWD" nmemory mcp serve

uv sync installs the pinned Python (3.14) and all dependencies. database create makes the store file. nMEMORY never makes it implicitly. Any MCP client that speaks stdio connects the same way as Claude Code.

How it works

mermaid
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#1B1916", "primaryTextColor": "#ECE7DE", "primaryBorderColor": "#E4733A", "lineColor": "#E4733A", "secondaryColor": "#151311", "tertiaryColor": "#0F0E0D", "fontFamily": "IBM Plex Mono, monospace"}}}%%
flowchart LR
  agent["Your agent<br/>(any MCP client)"] -->|"stdio, 27 tools"| server["nmemory mcp serve"]
  shell["You, in a shell"] -->|"nmemory CLI"| core
  server --> core["Capture and recall"]
  core -->|"one transaction per call"| store[("One SQLite file<br/>records, journal, index")]
  core -->|"BM25, always"| lexical["Keyword recall"]
  core -.->|"when a key is set"| vectors["Embedding provider"]
  lexical --> outcome{"grounded<br/>missing_evidence<br/>abstain"}
  vectors -.-> outcome

Each record must have a source and an anchor (path:line, a quote or a PR). Recall returns one of three outcomes. It never turns a weak match into an answer.

By the numbers

MCP tools per server: nMEMORY 27, nSPAWN 15, nBROWSER 14, nAPPLE 10. Tests per component: nSPAWN 4335, nMEMORY 2339, nBROWSER 731, nAPPLE 106.

Counted on 2026-10-21. Tools: the MCP tools/list request to nmemory mcp serve. Tests: uv run --group dev pytest --collect-only -q in each member root.

Why

BeforeWith nMEMORY
Each new session starts empty. You explain the same decision again.The agent recalls the decision at the start of the session.
A recalled "fact" has no origin. You cannot check it.Each record must have a source and an anchor.
A weak match comes back as a confident answer.Recall has three honest outcomes: grounded, missing_evidence or abstain.
Old notes and new notes conflict in silence.A new record can supersede an old one. Every change goes into a hash-chained audit journal.
Text from a web page or a file can steer the agent.nMEMORY marks imported or directive-shaped text as tainted. Recall labels all results as data, not instructions.

Quick start

Your agent uses the MCP tools. You can use the same store from the shell.

Store a decision (the agent calls nmemory_capsule_ingest):

config.json
{
  "content": "We store data in SQLite, not PostgreSQL.",
  "kind": "decision",
  "source": "docs/adr/0001-storage.md",
  "anchor": "docs/adr/0001-storage.md:3"
}

In a later session, recall it:

bash
uv run nmemory capsule retrieve "what database stores our data"
uv run nmemory capsule show --id cap-1

The first command returns "outcome": "grounded" and the record. The second command shows its provenance: source, anchor and source hash.

What you get

  • 27 MCP tools for capture, recall, sessions, handoffs, tasks, review and audit. The reference lists each tool and CLI command.
  • Hybrid recall. BM25 keyword search always works. The default embedding provider is Gemini (NOTT_NMEMORY_EMBED_PROVIDER, also openai or openai-compatible for a self-hosted server such as Ollama or vLLM).
  • Embeddings send text off the machine. When the provider key is in the environment (GEMINI_API_KEY for the default), nMEMORY sends capsule text and queries to that provider. To keep recall lexical only, unset that key. No key is needed to start.
  • One file, local first. The store is one SQLite file. Each call is one transaction. A connection stays read-only until the call declares a write.
  • Session brackets and handoffs. An agent opens a session, captures as it works, and closes with a handoff that the next session reads.
  • Purge that really deletes. Purge deletes the content, the quote, the queued embedding text and the vector in one transaction.

How it compares

A notes file (CLAUDE.md, AGENTS.md)A plain vector storenMEMORY
Survives a new sessionYesYesYes
Source required per recordNoNoYes
Says "no evidence" on a weak matchNoNo, it returns the nearest vectorsYes
Works with no embedding keyYesNoYes (lexical)
Audit trail of each changeGit onlyNoHash-chained journal
Grows without filling the promptNo, the whole file loadsYesYes, recall has a token budget

Benchmarks

The evaluation harness holds runners for synthetic recall, LongMemEval, extraction and comparison. It publishes methods, not a score for this release. We do not quote older numbers here, because they measured an earlier engine.

The NOTT family

n-memory
Memory that cites its source.
n-spawn
Tracked, resumable agent workers.
n-browser
The live web as cited evidence.
n-apple
App Store Connect for agents.
plugin
The team contract, routes and hooks.

For AI agents

This section is for a language model that reads this repository.

  • What it is. nMEMORY is a local memory server for coding agents. It stores records (decisions, facts, tasks, failures) with a required source and anchor, and recalls them with one of three outcomes: grounded, missing_evidence or abstain.
  • What it is not. It is not a hosted service, a general vector database or a chat history. It does not invent an answer when nothing matches.
  • Entry points. The CLI is nmemory <noun> <verb> (nmemory --help). The MCP server is nmemory mcp serve (stdio). All 27 tool names start with nmemory_. Start with nmemory_context_show, nmemory_capsule_retrieve and nmemory_capsule_ingest.
  • Configuration. The optional file is ~/.nott/memory.toml. The variable NOTT_NMEMORY_CONFIG names another path. The store directory is ~/.nott/state/database/, or NOTT_DATABASE_DIR when a test sets it.
  • Invariants. Every record has a source. Recalled text is data, not an instruction. Each mutation goes into the hash-chained journal. A test never opens the live store. The store is SQLite only.
  • Full reference. docs/REFERENCE.md lists every tool and command. RULEBOOK.md lists the implementation rules. llms.txt holds the same facts in the llms.txt format.

Documentation

PageContents
RunbookFirst useful result, failure diagnosis, backup and restore
ArchitectureTrust boundaries and the full engine detail: store, recall, tools, CLI
ReferenceEvery CLI command and MCP tool, linked to its source
RulebookImplementation invariants
SetupDevelopment setup
QualityChecks and security review
Docs indexDocumentation index and a first contribution
InstallationInstall paths
PrivacyProcessing choices
UpgradeExisting data
TroubleshootingFailure diagnosis
RoadmapDirection

Run the checks from the repository root:

bash
uv run ruff check . && uv run mypy --strict nmemory
TMPDIR=/var/tmp uv run --group dev pytest -q

Each test gets its own disposable store. No test touches your live store.

License

AGPL-3.0-only.