mcpField
M
Mnemon — Persistent Layered Memory for AI Agents

Mnemon — Persistent Layered Memory for AI Agents

ローカル
github.com/nikitacometaメモリ・ナレッジ315 週間前に更新

Mnemon — Persistent Layered Memory for AI Agents について

Mnemonは、AIエージェント向けのローカル優先メモリーサーバーで、エピソード、意味、手順、リソースの4層の記憶をSQLiteに保存します。検索可能なメモリーに事実のバージョン管理を組み合わせ、ベクトル検索も任意で利用できます。

主な機能

  1. 014層に分けたメモリー管理
  2. 02FTS5とBM25による検索
  3. 03任意のベクトル・ハイブリッド検索
  4. 04置換チェーンによる事実の版管理
  5. 05Markdownナレッジベースのインポート
  6. 06メモリーのJSON・Markdown出力

活用シーン

  1. 01エージェントのセッション間でコンテキストを保持
  2. 02トピックや日付でメモリーを検索
  3. 03変化する事実の履歴を追跡
  4. 04Markdownノートをメモリーに取り込み

MCP 対応

MnemonはstdioまたはHTTP経由で、MCP対応クライアントにメモリーツール、リソース、プロンプトを提供します。ツールはメモリーの保存、検索、更新、セッション管理、出力、診断に対応します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"mnemon": {
"command": "npx",
"args": [
"-y",
"mnemon-mcp"
],
"env": {
"MNEMON_DB_PATH": "<MNEMON_DB_PATH>",
"MNEMON_EMBEDDING_PROVIDER": "<MNEMON_EMBEDDING_PROVIDER>",
"MNEMON_EMBEDDING_API_KEY": "<MNEMON_EMBEDDING_API_KEY>"
}
}
}
}
起動コマンドnpx -y mnemon-mcp
設定が必要な環境変数
MNEMON_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmmnemon-mcp1.0.1

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

mnemon-mcp

CI npm version Node.js License: MIT

AI エージェントのための、永続的な階層型メモリです。 ローカルファースト。クラウド不要。単一の SQLite ファイル。

ランディングページ · npm · GitHub

AI エージェントはセッションごとにすべてを忘れてしまいます。Mnemon がそれを解決します。

OpenClaw、Claude Code、Cursor、Windsurf、自作のクライアントなど、あらゆる MCP 対応クライアントに、マシン上の単一の SQLite データベースを基盤とする、構造化された長期メモリを提供します。API キー不要、クラウド不要、テレメトリなし。npm install するだけで、エージェントが記憶できるようになります。

mnemon-mcp のデモ — memory_add、memory_search、memory_inspect、memory_update


階層型メモリが必要な理由

フラットなキーと値のストアでは、「昨日あったこと」と「テストなしでコミットしないこと」が同じように扱われます。それは適切ではありません。知識の種類によって、保持期間やアクセス方法は異なるからです。

Mnemon はメモリを4 つの層に整理します。

層保存する内容アクセス方法保持期間
エピソード記憶イベント、セッション、日記の記録日付または期間で検索時間とともに減衰(半減期 30 日)
意味記憶事実、好み、関係性トピックまたはエンティティで検索安定
手続き記憶ルール、ワークフロー、規約起動時に読み込みほとんど変化しない
リソース参考資料、読書メモ必要に応じてゆっくり減衰(90 日)

先週火曜日の日記と、変わることのないコーディングルールは、異なる層に保存されます。それが本来あるべき姿だからです。

検索品質

検索品質は、実際の 797 件のメモリを含むバイリンガル(RU/EN)コーパスを使った 50 ケースのゴールデンセットに対して、再実装ではなく実際の MCP サーバーを通して測定しています。現在の数値(評価方法と履歴):

指標FTS のみベクトルのみハイブリッド(RRF)
総合スコア88.989.291.7
Recall@50.9070.8980.919
MRR0.8170.8320.878
nDCG@50.8160.8280.869
ネガティブ精度1.0001.0001.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_MODELtext-embedding-3-small / nomic-embed-textモデル名
MNEMON_EMBEDDING_DIMENSIONS1024 / 768ベクトルの次元数
MNEMON_OLLAMA_URLhttp://localhost:11434Ollama のエンドポイント

ナレッジベースのインポート

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_namestring名前。entity_name の $owner 置換に使用します
extra_stop_wordsstring[]FTS クエリから除外する単語(名前の表記など)
globstring一致させるファイルパターン
layerstring対象のメモリレイヤー
entity_typestringuser / person / project / concept / file / rule / tool
entity_namestring固定の名前、"$owner"、または "from-heading"(H2/H3 から抽出)
splitstring"whole"(ファイルごとに 1 つのメモリ)、"h2"、または "h3"(見出しで分割)
importancenumber0.0~1.0。検索順位に影響します
confidencenumber0.0~1.0。検索時にフィルタリングできます
scopestringオプションの名前空間

