mcp-memory-graph について
MCP Memory Graphは、Claude CodeやほかのMCPクライアント向けのローカルメモリーサーバーです。セッションをまたいで知識を検索したい開発者に適しており、SQLite、意味検索とキーワード検索、ナレッジグラフを組み合わせ、データをクラウドに送信しません。
主な機能
- 01ローカルSQLiteメモリー保存
- 02ベクトル検索とキーワード検索の併用
- 03マルチホップ検索対応のナレッジグラフ
- 04信頼度ラベルと検索結果の再ランク付け
- 05自動記録とセッション想起のフック
- 06定期的な重複除去とクリーンアップ
活用シーン
- 01後のセッションでプロジェクトの決定事項を想起
- 02意味や正確な語句でメモを検索
- 03関連メモ間の依存関係をたどる
- 04共有ナレッジベースにチームの知識を保存
MCP 対応
51個のMCPツールを通じて、MCPクライアントにメモリーの保存、検索、ナレッジグラフ機能を提供します。Claude Codeではフックによる自動記録と想起も利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y mcp-memory-graphMCP_MEMORY_DB_PATHSQLite database file location (default ~/.mcp-memory/memory.db)MCP_MEMORY_MODELHuggingFace embedding model name (default Xenova/all-MiniLM-L6-v2)ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
51掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tags | array | いいえ | 分類用タグ |
| scope | enum | いいえ | 分離に使用するメモリーのスコープglobal | project | user | team | department |
| title | string | いいえ | メモリーの短いタイトル |
| author | string | いいえ | このコンテンツの作成者 |
| source | string | いいえ | コンテンツの出所(例:ファイルパス、URL、システム名) |
| content | string | はい | メモリーとして保存するテキストコンテンツ |
| agent_id | string | いいえ | マルチエージェントの帰属識別に使用する、書き込みを行ったエージェントの識別子 |
| language | string | いいえ | コンテンツの言語(ISO 639-1 コード) |
| metadata | object | いいえ | ドメイン固有のメタデータ(例:{contract_type: 'NDA', parties: ['A','B']}) |
| namespace | string | いいえ | スコープ内の名前空間(例:プロジェクト名、チーム名) |
| department | string | いいえ | 部門(例:legal、engineering、hr、sales、finance) |
| expires_at | string | いいえ | ISO-8601 形式の完全な有効期限タイムスタンプ。例:2026-03-01T00:00:00Z(期限を過ぎると、メモリーは検索対象から自動的に除外されます) |
| volatility | enum | いいえ | 自動判定された変動性クラスを上書きします。省略すると、内容と document_type に基づいて自動分類します(変動しやすいデプロイ/ステータス情報は、想起時に早めに警告されます)。volatile | normal | stable |
| on_conflict | enum | いいえ | 近似一致する項目がある場合の書き込みポリシーです。"add"(デフォルト):新規として挿入します。ただし完全な重複はスキップします(NOOP)—以前の動作と同じです。"update":既存の一致項目に内容を統合します(追記 + 再埋め込み + バージョン更新)。"supersede":競合する一致項目を廃止(無効化)し、これを現行項目として追加します。add | update | supersede |
| access_level | enum | いいえ | アクセス分類レベルpublic | internal | confidential | restricted |
| document_type | string | いいえ | ドキュメントの種類(例:契約、ポリシー、コード、インシデント、決定事項) |
| importance_score | number | いいえ | 明示的な重要度スコア 0-1(ガバナンス/重要度)です。省略すると内容から導出されます。min_importance フィルターはこの値に基づいて処理します。 |
| verification_tier | enum | いいえ | この事実の検証状況です:source_verified > tool_verified > asserted > unverified。未検証の主張は根拠性が低く評価されます。省略 ⇒ 中立。source_verified | tool_verified | asserted | unverified |
| verification_detail | string | いいえ | 自由記述:事実をどのように/いつ/何によって検証したか(例:"checked live UAT DB 2026-06-18")。 |
詳細
MCP Memory Graph
Claude Codeやその他のMCPクライアント向けのメモリーサーバーです。AI アシスタントが、マシン上の1つの SQLite ファイルに保存される、永続的で検索可能なメモリーを利用できるようにします。今日決定したことを保存しておけば、翌月に尋ねたときに答えが返ってきます。埋め込みモデル、検索インデックス、ナレッジグラフはすべてローカルで動作します。クラウドアカウントも API キーも、トークンごとの料金も必要ありません。
**ライセンス:**ソースコードを利用でき、非商用利用は無料です(PolyForm Noncommercial 1.0.0)。個人プロジェクト、趣味、学習、研究、慈善活動、教育、政府機関での利用が対象です。商用利用には有料ライセンスが必要です(COMMERCIAL.md)。
**対象ユーザー:**Claude(または Cursor、Codex、その他の MCP クライアント)に、セッションをまたいで決定事項を記憶させたい開発者です。個人開発者や趣味で使う方は無料で利用できます。チームでは git を通じてナレッジベースを共有できます。また、クラウドメモリーサービス(mem0、Zep、Letta、Supermemory)を、自分のマシンだけで完全に動作するものに置き換えたい方にも適しています。
実際の画面
npx mcp-memory-graph serveを実行すると、Claude の外からメモリーを閲覧・検索できるローカルのウェブダッシュボードが表示されます。

検索はキーワードではなく意味に基づいて機能します。以下のクエリ「支払いにはどのように対応しますか」では、そのフレーズが含まれていないにもかかわらず、Stripe、GDPR、Postgres に関するメモが見つかります。各結果には信頼度スコアと一致タイプのバッジが付いています。

スコープ、種類、タグ、品質スコア、各メモリーの参照回数を含む、保存されたすべてのデータを1つの表で閲覧・並べ替えできます。

