Claude Codeは毎回ゼロから始まる
Claude Codeを毎日使っていると、「同じ説明を何度も繰り返している」と感じることがあります。
- なぜこのアーキテクチャを選んだのか
- なぜ別の実装案を却下したのか
- 将来的にどこを改善する予定なのか
Claude Codeは同じプロジェクトでも、セッションが終われば会話の記憶は消えます。ログ自体は ~/.claude/projects/ にJSONLで残っているのに、次のセッションでは参照されません。つまり、記憶は存在しているのに、Claude自身はそれを使えない状態です。
コードはGitを見れば分かりますが、設計判断や議論、却下した案はGitには残りません。一番大事な、AIと議論した設計判断や議論を使い回すことができないのが非常にもったいないです。
これを解決するために、memcp というOSSツールを作りました。
memcpとは
一言で言うと、Claude Codeのセッションログをローカルに蓄積し、MCP経由でClaude自身に検索させるツールです。
セッションが終わるとログが自動的にSQLiteに取り込まれ、次のセッションでClaudeが search_memory のようなMCPツールを呼び出して過去の作業を検索できるようになります。
Before
User:
この認証サービス、なんでRedisでリフレッシュトークンを管理する設計にしたんだっけ?
Claude:
過去のセッションにはアクセスできません。
設計の背景をもう一度教えてください。
After
User:
この認証サービス、なんでRedisでリフレッシュトークンを管理する設計にしたんだっけ?
Claude:
[search_memory("refresh token design")]
6月10日のセッションが見つかりました。
・PostgreSQLよりTTL管理が容易
・高頻度アクセスに向いている
・失効済みトークンを自動削除できる
そのためRedisを採用しました。
過去に自分(Claude)が書いたコードや議論を、自分で検索して思い出す。そんな体験を目指しています。
仕組み
やっていることはシンプルです。
セッションが終わる
│ (自動で)
▼
ログを取り込む
│
▼
ローカルのDBに保存
│
▼
次のセッションで、必要になったらClaudeが検索する
データはすべてローカルのSQLiteに保存され、外部には一切送信されません。クラウド同期もテレメトリもなしです。
現在実装しているMCPツールは4つです。
| Tool | 説明 |
|---|---|
search_memory(query, limit) |
過去の全セッションを全文検索 |
read_session(session_id, query, max_messages) |
特定セッションのログを読む(queryで絞り込み可) |
list_recent_sessions(limit) |
直近のセッション一覧 |
ingest_session(path) |
特定のJSONLログを手動で取り込む |
Claudeは「前に〜」「先週〜」のような発言をユーザーが口にすると、自発的に search_memory を呼びに行きます。明示的にチャットで指示して呼ぶこともできます。
使ってみる
インストールは uv があれば1コマンドです。
git clone https://github.com/nnyannya-tech/memcp.git
cd memcp
uv tool install .
memcp setup
memcp setup は以下を一括でやってくれます。
-
~/.agent-memory/を作成し、SQLiteデータベースを初期化 - デフォルトの
~/.agent-memory/config.yamlを生成 - MCPサーバーを
~/.claude.jsonに登録 - SessionEnd hook(Claude Codeがセッション終了時に実行してくれるフック)を
~/.claude/settings.jsonに追加 - 以降、セッション終了時に自動でログが取り込まれる
セットアップ時に「過去のログも取り込むか」を聞かれます。Yesを選べば、既存の全プロジェクトのセッション履歴を一括でバックフィルできます。
あとはClaude Codeを再起動するだけで、次のセッションから記憶が使えるようになります。
設計でこだわった点
ローカル完結・ゼロクラウド
コーディングのセッションログには、業務のコンテキストや場合によっては機微な情報が含まれます。外部サービスに送るという選択肢は最初から除外し、SQLiteでローカルに閉じる設計にしました。依存も最小限です。
検索エンジンにSQLite FTS5を選んだ理由
ベクトルDBや外部の検索エンジンも検討しましたが、MVPとしては「追加のミドルウェアなしで動く」ことを優先しました。SQLiteのFTS5なら追加インフラなしで実用的な全文検索ができます。意味検索(embedding)は精度面で魅力的ですが、まずはFTSで使い物になるかを検証してから拡張する方針です。
パーサーはプラグイン構造
今はClaude Codeのログしか読めませんが、CursorやCodex CLIなど他のエージェントにも今後対応したいと考えています。そのため、パーサーは以下のシグネチャを持つ純粋関数として実装するだけで追加できる構造にしています。
ParseFn = Callable[[Path], tuple[Session, list[Message], list[ToolCall]]]
今できること/できないこと
まだMVPの段階なので現時点でできること・できないことを整理します。
できること
- Claude Codeのセッションログの自動取り込み
- SQLite FTS5による全文検索
- MCP経由でのセッション横断検索・特定セッションの読み込み
できないこと(今後の課題)
- Claude Code以外のエージェント(Cursor、Codex等)は未対応
- 意味検索(パラフレーズへの耐性)はまだない
- セッションからの「事実・決定事項」の自動抽出はしていない(生ログをそのまま検索する形)
- Windows未対応(macOS / Linuxのみ)
今後のロードマップ
-
memcp status— 取り込み状況の可視化(セッション数、最終取り込み日時、DBサイズ) - Cursor / Codex / Cline など複数コーディングエージェントへの対応
- ハイブリッド検索(FTS + embedding)
- セッションからのメモリ抽出(要点・決定事項の圧縮保存)
-
memcp search <query>— Claude Codeを開かずにCLIから検索
おわりに
「AIエージェントがセッションをまたいで記憶を持つ」というのは、今後のコーディングエージェントに標準的に求められる機能になると考えています。memcpはその最小構成の実装です。
まだ生まれたばかりのプロジェクトなので、フィードバックを歓迎しています。
- 実際に試してみた感想
- 「ここが不便」「ここは便利」という声
- Cursorなど他エージェント対応へのPR
GitHubへのStar、Issue、PRお待ちしています🙏