Memory MCP Server について
Memory MCP Serverは、MCP対応アシスタント向けのSQLiteベースの永続メモリです。ローカルのstdioサーバーで全文検索、関係グラフの探索、トークン予算に応じた取得を組み合わせます。
主な機能
- 01SQLiteへのメモリ永続化
- 02FTS5による内容とタグの検索
- 03BFSによるメモリ関係の探索
- 04トークン予算内でのコンテキスト取得
- 05メモリと関係の一括管理
活用シーン
- 01アシスタントのセッション間で情報を保持
- 02テキスト、種類、重要度からメモリを検索
- 03関係グラフをたどって関連メモリを想起
- 04トークン上限に収まるメモリコンテキストを選択
MCP 対応
stdio経由でメモリのCRUD、一括操作、検索、グラフ想起、コンテキスト取得、関係管理、統計のツールを提供します。使い方リソースとメモリURIテンプレートも備えています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
13掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| tags | array | はい | メモリタグ |
| content | string | はい | メモリーの内容 |
| importance | integer | いいえ | 優先度(0-10) |
| memory_type | enum | いいえ | メモリのカテゴリgeneral | fact | plan | decision | reflection | lesson | error | gradient |
詳細
Memory MCP
永続メモリストレージ、全文検索、関係グラフのトラバーサルに対応した、SQLite ベースの MCP サーバーです。
概要
Memory MCP は、MCP 対応アシスタント向けにローカルで永続的なメモリレイヤーを提供します。SHA-256 アドレス指定のメモリアイテムを SQLite に保存し、FTS5 による全文検索、有向関係グラフ、BFS による想起トラバーサル、トークン予算を考慮したコンテキスト取得を備えています。これらすべてを外部依存関係なしで、stdio トランスポート経由で利用できます。
主な機能
- CRUD、一括操作、FTS5 検索、BFS グラフ想起、トークン予算に応じたコンテキスト取得、関係、統計情報のための 13 個の MCP ツール。
- SQLite FTS5 を使用した、重要度とタイプによるフィルターに対応したコンテンツおよびタグの 全文検索。
- BFS トラバーサル、範囲を制限したフロンティア、ホップごとの MCP 進捗通知に対応した グラフ想起。
- トークン予算に応じた取得(
retrieve_context)では、呼び出し元が指定したトークン予算に収まるメモリを選択します。手動でページネーションする必要はありません。 - 型付き出力エンベロープと SHA-256 ハッシュアドレス指定に対応した 厳密な Zod 入力検証。
internal://instructions(Markdown ガイド)と、ハッシュの自動補完に対応した URI テンプレートmemory://memories/{hash}を備えた リソースサポート。SIGINT、SIGTERMによる正常なシャットダウン処理に対応した stdio トランスポート。HTTP エンドポイントはありません。 |
要件
- Node.js
>=24。 - FTS5 をサポートする SQLite(起動時に検証されます)。
- stdio コマンドサーバーに対応した任意の MCP クライアント。
クイックスタート
インストール不要で、npm パッケージを npx から直接使用できます。
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
ヒント
サーバーは stdio トランスポートのみを使用し、HTTP エンドポイントは公開しません。カスタムログ出力によって stdout を汚さないでください。
または、Docker で実行します。
docker run --rm -i ghcr.io/j0hanz/memory-mcp:latest
クライアント設定
VS Code にインストール
ワークスペースファイル .vscode/mcp.json:
{
"servers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
CLI:
code --add-mcp '{"name":"memory-mcp","command":"npx","args":["-y","@j0hanz/memory-mcp@latest"]}'
VS Code Insiders にインストール
CLI:
code-insiders --add-mcp '{"name":"memory-mcp","command":"npx","args":["-y","@j0hanz/memory-mcp@latest"]}'
Cursor にインストール
~/.cursor/mcp.json:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
Claude Desktop / Claude Code にインストール
claude_desktop_config.json:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
CLI:
claude mcp add memory-mcp -- npx -y @j0hanz/memory-mcp@latest
Windsurf にインストール
MCP 設定:
{
"mcpServers": {
"memory-mcp": {
"command": "npx",
"args": ["-y", "@j0hanz/memory-mcp@latest"]
}
}
}
Docker で実行
# Pull and run (stdio mode)
docker run --rm -i \
-e MEMORY_DB_PATH=/data/memory.db \
-v memory-data:/data \
ghcr.io/j0hanz/memory-mcp:latest
MCP クライアント設定:
{
"mcpServers": {
"memory-mcp": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MEMORY_DB_PATH=/data/memory.db",
"-v",
"memory-data:/data",
"ghcr.io/j0hanz/memory-mcp:latest"
]
}
}
}
ドキュメントの保守
- 担当者:
src/の MCP の動作を更新するメンテナーは、同じ PR でREADME.mdと該当するmcp/のミラーページを更新する必要があります。 - リンク/バージョンポリシー:プロトコルの参照には固定された
https://modelcontextprotocol.io/specification/2025-11-25/...リンクを使用し、latestや混在するレガシーなリンク先は避けてください。 - 差分確認チェックリスト:
src/server.tsの機能宣言を再確認します。- ツール/リソース/プロンプトのドキュメントを
src/tools/index.ts、src/resources/index.ts、src/prompts/index.tsと照合します。 src/instructions.mdの制限事項や注意点が実行時の動作と一致していることを確認します。
- 検証コマンド:
npm run type-check、npm run test:fast、npm run build。
MCP のインターフェース
ツールの概要
| ツール | カテゴリ | 備考 |
|---|---|---|
store_memory | 書き込み | 内容とソート済みタグのハッシュで冪等性を確保 |
store_memories | 書き込み | バッチ(1~50 件)、トランザクションでラップ |
get_memory | 読み取り | ハッシュ検索 |
update_memory | 書き込み | old_hash + new_hash を返す |
delete_memory | 書き込み | 関連データの削除を連鎖して実行 |
delete_memories | 書き込み | バッチ(1~50 件)、トランザクションでラップ |
search_memories | 読み取り | FTS5 + 重要度/タイプのフィルター + カーソル |
create_relationship | 書き込み | 冪等な有向エッジの作成 |
delete_relationship | 書き込み | 指定された有向エッジを削除 |
get_relationships | 読み取り | 方向フィルター + 関連するメモリのフィールド |
recall | 読み取り | FTS5 のシード + BFS トラバーサル(深度 0~3) |
retrieve_context | 読み取り | トークン予算を考慮したコンテキストの取得 |
memory_stats | 読み取り | ストアの集計情報とタイプ別内訳 |
store_memory
内容、タグ、オプションの種類/重要度を指定して、新しいメモリを保存します。冪等です。同じ内容とタグを保存すると、created: false と既存のハッシュが返されます。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
content | string | Yes | — | メモリの内容(1~100000 文字) |
tags | string[] | Yes | — | 1~100 個のタグ。各タグは最大 50 文字で、空白は使用できません |
memory_type | enum | No | general | general、fact、plan、decision、reflection、lesson、error、gradient |
importance | integer | No | 0 | 優先度(0~10) |
戻り値:{ hash, created }
store_memories
1 回のトランザクションで複数のメモリを保存します(最大 50 件)。
| Name | Type | Required | Description |
|---|---|---|---|
items | Array<StoreMemoryItem> | Yes | 1~50 件のアイテム。それぞれに content、tags、およびオプションの memory_type と importance を指定します |
戻り値:{ items, succeeded, failed }
get_memory
SHA-256 ハッシュを指定して、1 件のメモリを取得します。
| Name | Type | Required | Description |
|---|---|---|---|
hash | string | Yes | 64 文字の小文字の SHA-256 16 進数 |
戻り値:Memory、または E_NOT_FOUND の場合は { ok: false, error }。
update_memory
既存のメモリの内容を更新し、必要に応じてタグも更新します。両方のハッシュが返されます。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
hash | string | Yes | — | 既存のメモリのハッシュ |
content | string | Yes | — | 置き換える内容 |
tags | string[] | No | Existing tags | 置き換えるタグ |
戻り値:{ old_hash, new_hash }
delete_memory
ハッシュを指定して、1 件のメモリを削除します。関連するリレーションシップの行も連鎖的に削除されます。
| Name | Type | Required | Description |
|---|---|---|---|
hash | string | Yes | メモリのハッシュ |
戻り値:{ hash, deleted }
delete_memories
1 回のトランザクションで、ハッシュを指定して複数のメモリを削除します。
| Name | Type | Required | Description |
|---|---|---|---|
hashes | string[] | Yes | 1~50 個のメモリのハッシュ |
戻り値:{ items, succeeded, failed }
search_memories
FTS5 を使用して、メモリーの内容とタグを全文検索します。重要度とタイプによるフィルターに対応し、カーソルを使ってページネーションします。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | — | 検索テキスト(1~1000 文字) |
limit | integer | No | 20 | 1 ページあたりの結果数(1~100) |
cursor | string | No | — | 前回のレスポンスから取得したページネーション用カーソル |
min_importance | integer | No | — | 重要度がこの値以上(0~10)のメモリーのみを返します |
max_importance | integer | No | — | 重要度がこの値以下(0~10)のメモリーのみを返します |
memory_type | enum | No | — | メモリータイプで絞り込み |
返り値:{ memories, total_returned, nextCursor? }
create_relationship
2 つのメモリー間に、有向のリレーションシップエッジを作成します。べき等です。
relation_type の値として、related_to、causes、depends_on、parent_of、child_of、supersedes、contradicts、supports、references を推奨します。
| Name | Type | Required | Description |
|---|---|---|---|
from_hash | string | Yes | ソースメモリーのハッシュ |
to_hash | string | Yes | ターゲットメモリーのハッシュ |
relation_type | string | Yes | エッジのラベル(1~50 文字、空白なし、自由形式) |
返り値:{ created }
delete_relationship
有向のリレーションシップエッジを 1 つ削除します。
| Name | Type | Required | Description |
|---|---|---|---|
from_hash | string | Yes | ソースハッシュ |
to_hash | string | Yes | ターゲットハッシュ |
relation_type | string | Yes | リレーションシップタイプ |
返り値:E_NOT_FOUND の場合は { deleted } または { ok: false, error }。
get_relationships
メモリーのリレーションシップを取得します。方向によるフィルターを任意で指定できます。
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
hash | string | Yes | — | メモリーのハッシュ |
direction | enum | No | both | outgoing、incoming、または both |
返り値:{ relationships, count }
各リレーションシップには、from_hash、to_hash、relation_type、created_at、linked_hash、linked_content、linked_tags が含まれます。
recall
全文検索クエリでメモリを検索し、その後 BFS で最大 depth ホップまで関係グラフをたどります。各ホップで MCP の進捗通知を送信します。
| 名前 | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
query | string | はい | — | シード検索クエリ(1~1000 文字) |
depth | integer | いいえ | 1 | BFS のホップ数(0~3) |
limit | integer | いいえ | 10 | シードメモリ数(1~50) |
cursor | string | いいえ | — | 前回の応答から取得したページネーションカーソル |
min_importance | integer | いいえ | — | シードのフィルター:重要度が指定値以上のメモリのみ(0~10) |
max_importance | integer | いいえ | — | シードのフィルター:重要度が指定値以下のメモリのみ(0~10) |
memory_type | enum | いいえ | — | シードのフィルター:このタイプのメモリのみ |
戻り値:{ memories, graph, depth_reached, aborted?, nextCursor? }
graph 内の各項目は次の形式です。
{ "from_hash": "...", "to_hash": "...", "relation_type": "..." }
メモ
aborted: trueは、走査が安全上の上限(RECALL_MAX_FRONTIER_SIZE、RECALL_MAX_EDGE_ROWS、またはRECALL_MAX_VISITED_NODES)に達したことを示します。部分的な結果は引き続き返されます。
retrieve_context
メモリを検索し、呼び出し元が指定したトークン予算内に収まる関連度順の結果を返します。コンテキストウィンドウの管理における、手動のページネーションとトークン数のカウントが不要になります。
| 名前 | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
query | string | はい | — | 検索クエリ(1~1000 文字) |
token_budget | integer | いいえ | 4000 | 返す推定トークン数の上限(100~200000) |
strategy | enum | いいえ | relevance | 並べ替え順:relevance(FTS ランク)、importance(重要度の高い順)、recency(新しい順) |
戻り値:{ memories, estimated_tokens, truncated }
ヒント
トークン数の推定は概算です(コンテンツの長さ ÷ 4)。
truncated: trueは、すべての候補を含める前に予算に達したことを示します。
memory_stats
メモリと関係の集計統計を返します。入力は不要です。
戻り値:
{
"memories": {
"total": 0,
"oldest": null,
"newest": null,
"avg_importance": null
},
"relationships": { "total": 0 },
"by_type": {}
}
リソース
| URI | MIME | 説明 |
|---|---|---|
internal://instructions | text/markdown | すべてのツールとワークフローの Markdown 使用ガイド |
memory://memories/{hash} | application/json | 1 件のメモリを JSON で返します。ハッシュ補完に対応しています |
プロンプト
| 名前 | 引数 | 目的 |
|---|---|---|
get-help | なし | すべてのツールの使用方法をまとめて返します |
設定
環境変数
| 変数 | 説明 | デフォルト | 必須 |
|---|---|---|---|
MEMORY_DB_PATH | SQLite データベースファイルのパス | memory_db/memory.db | いいえ |
RECALL_MAX_FRONTIER_SIZE | ホップごとの BFS フロンティアノードの最大数(100–50000) | 1000 | いいえ |
RECALL_MAX_EDGE_ROWS | トラバーサルごとに取得する関係行の最大数(100–50000) | 5000 | いいえ |
RECALL_MAX_VISITED_NODES | トラバーサル全体で訪問済みとなるノードの最大数(100–50000) | 5000 | いいえ |
重要
MEMORY_DB_PATHが相対パスの場合(デフォルトのmemory_db/memory.dbを含む)、プロセスの作業ディレクトリを基準に解決されます。
ヒント
データベースをバージョン管理の対象外にするには、
.gitignoreにmemory_db/を追加してください。データベースにはローカルのセッションデータが含まれるため、共有したりコミットしたりしないでください。
制限事項と制約
| 項目 | 値 |
|---|---|
| コンテンツの長さ | 1~100000 文字 |
| タグ数 | メモリごとに 1~100 個 |
| タグの長さ | 1~50 文字、空白なし |
| ハッシュ形式 | 64 文字の小文字 16 進数 SHA-256 |
| 検索クエリの長さ | 1~1000 文字 |
search_memories.limit | 1~100(デフォルト 20) |
recall.depth | 0~3(デフォルト 1) |
recall.limit | 1~50(デフォルト 10) |
retrieve_context.token_budget | 100~200000(デフォルト 4000) |
| バッチサイズ | 1~50 件(store_memories、delete_memories) |
| リコールのフロンティア上限 | RECALL_MAX_FRONTIER_SIZE(ホップごとのデフォルトは 1000) |
| SQLite のビジータイムアウト | 5000 ms |
メモ
カーソル値は不透明な base64url エンコード済みトークンです。不透明な値として扱い、解析しないでください。
セキュリティ
- トランスポートは stdio のみ(
StdioServerTransport)で、HTTP エンドポイントはありません。 - 致命的なプロセスエラーは
stderrに出力されます。MCP プロトコルのため、stdout はクリーンな状態に保つ必要があります。 - データベースにアクセスする前に、すべての入力を厳格な Zod スキーマと上限付きフィールド制約で検証します。
- ハッシュは、小文字 64 文字の SHA-256 16 進数正規表現に照らして検証します。
- FTS の
MATCH実行前に検索入力を英数字の語句にトークン化します(英数字以外の文字は区切り文字として扱われ、FTS インジェクションを防ぎます)。 - SQLite の外部キーが有効になっており、メモリを削除すると関連行も連鎖削除されます。
開発
依存関係をインストールします:
npm install
主要なスクリプト:
| スクリプト | コマンド | 用途 |
|---|---|---|
build | npm run build | クリーンアップ、コンパイル、インストラクションの検証、アセットのコピー、実行権限の付与 |
dev | npm run dev | TypeScript のウォッチモード |
dev:run | npm run dev:run | .env とファイル監視を使用してビルド済みサーバーを実行 |
start | npm run start | ビルド済みサーバーを起動 |
test | npm run test | タスクランナーによるフルビルドとテスト |
test:fast | npm run test:fast | Node のテストランナーで TS テストを直接実行 |
lint | npm run lint | ESLint チェック |
lint:fix | npm run lint:fix | ESLint による自動修正 |
type-check | npm run type-check | 厳密な TypeScript チェック |
format | npm run format | Prettier によるフォーマット |
inspector | npm run inspector | stdio サーバーに対してビルドし、MCP Inspector を開く |
MCP Inspector で確認します:
npx @modelcontextprotocol/inspector node dist/index.js
ビルドとリリース
GitHub Actions のリリースワークフロー(.github/workflows/release.yml)は、単一の workflow_dispatch トリガーでバージョン管理、検証、公開を処理します:
workflow_dispatch (patch / minor / major / custom)
│
▼
release — bump package.json + server.json → lint → type-check → test → build → tag → GitHub Release
│
├──► publish-npm ──► publish-mcp (npm Trusted Publishing OIDC → MCP Registry)
│
└──► publish-docker (GHCR, linux/amd64 + linux/arm64)
リリースを実行します:
gh workflow run release.yml -f bump=patch
または、GitHub UI を使用します:Actions → Release → Run workflow。
メモ
npm の公開には OIDC Trusted Publishing を使用するため、
NPM_TOKENシークレットは不要です。MCP Registry では GitHub OIDC を使用します。Docker では組み込みのGITHUB_TOKENを使用します。
トラブルシューティング
| 症状 | 原因 | 対処法 |
|---|---|---|
| FTS5 エラーで起動に失敗する | FTS5 なしでビルドされた Node.js | SQLite FTS5 をサポートする Node.js 24+ を使用する |
get_memory で E_NOT_FOUND | ハッシュが存在しない | まず search_memories で確認する |
E_INVALID_CURSOR | 古い、または形式が不正なカーソル | cursor パラメーターを指定せずにリクエストを再試行する |
| MCP クライアントが接続できない | カスタム stdout ログが追加された | サーバープロセスが stdout に何も書き込まないようにする |
recall で aborted: true | トラバーサルが安全制限に達した | depth を減らすか、RECALL_MAX_* 環境変数を調整する |
| データベースのロックエラー | 書き込みの同時実行負荷が高い | SQLite のビジータイムアウトは 5000 ms です。同時書き込みを減らしてください |
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。