[2026-02-12 追記]
この記事にある チャットモードの場合 の会話保存方法は、カスタムスラッシュコマンドを用意して、ユーザが必要なタイミングで呼び出すものです。他方、フックスクリプトによる常時自動保存も可能です (以下)。
-
Claude Code との会話履歴を毎回自動保存する回答後フックスクリプト (セッション中に自動保存オンオフ可能) (手動実行で直前会話保存も可能) - Qiita
- 保存するかどうかを一々判断せずにとりあえず常時自動保存したい場合は上記記事のフックスクリプトの方が便利です。また、フックスクリプト方式はエージェントの本来のタスクへの集中を妨げないメリットもあります。
Claude Code への質問と回答を指定のファイルに保存する方法を、チャットモード / ワンショットモード別に記します。よりよい方法があれば教えてください。
背景
Claude Code (CLI) に質問するとき、質問と回答をマークダウンファイルに保存しておくと、以下の点で便利だと思います。
- Claude の回答内容を今すぐには対応できないとき、保留しておける。
- Obsidian 保管庫下に保存すれば、マークダウンがレンダリングされて見やすい。
- さらに Dropbox で同期すれば、他デバイスからも閲覧できる。
- 例えば質問をまとめて投げてから外出して、スマートフォンで回答を確認できる。
なので、保存方法の例をケース A と B について記します。
- A. チャットモードの場合 (カスタムスラッシュコマンドで直前の質問 & 回答を保存)
- B. ワンショットモードの場合 (独自シェルスクリプトで質問と回答を保存)
なお、以下のようなディレクトリ構成を想定しています。といっても、質問場所と保存場所はどこでも構いません。質問&回答保存ファイル名はタイムスタンプにしていますが、必要に応じてその質問をしたディレクトリ名を含めるなどしてください。
~/
├─ .claude/
│ └─ commands/save.md # カスタムスラッシュコマンド (チャットモードの場合)
│
├─ claudy.sh # 独自シェルスクリプト (ワンショットモードの場合) ※ どこに置いてもよいが
│
├─ aaa/ # ★ あるときはこの作業ディレクトリで質問
├─ bbb/ccc/ # ★ あるときはこの作業ディレクトリで質問
│
└─ Dropbox/obsidian/Mercury/ # 回答保存場所が Obsidian 保管庫内だとマークダウンが見やすい
│
└─ Claude/ # 回答保存場所 (※)
├─ 20260110-090000.md # 質問ディレクトリ名 & 質問 & 回答 を保存
├─ 20260110-091000.md # 質問ディレクトリ名 & 質問 & 回答 を保存
└─ 20260110-092000.md # 質問ディレクトリ名 & 質問 & 回答 を保存
(※) Dropbox 管理下に頻繁に質問 & 回答を保存して取捨選択する場合は、Dropbox の同期を一時停止しておいた方がよいかもしれません (通信量節約のため)。
A. チャットモードの場合
Claude とのチャット中「この回答を保存したい」となったときに、直前の質問 & 回答を保存する想定です。それならそうなったとき Claude に「直前の質問 & 回答を保存してください」と頼めば可能ですが、Claude にはカスタムスラッシュコマンド が登録できるので、~/.claude/commands/save.md などに以下の内容を登録しておけば、チャット中に /save でこの指示を呼び出して保存することができます (カスタムスラッシュコマンド名 = ファイル名はお好きに変更してください)。
このコマンドの直前のユーザの質問 1 つと、それに対する Claude の回答 1 つだけを、下記の形式で
C:/Users/kazusa/Dropbox/obsidian/Mercury/Claude/YYYYMMDD.md
に追記 (このファイルがなければ新規作成) してください。
ファイル名と見出しのタイムスタンプは現在時刻にしてください。
## YYYYMMDD-hhmmss
質問をしたディレクトリ名
質問
---
回答
質問と回答を都度新しいファイルに保存する場合は、冒頭を例えば以下に置き換えます。
このコマンドの直前のユーザの質問 1 つと、それに対する Claude の回答 1 つだけを、下記の形式で
C:/Users/kazusa/Dropbox/obsidian/Mercury/Claude/YYYYMMDD-hhmmss.md
に保存してください。タイムスタンプは現在時刻にしてください。
直前の n ターンのやり取りを保存したいときは、以下のようにして /save 3 とすれば可能だと思います (こうすれば引数が渡りますが、保存が意図通り動作するかは未確認です)。
このコマンドの直前までの $ARGUMENTS ターンの ユーザ質問 & Claude の回答 を、
C:/Users/kazusa/Dropbox/obsidian/Mercury/Claude/YYYYMMDD-hhmmss.md
に保存してください。タイムスタンプは現在時刻にしてください。
なお、保存先がプロジェクト外の場合は、上記の /save でファイルを保存するたびに「このファイルを書き出してよいか?」と訊かれてしまうと思いますが、永続的に許可する場合は作業ディレクトリに以下などを設定しておけば訊かれません (最小権限かはわかりません & 採用は慎重に検討してください)。
{
"permissions": {
"allow": ["Write"],
"additionalDirectories": ["C:/Users/kazusa/Dropbox/obsidian/Mercury/Claude"]
}
}
B. ワンショットモードの場合
1 回の質問で終了するモード claude -p "質問" の質問を保存するには、以下のようなラッパーシェル関数を用意しておけばよいと思います。
#!/usr/bin/bash
# 指定の作業ディレクトリに移動して Claude に質問し回答を回収場所に保存して戻ってきます
# これを何回分も予約しておくことができます
# 回答は回収ボックス内に YYYYMMDD-hhmmss.md という名前で保存されます
obsidian_dir=~/Dropbox/obsidian/Mercury/Claude/ # 回答マークダウンファイル回収場所
ask() { # 引数: 作業ディレクトリ, 質問文
# 作業ディレクトリに移動して Claude に質問し回答を回収場所に保存して戻ってきます
local out="$obsidian_dir/$(date '+%Y%m%d-%H%M%S').md"
pushd $1 # 作業ディレクトリに移動
echo $1$'\n' > $out
echo "$2" >> $out
echo "---"$'\n' >> $out
# 作業ディレクトリに書き込みさせないなら以下の --allowedTools=Write は不要
local answer=$(claude --allowedTools=Write -p "$2")
echo "$answer" >> $out
echo "Written to $out"
popd # 元のディレクトリに帰還
}
この関数 ask() を以下のように利用します。あるいは # ===== question 1 ===== 以降の行を上のスクリプトの下部に直接書き込んで実行しても構いません。
#!/usr/bin/bash
source ./claudy.sh # 関数を読み込み
cd ~/ # どこかの拠点に移動 (ここを拠点に各作業ディレクトリに行って帰ってくる)
# ===== question 1 =====
work_dir=./aaa/
question="\
このディレクトリのコードについて
ほげほげを調べてください。
ふがふがも調べてください。
"
ask "$work_dir" "$question"
# ===== question 2 =====
work_dir=./bbb/ccc/
question="\
このディレクトリのコードについて
ほげほげを調べてください。
ふがふがも調べてください。
"
ask "$work_dir" "$question"
B. ワンショットモードの場合のおまけ
ユースケースによっては下記 gist のように関数を追加しておいても便利かもしれません。
https://gist.github.com/CookieBox26/6eb6157478c8043eb76adc13101c1202
各関数の機能は以下です (これらは独立なので好きな方だけ追加できます)。
-
関数
wait_until_limit_reset(): Claude の回答が制限中メッセージYou've hit your limit ・ resets 5pm (Asia/Tokyo)のようなものだったときに制限解除まで待機します。- リクエスト量制限に引っ掛かるという方には役立つかもしれません。
- ご使用される場合は gist のように
ask()内でこれを呼んでください。 - お手元の制限中メッセージが
.*You've hit your limit.*resets [0-9]{1,2}[ap]m.*であって、端末の時刻とタイムゾーンが合致していることを想定しています。そうでない場合はパターンをお手元のメッセージに合うように修正ください。
-
関数
setup(): 作業ディレクトリに設定ファイル./.claude/settings.local.jsonやシステムプロンプト./.claude/CLAUDE.mdが未生成なら自動生成します (どちらかのみ生成もできます)。必要なときにのみask()の前に呼ぶ想定です。-
claudeを呼んだことがない作業ディレクトリで書き込みを伴う依頼をするとき、予め書き込み許可したり、コーディングルールを伝えるのに使用できます。 -
~/.claude_templates/にケース別のシステムプロンプトを配置しておくことを想定しています (ここからコピーします)。各ファイルの内容例はこちらです。 - ご使用の場合は生成されるファイルの設定やルールが意図通りか確認ください。
-
~/
├─ .claude/
│ └─ CLAUDE.md # 常に適用するシステムプロンプト
│
└─ .claude_templates/ # ★ ケース別のシステムプロンプト (プロンプト量節約のため切り分け)
├─ CLAUDE.summarizing.md # 文献要約ルール
├─ CLAUDE.coding.md # コード実装ルール
└─ CLAUDE.python-coding.md # Python プロジェクトでのコード実装ルール