MCP

QMD の MCP サーバーをやめて Bash で直接叩くようにした

TL;DR — QMD の MCP サーバーが重すぎたので、プラグインを削除して qmd query --no-rerank を Bash で直接呼ぶ運用に切り替えた。リランカーなしでも BM25 + ベクトル検索の組み合わせで十分実用的。

以前の記事で QMD を MCP サーバーとして導入した話を書いた。

その後、重さが気になり過ぎて運用を見直した話。

いや、本気で重かったのよ。全然結果が返ってこない。

なにこれとか思って調べたら GPU なしだとこんなもんだろうとのこと。

そうですかぁ…

今の運用

ということでどうしたかというと、Claude さんが過去セッションを検索するときは、MCP ツールではなく Bash コマンドを直接叩くようになった。

qmd query --no-rerank "調べたいキーワード"

CLAUDE.md に「QMD は qmd query --no-rerank で使う」と書いてあるので、Claude さんが自動でこの形式で呼ぶ。settings.jsonpermissions.allow には Bash(qmd *) を追加済み。

なぜ重かったか

以下 Claude さんの解説。

QMD は内部で 2 つのローカル ML モデルを動かしている。

モデルサイズ用途
embeddinggemma-300M-Q8_0.gguf314 MBベクトル埋め込み生成
Qwen3-Reranker-0.6B-Q8_0.gguf610 MB検索結果のリランキング

自分の環境は専用 GPU がなく CPU 推論になるので、2 モデル合計で 924 MB がオンメモリに乗る。MCP サーバーとして常駐させていると、起動のたびにこれをロードして複数プロセスを spawn する。qmd query(MCP が使う推奨コマンド)はさらにリランキングまで走らせるので、検索 1 回に数分かかることもあった。

Claude Code のセッション履歴をベクトル検索できる QMD を入れた

TL;DR — QMD は BM25 + ベクトル検索でローカル Markdown を横断検索できる MCP ツール。Stop hook で Claude Code セッション終了時に自動インデックス化することで、複数リポジトリのセッション履歴を横断検索できる。

nanoclaw(Claude Code の fork)をアップデートしているとき、内部で QMD が使われているのを見かけた。調べてみたら「お、これ良さそう」となったので入れた。

QMD とは

QMD は、ローカルの Markdown ファイルを対象に検索エンジンを立てる CLI ツール兼 MCP サーバー。単純な grep と違うのは、BM25(キーワード検索)とベクトル検索を組み合わせて意味的に近いドキュメントを引けること。検索用の埋め込みモデルもローカルで動く(GPU がなくても動作する、が後ほど書くけど CPU だとクソ重い処理が一回だけある)。

インストール

本体は以下のように、npm でインストール。

npm install -g @tobilu/qmd

Claude Code はプラグインとして追加する。

claude plugin marketplace add tobi/qmd
claude plugin install qmd@qmd

今回やりたかったことと設定

自分は複数のリポジトリで Claude Code を使っていて、技術的な会話もリポジトリをまたいでいる。そこで、QMD のコレクションに全リポジトリのセッション Markdown を入れておけば、「あのリポジトリでやった話、なんだったっけ」を後から引ける。

同じようなことを実現できるものとして、claude-mem がある。

そもそもこれ入れればいいじゃんって話もあるけど、なんか分からんけど直感で QMD いいかもって思ってしまったので仕方ない。直感で突き進みます。

まずは、Claude のセッションをマークダウンに変換するスクリプト convert-sessions.js を用意して、~/.claude/hooks 配下に配置。