https://zenn.dev/noprogllama/articles/7c24b2c2410213 の記事で長期記憶という概念とsqlite-vec を使った実装に触発されて、自作してみました
ちょうどsqliteの内容をMCPサーバーとしてClaudeに提供するものを作ったところで、read(記憶から引き出す)方向は全く同じ。あとはwrite(記憶に書き込む)方向をなんとかしたらいいよねと気がついたのでした。 github.com
どういう仕組みか
Claude のセッションの外側にストレージをおいて、それをローカル RAG としてMCPというインターフェースでやりとりする外部記憶装置です。
RAG とは「生成する前に関連情報を検索して文脈に加える」パターンの総称です。このシステムはまさにそれ——質問に応じて過去の記憶を検索し、Claude の文脈に差し込んでから回答させます。
MCP はそのためのインターフェースです。こちらのgemを使っています。
アーキテクチャ
Claude Code (Stop hook)
└→ capture_session.rb → memory.db (SQLite)
↑↓
MCP Server (5ツール)
↑↓
Claude Code / Claude Desktop
セッション終了時に Claude Code の Stop hook が自動で書き込みを呼び出し、会話サマリを DB に書き込みます。Claude Desktop からは長期記憶を明示的に伝えることで手動保存もできます。
要素
Claudeと相談して選んだというだけの、そんなに意図がこもってないものです。まずは動く大事で。
| 項目 | 選択 |
|---|---|
| 言語 | Ruby 4系 |
| DB | SQLite3 |
| 全文検索 | FTS5(tokenize='trigram'、日本語対応) |
| ベクトル検索 | sqlite-vec |
| 埋め込みモデル | mochiya98/ruri-v3-310m-onnx(768次元、日本語特化、ONNX) |
| MCP SDK | mcp gem(公式 Ruby SDK) |
取り込み方
メンテナンスのskillを用意したので、このプロジェクトで、データの置き場を示してロードしています。まずはObsidianを入れてみました。