比較
AI のメモリといえば、mem0、Zep、Letta、Supermemory がよく知られており、そのいくつかはオープンソースのコアを備えています。このツールは異なる前提で作られています。データがマシンの外に出ることはなく、実行するインフラストラクチャもありません。
| MCP Memory Graph | 一般的なホステッド型メモリサービス | |
|---|---|---|
| 実行場所 | マシン上の単一の SQLite ファイル | マネージドクラウドサービス(一部はセルフホストにも対応) |
| 埋め込み | Node 内のローカルモデル(MiniLM)、API キー不要 | 通常はクラウドの埋め込み API |
| トークンあたりのコスト | $0 — 使用量の計測なし | 従量課金、または自分で運用するサーバー |
| 追加のインフラストラクチャ | なし | 多くの場合、Postgres/pgvector、Redis、または Python サービス |
| Claude Code との統合 | 標準搭載:フックが自動で記録・呼び出し | 手動での接続 |
| ベンチマーク | コミット済みのコーパスと実行ツールを使い、ローカルで再現可能 | ほとんどが自己申告 |
トレードオフを正直に説明すると、単一プロセスの SQLite サーバーが扱えるベクトル数は数十万件程度が上限です(「制限事項」を参照)。一方、ホステッド型サービスなら、意識することなくそれ以上にスケールできます。プライベートで無料、運用作業がゼロのメモリを求める個人開発者や小規模チームにとって、その上限に最初に突き当たることはまずありません。
これが作られた理由
AI アシスタントはセッションが終わるたびにすべてを忘れてしまいます。あなたの決定、作業パターン、先週の火曜日に修正したバグなど、会話が終わるとすべて失われます。このサーバーはそれを解決します。
- 今日保存した知識を、明日、来週、来年も検索できます。
- 検索はキーワードだけでなく、意味に基づいて行われます。「契約の通知期間」で検索すると、「90 日前の更新条項」が見つかります。
- 自ら改善します。利用状況を追跡し、品質を評価し、セッションから学びを抽出して、定期的に不要な情報を整理します。
- プライバシーを守ります。埋め込みはローカルで行い、クラウド API もテレメトリもありません。唯一の例外は任意の Stop フックです。このフックは、学びの抽出のためにセッションのトランスクリプトを、ローカルにインストールした Claude Code(
claude -p)へ送信します。review_on_stop: falseに設定すれば無効にできます。 - あらゆる種類の知識に対応します。エンジニアはアーキテクチャ上の決定を、弁護士は契約のパターンを、会計士は監査手順を保存できます。
クイックスタート(約 5 分)
Node.js 20 以降と Claude Code が必要です。
1. サーバーを入手します。 npm から入手する方法(最も簡単):
npm install -g mcp-memory-graph
または、ソースから入手します:
git clone https://github.com/YonasValentin/mcp-memory-graph.git
cd mcp-memory-graph
npm install
npm run build
2. Claude Code にサーバーを登録します (任意 — 手順 3 の init がユーザースコープで登録します):
# npm install:
claude mcp add memory-server -- npx -y mcp-memory-graph
# from source:
claude mcp add memory-server node /path/to/mcp-memory-graph/dist/index.js
3. フックをインストールします(推奨):
npx mcp-memory-graph init
このコマンドひとつですべてを設定できます。MCP サーバーの登録(ユーザースコープ)、自動記録・呼び出しフックと使用スキルのインストール、設定ファイルの書き込み、夜間のクリーンアップのスケジュール設定を行います。質問に回答するか、--yes を指定して既定値を受け入れてください。(claude mcp を自分で管理している場合は、--no-register を指定して自動登録をスキップしてください。)
4. 試してみます。 Claude Code のセッションを開き、次のように伝えます:
Remember this: we use Postgres for the main app database. Decided 2026-06-01,
because we need JSONB and full-text search in one place.
その後、別のセッションで次のように伝えます:
What database did we decide to use, and why?
Claude がメモリを検索し、保存された決定に基づいて回答します。これで一連の流れは完了です。
5. インストールを確認します。 Claude に次のように尋ねます:
What memory tools do you have available?
51 個のツール(memory_* が 45 個、vault_* が 3 個、core_memory_* が 3 個)がすべて一覧表示されるはずです。
メモリツールを初めて実行すると、埋め込みモデル(約 30 MB)が HuggingFace からダウンロードされ、~/.cache/huggingface/ にキャッシュされます。それ以降の起動は即座に完了します。
すべてを元に戻すには、npx mcp-memory-graph uninstall を実行します。
アップグレード
npm install -g mcp-memory-graph@latest # or just let `npx -y mcp-memory-graph` pull it
npx mcp-memory-graph init # re-run to refresh on-disk hooks + the nightly schedule
パッケージをアップグレードすると、各セッションで実行されるコード(フック、ツール、サーバー)が更新されるため、サーバー側の修正は次回ツールを実行すると適用されます。これらについては、ほかに何もする必要はありません。
ただし、以前に init が書き込んだファイルは、パッケージをアップグレードしても書き換えられません。対象は、settings.json 内の Claude Code フック登録と、macOS の launchd plist(~/Library/LaunchAgents/com.mcp-memory.consolidate.plist)です。2.6.3 より前にインストールした場合、この plist は node を直接指定していました。launchd の最小限の PATH には nvm が含まれていないため、実行できず、夜間の統合処理がひそかに一度も実行されていませんでした。アップグレード後に npx mcp-memory-graph init を一度再実行して、絶対パスで node を指定し、出力ログも記録する plist を再生成してください。その後、次のように実行されることを確認します。
launchctl start com.mcp-memory.consolidate
cat ~/.mcp-memory/consolidation.log # should show a "Consolidation complete" report
ジョブが実行されていなかった間に蓄積した競合ノイズを解消するには、npx mcp-memory-graph consolidate を実行してください。
仕組みを簡単に説明
メモリーを保存すると、サーバーは Node.js 内で動作する小さなモデルを使って、テキストをベクトル(意味を表す384個の数値のリスト)に変換します。また、キーワード検索用にテキストをインデックス化します。どちらも1つの SQLite ファイルに保存され、デフォルトでは ~/.mcp-memory/memory.db にあります。
検索時には、サーバーが両方の種類の検索を同時に実行し、ランキングを統合して、信頼度ラベル付きで最適な結果を返します。さらに別のモデルで上位の結果を並べ替えることで、精度を高めることもできます(これがリランカーです。MCP クライアントではデフォルトで有効で、約200ミリ秒かかります)。
その上にはナレッジグラフがあり、メモリーがエンティティやほかのメモリーとつながっています。そのため、「決済サービスは何に依存しているか?」のように、複数のホップを必要とする質問にもサーバーが回答できます。夜間の「ドリームサイクル」では、重複を排除し、スコアを再計算し、不要なものを削除して、不足している情報を報告します。
ベンチマークとその読み方
以下の数値はすべてローカルで測定したものです。実際の埋め込みモデルと本番用ハンドラーを使用し、ネットワークは使っていません。すべてご自身のマシンで再実行できます。
ベンチマークに馴染みのない方に向けて、簡単に説明します。ゴールドセットとは、正解が事前にわかっている質問のリストです。Precision@1 は、最上位の結果が正解だったかを示します。Recall@5 は、上位5件の中に正解があったかを示します。MRR(平均逆順位)は、正解が上位にあるほど高く評価します。リランカーは2つ目のモデルで、上位50件の結果を並べ替えます。処理は遅くなりますが、精度は目に見えて向上します。
ローカルのゴールドセット
| 精度@1 | 精度@3 | MRR | 検索 p95 | |
|---|---|---|---|---|
| ハイブリッド(RRF) | 0.563 | 0.750 | 0.704 | 約4 ms |
| + クロスエンコーダーによる再ランキング(MCP のデフォルト) | 0.813 | 0.875 | 0.867 | 約230 ms |
npm run bench で再現できます。方法の詳細、ゴールドセットそのもの、およびすべての失敗例は、docs/BENCHMARKS.md に出力され、記載されています。
スケール
実際の埋め込みモデルとファイルベースの SQLite データベースを使った場合、ベクトル数が10,000件のとき検索の p95 は9.1 ms、50,000件のときは30 msです。再ランキング処理には、その上にほぼ一定の200 msが加わります。多くのメモリー製品は自己申告によるクラウド上の数値を公開していますが、これらの数値はローカルで測定され、コミット済みのコーパスと実行スクリプトから再現できます。
公開ベンチマーク
4つの公開メモリベンチマークで、調整なし(標準のMiniLMエンベッダー、本番用ハンドラー、ベンチマーク固有の調整なし)で実行し、4つすべてでMemPalaceと同等以上の結果を達成しています。
| ベンチマーク | 当プロジェクトの結果 | 比較 |
|---|---|---|
| LongMemEval-S | R@5 = 97.8% | 公開値の96.6%に対して |
| ConvoMem | R@10 = 93.5% | 92.9%に対して |
| LOCOMO | セッション R@10 = 82.2%、R@50 = 100% | ベースラインの60.3%に対して |
| MemBench | hit@5 = 78.7% | 調整済みの同プロジェクトの80.3%に対して |
次のコマンドで、ご自身でも実行できます:npm run bench:longmemeval、bench:locomo、bench:convomem、bench:membench。再ランキングが役立つケースと悪影響を及ぼすケース、MemBenchの重複排除の上限、正解セットのサイズに関する注意点など、率直な考察はdocs/BENCHMARKS.mdに記載しています。
機能
コア機能
- 51個のMCPツール:CRUDと検索、信頼度タグ付きナレッジグラフ、自己修正型の書き込みゲート、署名付きの来歴と検証、SSRF対策済みウェブフックを備えたイベントバス、変更の伝播とアドバイザー機能、再開可能なセッション状態、専門知識プロファイル、メモリ階層、Obsidian Vaultとの双方向変換、GDPR準拠の削除と履歴機能を備えています。全リストは以下をご覧ください。
- ハイブリッド検索:ベクトル類似度(意味)とキーワード照合(完全一致語句)を、Reciprocal Rank Fusionで統合します。
rerank: trueを指定すると、クロスエンコーダーによる再ランキングを追加します。use_graph: trueを指定すると、HippoRAGのPersonalized PageRankによるマルチホップスコアを組み合わせます。as_of: <timestamp>を指定すると、過去の時点におけるグラフを検索します。 - ローカル埋め込み:Node.js内でall-MiniLM-L6-v2(384次元)を実行するTransformers.jsを使用します。Python、クラウドAPI、GPUは不要です。
- SQLiteストレージ:better-sqlite3と2つの拡張機能(ベクトル近傍検索用のsqlite-vec、BM25ランキングによるキーワード検索用のFTS5)を使用する単一ファイルです。
- 構造を考慮したチャンク分割:テキストは段落ごと、Markdownは見出しごと(各チャンク内に見出しのコンテキストを保持)、コードは関数とクラスの境界ごと、法律文書は文ごとに分割します。
- スコープ:メモリを
global、project、user、team、departmentに整理します。 - バージョン履歴:更新のたびに直前のバージョンを保存します。誰が、いつ、何を変更したかの完全な監査証跡を残します。
- 時間減衰:新しいメモリを優先する、時間ベースのスコアリングを任意で利用できます(指数型または線形)。
- 信頼度スコアリング:すべての検索結果に0から1までの信頼度と、平易なラベル(高、中、低)が付与されます。
- 有効期限:時間的制約のあるメモリには有効期限を設定でき、期限が切れると自動的に検索対象から除外されます。
自己改善
- アクセス追跡:検索、取得、関連メモリの呼び出しごとに、参照されたメモリを記録します。
- 品質スコアリング:アクセス頻度、新しさ、内容のシグナルに基づき、すべてのメモリに
importance_scoreとconfidence_scoreを自動で付与します。 - 学習内容の抽出:セッション終了時に、ヘッドレスの
claude -pがトランスクリプトを確認し、厳選した学習内容を0~5件保存します。(これは、macOSで通知されずに動作しなくなる以前のtype: "agent"Stopフックを置き換えるものです。anthropics/claude-code#39184を参照してください。) - ドリームサイクル:スケジュール実行またはオンデマンドで、重複排除、再スコアリング、整理、有効期限の適用、ナレッジギャップの検出を行います。
- ギャップ検出:検索で何も見つからなかった場合に記録し、不足している知識を確認できるようにします。
Claude Code フック
init でインストールされる、オプトインのフックが5つあります。
| フック | 実行タイミング | 動作 |
|---|---|---|
| SessionStart | セッション開始時 | ステータスを確認し(メモリ数、期限切れ、古いドキュメント)、プロジェクトの上位メモリを表示します |
| UserPromptSubmit | タスクを示す情報(チケット/PR ID、または2つ以上のキーワード)を含む各プロンプトの送信時 | ストアをキーワード検索し、一致するメモリを表示します。以前の作業を思い出してから再調査できるようにします。簡単なプロンプトには反応しません |
| PostToolUse | メモリ検索の後 | 検索のヒットとミスを search-log.jsonl に記録します |
| PreCompact | コンテキスト圧縮の前 | 学習内容の抽出をオプションで実行します(デフォルトではオフ) |
| Stop | セッション終了時 | ヘッドレスの claude -p を起動して、セッションを確認し、学習内容を保存します |
Stop フックは約30 msで処理を切り離し、バックグラウンドで10~60秒かけて確認します。認証済みの claude CLI が $PATH(または $CLAUDE_BIN)上に必要です。~/.mcp-memory/config.json で review_on_stop: false にすると無効になります。
すべてのメモリのメタデータ
| フィールド | 目的 | 例 |
|---|---|---|
scope | 分離レベル | global、project、user、team、department |
namespace | サブスコープのグループ化 | "my-project"、"legal-team"、"q4-audit" |
department | 組織単位 | legal、engineering、hr、sales、finance |
document_type | コンテンツの分類 | contract、policy、code、incident、decision、report |
access_level | データの機密性 | public、internal、confidential、restricted |
tags | 柔軟な分類 | ["renewal", "notice-period", "compliance"] |
language | コンテンツの言語(ISO 639-1) | "en"、"da"、"de" |
source | 出所 | ファイルパス、URL、システム名 |
author | 作成者 | 人またはシステムの名前 |
metadata | ドメイン固有の JSON | {contract_type: "NDA", parties: ["A","B"]} |
expires_at | 自動失効日 | ISO 8601 タイムスタンプ |
scope と namespace は、1つのデータベース内でコンテンツをグループ化します。共有データベースの MCP_API_NAMESPACE ピンを使うと、対応する名前空間ごとのマルチテナント分離を実現できます(スキーマ v14)。テナントごとに別のデータベースファイルを使う方法が、最も強固な境界となります。docs/MULTI-TENANCY.md を参照してください。
ナレッジグラフとバイテンポラルモデル
- バイテンポラルな有効性:すべてのメモリは、トランザクション時間とともに有効時間(
valid_from、valid_to)を持ちます。更新時は削除ではなく無効化します。以前の事実は上書きされず、valid_toのタイムスタンプが付与されるため、履歴は失われません。読み取りでは現在有効な行がデフォルトで返されますが、特定時点の情報を取得するためにas_of: <timestamp>を指定できます。memory_historyは、1つのメモリの全履歴を返します。 - 信頼度付きリンク:メモリは、ウィキリンク、共起、類似性のエッジを介して接続され、それぞれに信頼度の重みが付きます。
memory_graphは、最大3ホップまでエンティティと関係をたどります。memory_extract_entitiesは、LLM が抽出したエンティティと関係を保存します。 - HippoRAG のマルチホップ検索:検索で
use_graph: trueを指定すると、エンティティとリンクのグラフに Personalized PageRank を実行し、連想検索を行います。 - トークン予算に合わせた回答:
memory_queryは、絞り込んだサブグラフを使って質問に回答します。ハイブリッド検索で起点を見つけ、ハブを避けながらmax_hopsまでグラフをたどり、コンテキストウィンドウに情報を詰め込みすぎる代わりに、トークン予算に合わせたコンテキスト文字列を返します。 - コミュニティ:
memory_communitiesは、密に接続されたエンティティのクラスターを検出します。「ここにある主なテーマは何ですか?」といった質問に使えます。
自己修正型の書き込み
- 書き込みゲート:保存時に ADD、UPDATE、DELETE、NOOP のいずれかを判断します(
on_conflict)。新しい事実を重複して蓄積するのではなく、既存の事実と整合させます。 - 矛盾検出:クロスエンコーダーの NLI モデルが、追加されるメモリとすでに保存されている情報との矛盾を検出します。
- 忘却曲線:メモリには
stabilityシグナルが付きます。あまり再確認されない知識は、人間の記憶が薄れるように、ランキングで徐々に下がります。
Agent-OS メモリ
- コアメモリブロック:エージェントが自ら管理する、
(scope, namespace)ごとの小さく容量に上限のある、常にコンテキスト内にあるメモです(core_memory_get、core_memory_append、core_memory_replace)。上限を超える追記は拒否されるため、意図的な圧縮が促されます。 - 階層:
memory_tiersは MemGPT 方式のホット/リコール/アーカイブの分布を報告し、ホットワーキングセットを一覧表示します。 - リフレクション:
memory_reflectはリフレクションに最も適したメモリを集め、ストアモードでは、元の情報源にリンクした統合済みの洞察を永続化します。
Obsidian ボルト
- 双方向同期:
vault_syncはボルトを読み込みます。memory_export_vaultはメモリを.mdファイルとして書き出し、YAML フロントマターによって、作成されたすべてのフィールド(id、scope、namespace、tags、access_level、importance、timestamps)を損失なく往復できるようにします。派生スコアのうち2つはフロントマターに含まれず、再インポート時にリセットされます。confidence_scoreは 0.6 に、stabilityは 1.0 にリセットされます。バイト単位で完全なバックアップにはmemory_export(JSON)を使用してください。メタデータキーの1つは予約済みです。metadata._vaultは内部同期の管理情報を保持し、ツールの出力やエクスポートされたファイルには表示されません。 - JSON Canvas:
memory_canvasはグラフを JSON Canvas 1.0 の.canvasファイルとしてエクスポートします。このファイルは Obsidian で空間的なボードとして開けます。 - 読み取り専用ウィキ:
serveは/publish/:namespace(インデックス、ページ、検索、グラフ)を読み取り専用ウィキとして公開します。意図的にベアラ認証を設けていませんが、公開対象のアクセスレベル(MCP_PUBLISH_ACCESS_LEVELS、デフォルトはpublic)に厳密に限定されています。 - セッションノートとテンプレート:
memory_session_noteはセッションごとに1つの「デイリーノート」に追記します。memory_templateはドキュメントの種類ごとに、構造化されたノートのひな形を返します。
チームおよび個人での共有(git)
memory initウィザード:対話形式のセットアップ(またはデフォルト値を使う--yes)を実行し、~/.mcp-memory/config.json(またはプロジェクトスコープの設定)と Claude Code の接続設定を書き込みます。- コミット可能なグラフ成果物:
memory export-graphは、コミットして共有できる決定論的なmemory-graph.jsonを書き出します。memory git-setupは.gitattributesエントリとmemory-unionマージドライバーを設定し、並行して行われたコミットを競合させずにマージできるようにします。 - 帰属情報:
MCP_AGENT_IDを設定する(または保存ごとにagent_idを渡す)と、memory_attributionで各エージェントが書き込んだ有効なメモリの数を確認できます。
信頼とガバナンス
- 確認すべき事項:
memory_questionsは、グラフが検出するのに適した情報、つまり確認が必要な曖昧なリンク、頻繁に言及される一方で文書化が不十分なエンティティ、孤立したメモリや古くなったメモリを提示します。 - GDPR 準拠の忘却:
memory_forgetはデフォルトでソフト削除を行います(valid_toによる墓標を設定し、復元可能な状態にして、as_ofから引き続き参照可能にします)。hard: trueを指定すると、最初にポータビリティ用のエクスポートを返してから、完全に消去します。memory_deleteの動作は変更されていません。 - 出力のサニタイズ:すべてのツール結果は、サーバーから出る前に、ANSI および VT エスケープ、制御文字、ゼロ幅文字、BiDi による Trojan Source のなりすましを単一の要所で除去されます。保存されたコンテンツは、保存時には生のままです。
- ホットリロード:設定の変更は再起動なしで適用されます。
Web ダッシュボード
サーバーには、Claude 以外でメモリを表示、管理するためのブラウザーダッシュボードが付属しています。MCP HTTP トランスポートと同じ Express サーバー上で動作するため、別のプロセスは必要ありません。
6 つのページがあります。
- ダッシュボード:メモリ数、コンテンツサイズ、スコープ、部門、種類別の内訳に加え、最近更新されたメモリ 10 件を表示します。
- 検索:信頼度と一致タイプのバッジ付きハイブリッド検索と、入力中にすぐ表示されるあいまい検索候補を利用できます。
- 一覧:スコープで絞り込み、品質インジケーターを表示できる、並べ替えとページ分割に対応した全メモリのテーブルです。
- メモリ詳細:コンテンツ全体、メタデータ、バージョン履歴、関連メモリを表示し、インライン編集と削除を行えます。
- ナレッジグラフ:D3 の力学モデルによるグラフ表示です。ノードのサイズは重要度、色はスコープを表します。ズーム、パン、ドラッグ、ダブルクリックによる移動ができます。
- ツール:すべてのツール機能を備えたコンソールです。サーバーが公開するすべてのツールを一覧表示し、各スキーマからフォームを生成して、認証済み MCP エンドポイント経由で実行します。破壊的な操作の前には確認を求めます。
技術構成:React 19、Vite、Tailwind CSS v4、shadcn/ui、Fuse.js、D3、Recharts。
実行方法:
# Development (hot reload)
npm run build && npm run serve # Terminal 1: server on :3100
npm run dev:web # Terminal 2: Vite on :5173 (proxies /api to :3100)
# Production (single process)
npm run build:all # Builds server + frontend
npm run serve # http://localhost:3100 serves both API and UI
Docker: イメージにはビルド済みのフロントエンドが含まれています。docker compose up の実行後、MCP エンドポイントと同じ場所で、http://<host>:3200 からダッシュボードにアクセスできます。チームメンバーは Claude Code を必要とせず、どのブラウザーからでも共有ストアを閲覧できます。
REST API(16 エンドポイント)
REST API は読み取りと管理のためのものです。メモリの作成には MCP(POST /mcp 経由の memory_store)を使用します。意図的に POST /api/memories は用意していません。
| メソッド | パス | 説明 |
|---|---|---|
GET | /api/stats | メモリ数と内訳 |
GET | /api/search?q=... | フィルター対応のハイブリッド検索 |
GET | /api/memories | ページ分割と並べ替えに対応した一覧 |
GET | /api/memories/:id | メタデータ付きの単一メモリ |
GET | /api/memories/:id/versions | バージョン履歴 |
GET | /api/memories/:id/related | 意味的に関連するメモリ |
PATCH | /api/memories/:id | コンテンツまたはメタデータを更新 |
DELETE | /api/memories/:id | メモリを削除 |
GET | /api/graph | グラフ表示用のノードとエッジ |
GET | /api/manifest | 整合性マニフェスト(Merkle ルートとメモリごとのハッシュ) |
GET | /api/insights | 傾向とテーマの概要 |
GET | /api/health | ナレッジギャップレポート(結果が繰り返し 0 件になる検索) |
GET | /api/webhooks | Webhook ターゲットの一覧(MCP_WEBHOOKS による制限あり) |
POST | /api/webhooks | SSRF 検証済みの送信先を登録 |
DELETE | /api/webhooks/:id | Webhook ターゲットを削除 |
POST | /api/webhooks/dispatch | 永続化され、HMAC 署名された配信キューを処理 |
最初の 9 つはダッシュボードが使用します。すべての REST エンドポイントは MCP ツールと同じハンドラーを呼び出すため、ビジネスロジックは重複していません。
自己改善の詳細
サーバーはナレッジの利用状況を追跡し、品質を評価し、セッションから学習して、時間の経過とともに自身を統合します。
学習ループ
┌──────────────────────────────────────────────────────────┐
│ SESSION │
│ Claude searches → access_count++ on matched memories │
│ Claude stores → new memory with initial scores │
│ Zero results → knowledge gap recorded │
└─────────────┬────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ SESSION END (Stop command hook) │
│ Hook spawns detached `claude -p` headless review │
│ --allowedTools restricts to memory_store only │
│ Claude judges → 0-5 curated entries via memory_store │
│ Deduplicates against existing memories │
└─────────────┬────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────┐
│ DREAM CYCLE (nightly or manual) │
│ 1. Score : Recalculate importance from access data │
│ 2. Expire : Enforce expiration dates │
│ 3. Prune : Remove low-quality, never-accessed items │
│ 4. Dedup : Merge near-duplicate memories │
│ 5. Gaps : Surface zero-result search patterns │
└──────────────────────────────────────────────────────────┘
品質スコアリング
すべてのメモリには、0〜1 の importance_score が設定されます。
importance = 0.3 * current_score + 0.4 * normalized_access_frequency + 0.3 * recency_factor
経過期間の係数:
| 経過期間 | 係数 |
|---|---|
| 7 日未満 | 1.0 |
| 30 日未満 | 0.7 |
| 90 日未満 | 0.4 |
| 90 日超 | 0.1 |
アクセスされないメモリは、時間とともに重要度が徐々に低下します。自動抽出されたメモリは低めの値から始まり、有用性が示されなければ削除されます。
アクセスによる強化について。 上記の数式は、consolidate の Score ステージで定期的に再計算される値です。各読み取り(
memory_get、memory_search、memory_related)でも、小さな即時加算(importance_score += 0.03、上限は 1.0)が適用されます。また、検索では重要度が軽いランキング係数として使われます(1 + importance * 0.5)。20 回以上読み取られたメモリは、読み取りだけで上限に近づき、次回の consolidate 実行時に基準値が再設定されます。この人気度による重み付けは意図的なものです。読み取りによって値が変動しない固定値にしたい場合は、memory_storeまたはmemory_updateで明示的なimportance_scoreを設定してください。
ナレッジギャップの検出
検索結果が見つからない場合、クエリが記録されます。dream サイクルのギャップ段階でこれらが表面化するため、ストアに不足しているものを確認できます。
インストールのリファレンス
前提条件
- Node.js 20 以降。すべてのクライアントで必要です。
- MCP クライアント。 Claude Code が最も充実した環境です。自動キャプチャと想起のフックは Claude Code 専用です。ほかの MCP クライアント(Codex、Cursor など)でも 51 個すべてのツールを利用できますが、手動で実行する必要があります。以下の「ほかの MCP クライアント」を参照してください。
- Stop フックのみ:
$PATH(または$CLAUDE_BIN)にclaudeバイナリがあり、プロンプトなしで認証されている必要があります。任意です。review_on_stop: falseで無効にできます。
init の動作
npx mcp-memory-graph init # user scope: hooks apply to all projects
npx mcp-memory-graph init --scope project # this project only
ユーザースコープでは、フックは ~/.claude/settings.json に書き込まれ、すべての Claude Code セッションで実行されます。プロジェクトスコープでは、フックはカレントディレクトリの .claude/settings.json に書き込まれ、自動的なサーバー検出のために .mcp.json が作成されます。プロジェクトをクローンした共同作業者には、メモリーサーバーが自動的に登録されます。
Init は次の 7 つの処理を行います。
- フックスクリプトが
dist/hooks/に存在することを確認します。 - 5 つのフックを settings.json に登録します。
- 適切なデフォルト値で設定ファイルを作成します。ユーザースコープでは
~/.mcp-memory/config.json、プロジェクトスコープでは<project>/.mcp-memory/config.jsonに作成されます(生成される.mcp.jsonによりMCP_MEMORY_CONFIG_PATHが設定されます)。 - メモリーの使用手順を、プロジェクトスコープでは
.claude/CLAUDE.mdに書き込み、ユーザースコープではスニペットを表示します。 - MCP サーバーを Claude Code に登録します — ユーザースコープでは
claude mcp add -s user memory-server -- npx -y mcp-memory-graphを実行します(冪等で、ベストエフォートです。claudeCLI がPATHにない場合は、手動で実行するコマンドを警告とともに表示します。--no-registerでスキップできます)。プロジェクトスコープでは、コミット可能な.mcp.jsonを通じて登録されます。これにより、クイックスタートの手順 2 は任意になります。 mcp-memory-graphの使用スキルを~/.claude/skills/にインストールし、Claude Code が 51 個すべてのツール、注意点、ワークフローのインラインガイダンスを利用できるようにします。--no-skillでスキップできます。- 夜間の統合スケジュールを設定します(macOS:launchd。ログインし直さなくても実行されるよう、直ちに読み込みます。Linux:cron の設定例を表示します。プロジェクトスコープではスキップされます)。
非対話型シェル(エージェント/CI)ではウィザードをスキップし、デフォルト値を適用して、設定内容と各値の変更方法を示すレポートを表示します。--yes を渡すと、デフォルト値を適用し、レポートを表示せずに終了します。
主なフラグ:--scope user|project、--schedule HH:MM[,HH:MM](夜間の統合時刻。デフォルトは 03:00)、--vault <path>(Obsidian vault とのラウンドトリップを有効化)、--no-review-on-stop(セッション終了時の学習レビューを無効化)、--no-skill(スキルのインストールをスキップ)、--no-register(ユーザースコープの claude mcp add をスキップ)、--remote <url>(チームサーバーモード)。
npx mcp-memory-graph uninstall は、init が行ったすべての処理を元に戻します。フック、夜間スケジュール、CLAUDE.md のブロック、インストールしたスキルを削除します。
無人セットアップ(CI、プロビジョニング、エージェント)
すべての手順をスクリプト化できます。対話型でしか実行できない手順はありません。
git clone https://github.com/YonasValentin/mcp-memory-graph.git
cd mcp-memory-graph
npm install && npm run build
npx mcp-memory-graph init --scope project --yes # local: hooks + .mcp.json, no prompts
# or point at a shared self-hosted server instead:
# npx mcp-memory-graph init --remote https://memory.example.com --token-env MEMORY_MCP_TOKEN
その他の MCP クライアント(Codex、Cursor など)
Claude Code ではフックが使えますが、それ以外のクライアントでは同じ 51 個のツールを手動で実行します。このサーバーは標準的な MCP サーバーなので、どのクライアントでも動作します。クライアントのルールファイルに一行追加すれば、ほぼ自動で使えるようになります。
サーバーを登録します。Codex の場合は、~/.codex/config.toml(グローバル)または .codex/config.toml(プロジェクト。信頼済みの場合のみ)に次のように記述します。
[mcp_servers.memory-graph]
command = "node"
args = ["/abs/path/to/mcp-memory-graph/dist/index.js"]
tool_timeout_sec = 180 # the first call downloads the ~30 MB model once; the 60s default can be tight
[mcp_servers.memory-graph.env]
MCP_MEMORY_DB_PATH = "/abs/path/to/.mcp-memory/memory.db"
# or a shared self-hosted server over HTTP (see Self-hosting below):
# url = "https://memory.example.com/mcp"
# bearer_token_env_var = "MEMORY_MCP_TOKEN"
または、codex mcp add memory-graph -- node /abs/path/to/mcp-memory-graph/dist/index.js を実行します。Cursor、Windsurf、その他のクライアントではそれぞれ独自の MCP 設定形式を使用しますが、サーバーコマンド(node .../dist/index.js)と HTTP オプションは同じです。
次に、エージェントの指示ファイル(Codex:AGENTS.md、Cursor:プロジェクトルール)に以下を追加します。
アーキテクチャ、決定事項、パターン、または過去の修正について質問に回答する前に、まず memory-graph サーバーで
memory_searchを呼び出してください。新しい決定事項、パターン、修正はmemory_storeで保存してください。
メモリ基盤のセルフホストと共有
このサーバーは、単一ユーザーのキャッシュから複数のマシンで共有するナレッジベースまで、3 通りの方法で実行できます。いずれもローカル優先で、実行するマシンとして選んだもの以外にデータが送信されることはありません。
1. ローカル(単一ユーザー)、デフォルト
npx mcp-memory-graph init は、ローカルの stdio サーバーとフックを登録します。メモリはマシン上の 1 つの SQLite ファイルに保存されます。それ以外に実行するものはありません。個人利用に適しています。
2. 共有サーバー(複数のマシンまたはグループ)
複数のクライアントが HTTP 経由で接続するサーバーを 1 つ実行します。全員が同じメモリ基盤をリアルタイムで共有します。
サーバーを起動します(いずれかを選択):
# From source: build the server (and the dashboard, if you want it) first
npm run build:all
MCP_AUTH_TOKEN=$(openssl rand -hex 32) MCP_BIND=0.0.0.0 npm run serve
# MCP at /mcp, REST at /api, dashboard at /, all on :3100
# Or with Docker (frontend included; publishes host port 3200 by default)
MCP_AUTH_TOKEN=$(openssl rand -hex 32) docker compose up -d
サーバーがループバック以外からアクセス可能な場合は、必ず MCP_AUTH_TOKEN を設定してください。すべてのクライアントで共有する、1 つのベアラートークンです。ループバック以外にバインドする際、MCP_AUTH_OPTIONAL=1 を設定しない限り、認証なしでサーバーが起動することはありません。ホスト外からアクセスする場合は、リバースプロキシまたはトンネルで TLS を終端してください。
クライアントを接続します。各マシンで次のコマンドを実行します。
npx mcp-memory-graph init --remote https://memory.example.com --token-env MEMORY_MCP_TOKEN
export MEMORY_MCP_TOKEN=<the server token> # in your shell or .env
Claude Code の場合、共有サーバーを指すプロジェクトの .mcp.json が書き込まれます。トークンは環境変数への参照("Authorization": "Bearer ${MEMORY_MCP_TOKEN}")として保存されるため、コミットした .mcp.json にシークレットが含まれることはありません。Claude 以外のクライアントも、それぞれの MCP 設定を通じて同じサーバーを指定します。
| フラグ | 効果 |
|---|---|
--token-env <NAME> | トークンにこの環境変数を参照します(デフォルトは MEMORY_MCP_TOKEN) |
--token <value> | 代わりにトークンを直接指定します(コミットしないでください) |
--no-auth | 認証ヘッダーを省略します(ループバックまたは信頼できるネットワークでのみ使用) |
リモートモードでは、ローカルの記録・想起フックはインストールされません。メモリはサーバー上に保存され、フックが読み取れるローカルファイルには保存されないためです。エージェントは
memory_searchとmemory_storeを直接使用します(CLAUDE.md のガイダンスは引き続き書き込まれます)。
3. Git ボルト(非同期のバージョン管理による共有)
サーバーを実行せず、プルリクエストでレビューしながらナレッジベースを git で管理したい場合は、メモリをプレーンな Markdown にエクスポートして、フォルダーを git リポジトリとして共有します。
npx mcp-memory-graph vault-init # make the vault a git repo (union merge driver + rebuild hook)
git add -A && git commit -m "memory snapshot" && git push
# collaborators, once after cloning:
# npx mcp-memory-graph vault-init # registers the union merge driver + post-merge hook in THEIR clone
# collaborators, thereafter: git pull && npx mcp-memory-graph rebuild
各コラボレーターは、自分のクローンで一度
vault-initを実行する必要があります。 マージドライバーとマージ後の再構築フックは、リポジトリではなくローカルの git 設定(.git/)に保存されます。vault-initを実行していない新しいクローンでは、最初に並行してプルしたときに.memory/graph.jsonに競合マーカーがそのまま残ります。vault-initは何度実行しても安全で、コミット済みのサイドカーを上書きしません。
チームボルトの復旧に関する注意事項が 2 つあります。
- 手動で解決したマージ後(マージがクリーンに完了した場合にのみ、マージ後フックが実行されます)は、
.memory/manifest.jsonが古いため、memory rebuildがVaultIntegrityErrorで失敗することがあります。このファイルを削除してrebuildを再実行してください。このファイルは派生状態であり、再生成されます。 - データベースの状態が新しいのに
.mdを手動編集しましたか? まずインポート(vault_syncまたはrebuild)し、その後エクスポート(memory sync)してください。古いデータベースから全件エクスポートすると、手動編集した内容も含め、ボルト内のファイルが上書きされます。
セキュリティに関する注意事項
MCP_AUTH_TOKENは信頼できるグループでの利用に適した、単一の共有シークレットです。新しい値を指定してサーバーを再起動すると、ローテーションできます。キーごとの RBAC(1 台のサーバーで N 個のキーを使用し、それぞれに名前空間のセットとアクセスレベルの上限を固定する)には、memory keys create|list|revoke(スキーマ v16)を使用してください。従来の共有トークンも引き続き使用でき、最初にチェックされます。docs/MULTI-TENANCY.md を参照してください。- トークンをコミットしないでください。
--remoteのデフォルトでは、設計上、トークンは環境変数に保持されます。 - TLS を終端するプロキシをサーバーの前段に置かない限り、
127.0.0.1(デフォルト)にバインドしてください。その場合はMCP_BIND=0.0.0.0を設定してください。
組織全体で利用する AI ブレインを構築しますか? 1 台のサーバーに従業員ごとのキーを用意し、AI がたどれる組織図(人物、チーム、SOP、ツールを型付きグラフノードとして表現)を作成して、誰が何を見られるかを適用できます。既存のプリミティブを基にした手順は、docs/ENTERPRISE-BRAIN.md にあります。
設定
環境変数
| 変数 | デフォルト | 説明 |
|---|---|---|
MCP_MEMORY_DB_PATH | ~/.mcp-memory/memory.db | データベースファイルの場所です。ディレクトリは自動的に作成されます。 |
MCP_MEMORY_MODEL | Xenova/all-MiniLM-L6-v2 | HuggingFace 埋め込みモデル名です。Transformers.js と互換性のある ONNX モデルである必要があります。 |
MCP_MEMORY_DIMENSIONS | 384 | 埋め込みベクトルの次元数です。モデルの出力と一致している必要があります。 |
MCP_MEMORY_CONFIG_PATH | ~/.mcp-memory/config.json | 設定ファイルの場所を上書きします。 |
環境変数の完全なリファレンス(認証、レート制限、Webhook、ボルト、公開)については、docs/ENV.md を参照してください。
カスタムデータベースの場所
claude mcp add memory-server --env MCP_MEMORY_DB_PATH=/path/to/project/.memory.db node /path/to/dist/index.js
代替埋め込みモデル
# Swap the embedding model (same 384 dimensions; drop-in for the existing index
# AFTER a re-embed; see the warning below)
claude mcp add memory-server \
--env MCP_MEMORY_MODEL=Xenova/bge-small-en-v1.5 \
--env MCP_MEMORY_DIMENSIONS=384 \
node /path/to/dist/index.js
モデルの識別情報は記録され、適用されます。 データベースには、構築に使用された埋め込みモデル(
schema_meta.embedding_model)が記録されます。異なるMCP_MEMORY_MODELでサーバーを起動すると、すべての検索結果がひそかに劣化するのではなく、明示的にエラーになります(次元数が同じでも、同じベクトル空間とは限りません)。モデルを切り替えるには、新しいモデルを設定してmemory rebuildを実行するか(ボルトから再度埋め込みます)、エクスポートして再インポートしてください。
設定ファイル
設定ファイルでは、自己改善の動作、フックの設定、プロジェクトごとの上書きを制御します。解決順序は、まず環境変数 MCP_MEMORY_CONFIG_PATH、次に <cwd>/.mcp-memory/config.json(プロジェクトスコープの初期化時に作成されます)、最後に ~/.mcp-memory/config.json です。npx mcp-memory-graph init で作成するか、手動で記述してください:
{
"defaults": {
"scope": "project",
"namespace": "auto"
},
"projects": [
{
"path": "~/Documents/MyApp",
"namespace": "my-app",
"watch": ["README.md", "docs/**/*.md"]
}
],
"consolidation": {
"similarity_threshold": 0.85,
"prune_after_days": 30,
"min_importance_to_keep": 0.1,
"max_operations": 100,
"schedule": [
{ "hour": 11, "minute": 30 },
{ "hour": 16, "minute": 0 }
]
},
"hooks": {
"extract_on_compact": false,
"extract_on_session_end": false,
"track_searches": true,
"review_on_stop": true
},
"extraction": {
"categories": ["decision", "pattern", "error_fix", "convention"],
"min_confidence": 0.4
}
}
| セクション | キー | デフォルト | 説明 |
|---|---|---|---|
defaults | scope | "project" | 新しいメモリーのデフォルトスコープ |
defaults | namespace | "auto" | デフォルトの名前空間("auto" の場合、プロジェクトディレクトリ名から決定されます) |
projects[] | path | プロジェクトのルートディレクトリ | |
projects[] | namespace | このプロジェクトの名前空間の上書き値 | |
projects[] | watch | 変更を追跡するファイルのグロブパターン | |
consolidation | similarity_threshold | 0.85 | 重複排除に使うコサイン類似度のしきい値(0.5~1.0) |
consolidation | prune_after_days | 30 | 低品質のメモリーを整理するまでの日数 |
consolidation | min_importance_to_keep | 0.1 | 整理後も保持するために必要な最低重要度スコア |
consolidation | max_operations | 100 | 1 回の統合処理あたりの最大操作数 |
consolidation | schedule | [{ "hour": 3, "minute": 0 }] | { hour, minute } エントリを 1 つ以上指定します(24 時間制)。変更後に init を再実行すると、launchd plist が再生成されます。 |
hooks | extract_on_compact | false | コンテキスト圧縮前にトランスクリプトから情報を抽出します(正規表現ベース、デフォルトでは無効) |
hooks | extract_on_session_end | false | セッション終了時に学びを抽出します(正規表現ベース、デフォルトでは無効) |
hooks | track_searches | true | 検索のヒットとミスを search-log.jsonl に記録します |
hooks | review_on_stop | true | セッション終了時にヘッドレスの claude -p を起動し、トランスクリプトを確認して学びを保存します。フックを削除せずに無効にするには、false に設定します。 |
extraction | categories | ["decision", "pattern", "error_fix", "convention"] | 抽出する学びのカテゴリ |
extraction | min_confidence | 0.4 | 抽出する学びに必要な最低信頼度 |
storage | db_path | スコープに依存 | SQLite ファイルの場所(ユーザースコープでは ~/.mcp-memory/memory.db、プロジェクトスコープでは <project>/.mcp-memory/memory.db)。MCP_MEMORY_DB_PATH で上書きされます。 |
vault | path | 未設定 | 明示的なパスが指定されていない場合に vault_sync、memory_export_vault、rebuild が使用する Obsidian Vault のルート。MCP_VAULT_PATH と --vault <path> で上書きされます。 |
vault | write_through | true | Vault が設定されている場合、メモリーへの書き込みを .md ファイルとして Vault にも反映します。MCP_VAULT_WRITE_THROUGH=0 で上書きされます。 |
CLI コマンド
| コマンド | 説明 |
|---|---|
npx mcp-memory-graph | stdio で MCP サーバーを起動します(デフォルト) |
npx mcp-memory-graph serve | HTTP サーバーを起動します:MCP トランスポート、REST API、Web ダッシュボード |
npx mcp-memory-graph init | 対話形式のセットアップウィザード:フック、設定、夜間スケジュール(ユーザースコープ)。非対話形式にするには --yes/-y を追加します |
npx mcp-memory-graph init --scope project | 現在のプロジェクトのみを対象にセットアップします(.mcp.json と .claude/settings.json を作成します) |
npx mcp-memory-graph uninstall | init を元に戻します:フックとスケジュールを削除します |
npx mcp-memory-graph consolidate | ドリームサイクルを手動で実行します |
npx mcp-memory-graph export-graph [--out <path>] [--scope <s>] [--namespace <n>] | Git で共有できる、コミット可能な決定論的な memory-graph.json を書き出します |
npx mcp-memory-graph git-setup | 競合のないグラフ共有のため、.gitattributes のエントリーと memory-union マージドライバーをインストールします |
npx mcp-memory-graph merge-graphs <ours> <theirs> <out> | memory-graph.json 用の Git ユニオンマージドライバーです(手動ではなく Git によって呼び出されます) |
npx mcp-memory-graph vault-init [--vault <path>] | Vault を Git リポジトリにします:ユニオンマージドライバー、pull.rebase=false、マージ後およびチェックアウト後の再構築フック |
npx mcp-memory-graph sync | すべての有効なメモリとグラフのサイドカーファイルを Vault に書き出します(.md ファイル) |
npx mcp-memory-graph rebuild [--vault <path>] | Vault の .md ファイルから SQLite インデックスを再構築します(共同作業者は git pull の後に実行します) |
npx mcp-memory-graph migrate | データベースを現在のスキーマバージョンにアップグレードします |
npx mcp-memory-graph backup [--out <path>] | WAL セーフなオンラインスナップショットを作成します(保持数:MCP_MEMORY_MAX_BACKUPS、デフォルトは 10) |
npx mcp-memory-graph keys create|list|revoke | キーごとの RBAC:API キーの発行、確認、失効(名前空間の設定とアクセス上限) |
ツールリファレンス
1. memory_store
新しいメモリを保存します。ベクトル埋め込みは自動的に生成されます。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
content | string | はい | 保存するテキストコンテンツ | |
title | string | いいえ | メモリの短いタイトル | |
scope | enum | いいえ | global¹ | global、project、user、team、department |
namespace | string | いいえ | ¹ | サブスコープ(例:プロジェクト名) |
importance_score | number | いいえ | 算出値 | 手動で設定する重要度の上書き値(0~1) |
agent_id | string | いいえ | MCP_AGENT_ID env | memory_attribution の集計用の帰属情報 |
on_conflict | enum | いいえ | add | add、supersede、skip:類似した重複に対する書き込みゲートの動作 |
document_type | string | いいえ | contract、policy、code、incident、decision など | |
source | string | いいえ | このコンテンツの出所 | |
author | string | いいえ | 作成者 | |
department | string | いいえ | legal、engineering、hr、sales、finance | |
tags | string[] | いいえ | 分類用のタグ | |
access_level | enum | いいえ | internal | public、internal、confidential、restricted |
language | string | いいえ | en | ISO 639-1 言語コード |
metadata | object | いいえ | ドメイン固有のキーと値のペア | |
expires_at | string | いいえ | ISO 8601 の有効期限 |
¹ 省略した場合、読み込まれた設定ファイルの defaults.scope と defaults.namespace("auto" = プロジェクトディレクトリ名)が先に適用されます。ハードコードされたフォールバックは、名前空間なしの global です。
プロンプトの例:
Store this memory with department=legal and tags=["compliance","gdpr"]:
"All customer data processing agreements must include a GDPR Article 28 addendum effective January 2025."
2. memory_search
保存されたメモリを対象に、ベクトル検索とキーワード検索を組み合わせて検索します。
仕組み:
- クエリを埋め込み表現に変換し、保存されたすべてのベクトルと比較します(意味的類似性)。
- キーワードを FTS5 でメモリのテキストと照合します(完全一致)。
- 両方の検索結果リストを Reciprocal Rank Fusion で統合します。
- オプションの時間減衰により、最近のメモリを優先します。
- 結果に信頼度スコアとラベルを付与します。
- 品質スコアリングのため、アクセスを記録します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
query | string | はい | 自然言語のクエリまたはキーワード | |
scope | enum | いいえ | スコープで絞り込み | |
namespace | string | いいえ | 名前空間で絞り込み | |
department | string | いいえ | 部門で絞り込み | |
document_type | string | いいえ | ドキュメントタイプで絞り込み | |
tags | string[] | いいえ | 絞り込み:指定したすべてのタグを含むもの | |
access_level | enum | いいえ | アクセスレベルで絞り込み | |
language | string | いいえ | 言語で絞り込み | |
limit | number | いいえ | 10 | 最大結果数(1~100) |
offset | number | いいえ | 0 | ページネーションのオフセット |
search_mode | enum | いいえ | hybrid | hybrid、vector、または keyword |
temporal_decay | object | いいえ | {type: "exponential", half_life_days: 30} または {type: "linear", max_age_days: 365} | |
date_from | string | いいえ | この日付以降のメモリのみ | |
date_to | string | いいえ | この日付以前のメモリのみ | |
min_confidence | number | いいえ | 信頼度の最小しきい値(0~1) |
プロンプトの例:
Search memories for "contract renewal notice requirements" in the legal department
Search memories for "authentication" with search_mode=keyword
Search memories for "deployment patterns" with temporal_decay={type:"exponential", half_life_days:60}
各結果には、メモリの内容とメタデータ、統合された RRF score、正規化された confidence(0~1)、confidence_level ラベル(0.7 以上は高、0.4 以上は中、それ未満は低)、および match_type(hybrid、vector、または keyword)が含まれます。
デフォルトの
detail_level: "summary"投影では、トークンを節約するためにconfidence_levelを返しますが、数値のconfidenceと完全なcontentは省略されます。これらが必要な場合は、detail_level: "full"を指定してください。
3. memory_get
ID を指定して特定のメモリを取得します。取り込み済みのドキュメントでは、すべての子チャンクを含めることもできます。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
id | string | はい | メモリの UUID | |
include_chunks | boolean | いいえ | false | 取り込み済みドキュメントの子チャンクを含める |
4. memory_update
既存のメモリを更新します。内容が変更されると、埋め込み表現が自動的に再生成されます。以前のバージョンは履歴に保存されます。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
id | string | はい | 更新するメモリの ID | |
content | string | いいえ | 新しい内容(埋め込み表現の再生成を実行) | |
title | string | いいえ | 新しいタイトル | |
metadata | object | いいえ | 置き換えるメタデータ | |
tags | string[] | いいえ | 置き換えるタグ | |
expires_at | string/null | いいえ | 新しい有効期限。削除する場合は null | |
changed_by | string | いいえ | この変更を行ったユーザー |
5. memory_delete
ID またはフィルターを指定してメモリを削除します。id または filter の少なくとも一方が必要です。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
id | string | いいえ | 特定のメモリを削除 |
filter.scope | enum | いいえ | スコープ内のすべてを削除 |
filter.namespace | string | いいえ | 名前空間内のすべてを削除 |
filter.department | string | いいえ | 部門内のすべてを削除 |
filter.before_date | string | いいえ | 指定日より古いものを削除 |
filter.expired_only | boolean | いいえ | 期限切れのメモリのみ削除 |
6. memory_list
フィルタリング、ページネーション、並べ替えを使用してメモリを参照します。
| Parameter | Type | Default | Description |
|---|---|---|---|
scope | enum | スコープでフィルタリングします | |
namespace | string | 名前空間でフィルタリングします | |
department | string | 部門でフィルタリングします | |
document_type | string | 種類でフィルタリングします | |
limit | number | 20 | 最大結果数(1-100) |
offset | number | 0 | ページネーションのオフセット |
sort_by | enum | created_at | created_at、updated_at、または title |
sort_order | enum | desc | asc または desc |
7. memory_ingest
ドキュメント全体を取り込みます。コンテンツの種類に応じてチャンクに分割し、各チャンクを埋め込み、親子関係を付けてすべて保存します。大きなドキュメントに使用してください。
| Parameter | Type | Default | Description |
|---|---|---|---|
content | string | ドキュメント全体のテキスト(必須) | |
title | string | ドキュメントのタイトル | |
content_type | enum | text | チャンク分割方式:text、markdown、code、legal、structured |
chunk_size | number | 512 | チャンクの目標サイズ(文字数。トークンあたり約4文字) |
chunk_overlap | number | 50 | コンテキストを保つためのチャンク間の重複 |
source | string | 元のファイルまたは URL | |
document_type | string | ドキュメントの分類 | |
department | string | 部門 | |
author | string | 作成者 | |
tags | string[] | タグ | |
metadata | object | ドメイン固有のメタデータ |
コンテンツの種類ごとのチャンク分割:
| Type | Strategy | Splits on |
|---|---|---|
text | 段落 | 二重改行(\n\n) |
markdown | 見出しを考慮 | #、##、### の見出し |
code | 関数を考慮 | function、class、const、interface の境界 |
legal | 文 | ピリオド、感嘆符、疑問符 |
structured | 段落 | 二重改行(text と同じ) |
8. memory_related
指定したメモリに意味的に関連するメモリを検索します。ベクトル類似度を使用するため、キーワード検索では見つからない関連性を見つけられます。
| Parameter | Type | Default | Description |
|---|---|---|---|
id | string | 関連項目を検索するメモリ ID(必須) | |
limit | number | 5 | 最大結果数(1-50) |
min_similarity | number | 類似度の最小しきい値(0-1) |
9. memory_versions
メモリのバージョン履歴を表示します。更新のたびにバージョンレコードが作成されます。
| Parameter | Type | Default | Description |
|---|---|---|---|
id | string | メモリ ID(必須) | |
limit | number | 10 | 最大バージョン数(1-50) |
10. memory_stats
保存されているメモリの使用統計情報です。
| Parameter | Type | Description |
|---|---|---|
scope | enum | スコープで統計情報をフィルタリングします |
namespace | string | 名前空間で統計情報をフィルタリングします |
department | string | 部門で統計情報をフィルタリングします |
メモリ、ドキュメント、チャンクの合計数、スコープ、部門、種類ごとの内訳、ストレージサイズ、有効期限切れの件数を返します。
11. memory_export
移植や移行のために、現在のメモリ内容を JSON としてエクスポートします。完全なバックアップではありません。現在有効なトップレベルのメモリのみをシリアライズします。編集履歴、ナレッジグラフ、condense-undo の元データ、取り込まれた子チャンク、ソフト削除された行は含まれません。災害復旧には、SQLite ファイルをコピーしてください(cp ~/.mcp-memory/memory.db ...。RUNBOOK を参照)。インポート時に埋め込みは決定論的に再計算されます。
| Parameter | Type | Default | Description |
|---|---|---|---|
scope | enum | エクスポート対象をフィルタリングします | |
namespace | string | エクスポート対象をフィルタリングします | |
department | string | エクスポート対象をフィルタリングします |
エクスポートあたりの最大レコード数は 1000 件です。
12. memory_import
JSON からメモリをインポートします。各項目は埋め込み化され、保存されます。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
data | array | メモリオブジェクトの配列(必須) | |
overwrite | boolean | false | 既存の ID を上書きします |
13. vault_sync
Obsidian の保管庫をスキャンし、Markdown を解析して埋め込み化し、保存します。詳しくは、以下のObsidian Vault の統合をご覧ください。
14. vault_status
保管庫の同期状況を表示します。同期済み、保留中、変更済みのファイル数と、最終同期時刻を確認できます。
15. vault_search
1 つの保管庫のメモリに限定してハイブリッド検索を行います。
デフォルトでは、保管庫のフォルダー名と同じ名前の名前空間を検索します。別の名前空間からエクスポートされたメモリは、フロントマターに元の名前空間が保持されます。新しく同期した保管庫を検索しても結果が返らない場合は、
namespace(および/またはscope)を明示的に指定して上書きしてください。
16. memory_consolidate
夢のサイクルです。重複の排除、スコア付け、整理、期限切れの処理、ナレッジの不足の検出を行います。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
scope | enum | いいえ | 統合の対象範囲を限定します | |
namespace | string | いいえ | 統合の対象を名前空間に限定します | |
similarity_threshold | number | いいえ | 0.85 | 重複排除に用いるコサイン類似度(0.5~1.0) |
prune_expired | boolean | いいえ | true | 期限切れのメモリを削除します |
prune_low_quality | boolean | いいえ | false | 重要度の最小値を下回るメモリを削除します |
dry_run | boolean | いいえ | false | 適用せずに変更内容をプレビューします |
max_operations | number | いいえ | 100 | 1 回の実行あたりの操作数の上限 |
5 つの段階を順番に実行します。Score(重要度を再計算)、Expire(expires_at を適用)、Prune(有効にすると品質の低いメモリを削除)、Dedup(類似した重複を統合)、Gaps(結果がゼロ件だった検索を提示)です。各段階の件数を含むレポートを返します。
プロンプトの例:
Run a dream cycle consolidation with dry_run=true to preview what would change
Consolidate memories in namespace=my-project with similarity_threshold=0.9
Run consolidation with prune_low_quality=true to clean up unused memories
17. memory_extract_learnings
ヒューリスティックなパターンマッチングを用いて、セッションのトランスクリプトから意思決定、パターン、エラーの修正、規約を抽出します。外部の LLM は不要です。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
transcript | string | はい | 抽出対象となるセッションのトランスクリプトテキスト | |
scope | enum | いいえ | 抽出したメモリの対象範囲 | |
namespace | string | いいえ | 抽出したメモリの名前空間 | |
department | string | いいえ | 抽出したメモリの部門 | |
tags | string[] | いいえ | 追加のタグ | |
source | string | いいえ | ソースの帰属情報 | |
categories | enum[] | いいえ | all | decision、pattern、error_fix、convention に絞り込みます |
auto_store | boolean | いいえ | true | 抽出した学びを自動的に保存します |
意思決定を示す表現(「we decided」「the fix was」)、パターンを示す表現(「always use」「never do」)、エラーの修正を示す表現(「the problem was」「solved by」)、規約を示す表現(「our convention is」「standard practice」)を探します。見つかった項目は既存のメモリと重複していないか照合され、初期信頼度を低めに設定して保存されます。
18-42. グラフ、Agent-OS、Vault のラウンドトリップ、およびガバナンスツール
残りのツールのパラメーターは src/schemas/ の Zod スキーマで検証されます。各登録の詳細な説明は src/server.ts にあります。
| # | ツール | 目的 |
|---|---|---|
| 18 | memory_tiers | MemGPT 形式のホット/リコール/アーカイブ各階層の分布と、ホットな作業セット |
| 19 | memory_export_vault | メモリーを YAML フロントマター付きの .md ファイルとして Obsidian の Vault に書き出します(vault_sync の逆方向) |
| 20 | memory_canvas | グラフを Obsidian 用の JSON Canvas 1.0 .canvas としてエクスポートします |
| 21 | memory_manifest | 何が存在するかを見つけるための、コンテンツを含まない軽量インデックス(タイトル、種類、タグ、スコア) |
| 22 | memory_graph | ナレッジグラフを検索します。エンティティ、関係、リンクされたメモリー、複数ホップのたどり(深さ 1~3)に対応します |
| 23 | memory_extract_entities | LLM が抽出したエンティティと関係をメモリーに保存します |
| 24 | memory_condense | エージェントが生成した要約を適用して古いメモリーを簡潔にします(元の内容は保持されます) |
| 25 | memory_restore | 簡潔化したメモリーを元の内容に戻し、再度埋め込みます |
| 26 | memory_query | コンテキストを溢れさせる代わりに、トークン予算を厳密に制限したサブグラフを使って質問に回答します |
| 27 | core_memory_get | (scope, namespace) に対応する、ピン留めされ常にコンテキストに含まれるコアメモリーブロックを読み取ります |
| 28 | core_memory_append | コアメモリーブロックに追記します(char_limit を超える場合は拒否されます) |
| 29 | core_memory_replace | コアメモリーブロック内のテキストを置換します(更新や圧縮に使用します) |
| 30 | memory_reflect | Generative Agents 形式のリフレクションです。素材を集めるか、統合した知見を保存します |
| 31 | memory_communities | コーパス全体のテーマを見つけるため、エンティティグラフ上で GraphRAG のコミュニティ検出を行います |
| 32 | memory_template | ドキュメントの種類ごとに構造化されたノートのひな形を取得します |
| 33 | memory_session_note | セッションごとの「デイリーノート」です(session_id ごとに 1 つのメモリーに追記します) |
| 34 | memory_attribution | 各 agent_id が書き込んだ有効なメモリーの数を集計します |
| 35 | memory_questions | 「質問事項」のダイジェストです。曖昧なリンク、記録が不十分なエンティティ、孤立した項目を示します |
| 36 | memory_forget | GDPR 準拠の消去機能です。デフォルトではソフト削除(復元可能)、または hard を指定してエクスポート後に消去します |
| 37 | memory_history | 1 つのメモリーについて、指定時点の二時点タイムラインと編集バージョン履歴を表示します |
| 38 | memory_unlinked_mentions | メモリーのテキストに記載されているものの、グラフのエッジがまだないエンティティ名(リンク候補) |
| 39 | memory_query_structured | トップレベルのメモリーに対する厳密なメタデータフィルター検索(セマンティックランキングなし) |
| 40 | memory_version_diff | 保存された 2 つのメモリーバージョン間の行単位の差分 |
| 41 | memory_version_restore | メモリーを以前のバージョンに戻します(先に現在のバージョンをスナップショットとして保存します) |
| 42 | memory_verify | メモリーの署名付き来歴エンベロープを検証します(content_hash と origin に対する ed25519)。メモリーごとに ok/unsigned/content_mismatch/bad_signature/untrusted を示し、概要も返します。MCP_SIGN_MEMORIES で署名をオプトインできます。複数マシンの許可リストには MCP_TRUSTED_PUBKEYS/trusted_pubkeys を使用します |
43-50. アクティブなインフラストラクチャと型付きシェイプ
| # | ツール | 目的 |
|---|---|---|
| 43 | memory_webhook | イベントバスを管理します(MCP_WEBHOOKS によって制御)。SSRF 検証済みの送信先の登録、一覧表示、削除、または永続化され HMAC 署名された配信キューの実行(再試行、サーキットブレーカー、デッドレター)を行います。変更時には created/updated/superseded/deleted/forgotten イベントを出力します |
| 44 | memory_insights | アドバイザー向けダイジェスト:未解決の競合、古くなったメモリ、最も矛盾の多い事実、証拠のない判断 |
| 45 | memory_health | ストアの健全性の概要:有効/廃止/古くなったメモリの件数、経過期間別の区分、未解決の競合、Webhook 配信の健全性 |
| 46 | memory_revalidate | 変更の伝播:古くなったメモリの一覧表示、変更の影響範囲のプレビュー(ドライラン)、またはメモリが最新であることの確認 |
| 47 | memory_session_state | 再開可能な「どこまで進んだか」のセッション状態を保存、再開します(バージョン管理) |
| 48 | memory_expertise | ユーザーごとの専門知識プロフィール:トピックを記録し、プロフィールを取得します |
| 49 | memory_export_dataset | ファインチューニング用の JSONL トレーニングペア(pairs/chatml/alpaca)として、学習内容と振り返りをエクスポートします |
| 50 | memory_lesson | 構造化された教訓またはインシデントを 1 回の呼び出しで記録します。フィールド値から対応するセクションテンプレート(インシデント → 症状/根本原因/修正/予防、教訓 → 内容/重要である理由/適用方法)を埋め、通常の重複排除付き書き込みパスを通じて保存します |
アーキテクチャ
システム概要
Claude Code ──stdio──> MCP Memory Graph
│
┌───────┴───────┐
│ │
Transformers.js SQLite DB
(embeddings) (~/.mcp-memory/memory.db)
│
┌────────────┼────────────┐
│ │ │
memories memories_fts memories_vec
(data + (FTS5 index) (vec0 index)
scores)
│
┌────────┼────────┐
│ │ │
memory_ memory_ ingest_
versions access_ source_
log tracking
Claude Code Hooks (opt-in)
│
├── SessionStart ──> memory_stats (status check)
├── PostToolUse ───> search-log.jsonl (hit/miss tracking)
├── PreCompact ────> learning extraction (disabled by default)
└── Stop ──────────> spawn detached `claude -p` headless review
│
└─> --allowedTools mcp__memory-server__memory_store
Claude reviews transcript → memory_store calls
Nightly Schedule (opt-in)
└── 3:00 AM ───────> memory_consolidate (dream cycle)
ハイブリッド検索の仕組み
Query: "contract renewal notice"
│
┌────┴────┐
│ │
Embed Tokenize
│ │
▼ ▼
sqlite-vec FTS5
(semantic) (keyword)
│ │
│ rank │ rank
│ 1: A │ 1: A
│ 2: C │ 2: B
│ 3: B │ 3: D
│ │
└────┬────┘
│
Reciprocal Rank Fusion
RRF(d) = Σ 1/(60 + rank)
│
▼
[A: 0.033, B: 0.026, C: 0.016, D: 0.016]
│
Temporal Decay (optional)
│
Confidence Scoring
│
Access Tracking (record hit)
│
▼
Final ranked results
データベーススキーマ
SQLite データベースのスキーマバージョンは 18 で、以前のすべてのバージョンから自動的に前方移行できます。主なテーブルは次のとおりです。
memories:すべてのメモリデータを格納します。主キーは TEXT(UUID)で、ドキュメントチャンクの親子関係をサポートし、access_count、last_accessed_at、importance_score、confidence_scoreも保持します。memories_fts:BM25 ランキングによるキーワード検索用の FTS5 仮想テーブルで、memories テーブルと同期されます。memories_vec:ベクトル検索用の vec0 仮想テーブルです。事前フィルタリング用のスコープおよび名前空間メタデータとともに、384 次元の float32 埋め込みを格納します。memory_versions:すべての変更のバージョン履歴です。memory_access_log:検索、取得、関連メモリへのアクセスをすべて、タイムスタンプとクエリコンテキストとともに記録します。ingest_source_tracking:再取り込み時の変更検出に使用する、取り込み済みファイルの情報です。
後続のスキーマバージョンでは、ナレッジグラフのテーブル(エンティティ、リンク、競合、コミュニティ)、Webhook、セッション状態、RBAC の api_keys テーブルが追加されます。すべての変更で、SQLite トランザクション内において 3 つのコアテーブルの整合性が原子的に保たれます。これを repository.ts レイヤーが保証し、それ以外からテーブルに直接アクセスすることはありません。
プロジェクトの構成
src/
├── index.ts # Entry point (stdio transport)
├── server.ts # All 51 tool registrations
├── config/ # Config file loading + validation
├── db/ # Connection, schema, migrations, repository (three-table sync)
├── embeddings/ # Embedding providers (Transformers.js, registry, Ollama)
├── search/ # Hybrid search, reranker, temporal decay, scoring
├── chunking/ # Per-content-type chunking strategies
├── graph/ # Entities, links, PageRank, communities
├── vault/ # Obsidian round-trip, write-through, bookkeeping
├── tools/ # One handler per MCP tool
├── api/ # REST routes + security middleware
├── events/ # Webhook bus (SSRF guard, HMAC, retry)
├── cli/ # init, serve, vault, backup, keys, migrate, ...
├── hooks/ # Claude Code lifecycle hooks
└── schemas/ # Zod schemas for every tool input
部門別のユースケース
エンジニアリング:
Store memory: "We chose event sourcing over CRUD for the order service because
we need full audit trail and the ability to replay events for debugging.
ADR-042, decided 2026-03-15."
department=engineering, document_type=decision, tags=["architecture","event-sourcing"]
法務:
Ingest this contract template with content_type=legal, department=legal,
document_type=contract, tags=["template","nda","standard"]
財務:
Store memory: "Q4 2025 revenue recognition policy change: SaaS contracts
over 12 months now recognized ratably per ASC 606 guidance."
department=finance, document_type=policy, tags=["revenue-recognition","asc-606"]
人事:
Ingest the employee handbook with department=hr, content_type=text,
document_type=policy, tags=["handbook","onboarding"]
営業:
Store memory: "When prospect objects on price vs CompetitorX, lead with
our 99.9% uptime SLA and dedicated support. This converted 3 deals in Q1."
department=sales, document_type=pattern, tags=["objection-handling","pricing","competitorx"]
Obsidian Vault 連携
サーバーに Vault フォルダーを指定すると、すべての Markdown ファイルが検索可能なメモリーになり、フロントマター、タグ、Wiki リンクが抽出されます。Obsidian アプリは不要で、ディスク上のファイルを直接読み取ります。
| ツール | 説明 |
|---|---|
vault_sync | Vault をスキャンし、ファイルを解析して、埋め込みを生成して保存します。増分処理(mtime ベース)です。 |
vault_status | 同期状況:同期済み、保留中、変更済みのファイル数、最終同期時刻です。 |
vault_search | Vault のメモリーを対象としたハイブリッド検索です。 |
抽出される情報:
| Obsidian の機能 | メモリーフィールド |
|---|---|
YAML フロントマターの title: | title |
YAML フロントマターの tags: [...] | tags(インラインのタグと統合) |
YAML フロントマターの author: | author |
| YAML フロントマター(すべてのフィールド) | metadata.frontmatter |
コンテンツ内のインライン #tags | tags(フロントマターのタグと統合) |
[[wiki-links]] | metadata.links 配列 |
| Vault からの相対ファイルパス | source |
| Vault ディレクトリ名 | namespace |
使用例:
Sync my Obsidian vault at ~/Documents/my-vault
Check vault sync status for ~/Documents/my-vault
Search my vault for "meeting action items about hiring"
Sync vault but only the notes/ and projects/ folders:
vault_sync with include_patterns=["notes/**", "projects/**"]
Force re-sync everything (ignore modification times):
vault_sync with force=true
vault_sync のパラメーター:
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
vault_path | string | Vault ディレクトリへの絶対パス(必須) | |
chunk_size | number | 1024 | 大きなファイルの目標チャンクサイズ |
chunk_overlap | number | 50 | チャンク間のオーバーラップ |
force | boolean | false | mtime に関係なく、すべてのファイルを再同期します |
include_patterns | string[] | 一致する glob のみを同期します(例:["notes/**"]) | |
exclude_patterns | string[] | 一致する glob をスキップします(例:["templates/**"]) |
同期の仕組み:Vault を再帰的にスキャンして .md ファイルを探し(.obsidian/、.trash/、.git/ はスキップ)、更新時刻を前回の同期時刻と比較します。新規ファイルまたは変更されたファイルからフロントマター、Wiki リンク、タグを抽出し、埋め込みを生成して保存します。削除されたファイルのメモリーは削除されます。チャンクサイズを超えるファイルは、Markdown の構造を考慮したチャンク分割で分割されます。変更のない Vault を再同期する場合、1 ミリ秒もかかりません。
セキュリティとプライバシー
- モデルの初回ダウンロード後は、ネットワークへの呼び出しはありません(ローカルにキャッシュされます)。
- テレメトリー、アナリティクス、トラッキングはありません。
- フックはオプトインです。
npx mcp-memory-graph initを実行した場合にのみインストールされます。 - 夜間スケジュールもオプトインで、
npx mcp-memory-graph uninstallによって削除されます。 - すべてが単一の SQLite ファイルに保存されるため、簡単にバックアップ、移動、削除できます。
- 組織での把握に役立つ
access_levelメタデータ(public、internal、confidential、restricted)を使用できます。 - データがマシンの外部に送信されることはありません。
バックアップ:
# WAL-safe online snapshot with retention
npx mcp-memory-graph backup
# Or a simple file copy
cp ~/.mcp-memory/memory.db ~/.mcp-memory/memory.db.backup
リセット:
# Delete the database to start fresh
rm ~/.mcp-memory/memory.db
夜間の統合
npx mcp-memory-graph init でインストールすると、夜間ジョブによって 5 つのドリームサイクル段階すべてとアクセスログのローテーションが実行されます(90 日より古いエントリーは削除されます)。
macOS では、~/Library/LaunchAgents/com.mcp-memory.consolidate.plist に launchd plist が作成され、午前 3 時にスケジュールされます。Linux では、init によって cron の設定例が表示されます:
# Add to crontab -e
0 3 * * * /usr/local/bin/npx mcp-memory-graph consolidate
いつでも手動で実行できます:
npx mcp-memory-graph consolidate
制限事項
- 規模の上限。 ベクトル検索は全件スキャン方式です。10K ベクトルで p95 は 9.1 ms、50K では約 30 ms で、そこからは線形に遅くなります。数十万件までは快適に使えますが、それ以上では専用の ANN インデックスが必要になります。現時点で、このサーバーにはまだありません。
- 英語に最適化されています。 デフォルトの MiniLM モデルは、実質的に英語専用です。言語をまたいだマッチングの精度は低くなります。
MCP_MEMORY_MODELで多言語モデルを設定できます(再ビルドが必要です)が、公開済みのベンチマークで検証しているのはデフォルトモデルのみです。 - 初回呼び出し時のコールドスタート。 初回の使用時は、埋め込みモデルの読み込みに 3~5 秒かかります。それ以降はキャッシュされます。
- ヒューリスティックな抽出。
memory_extract_learningsはパターンマッチングを使用し、LLM は使用しません。よくある言い回しは検出できますが、微妙な表現は見逃します。(Stop フックのclaude -pによるレビューが、LLM 品質で処理する方法です。) - 単一プロセス。 RBAC キーと失効情報はサーバープロセス内に保持されます。水平スケーリングするには、テナントを複数のプロセスに分散するか、テナントごとに独自のデータベースファイルを割り当てます。
ロードマップ
現時点で次に予定していることを、おおよその順に示します。
- オプトイン方式の多言語埋め込み。 多言語 ONNX モデルのオプションを提供します(埋め込みモデルのレジストリとモデル ID のガードはすでにあるため、安全かつ明確に切り替えられます)。
- オフィス文書の取り込み。 PDF、DOCX、XLSX などを、ローカルでの抽出のみを使う取り込みモードで処理します。
- Vault ファイル監視。 手動で
rebuildする代わりに、.mdの変更時に自動で再構築します。 as_ofによるコンテンツの再構築。 現在の時点指定クエリでは、有効性(どの事実が有効だったか)を再構築できます。残る課題は、その時点に編集されたメモリの内容を再構築することです。- 数十万件を超えるコーパス向けの ANN インデックス。
- Windows テストスイートの移植。 サーバーは Windows 上で動作しますが、テストスイートには POSIX パスを前提とした箇所があります。対応が完了するまでは、Windows CI の実行はブロッキングではありません。
技術スタック
| コンポーネント | パッケージ | 用途 |
|---|---|---|
| MCP SDK | @modelcontextprotocol/sdk ^1.29 | Model Context Protocol サーバー用フレームワーク |
| 埋め込み | @huggingface/transformers ^3.8 | Node.js でのローカル ONNX モデル推論 |
| データベース | better-sqlite3 ^12.10 | ネイティブバインディングを使用する同期 SQLite |
| ベクトル検索 | sqlite-vec 0.1.10-alpha.4 | KNN 検索用の vec0 仮想テーブル |
| 検証 | zod ^3.25 | ツール入力のスキーマ検証 |
| TypeScript | typescript ^5 | 厳格モード、ES2022 ターゲット |
| フロントエンド | React 19, Vite, Tailwind CSS v4 | Web ダッシュボード SPA |
| UI コンポーネント | shadcn/ui | アクセシブルなコンポーネントプリミティブ |
| あいまい検索 | fuse.js ^7 | クライアント側のオートコンプリート候補 |
| グラフの可視化 | d3-force, d3-zoom, d3-drag | ナレッジグラフのレイアウト |
ライセンス
ソースコードは利用可能ですが、オープンソースではありません。PolyForm Noncommercial License 1.0.0 の下でライセンスされており、あらゆる非商用目的(個人プロジェクト、趣味、学習、研究、慈善、教育、公的研究、政府機関での利用)で無料で利用できます。商用利用には有償ライセンスが必要です。詳細は COMMERCIAL.md をご覧ください。
ご自身の利用が商用に該当するか不明な場合は、ライセンスのセーフハーバーを確認するか、こちらにお問い合わせください:[email protected]。
キーワード
MCP メモリーサーバー · Model Context Protocol · Claude Code メモリー · 永続的な AI メモリー · LLM の長期記憶 · AI エージェントのメモリー · ローカルファーストのメモリー · $0/token のメモリー · ベクトル検索とキーワード検索のハイブリッド · セマンティック検索 · ナレッジグラフ · 双時間メモリー · HippoRAG / Personalized PageRank · クロスエンコーダーによる再ランキング · RAG メモリー · SQLite ベクトルデータベース · sqlite-vec · FTS5 / BM25 · ローカル埋め込み(all-MiniLM-L6-v2、Transformers.js) · Obsidian Vault 同期 · JSON Canvas · GDPR に基づく削除 · 署名付きプロベナンス · セルフホスト可能なメモリー。
次の名称でも検索されています:mem0、Zep、Letta、Cognee、Supermemory に代わる、セルフホスト可能でプライバシーを重視したソリューション · Claude / Cursor / Codex 向け長期記憶 · AI エージェント向け Obsidian ベースのナレッジベース · マシンの外に出ないローカルナレッジグラフメモリー。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。