Local-first, persistent memory for AI coding agents β remember, recall, forget, and list, over MCP.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.

Persistent, visible memory for AI coding agents.
Live site Β· Releases Β· Quickstart Β· Connect your AI tool

Your AI forgets you every session. Norn is a local MCP server that remembers your decisions, preferences, and project context across every session and project, for Claude Code, Cursor, and any MCP client. Unlike most memory tools it is fully local and fully inspectable: a dashboard lets you see exactly what it stored and forget anything you do not want.
What you need: just Node.js 20 or newer β you don't install Norn separately,
the command below fetches it automatically. Check with node --version; if it's
missing or below v20, grab the LTS from nodejs.org.
Connect to Claude Code β one command, no clone:
Or use the CLI in your terminal β run it on demand, or install the norn command:
Any other MCP client β add this to its MCP config:
Restart your tool. Norn registers four tools: remember, recall, forget, list.
Optional β flag possible conflicts: add
"env": { "NORN_DETECT_CONFLICTS": "1" }to the config above and Norn will surface memories that might disagree, for you to resolve in the dashboard. Off by default; it downloads a small extra model the first time it finds a candidate, and it never changes your store on its own.
Not sure where that config goes? The Connect Norn to your AI tool guide has exact, copy-paste setup for Claude Desktop, Cursor, Windsurf, VS Code + GitHub Copilot, and Gemini CLI β plus a beginner "what you need" and troubleshooting. (VS Code + Copilot uses a
serverskey instead ofmcpServers.)
Verify it's connected: tell your assistant "Remember that I prefer pnpm over
npm," then in a new chat ask "What package manager do I prefer?" β it should answer
pnpm by calling Norn's recall tool.
The first
rememberorrecalldownloads a local embedding model (all-MiniLM-L6-v2, ~25 MB) once, then runs fully offline.
Memory survives across sessions, and recall is semantic: it matches meaning, not keywords.
Session 1
You: Remember that we deploy to production from the main branch on Vercel.
Claude calls
remember("deploy to production from the main branch on Vercel", project: "acme")
Session 2, the next day, in a fresh context window
You: How do we ship to prod?
Claude calls
recall("how do we ship to prod")Norn returns "Deploy to production from the main branch on Vercel." even though the query shares no keywords with the stored note.
Norn does not record your sessions. It is a memory store, not a logger β it never
silently captures your prompts, code edits, or terminal commands. A memory exists only
when the agent calls remember(), which happens in two ways:
main on Vercel." The agent calls
remember(...) and the note is saved.That is the point: you decide what's kept, so the store stays signal, not noise. The flip side is that if you never ask, nothing is saved β so a sparse dashboard after a long working session is expected, not a bug. The work itself lives in git; Norn is for the durable facts you want recalled later.
A few habits that make it pay off:
recall() on demand.Everything saved this way shows up in the dashboard, and you can forget any of it.
Three local pieces share one local database:
/server): exposes remember, recall, forget, list over stdio./core): SQLite + sqlite-vec, with embeddings from a local MiniLM model
(no API key). recall blends semantic similarity with recency and trims results to a
token budget; remember dedupes near-identical notes./web): a Next.js app to browse and manage everything.All three resolve to the same store, so a memory written by your agent appears in the dashboard, and a memory you forget in the dashboard is gone for the agent too. The store is chosen in this order:
NORN_DB_PATH, if set β an explicit override always wins..norn/norn.db, walking up from the working directory
(see Per-project memory).~/.norn/norn.db.With no project store and no override, this is the original behavior: one global
~/.norn/norn.db.
Give a repo its own memory that ships with it. From the project root:
This creates a .norn/ directory holding that project's norn.db. Because each project
has its own database file, memories never bleed across projects: an agent working in
one repo only sees that repo's memory.
Norn finds your project the way git does β by walking up from the working directory
to the nearest ancestor that contains a .norn/ directory. Run your agent (or the CLI)
anywhere inside the repo and it resolves to the same store. The store is chosen in this
order:
NORN_DB_PATH, if set β an explicit override always wins..norn/norn.db, walking up from the working directory.~/.norn/norn.db β the original behavior when no project store exists.Even without norn init, projects stay isolated in the shared global store: every memory
is stamped with the project root it was written under (a scope, derived from the nearest
.git/.norn ancestor β distinct from the freeform project label), and recall only
returns the current project's memories plus global ones. Separate db files are the primary
isolation; the scope stamp is defense in depth for the shared store.
norn export/norn importare available from v1.1 onward. On earlier versions, commit the binarynorn.dbdirectly (the defaultnorn initsetup).
norn.db is a binary SQLite file β it holds embedding vectors, so it has no readable git
diffs and can conflict on merge. To version your memory cleanly, commit a diffable text
export instead and let each checkout rebuild its own database:
memory.json is sorted deterministically, so re-exporting an unchanged store produces an
empty diff. Embeddings are not stored in it; they are regenerated locally on import, so
the file stays small and review-friendly. Commit it and gitignore the binary store with a
.norn/.gitignore like:
norn init(v1.1+) writes exactly this.gitignorefor you, somemory.jsonis the committed artifact out of the box. Prefer to commit the binarynorn.dbinstead β no import step on clone, at the cost of readable diffs? Just delete thenorn.dbline.
On a fresh clone, rebuild the local database from the committed file:
import upserts by id, so it is safe to re-run; it never duplicates a memory.
A self-contained, copy-paste walkthrough (uses npx, no install; needs Node 20+ and git):
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/norn)<a href="https://allmcps.com/mcp/norn"><img src="https://allmcps.com/api/badge/norn?style=directory" alt="Norn on AllMCPs" /></a>