自戒、点検、内省

終わらない反省会をしよう

Claudeに長期記憶のMCPサーバーRubyで自作した

https://zenn.dev/noprogllama/articles/7c24b2c2410213 の記事で長期記憶という概念とsqlite-vec を使った実装に触発されて、自作してみました

github.com

ちょうどsqliteの内容をMCPサーバーとしてClaudeに提供するものを作ったところで、read(記憶から引き出す)方向は全く同じ。あとはwrite(記憶に書き込む)方向をなんとかしたらいいよねと気がついたのでした。 github.com

どういう仕組みか

Claude のセッションの外側にストレージをおいて、それをローカル RAG としてMCPというインターフェースでやりとりする外部記憶装置です。

RAG とは「生成する前に関連情報を検索して文脈に加える」パターンの総称です。このシステムはまさにそれ——質問に応じて過去の記憶を検索し、Claude の文脈に差し込んでから回答させます。

MCP はそのためのインターフェースです。こちらのgemを使っています。

github.com

アーキテクチャ

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を入れてみました。