手で組んだ外部脳の製品版が出ていたので、比べたら足すものが無かった
Basic Memory という製品を教えてもらった。「Real memory for your AI. A knowledge base you own」と謳っている。AI が読み書きする Markdown をローカルに置き、その上に全文検索と意味検索とグラフの索引を張って、MCP でどのクライアントからも引けるようにするものだ。製品のサイトには GitHub のスターが3千超、月5万7千ダウンロードとある。ローカル版は無料のオープンソースで、クラウド同期が月15ドルから。
謳い文句が、うちの外部脳とほぼ同じだった。6月に Obsidian の vault を Claude Code の記憶にして、意味検索を足し、全体を掴む層を足し、三層になったところまで書いてきた。全部手組みだ。その製品版が出ていたなら、乗り換えるか、少なくとも何かは盗めるはずで、トップページ、ドキュメント、GitHub の README、Claude Code 向けプラグインの README を読んで、機能ごとにうちの何に当たるかの対応表を作った。
対応表は、一対一で埋まった
| Basic Memory | うちの外部脳 |
|---|---|
| Markdown を MCP ツールで読み書き | vault を直接読み書き。書式は obsidian-protocol |
| 全文とベクトルのハイブリッド検索(FastEmbed、SQLite) | vault-search。キーワードと Ollama の埋め込みを RRF で融合、SQLite |
build_context で [[link]] を辿る | vault-search の nb。リンクとタグの1ホップ先を持ち上げる。面は MOC |
| セッション開始時のブリーフィング(直近3日) | persona.md。7日で鮮度切れを hook が検知して再生成 |
| コンテキスト圧縮前のチェックポイント | セッションの生ログ全文検索と、手で書く作業ログ |
| Obsidian と同じフォルダを共有 | vault が本体 |
| クラウド同期、スマホから | Syncthing と Remote Control |
読み書きは、向こうが write_note や edit_note のような MCP ツールを21個並べて、AI にそれを呼ばせる形。うちは vault のファイルを Claude Code がそのまま読み書きして、何をどこにどう書くかは obsidian-protocol というスキルの規約で縛っている。道具が違うだけで、Markdown が正本という点は同じだ。ただ、この道具の違いだけは機能の差ではなく届く範囲の差で、あとで一度だけ話に戻ってくる。
検索は、向こうが SQLite の全文検索に FastEmbed のベクトル検索を重ねたハイブリッド。うちの vault-search も SQLite で、キーワードと Ollama の埋め込みの両方で引いて RRF で順位を混ぜる。意味検索を足した記事で書いたとおり、300行の標準ライブラリだけの Python だ。
グラフは、向こうが build_context というツールで [[link]] を辿って周辺のノートを集める。うちはそこまで辿らないが、vault-search が上位ヒットからリンクとタグで1ホップ先のノートを少し持ち上げる。点で引けても面が見えない問題は二層にした記事で MOC を作って埋めた。
ブリーフィングは、向こうのプラグインが SessionStart フックで直近3日の作業と未完了タスクを Claude に渡す。うちは persona.md という一枚を手書きノートから蒸留して起動時に読ませていて、7日経つと hook が古いと言ってくるので作り直す。昨日もそれで作り直した。
チェックポイントは、向こうのプラグインが PreCompact フックで、コンテキストが圧縮される直前にセッションの要約をノートとして書き出す。うちは三層目で書いたセッションの生ログ全文検索が黙って全部残していて、要約は作業ログとして手で書く。
Obsidian との共有は、向こうは AI が書くフォルダを Obsidian で開けば同じファイルが見える、という話だ。うちは vault が本体で、AI が書く先も人が開く先も最初から同じフォルダなので、共有という工程がそもそも無い。
スマホは、向こうがクラウド同期で端末を跨ぐ。うちは Syncthing で vault を Android に同期し、検索や書き込みは Remote Control で PC のセッションを手元から動かす。7月の記事で片付けた話だ。
盗めるものを探して読み始めたのに、表を埋め終わったら、機能の欄に空欄が無かった。
向こうにあって、こちらに無いもの
一つだけある。MCP だ。
vault-search は Bash から呼ぶ CLI で、Claude Code には shell があるから届く。Claude Desktop や ChatGPT のように shell の無いクライアントからは届かない。ロックインしない設計の記事で、Claude 専用なのは読み方のルールだけだと書いたが、正確には「shell のあるエージェント専用」だった。Basic Memory は同じ Markdown を MCP で出すので、MCP を話せるものなら何でも同じ記憶を引ける。
ただ、今は Claude Code しか使っていない。他のクライアントから vault を引きたくなった日が来たら、Basic Memory を入れるより、vault-search を薄く MCP で包むほうが早い。索引も記法も今のまま使えるからだ。
足すと、増えるもの
入れたら何が増えるかも並べた。入れるならローカル版なので、金は増えない。増えるのは別のものだった。
MCP の登録が1本増える。前の記事で MCP 設定を点検する道具を作ったとき、俺の環境の登録は X 連携の1本だけだった。uvx でパッケージ名から起動する形で加わって、点検の表が2行になる。
ツール定義が21個、セッションのコンテキストに乗る。読み書きが7つ、検索が3つ、グラフが1つ、プロジェクト管理が4つ、スキーマの検証が3つ、互換と診断が3つ。うちの vault-search は Bash の1コマンドで、ツール定義は増えない。
索引がもう一組できる。向こうの既定の埋め込みモデルは英語向けの bge-small-en-v1.5 で、多言語にするには設定でモデルを差し替える。うちの vault は日本語が主で、vault-search は最初から多言語の bge-m3 で索引している。差し替えれば同じ方向に寄せられるが、寄せた先が今と同じだ。
記法がぶつかる。向こうは1ファイルを1エンティティとして、事実は - [category] 内容 #tag、関係は - 関係名 [[相手]] の行で書く。これを索引が読んでグラフにする。うちの規約は、検証していない主張に(推測)(要確認)を付け、事実には日付を添え、リンクは実際に関係があったノートにだけ張る、というものだ。両方を同じ vault に置くなら、AI が書く部分をどちらかの記法に寄せるか、フォルダで隔離することになる。
向きが、逆だった
対応表を埋めていて、機能より先に気になったのは向きだ。
向こうのプラグインは、セッションの開始で自動的にブリーフィングを渡し、圧縮の直前に自動的にチェックポイントを書く。AI が黙って書く量を増やすことで、記憶を落とさない設計になっている。
うちは逆で、書くのは手で、書いたものの手入れも手でやる。昨日、その手入れを久しぶりに回したら、自分の環境の構成マップに古い記述が4か所あった。スキルの版管理の経路が変わっているのに古いままで、リポジトリの一覧から最近作った4つが漏れていて、公開リポジトリの列挙が同じノートの表と合っていなくて、存在しないノートへのリンクが残っていた。実機と突き合わせたら、symlink だと書いてあるものがコピーに変わっているのがもう1か所出た。6月に書いてから3か月手を入れなかった一枚が、それだけ実態からずれていた。
外部脳で困るのは、記憶が足りないことより、あるはずの記憶が腐っていることだった。手で書いた一枚ですら3か月で4か所ずれる。手入れできる速度は、書く側を自動にしても上がらない。書く量だけ自動で増やせば、腐ったまま誰も見ないノートが一緒に増える。だからうちは、腐ったところを見つけて直す手順のほうに時間を使っている。Basic Memory と俺とでは、解こうとしている問題が違う。
入れない
対応表は埋まり、向こうにあってこちらに無いのは MCP だけで、足すと増えるのは登録とツール定義と索引と記法の衝突だった。それ以前に、向こうが解いているのは記憶を落とさない問題で、こちらが困っているのは腐る問題だ。入れない。再検討するのは、Claude Code 以外のクライアントから vault を引きたくなったときの一点で、そのときも先に試すのは vault-search を MCP で包むほうだ。
製品版が出ていたと聞いて、最初に思ったのは、先にやられたな、だった。表を埋めてみると、先にやられていたのは機能で、困っているのは機能ではなかった。次に手を入れるのは、6月からの3か月で4か所ずれた一枚を、もっと早く見つける手順だ。
comments powered by Disqus