Mnemon — Persistent Layered Memory for AI Agents について
Mnemonは、AIエージェント向けのローカル優先メモリーサーバーで、エピソード、意味、手順、リソースの4層の記憶をSQLiteに保存します。検索可能なメモリーに事実のバージョン管理を組み合わせ、ベクトル検索も任意で利用できます。
主な機能
- 014層に分けたメモリー管理
- 02FTS5とBM25による検索
- 03任意のベクトル・ハイブリッド検索
- 04置換チェーンによる事実の版管理
- 05Markdownナレッジベースのインポート
- 06メモリーのJSON・Markdown出力
活用シーン
- 01エージェントのセッション間でコンテキストを保持
- 02トピックや日付でメモリーを検索
- 03変化する事実の履歴を追跡
- 04Markdownノートをメモリーに取り込み
MCP 対応
MnemonはstdioまたはHTTP経由で、MCP対応クライアントにメモリーツール、リソース、プロンプトを提供します。ツールはメモリーの保存、検索、更新、セッション管理、出力、診断に対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y mnemon-mcpMNEMON_DB_PATHPath to SQLite database file (default: ~/.mnemon-mcp/memory.db)MNEMON_EMBEDDING_PROVIDEREmbedding provider for vector search: 'openai' or 'ollama' (default: disabled)MNEMON_EMBEDDING_API_KEYシークレットAPI key for embedding provider (required for OpenAI)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mnemon-mcp
AI エージェントのための、永続的な階層型メモリです。 ローカルファースト。クラウド不要。単一の SQLite ファイル。
AI エージェントはセッションごとにすべてを忘れてしまいます。Mnemon がそれを解決します。
OpenClaw、Claude Code、Cursor、Windsurf、自作のクライアントなど、あらゆる MCP 対応クライアントに、マシン上の単一の SQLite データベースを基盤とする、構造化された長期メモリを提供します。API キー不要、クラウド不要、テレメトリなし。npm install するだけで、エージェントが記憶できるようになります。
階層型メモリが必要な理由
フラットなキーと値のストアでは、「昨日あったこと」と「テストなしでコミットしないこと」が同じように扱われます。それは適切ではありません。知識の種類によって、保持期間やアクセス方法は異なるからです。
Mnemon はメモリを4 つの層に整理します。
| 層 | 保存する内容 | アクセス方法 | 保持期間 |
|---|---|---|---|
| エピソード記憶 | イベント、セッション、日記の記録 | 日付または期間で検索 | 時間とともに減衰(半減期 30 日) |
| 意味記憶 | 事実、好み、関係性 | トピックまたはエンティティで検索 | 安定 |
| 手続き記憶 | ルール、ワークフロー、規約 | 起動時に読み込み | ほとんど変化しない |
| リソース | 参考資料、読書メモ | 必要に応じて | ゆっくり減衰(90 日) |
先週火曜日の日記と、変わることのないコーディングルールは、異なる層に保存されます。それが本来あるべき姿だからです。
検索品質
検索品質は、実際の 797 件のメモリを含むバイリンガル(RU/EN)コーパスを使った 50 ケースのゴールデンセットに対して、再実装ではなく実際の MCP サーバーを通して測定しています。現在の数値(評価方法と履歴):
| 指標 | FTS のみ | ベクトルのみ | ハイブリッド(RRF) |
|---|---|---|---|
| 総合スコア | 88.9 | 89.2 | 91.7 |
| Recall@5 | 0.907 | 0.898 | 0.919 |
| MRR | 0.817 | 0.832 | 0.878 |
| nDCG@5 | 0.816 | 0.828 | 0.869 |
| ネガティブ精度 | 1.000 | 1.000 | 1.000 |
ハイブリッド方式は両方の方式を個別に上回ります。これこそが、両者を融合させる理由です。語彙検索は生の再現率に優れ、ベクトル検索はランキングに優れています。RRF は両者を平均化して差を消すのではなく、その長所を保ちます。
評価ドキュメントでは、コーパスの拡大に伴うスコアの変動、評価で見つかった BM25 のフィールド重み付けのバグ、融合方式が純粋な語彙検索に劣る 2 つのケース、そしてゴールデンセットが対象としていない項目も追跡しています。監査できない数値は宣伝文句にすぎません。数値の算出方法をご覧ください。
アーキテクチャ
flowchart LR
C["MCP client<br/>Claude Code · Cursor · …"] -- "stdio / HTTP" --> T["10 tools · 4 resources · 3 prompts"]
T --> R["retrieval pipeline<br/>FTS5 · vector · RRF fusion"]
T --> M["memories + supersede chains"]
I["KB import pipeline<br/>markdown → memories"] --> M
M -- triggers --> F["FTS5 index (stemmed EN+RU)"]
R --> F
R --> V["sqlite-vec (optional, BYOK)"]
1 つの SQLite ファイルに、メモリ、FTS5 インデックス、オプションのベクトルインデックスが保存されます。書き込みは、置き換えチェーンの不変条件を維持するトランザクションを通して行われます。読み取りでは、検索で説明する段階的な検索パイプラインが実行されます。
モジュールの境界、書き込み/読み取り経路、不変条件、既知の制限事項を含む全体像は、docs/ARCHITECTURE.mdにあります。設計上の決定は ADR として記録されています:SQLite+FTS5 コア、ハイブリッド RRF 検索、同期ドライバー、階層型メモリモデル。
クイックスタート
インストール
npm install -g mnemon-mcp
またはソースからインストールします。
git clone https://github.com/nikitacometa/mnemon-memory-mcp.git
cd mnemon-memory-mcp && npm install && npm run build
MCP クライアントを設定する
OpenClaw
openclaw mcp register mnemon-mcp --command="mnemon-mcp"
または、~/.openclaw/mcp_config.json に追加します。
{
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
Claude Code
~/.claude/mcp.json に追加します。
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}
Cursor / Windsurf / Other MCP clients
クライアントの MCP 設定に追加します。
{
"mcpServers": {
"mnemon-mcp": {
"command": "mnemon-mcp"
}
}
}
ソースから実行しますか?
コンパイル済みエントリーポイントのフルパスを使用します。
{
"mnemon-mcp": {
"command": "node",
"args": ["/absolute/path/to/mnemon-mcp/dist/index.js"]
}
}
確認
echo '{"jsonrpc":"2.0","method":"tools/list","id":1}' | mnemon-mcp
応答には 10 個のツールが表示されます。データベース(~/.mnemon-mcp/memory.db)は初回実行時に自動作成されます。
これで完了です。エージェントが永続的なメモリを利用できるようになりました。
できること
10 個の MCP ツール
| ツール | 機能 |
|---|---|
memory_add | レイヤー、エンティティ、信頼度、重要度、任意の TTL を指定してメモリを保存します |
memory_search | レイヤー、エンティティ、日付、スコープ、信頼度で絞り込める全文検索または完全一致検索です |
memory_update | その場で更新するか、バージョン管理された置換項目を作成します(後継チェーン) |
memory_delete | メモリを削除します。前の項目がある場合は再び有効化します |
memory_inspect | レイヤーの統計情報を取得するか、単一メモリのバージョン履歴を追跡します |
memory_export | フィルターを適用して、JSON、Markdown、または Claude-md 形式でエクスポートします |
memory_health | 期限切れの項目、孤立したチェーン、古いメモリを診断します。任意で GC も実行できます |
memory_session_start | エージェントセッションを開始します。メモリをグループ化するためのセッション ID を返します |
memory_session_end | 任意の要約を付けてセッションを終了します。所要時間とメモリ件数を返します |
memory_session_list | クライアント、プロジェクト、アクティブ状態で絞り込んでセッションを一覧表示します |
MCP リソースとプロンプト
リソース — エージェントが読み取れる最新データです。
| URI | 返される内容 |
|---|---|
memory://stats | レイヤーごとの集計統計情報 |
memory://recent | 過去 24 時間に作成または更新されたメモリ |
memory://layer/{layer} | レイヤー内のすべての有効なメモリ |
memory://entity/{name} | エンティティに関するすべての有効なメモリ |
プロンプト — 事前に構築されたワークフローです。
| プロンプト | 用途 |
|---|---|
recall | 「X について知っていることをすべて教えて」 |
context-load | タスクを開始する前に、関連するコンテキストを読み込みます |
journal | 形式に沿ったジャーナル項目を作成します |
検索
4 つのモードがあり、すべてでレイヤー/エンティティ/スコープ/日付/信頼度による絞り込みに対応しています。
FTS モード(埋め込みがない場合のデフォルト) — BM25 ランキングを使用するトークン化された全文検索です。複数語のクエリでは AND を使用し、結果が少なすぎる場合はスコアにペナルティを加えて OR で補います。段階的な AND 緩和では、完全な OR に切り替える前に、最も具体的な上位 3 語で検索を試みます。
ハイブリッドモード(埋め込みを設定した場合のデフォルト) — Reciprocal Rank Fusion によって FTS5 とベクトル検索を組み合わせます。クエリ内の引用符で囲まれたエンティティ(例:'Essentialism')を検出し、相互参照検索用の重み付きサブクエリを実行します。
ベクトルモード — 埋め込みに対するコサイン類似度のみを使用する検索です。
完全一致モード — 正確なフレーズ検索に LIKE による部分文字列一致を使用します。
スコア:bm25 × (0.3 + 0.7 × importance) × decay(layer) × recency
新しさのブースト:1 / (1 + daysSince / 365) — 最近作成されたメモリを緩やかに優先し、古いメモリにはペナルティを課しません。
ステミング
英語とロシア語では、インデックス作成時とクエリ時の両方で Snowball ステマーを適用します。つまり、"running" は "runs" に一致し、"книги" は "книга" に一致します。精度を高めるため、クエリからストップワードを除外します。
事実のバージョン管理
知識は変化します。Mnemon は古い事実を削除せず、チェーン化します。
v1: "Team uses React 17" → superseded_by: v2
v2: "Team uses React 19" → supersedes: v1 (active)
検索では最新のバージョンのみが返されます。include_history: true を指定した memory_inspect では、チェーン全体を確認できます。memory_delete を実行すると前の項目が再び有効になり、何も失われません。
ベクトル検索(オプション、BYOK)
独自の埋め込み API を指定して、意味的類似性検索を有効にします。
# OpenAI
MNEMON_EMBEDDING_PROVIDER=openai MNEMON_EMBEDDING_API_KEY=sk-... mnemon-mcp
# Ollama (local, free)
MNEMON_EMBEDDING_PROVIDER=ollama mnemon-mcp
これにより、次の 2 つの検索モードが追加されます。
mode: "vector"— コサイン類似度による純粋な検索mode: "hybrid"— Reciprocal Rank Fusion を使用して FTS5 とベクトルを組み合わせた検索
sqlite-vec(オプションの依存関係としてインストール)が必要です。新しいメモは追加時に埋め込まれ、既存のメモは後から埋め込みを追加できます。
埋め込みの設定
| 変数 | デフォルト | 説明 |
|---|---|---|
MNEMON_EMBEDDING_PROVIDER | — | openai または ollama(未設定の場合は無効) |
MNEMON_EMBEDDING_API_KEY | — | API キー(OpenAI では必須) |
MNEMON_EMBEDDING_MODEL | text-embedding-3-small / nomic-embed-text | モデル名 |
MNEMON_EMBEDDING_DIMENSIONS | 1024 / 768 | ベクトルの次元数 |
MNEMON_OLLAMA_URL | http://localhost:11434 | Ollama のエンドポイント |
ナレッジベースのインポート
Markdown ファイルのフォルダーがあれば、一括でインポートできます。
cp config.example.json ~/.mnemon-mcp/config.json # edit this first
npm run import:kb -- --kb-path /path/to/your/kb # incremental (skips unchanged files)
設定では、glob パターンをメモリレイヤーに割り当てます。
{
"owner_name": "your-name",
"extra_stop_words": [],
"mappings": [
{
"glob": "journal/*.md",
"layer": "episodic",
"entity_type": "user",
"entity_name": "$owner",
"importance": 0.6,
"split": "h2"
},
{
"glob": "people/*.md",
"layer": "semantic",
"entity_type": "person",
"entity_name": "from-heading",
"importance": 0.8,
"split": "h3"
}
]
}
設定フィールド
| フィールド | 型 | 説明 |
|---|---|---|
owner_name | string | 名前。entity_name の $owner 置換に使用します |
extra_stop_words | string[] | FTS クエリから除外する単語(名前の表記など) |
glob | string | 一致させるファイルパターン |
layer | string | 対象のメモリレイヤー |
entity_type | string | user / person / project / concept / file / rule / tool |
entity_name | string | 固定の名前、"$owner"、または "from-heading"(H2/H3 から抽出) |
split | string | "whole"(ファイルごとに 1 つのメモリ)、"h2"、または "h3"(見出しで分割) |
importance | number | 0.0~1.0。検索順位に影響します |
confidence | number | 0.0~1.0。検索時にフィルタリングできます |
scope | string | オプションの名前空間 |
HTTP トランスポート
リモート環境または複数のクライアントで使用する場合:
MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http
| エンドポイント | 説明 |
|---|---|
POST /mcp | MCP JSON-RPC(トークン設定時は Bearer 認証) |
GET /health | {"status":"ok","version":"..."} |
デフォルトでは 127.0.0.1 にバインドします。他のホストにバインドするには MNEMON_AUTH_TOKEN が必要です。サーバーは、認証なしでメモリストアをネットワークに公開することを拒否します(信頼できるネットワークでは MNEMON_ALLOW_INSECURE_HTTP=1 で上書きできます)。デフォルトで毎分 100 件/IP のレート制限、オプトイン方式の CORS、1MB の本文サイズ制限、タイミングセーフな認証、SIGTERM 時の正常なシャットダウンに対応しています。
設定リファレンス
| 変数 | デフォルト | 説明 |
|---|---|---|
MNEMON_DB_PATH | ~/.mnemon-mcp/memory.db | データベースのパス |
MNEMON_KB_PATH | . | インポート対象のナレッジベースのルート |
MNEMON_CONFIG_PATH | ~/.mnemon-mcp/config.json | インポート設定のパス |
MNEMON_AUTH_TOKEN | — | HTTP トランスポート用の Bearer トークン |
MNEMON_HOST | 127.0.0.1 | HTTP トランスポートのバインドアドレス |
MNEMON_PORT | 3000 | HTTP トランスポートのポート |
MNEMON_CORS_ORIGIN | — | CORS の Access-Control-Allow-Origin(設定しない場合、CORS ヘッダーは送信されません) |
MNEMON_RATE_LIMIT | 100 | IP ごとの 1 分あたりの最大リクエスト数(0 = 無効) |
ツールリファレンス
memory_add — 全パラメーター一覧
| パラメーター | 型 | 必須 | 説明 |
|-----------|------|----------|-------------|
| `content` | string | はい | メモリのテキスト(最大100K文字) |
| `layer` | string | はい | `episodic` / `semantic` / `procedural` / `resource` |
| `title` | string | いいえ | 短いタイトル(最大500文字) |
| `entity_type` | string | いいえ | `user` / `project` / `person` / `concept` / `file` / `rule` / `tool` |
| `entity_name` | string | いいえ | フィルタリング用のエンティティ名 |
| `confidence` | number | いいえ | 0.0~1.0(デフォルトは0.8) |
| `importance` | number | いいえ | 0.0~1.0(デフォルトは0.5) |
| `scope` | string | いいえ | 名前空間(デフォルトは`global`) |
| `source_file` | string | いいえ | ソースファイルのパス。一致するエントリの自動置き換えを実行します |
| `ttl_days` | number | いいえ | N日後に自動期限切れ |
| `valid_from` / `valid_until` | string | いいえ | 時間的事実の有効期間(ISO 8601) |
memory_search — パラメーター一覧
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
query | string | はい | 検索テキスト |
mode | string | いいえ | fts(デフォルト)、exact、vector、hybrid |
layers | string[] | いいえ | レイヤーで絞り込み |
entity_name | string | いいえ | エンティティで絞り込み(エイリアスに対応) |
scope | string | いいえ | スコープで絞り込み |
date_from / date_to | string | いいえ | 日付範囲(ISO 8601) |
as_of | string | いいえ | 時間的事実によるフィルター。この日付時点で有効な事実 |
min_confidence | number | いいえ | 信頼度の最小値 |
min_importance | number | いいえ | 重要度の最小値 |
limit | number | いいえ | 最大結果数(デフォルトは10、最大100) |
offset | number | いいえ | ページネーションのオフセット |
memory_update — パラメーター一覧
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | はい | メモリID |
content | string | いいえ | 新しい内容 |
title | string | いいえ | 新しいタイトル |
confidence | number | いいえ | 新しい信頼度 |
importance | number | いいえ | 新しい重要度 |
supersede | boolean | いいえ | true = バージョン管理された置き換え、false(デフォルト)= インプレース更新 |
new_content | string | いいえ | 置き換え後のエントリの内容 |
memory_delete
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | はい | メモリID。置き換えチェーンの一部である場合、前のエントリを再有効化します |
memory_inspect
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | いいえ | メモリID(集計統計を取得する場合は省略) |
layer | string | いいえ | レイヤーで統計を絞り込み |
entity_name | string | いいえ | エンティティで統計を絞り込み |
include_history | boolean | いいえ | 置き換えチェーンを表示 |
memory_export
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
format | string | はい | json / markdown / claude-md |
layers | string[] | いいえ | レイヤーで絞り込み |
scope | string | いいえ | スコープで絞り込み |
date_from / date_to | string | いいえ | 日付範囲 |
limit | number | いいえ | エントリの最大数(デフォルトはすべて、最大10K) |
memory_health
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
cleanup | boolean | いいえ | true = 期限切れエントリをガベージコレクションします(デフォルトはレポートのみ) |
戻り値:ステータス(healthy / warning / degraded)、レイヤーごとの統計、期限切れエントリ、孤立したチェーン、古いエントリ/信頼度の低いエントリの数、cleanup=trueの場合はクリーンアップ数。
memory_session_start
| パラメーター | 型 | 必須 | 説明 |
|-----------|------|----------|-------------|
| `client` | string | はい | クライアント識別子(例:`claude-code`、`cursor`、`api`) |
| `project` | string | いいえ | このセッションのプロジェクトスコープ |
| `meta` | object | いいえ | 追加のセッションメタデータ |
戻り値:id(セッション UUID)、started_at(ISO 8601)。
memory_session_end
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | はい | 終了するセッション ID |
summary | string | いいえ | 達成した内容の要約(最大 10K 文字) |
戻り値:id、ended_at、duration_minutes、memories_count。
memory_session_list
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
limit | number | いいえ | セッションの最大数(デフォルトは 20、最大 100) |
client | string | いいえ | クライアントで絞り込み |
project | string | いいえ | プロジェクトで絞り込み |
active_only | boolean | いいえ | 終了していないセッションのみを返す(デフォルトは false) |
戻り値:id、client、project、started_at、ended_at、summary、memories_count を含むセッションの配列。
比較
| mnemon-mcp | mem0 | basic-memory | Engram | Anthropic KG | |
|---|---|---|---|---|---|
| アーキテクチャ | SQLite FTS5 + ベクトル | クラウド API + Qdrant | Markdown + ベクトル | SQLite FTS5 | JSON ファイル |
| メモリー構造 | 4 つの型付きレイヤー | フラット | フラット | フラット + セッション | グラフ |
| 検索 | FTS5 + ハイブリッド RRF | セマンティック | ハイブリッド | FTS5 | 完全一致 |
| 事実のバージョン管理 | 上書きチェーン | 部分的 | なし | なし | なし |
| ステミング | EN + RU(Snowball) | EN のみ | EN のみ | なし | なし |
| 埋め込み | BYOK(OpenAI / Ollama) | 組み込み | FastEmbed | なし | なし |
| 依存関係 | 必須のものは 0 | Qdrant、Neo4j | Python 3.12 | Go バイナリ | なし |
| クラウドが必要 | いいえ | はい | いいえ | いいえ | いいえ |
| 費用 | 無料 | 月額 $19–249 | 無料 | 無料 | 無料 |
| セットアップ | npm install -g | Docker + API キー | pip + 依存関係 | Go install | 組み込み |
| ライセンス | MIT | Apache 2.0 | AGPL | MIT | MIT |
出典付きの詳細な競合分析:docs/COMPETITORS.md。
開発
npm run dev # run via tsx (no build step)
npm run build # TypeScript → dist/
npm run lint # eslint (flat config)
npm test # vitest — unit + integration + MCP dispatch + HTTP transport + hybrid RRF
npm run bench # performance benchmarks
npm run db:backup # backup database
CI では Node 20 と 22 でビルド、lint、テストを実行した後、実際の JSON-RPC を使用してコンパイル済みサーバーのスモークテストを実施します(tools/list がツールセットと完全に一致する必要があります)。
技術スタック: TypeScript 5.9(厳格モード)、better-sqlite3、@modelcontextprotocol/sdk、Snowball stemmer、Zod、vitest。
コーディングガイドラインについては、CONTRIBUTING.md を参照してください。
設計原則
- デフォルトでエアギャップ — テレメトリーは一切ありません。初期状態ではマシンの外部にデータが送信されることはありません。ネットワークと通信するコンポーネントはオプションの埋め込み機能だけで、設定したプロバイダー(ローカルの Ollama を含む)とのみ通信します。
- 単一ファイル — SQLite データベースは 1 つだけで、運用作業は不要、ファイルをコピーするだけですぐにバックアップできます。
- 決定論的な検索 — デフォルトは埋め込みではなく FTS5 です。解釈可能で再現性があり、GPU も不要です。
- フラット構造より構造化 — レイヤーでアクセスパターンを表現し、上書きチェーンで時間を表現します。
- 最小限 — 本番環境の依存関係は 4 つです。Node が動作する環境ならどこでも使えます。
- 主張ではなく測定 — 検索結果の変更は、リグレッションを含むゴールデンセットで評価します。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。