HTTP トランスポート

リモート環境または複数のクライアントで使用する場合:

MNEMON_AUTH_TOKEN=your-secret MNEMON_HOST=0.0.0.0 MNEMON_PORT=3000 npm run start:http
エンドポイント説明
POST /mcpMCP 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_HOST127.0.0.1HTTP トランスポートのバインドアドレス
MNEMON_PORT3000HTTP トランスポートのポート
MNEMON_CORS_ORIGIN—CORS の Access-Control-Allow-Origin(設定しない場合、CORS ヘッダーは送信されません)
MNEMON_RATE_LIMIT100IP ごとの 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 — パラメーター一覧
パラメーター型必須説明
querystringはい検索テキスト
modestringいいえfts(デフォルト)、exact、vector、hybrid
layersstring[]いいえレイヤーで絞り込み
entity_namestringいいえエンティティで絞り込み(エイリアスに対応)
scopestringいいえスコープで絞り込み
date_from / date_tostringいいえ日付範囲(ISO 8601)
as_ofstringいいえ時間的事実によるフィルター。この日付時点で有効な事実
min_confidencenumberいいえ信頼度の最小値
min_importancenumberいいえ重要度の最小値
limitnumberいいえ最大結果数(デフォルトは10、最大100)
offsetnumberいいえページネーションのオフセット
memory_update — パラメーター一覧
パラメーター型必須説明
idstringはいメモリID
contentstringいいえ新しい内容
titlestringいいえ新しいタイトル
confidencenumberいいえ新しい信頼度
importancenumberいいえ新しい重要度
supersedebooleanいいえtrue = バージョン管理された置き換え、false(デフォルト)= インプレース更新
new_contentstringいいえ置き換え後のエントリの内容
memory_delete
パラメーター型必須説明
idstringはいメモリID。置き換えチェーンの一部である場合、前のエントリを再有効化します
memory_inspect
パラメーター型必須説明
idstringいいえメモリID(集計統計を取得する場合は省略)
layerstringいいえレイヤーで統計を絞り込み
entity_namestringいいえエンティティで統計を絞り込み
include_historybooleanいいえ置き換えチェーンを表示
memory_export
パラメーター型必須説明
formatstringはいjson / markdown / claude-md
layersstring[]いいえレイヤーで絞り込み
scopestringいいえスコープで絞り込み
date_from / date_tostringいいえ日付範囲
limitnumberいいえエントリの最大数(デフォルトはすべて、最大10K)
memory_health
パラメーター型必須説明
cleanupbooleanいいえ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
パラメーター型必須説明
idstringはい終了するセッション ID
summarystringいいえ達成した内容の要約(最大 10K 文字)

戻り値:id、ended_at、duration_minutes、memories_count。

memory_session_list
パラメーター型必須説明
limitnumberいいえセッションの最大数(デフォルトは 20、最大 100)
clientstringいいえクライアントで絞り込み
projectstringいいえプロジェクトで絞り込み
active_onlybooleanいいえ終了していないセッションのみを返す(デフォルトは false)

戻り値:id、client、project、started_at、ended_at、summary、memories_count を含むセッションの配列。

比較

mnemon-mcpmem0basic-memoryEngramAnthropic KG
アーキテクチャSQLite FTS5 + ベクトルクラウド API + QdrantMarkdown + ベクトルSQLite FTS5JSON ファイル
メモリー構造4 つの型付きレイヤーフラットフラットフラット + セッショングラフ
検索FTS5 + ハイブリッド RRFセマンティックハイブリッドFTS5完全一致
事実のバージョン管理上書きチェーン部分的なしなしなし
ステミングEN + RU(Snowball)EN のみEN のみなしなし
埋め込みBYOK(OpenAI / Ollama)組み込みFastEmbedなしなし
依存関係必須のものは 0Qdrant、Neo4jPython 3.12Go バイナリなし
クラウドが必要いいえはいいいえいいえいいえ
費用無料月額 $19–249無料無料無料
セットアップnpm install -gDocker + API キーpip + 依存関係Go install組み込み
ライセンスMITApache 2.0AGPLMITMIT

出典付きの詳細な競合分析: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 が動作する環境ならどこでも使えます。
  • 主張ではなく測定 — 検索結果の変更は、リグレッションを含むゴールデンセットで評価します。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。