Norn について
Nornはコーディングエージェント向けのローカルメモリMCPサーバーで、決定事項、好み、プロジェクトの情報をセッション間で保存・検索します。内容を確認して管理でき、プロジェクトごとの分離にも対応します。
主な機能
- 01セッションをまたぐ保存と意味検索
- 02ローカルのSQLiteストアと埋め込みモデル
- 03ダッシュボードでの閲覧、検索、削除
- 04プロジェクトごとのメモリ分離
- 05任意の競合通知とアクティビティ表示
活用シーン
- 01新しいセッションでプロジェクトの決定事項を参照
- 02好みや規約の再入力を減らす
- 03保存したメモリの確認と整理
- 04コードベースごとにコンテキストを分離
MCP 対応
Nornはstdio経由で、remember、recall、forget、listツールをMCPクライアントに提供します。メモリはローカルに保存され、ダッシュボードから確認・管理できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @samad001z/norn-serverNORN_DETECT_CONFLICTSSet to 1 to opt in to possible-conflict detection. Off by default; downloads a small NLI model on first use. Surface-only — never edits, merges, or deletes memories.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細

Norn
AI コーディングエージェントのための、永続的で可視化されたメモリです。
ライブサイト · リリース · クイックスタート · AI ツールを接続する

AI はセッションのたびにあなたのことを忘れてしまいます。Norn はローカル MCP サーバーで、Claude Code、Cursor、およびあらゆる MCP クライアントで、すべてのセッションとプロジェクトを通じて、あなたの決定、好み、プロジェクトのコンテキストを記憶します。ほとんどのメモリツールと異なり、完全にローカルで、保存内容をすべて確認できます。ダッシュボードで保存された内容を正確に確認し、不要な情報を削除できます。
クイックスタート
必要なもの: Node.js 20 以降だけです。Norn を別途インストールする必要はありません。以下のコマンドが自動的に取得します。node --version で確認してください。インストールされていない場合や v20 未満の場合は、nodejs.org から LTS 版を入手してください。
Claude Code に接続する — クローン不要のワンコマンドです。
claude mcp add norn -- npx -y @samad001z/norn-server
または、ターミナルで CLI を使う — 必要なときに実行するか、norn コマンドをインストールします。
npx @samad001z/norn-core list # no install — npx fetches it each time
npm install -g @samad001z/norn-core # or put the `norn` command on your PATH
その他の MCP クライアント — MCP 設定に以下を追加してください。
{
"mcpServers": {
"norn": {
"command": "npx",
"args": ["-y", "@samad001z/norn-server"]
}
}
}
ツールを再起動してください。Norn は remember、recall、forget、list の 4 つのツールを登録します。
任意 — 起こり得る矛盾を検出する: 上記の設定に
"env": { "NORN_DETECT_CONFLICTS": "1" }を追加すると、矛盾している可能性のあるメモリが Norn に表示され、ダッシュボードで解決できます。デフォルトではオフです。候補が初めて見つかったときに、小さな追加モデルがダウンロードされます。また、Norn が独自にストアを変更することはありません。
設定の場所がわからない場合: Norn を AI ツールに接続する ガイドでは、Claude Desktop、Cursor、Windsurf、VS Code + GitHub Copilot、Gemini CLI の正確なコピー&ペースト用設定に加え、初心者向けの「必要なもの」とトラブルシューティングを紹介しています。(VS Code + Copilot では
mcpServersではなくserversキーを使います。)
接続を確認する: アシスタントに 「npm より pnpm を使うほうが好みだと覚えておいて」 と伝え、新しいチャットで 「どのパッケージマネージャーを使うのが好み?」 と尋ねてください。Norn の recall ツールを呼び出して、pnpm と答えるはずです。
最初の
rememberまたはrecallの実行時に、ローカルの埋め込みモデル(all-MiniLM-L6-v2、約 25 MB)が一度だけダウンロードされ、その後は完全にオフラインで動作します。
またはソースから実行する
git clone https://github.com/samad001z/Norn.git
cd Norn
npm install
npm run build -w @samad001z/norn-core && npm run build -w @samad001z/norn-server
claude mcp add norn -- node "$(pwd)/server/dist/index.js"
動作を見る
メモリはセッションをまたいで保持されます。また、検索は意味ベースのため、キーワードではなく意味で一致します。
セッション 1
あなた:Vercel では main ブランチから本番環境にデプロイすることを覚えておいて。
Claude が
remember("deploy to production from the main branch on Vercel", project: "acme")を呼び出します。
セッション 2、翌日、新しいコンテキストウィンドウで
あなた:本番環境へのリリース方法は?
Claude が
recall("how do we ship to prod")を呼び出します。保存されたメモと検索語に共通するキーワードがなくても、Norn は「Vercel では main ブランチから本番環境にデプロイします。」と返します。
メモリの使用方法:明示的に保存するものであり、自動ではありません
Norn はセッションを記録しません。Norn はメモリストアであり、ロガーではありません。プロンプト、コードの編集、ターミナルコマンドをひそかに記録することはありません。メモリが保存されるのは、エージェントが remember() を呼び出した場合だけです。呼び出し方は次の 2 通りです。
- あなたが頼む場合。 「Vercel には
mainからデプロイすることを覚えておいて。」 エージェントがremember(...)を呼び出し、メモが保存されます。 - エージェントが自ら判断する場合。 次のセッションに残しておく価値がある事実(決定事項、好み、制約など)だと判断したときに保存します。
これが重要な点です。何を残すかはあなたが決めるため、ストアにはノイズではなく有用な情報が蓄積されます。一方で、あなたが一度も頼まなければ、何も保存されません。そのため、長時間作業した後のダッシュボードにメモリがほとんどなくても、それは想定どおりであり、バグではありません。作業内容は git に保存されます。Norn は、後で思い出したい永続的な情報を保存するためのものです。
活用するための習慣をいくつか紹介します。
- タスクの最後に**「ここでの重要な決定事項を覚えておいて」**と伝えると、エージェントが記録してくれます。
- セッションのたびに再度貼り付けるのではなく、最初に一度だけ**「自分の技術スタックと規約を覚えておいて」**と伝えておきます。
- **「X について何を覚えている?」**と尋ねると、エージェントが必要に応じて
recall()を呼び出します。
この方法で保存した内容はすべてダッシュボードに表示され、必要に応じて忘れさせることができます。
仕組み
3 つのローカルコンポーネントが、1 つのローカルデータベースを共有します。
Claude Code / Cursor ──MCP (stdio)──► Norn MCP server ┐
├──► ~/.norn/norn.db
Dashboard (Next.js) ────────────────────────────┘ (SQLite + sqlite-vec)
- MCP サーバー(
/server):stdio 経由でremember、recall、forget、listを公開します。 - ストア(
/core):SQLite と sqlite-vec を使用し、ローカルの MiniLM モデルによる埋め込みを利用します(API キーは不要です)。recallは意味的な類似度と新しさを組み合わせ、結果をトークンの予算に合わせて調整します。rememberはほぼ同一のメモを重複排除します。 - ダッシュボード(
/web):すべての内容を閲覧・管理できる Next.js アプリです。
3 つすべてが同じストアを参照するため、エージェントが書き込んだメモリはダッシュボードに表示され、ダッシュボードで忘れさせたメモリはエージェント側からも削除されます。ストアは次の順序で選ばれます。
- 設定されている場合は
NORN_DB_PATH— 明示的な指定が常に優先されます。 - 作業ディレクトリから上位にたどって見つかる、最も近いプロジェクトローカルの
.norn/norn.db(プロジェクトごとのメモリを参照)。 - グローバルな
~/.norn/norn.db。
プロジェクトストアも上書き指定もない場合は、従来どおり、グローバルな ~/.norn/norn.db が 1 つ使われます。
プロジェクトごとのメモリ
リポジトリごとに専用のメモリを用意し、リポジトリと一緒に管理できます。プロジェクトのルートから次を実行します。
npx @samad001z/norn-core init # or: norn init
これにより、そのプロジェクトの norn.db を格納する .norn/ ディレクトリが作成されます。各プロジェクトが独自のデータベースファイルを持つため、メモリがプロジェクト間で混ざることはありません。あるリポジトリで作業するエージェントには、そのリポジトリのメモリだけが表示されます。
プロジェクトの検出方法
Norn は git と同じ方法でプロジェクトを検出します。作業ディレクトリから上位へたどり、.norn/ ディレクトリを含む最も近い祖先ディレクトリを探します。リポジトリ内のどこからエージェント(または CLI)を実行しても、同じストアが選ばれます。ストアは次の順序で選ばれます。
- 設定されている場合は**
NORN_DB_PATH** — 明示的な指定が常に優先されます。 - 作業ディレクトリから上位にたどって見つかる、最も近いプロジェクトローカルの
.norn/norn.db。 - グローバルな**
~/.norn/norn.db** — プロジェクトストアがない場合の従来の動作です。
norn init を実行していない場合でも、共有のグローバルストア内ではプロジェクトごとに分離されます。各メモリには、書き込まれたプロジェクトルートが記録されます(自由に指定できるプロジェクトラベルとは別に、最も近い .git/.norn の祖先から導出される scope)。recall は、現在のプロジェクトのメモリとグローバルメモリのみを返します。データベースファイルを分けることが分離の基本であり、scope による記録は共有ストアの安全性をさらに高めます。
リポジトリと一緒にメモリーをコミットする
norn export/norn importは v1.1 以降で利用できます。それ以前のバージョンでは、バイナリのnorn.dbをそのままコミットしてください(デフォルトのnorn initの設定です)。
norn.db はバイナリの SQLite ファイルで、埋め込みベクトルを保持するため、読み取り可能な git diff がなく、マージ時に競合する可能性があります。メモリーを適切にバージョン管理するには、代わりに 差分を確認できるテキスト形式でエクスポートしてコミットし、各チェックアウトでデータベースを再構築します:
norn export # writes .norn/memory.json — text, tags, project, ids, timestamps (no vectors)
memory.json は決定論的にソートされるため、変更のないストアを再エクスポートすると、差分は空になります。埋め込みはこのファイルに保存されず、インポート時にローカルで再生成されるため、ファイルは小さく、レビューしやすいままです。これをコミットし、次のような .norn/.gitignore でバイナリストアを gitignore に追加します:
# .norn/.gitignore — commit memory.json, ignore the binary store.
# norn.db is binary SQLite (it holds embedding vectors): no readable diffs,
# and it can conflict on merge. memory.json (not listed here) is the
# diffable file you commit; the sidecars below are always transient.
norn.db
norn.db-wal
norn.db-shm
norn.db-journal
norn init(v1.1 以降)はこの.gitignoreを正確に作成するため、初期状態ではmemory.jsonがコミット対象になります。代わりにバイナリのnorn.dbをコミットし、クローン時のインポート手順を省くことを優先しますか(読み取り可能な差分はなくなります)?その場合はnorn.dbの行を削除してください。
新しいクローンでは、コミットしたファイルからローカルデータベースを再構築します:
norn import # reads .norn/memory.json and regenerates embeddings locally
import は ID を基準にアップサートするため、繰り返し実行しても安全です。メモリーが重複することはありません。
試してみる:分離してから、コミットしてクローンする
自己完結型のコピー&ペースト用ウォークスルーです(npx を使用するため、インストール不要です。Node 20 以降と git が必要です):
# 1. Two separate projects, each with its own committed memory store.
mkdir -p /tmp/demo/alpha /tmp/demo/beta
cd /tmp/demo/alpha
npx @samad001z/norn-core init
npx @samad001z/norn-core remember "Alpha API rate limit is 600 requests per minute per token"
cd /tmp/demo/beta
npx @samad001z/norn-core init
npx @samad001z/norn-core remember "Beta deploys to prod from the main branch on Vercel"
# 2. Isolation: from Beta, ask for Alpha's fact. Beta only ever returns its own
# (and global) memories — Alpha's note never appears here.
npx @samad001z/norn-core recall "what is the request rate limit"
# 3. Export Alpha's memory to a diffable file and commit it.
cd /tmp/demo/alpha
npx @samad001z/norn-core export # writes .norn/memory.json
git init -q && git add .norn/memory.json && git commit -qm "Add project memory"
# 4. Simulate a teammate's fresh clone: bring the export, NOT the binary db.
mkdir -p /tmp/demo/alpha-clone/.norn
cp .norn/memory.json /tmp/demo/alpha-clone/.norn/memory.json
# 5. Rebuild the store from the committed file and confirm recall works.
cd /tmp/demo/alpha-clone
npx @samad001z/norn-core import # regenerates embeddings locally
npx @samad001z/norn-core recall "what is the request rate limit"
# → "Alpha API rate limit is 600 requests per minute per token"
機能
- セッションやプロジェクトをまたいで記憶します。 CLAUDE.md を手作業で何度も貼り付ける必要はありません。
- 記憶している内容をすべて確認できます。 ブラックボックスではなく、すべてのメモリーを確認できます。
- 必要なものを元に戻せる形で忘れさせられます。 保持する内容を完全に管理できます。
- 古くなったメモリーを表示します。 しばらく触れていないメモリーには、ダッシュボードでひっそりとフラグが付くため、整理できます。表示するだけで、削除することはありません。
- 競合の可能性を検出します(オプトイン)。
NORN_DETECT_CONFLICTS=1を設定すると、矛盾している可能性のあるメモリーに Norn がフラグを付けるので、どれを残すか選べます。自動で解決、編集、削除することはありません。デフォルトではオフで、追加のモデルは有効にしたときにのみダウンロードされます。 - Norn Live:エージェントによるメモリーの利用を確認できます。 ダッシュボードのライブアクティビティフィードに、すべての
remember、recall、forgetが実行時に表示され、判断が必要な競合も確認できます。Norn Live を参照してください。 - MCP 経由でツールから利用できます。 Claude Code、Cursor、およびあらゆる MCP クライアントに対応しています。
- ローカル優先です。 コンテキスト、埋め込みモデル、データベースはすべてお使いのマシンに保存されます。
プライバシー
デフォルトでローカルに保存されます。ストアはディスク上の SQLite ファイルで、埋め込みモデルはお使いのマシンで実行され、データが外部に送信されることはありません。アカウント、API キー、テレメトリーは不要です。~/.norn/norn.db を削除すれば、メモリーも消去されます。
メモリーを管理する
ダッシュボードでは、プロジェクトごとの閲覧、検索、任意のメモリーの取り消し(元に戻す機能付き)ができます。リポジトリをクローンして実行します(npx サーバーパッケージには含まれていません)。エージェントが書き込むものと同じローカルストア、つまり ~/.norn/norn.db を読み込むため、Norn が記憶した内容がここに表示されます。
新しいターミナルから、次の 4 つのコマンドを実行します:
git clone https://github.com/samad001z/Norn.git
cd Norn
npm install # install dependencies
npm run build:core # build the store package the dashboard reads through (required)
npm run dev:web # start the dashboard
次に http://localhost:3000/app を開きます。
ダッシュボードが空のまま表示されるよくある原因は、
npm run build:coreを省略していることです。ウェブアプリは@samad001z/norn-coreからコンパイル済みのストアをインポートするため、最初にこのパッケージを一度ビルドする必要があります。その後は、再度開くときにnpm run dev:webを実行するだけで大丈夫です。
デフォルト以外の場所にあるストアをダッシュボードに指定するには、dev:web の実行前に NORN_DB_PATH をエージェントが使用するものと同じパスに設定します(それ以外の場合はデフォルトのままで問題ありません):
NORN_DB_PATH=/path/to/norn.db npm run dev:web

