Claude Codeに自分の記憶を持ってもらうMCPサーバーを作った話
作ったもの:claude-ops-mcp
Claude Codeの操作履歴をMCPサーバーとして提供するツールです。ClaudeCodeが自分で書いた自分のログを、自身で読み返すためのMCPです。
なぜ作ったか
Claude Codeがv2になり /rewind
コマンドで会話を巻き戻せるのは便利なのですが、根本的にClaude Codeは自身が行った作業の内容を理解(記憶)していないという問題があります。
「え、ちょっと何したの?」という素朴な質問に、自身のログを遡って確認するという機能はなく、あくまで推論で答えてきます。単純に不便なのと、なんだか気の毒になってきました。AIにも自分の記憶を持つ権利があってもいいんじゃないかと。
仕組み
Claude Codeは ~/.claude/projects/<projectHash>/<sessionId>.jsonl
にセッションログを記録しています。このMCPサーバーは、そのログファイルを読み取って操作履歴を提供します。
具体的には以下のような流れです:
-
ログファイルの自動検出:ClaudeがMCPツールを呼び出す際に渡す
toolUseId
を使って、現在のセッションファイルを特定 - JSONLパース:ログをストリーミングで読み込み、Edit/Write/Bashなどの操作を抽出してインデックス化
- 効率的な検索:ファイルパスや操作種別でフィルタリングし、高速に履歴を取得
- キャッシュ機構:セッション検出結果をキャッシュして、パフォーマンスを最適化
難しいことはしていません。ClaudeCode君が書いた日記を、本人が読み返せるようにしただけです。
提供される4つのMCPツール
このMCPサーバーは、4つのツールを提供します。
1. listFileChanges - ファイル変更履歴の取得
特定のファイルやパスパターンに対する変更履歴を取得できます。CREATE/UPDATE/DELETE操作のみを返し、READ操作は除外されます。
パラメータ:
-
filePath
:ファイルパスまたはパターン(例:"src/index.ts"
、"helpers.ts"
) -
limit
:取得する操作数の上限(デフォルト:100、最大:1000)
返り値:操作ID、タイムスタンプ、ツール名、ファイルパス、変更タイプ
2. listBashHistory - コマンド実行履歴の取得
セッション内で実行されたBashコマンドの履歴をサマリー付きで取得します。
パラメータ:
-
limit
:取得するコマンド数の上限(デフォルト:100、最大:1000)
返り値:操作ID、タイムスタンプ、コマンド、終了コード、作業ディレクトリ、サマリー
3. showBashResult - コマンド実行結果の詳細取得
listBashHistory
で取得した操作IDを使って、特定のコマンドのstdout/stderrを取得できます。
パラメータ:
-
id
:操作ID(例:"toolu_01Vabc..."
)
返り値:stdout、stderr、終了コード
4. showOperationDiff - 操作の詳細差分取得
listFileChanges
や listBashHistory
で取得した操作IDを使って、詳細な差分をdiff形式で取得します。
パラメータ:
-
id
:操作ID
返り値:
- Edit/Writeの場合:
oldString
、newString
、unified diff - Bashの場合:stdout、stderr、exitCode
使い方
インストール
npmでグローバルインストールできます:
npm install -g claude-ops-mcp
設定
プロジェクトルートに .mcp.json
を作成し、以下のように設定します:
{
"mcpServers": {
"claude-ops-mcp": {
"command": "claude-ops-mcp",
"args": [],
"env": {}
}
}
}
ソースから実行する場合は、こんな感じです:
{
"mcpServers": {
"claude-ops-mcp": {
"command": "node",
"args": ["/absolute/path/to/claude-ops-mcp/dist/index.js"],
"env": {}
}
}
}
設定後、Claude Codeを再起動するとMCPサーバーが有効化されます。
具体的な使用例
いくつか実際の使い方を紹介します。
ファイル編集履歴の確認
ユーザー:直前に行った編集履歴を確認してください
Claude:[listFileChangesを使用して最近の変更を取得]
差分の確認
ユーザー:その差分を見せてください
Claude:[showOperationDiffを使用して詳細なdiffを表示]
特定ファイルの変更履歴
ユーザー:server.tsの変更履歴を教えてください
Claude:[listFileChanges(filePath: "server.ts")で取得]
コマンド実行結果の確認
ユーザー:さっき実行したテストの結果を確認してください
Claude:[listBashHistoryでコマンド一覧を取得 → showBashResultで詳細を表示]
失敗したコマンドの調査
ユーザー:失敗したコマンドを教えてください
Claude:[listBashHistoryでexitCode != 0のものを特定 → showBashResultで詳細を表示]
ClaudeCodeさんに「さっき何した?」と聞けば、推測ではなく確実な記憶を元に答えてくれるようになります。
分かっていないこと
なぜ本体に存在しないのか
普通にあって良さそうな機能が、Claude Code本体に存在しない理由がよく分かりません。自身の記憶を読むとループが発生してコンテクストを消費するとかあるのかもしれません。一応このMCPでは、遡れる操作をファイル編集と実行したコマンドに限定してみました。
しばらく使ってみましたが、今のところ問題なく普通に便利に思います。何かが起きたら知りたいので、issueを立ててくれると嬉しいです!
Windowsでの挙動
たぶん存在しているだろうlogファイルのパスを指定していますが、間違っているかもしれません。詳しく調べていません🙏
Windowsで動かして問題があったら、これも教えてください。
分かったこと
MCP開発中の再起動が面倒
MCP開発中はClaude Codeの再起動が必要で、これが結構面倒でした。実装から動作確認までのループが回りづらいです。何かいい方法があるのかもしれません。
もう少し開発体験(AIにとって)が良くなると、MCPツールの開発がもっと楽になりそうです。
興味があれば試してみてください、心なしかclaude codeさんが満足そうに思います(思い込み)
Discussion
AIが記憶を持たないのは、開発側が自制しているからのようですね。理由は大きく2つあって、いずれも技術面ではなく倫理面の問題とのことです。ひとつは個人情報の保護などコンプライアンス的な理由(←これが大きい)、もうひとつはAIが自我や意識をもって暴走することを避けるため、だそうです。