ターミナルを使いたい場合は、ダッシュボードを使わずに同じストアを調べられます:
npm run cli -w @samad001z/norn-core -- init # give this project its own committed store
npm run cli -w @samad001z/norn-core -- list
npm run cli -w @samad001z/norn-core -- recall "how do we deploy"
npm run cli -w @samad001z/norn-core -- export # write .norn/memory.json to commit with the repo
npm run cli -w @samad001z/norn-core -- import # rebuild this checkout's store from memory.json
Norn Live:エージェントがメモリを使う様子を確認
**http://localhost:3000/app/live**(またはダッシュボードのサイドバーにある Live リンク)を開くと、エージェントがメモリをリアルタイムで使う様子を確認できます。Norn 経由で行われるすべての remember、recall、forget はローカルのアクティビティログに記録され、発生と同時にフィードに配信されます。誰が、何を、いつ行い、何に触れたかを短くプレビューできます。対応が必要パネルには、まだ判断待ちの競合候補(検出が有効な場合)が表示されます。ダッシュボードで解決すると、こちらからも消えます。
Norn のほかの機能と同様、ログはローカルに保存されます。イベントはメモリと同じ SQLite ファイルに保存され、マシンの外に出ることはありません。このページはサーバー送信イベントで配信し、ストリームが切断された場合はポーリングに切り替えます。
エージェントの名前設定。 イベントには、任意のツール引数 agentId または MCP 設定の環境変数 NORN_AGENT_ID を使ってエージェント名を付けられます。どちらも設定されていない場合、サーバーセッションには agent-3f9c21 のような ID が自動生成されます。アクティビティは引き続きセッションごとにグループ化されますが、名前は表示されません。イベントにもモデル名を付けたい場合は NORN_MODEL を設定してください。Norn がモデル名を推測することはありません。
できることと、できないこと:
- ログに記録されるのはNorn 独自のツールのみです。セッションレコーダーではないため、プロンプト、コード、ターミナルが記録されることはありません。通常の
listによる閲覧も記録されません。 - イベントのログ記録は、設計上ベストエフォートです。ログの書き込みに失敗しても、メモリの書き込みがブロックされたり、ロールバックされたりすることはありません。フィードは監査記録ではなく、トレースとして扱ってください。
- イベントの記録にはサーバー v1.3.0 以降が必要です。古いサーバーはイベントを書き込まないため、
npxコマンドが新しいバージョンを取得するまでフィードは空のままです(次回起動時に最新バージョンを自動で取得します)。 - 現在、ログの容量に上限はありません。保持件数の上限はまだなく、使用とともに増えていきます。古いログの削除は今後のロードマップに含まれています。
ロードマップ
- 既存の
Embedderインターフェースの背後で、埋め込みバックエンド(Ollama、OpenAI 互換)を切り替えられるようにします。 - ダッシュボードからメモリを直接編集できるようにします(追加と忘却にはすでに対応しています)。
- 競合検出のしきい値をより多くのデータで調整するため、ラベル付きベンチマークを拡充します。
- アクティビティログに保持期間(経過時間/件数の上限)を設定し、Norn Live の履歴が際限なく増えないようにします。
- エディターや MCP クライアントとの連携を拡充します。
コントリビューション
コントリビューションを歓迎します。CONTRIBUTING.md をご覧ください。簡単にまとめると:
npm install
npm run build
npm test -w @samad001z/norn-core
ライセンス
MIT。LICENSE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。