
<小ネタ>Claude Code で常時コンテキスト使用量を把握できるようにしてみた
はじめに
クラウド事業本部、あきやまです。
みなさん、Claude Code使っていますか?
私はクラスメソッドに入社して本格的に利用しています。
現在、Maxプランで利用しているのですが自分のコンテキストの利用状況って
どんなもんやろと、ふと疑問に思いました。
Claude Codeにはコンテキスト使用量を確認するためにぱっと思いつくとこで以下コマンドがあります。
-
/contextというコマンドを実行するとコンテキストの使用状況を確認できます。

-
/statuslineというコマンドは赤枠で囲った箇所をカスタマイズすることでできます。少し設定が必要ですがこちらもでコンテキストを確認できます。

色々調べていたところ、見た目が自分好みにカスタマイズできそうな/statuslineを
利用して今回は設定していきたいと思います。
環境
| 項目 | 値 |
|---|---|
| OS | macOS Tahoe 26.2 |
| Claude Code | v2.1.37 |
| モデル | Opus 4.6 |
準備
- Claude Codeがインストール済みであること
jqコマンドが利用可能であること(JSON パース用)
最初に結論
最終的には以下レイアウトになりました!Claude Codeで/statusline実行のやりとりのみでブラッシュアップしていった感じです。設定方法の箇所では作成されたスクリプトとjsonを記載しておりますのでよかったらお試しください!

1行目 - 現セッションのコンテキスト状態
| アイコン | 項目名 | 表示例 | 説明 |
|---|---|---|---|
| 🤖 | モデル名 | Claude Opus 4.6 |
現在使用中の Claude モデル |
| 📊 | コンテキスト使用量 | 12.5k/200k ████░░░░░░ 35% |
使用トークン / 上限 + プログレスバー + 使用率 |
| 🟢🟡🟠🔴 | パフォーマンスゾーン | 🟢 Good |
コンテキスト使用率に応じた性能状態(詳細は下記) |
| ⬇ | Input トークン | 8k |
ユーザー入力・システムプロンプト等のトークン消費量 |
| ⬆ | Output トークン | 4.5k |
Claude の応答側のトークン消費量 |
| 💡 | 残りトークン | 残187.5k |
コンテキストウィンドウの残り容量 |
| ⏳ | 枯渇推定時間 | ~95min |
バーンレートから逆算した、コンテキストが満杯になるまでの推定時間 |
| 🔄 | 圧縮回数 | 0回 |
セッション内でコンテキスト圧縮が発生した回数 |
2行目 - 使用量の統計
| アイコン | 項目名 | 表示例 | 説明 |
|---|---|---|---|
| 🔥 | バーンレート | 2.1k/min |
1分あたりのトークン消費速度 |
| 🕐 | Daily | 45k |
本日(午前0時〜)の合計トークン使用量 |
| 🗓 | Weekly | 210k |
直近7日間の合計トークン使用量 |
| 📊 | Monthly | 890k |
直近30日間の合計トークン使用量 |
パフォーマンスゾーン詳細
コンテキスト使用率に応じて、Claude の応答品質がどの程度維持されているかを色で示します。
| 表示 | 使用率 | 状態 | 推奨アクション |
|---|---|---|---|
| 🟢 Good | 0〜50% | フル性能。自由に作業可能 | なし |
| 🟡 Caution | 50〜70% | 性能は維持されるが注意が必要 | 大量のファイル読み込みを控え始める |
| 🟠 Warning | 70〜90% | 性能低下の可能性あり | /compact の手動実行を推奨 |
| 🔴 Critical | 90%以上 | 自動圧縮が間もなく発動 | 即座に /compact を実行、またはセッション分割を検討 |
備考
スクリプトは以下の作業ファイルを ~/.claude/ 配下に自動生成します。
| ファイル | 用途 | 削除の影響 |
|---|---|---|
.sl_session.json |
セッション開始時刻を記録 | バーンレート・ETA がリセットされる |
.sl_last_state.json |
直前のセッション状態を記録 | セッション切替検出がリセットされる |
.sl_compress.json |
圧縮回数を記録 | 圧縮カウントがリセットされる |
.sl_usage_log.csv |
過去セッションの使用量を蓄積 | Daily/Weekly/Monthly の履歴が消える |
.sl_usage_log.csvは90日以上古いエントリが自動的にプルーニングされます。
設定方法
jq のインストール(未導入の場合)
# macOS
brew install jq
Step 1: スクリプトの配置
以下のスクリプトを ~/.claude/statusline.sh として保存します。
statusline.sh
#!/bin/bash
# Claude Code Enhanced Status Line
# Model | Context | In/Out | Remaining | ETA | Compression | Burn Rate | D/W/M
CLAUDE_DIR="$HOME/.claude"
SESSION_FILE="$CLAUDE_DIR/.sl_session.json"
LAST_STATE_FILE="$CLAUDE_DIR/.sl_last_state.json"
USAGE_LOG="$CLAUDE_DIR/.sl_usage_log.csv"
COMPRESS_FILE="$CLAUDE_DIR/.sl_compress.json"
input=$(cat)
# Extract data
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
total_input=$(echo "$input" | jq -r '.context_window.total_input_tokens // 0')
total_output=$(echo "$input" | jq -r '.context_window.total_output_tokens // 0')
context_size=$(echo "$input" | jq -r '.context_window.context_window_size // 200000')
used_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
session_id=$(echo "$input" | jq -r '.session_id // "unknown"')
used_tokens=$((total_input + total_output))
current_used=$(awk "BEGIN {printf \"%.0f\", ($used_pct * $context_size) / 100}")
remaining_tokens=$((context_size - current_used))
[ "$remaining_tokens" -lt 0 ] && remaining_tokens=0
current_time=$(date +%s)
# Format number with k/M suffix
fmt() {
local n=$1
if [ "$n" -ge 1000000 ] 2>/dev/null; then
awk "BEGIN {printf \"%.1fM\", $n/1000000}"
elif [ "$n" -ge 1000 ] 2>/dev/null; then
awk "BEGIN {printf \"%.1fk\", $n/1000}"
else
echo "${n:-0}"
fi
}
# Initialize usage log
[ ! -f "$USAGE_LOG" ] && echo "ts,sid,tokens" > "$USAGE_LOG"
# Session & burn rate tracking
burn_rate_str="--"
eta_str="--"
br_val=0
new_session=0
if [ -f "$LAST_STATE_FILE" ]; then
last_sid=$(jq -r '.sid // ""' "$LAST_STATE_FILE" 2>/dev/null)
last_tok=$(jq -r '.tok // 0' "$LAST_STATE_FILE" 2>/dev/null)
if [ "$session_id" != "$last_sid" ] || [ "$current_used" -lt "${last_tok:-0}" ]; then
new_session=1
if [ -n "$last_sid" ] && [ "${last_tok:-0}" -gt 0 ]; then
echo "$current_time,$last_sid,$last_tok" >> "$USAGE_LOG"
fi
printf '{"ts":%d,"tok":0}' "$current_time" > "$SESSION_FILE"
printf '{"sid":"%s","count":0,"last_used":%d}' "$session_id" "$current_used" > "$COMPRESS_FILE"
fi
else
new_session=1
printf '{"ts":%d,"tok":0}' "$current_time" > "$SESSION_FILE"
printf '{"sid":"%s","count":0,"last_used":%d}' "$session_id" "$current_used" > "$COMPRESS_FILE"
fi
# Detect context compression (used_tokens drops significantly within same session)
compress_count=0
if [ -f "$COMPRESS_FILE" ]; then
c_sid=$(jq -r '.sid // ""' "$COMPRESS_FILE" 2>/dev/null)
c_count=$(jq -r '.count // 0' "$COMPRESS_FILE" 2>/dev/null)
c_last=$(jq -r '.last_used // 0' "$COMPRESS_FILE" 2>/dev/null)
if [ "$session_id" = "$c_sid" ]; then
compress_count=$c_count
if [ "$c_last" -gt 0 ] && [ "$current_used" -gt 0 ]; then
drop=$((c_last - current_used))
threshold=$((c_last / 5))
if [ "$drop" -gt "$threshold" ] && [ "$drop" -gt 10000 ]; then
compress_count=$((compress_count + 1))
fi
fi
printf '{"sid":"%s","count":%d,"last_used":%d}' "$session_id" "$compress_count" "$current_used" > "$COMPRESS_FILE"
fi
fi
# Update last state
printf '{"sid":"%s","tok":%d,"ts":%d}' "$session_id" "$current_used" "$current_time" > "$LAST_STATE_FILE"
# Calculate burn rate & ETA
if [ -f "$SESSION_FILE" ]; then
s_start=$(jq -r '.ts' "$SESSION_FILE" 2>/dev/null || echo "$current_time")
elapsed=$((current_time - s_start))
if [ "$elapsed" -gt 10 ] && [ "$current_used" -gt 0 ]; then
br_val=$(awk "BEGIN {v=($current_used * 60.0) / $elapsed; printf \"%.0f\", v}")
burn_rate_str="$(fmt "$br_val")/min"
if [ "$br_val" -gt 0 ] 2>/dev/null; then
eta_sec=$(awk "BEGIN {printf \"%.0f\", ($remaining_tokens * 60.0) / $br_val}")
if [ "$eta_sec" -ge 3600 ] 2>/dev/null; then
eta_str="$(awk "BEGIN {printf \"%.1f\", $eta_sec/3600}")h"
elif [ "$eta_sec" -ge 60 ] 2>/dev/null; then
eta_str="$(awk "BEGIN {printf \"%.0f\", $eta_sec/60}")min"
else
eta_str="${eta_sec}s"
fi
fi
fi
fi
# Aggregate daily/weekly/monthly
day_start=$(date -j -v0H -v0M -v0S +%s 2>/dev/null || echo $((current_time - 86400)))
week_ago=$((current_time - 604800))
month_ago=$((current_time - 2592000))
d_total=0; w_total=0; m_total=0
if [ -f "$USAGE_LOG" ]; then
while IFS=, read -r ts sid tok; do
[ "$ts" = "ts" ] && continue
[[ "$tok" =~ ^[0-9]+$ ]] || continue
[ "${ts:-0}" -ge "$day_start" ] 2>/dev/null && d_total=$((d_total + tok))
[ "${ts:-0}" -ge "$week_ago" ] 2>/dev/null && w_total=$((w_total + tok))
[ "${ts:-0}" -ge "$month_ago" ] 2>/dev/null && m_total=$((m_total + tok))
done < "$USAGE_LOG"
fi
d_total=$((d_total + used_tokens))
w_total=$((w_total + used_tokens))
m_total=$((m_total + used_tokens))
# Prune old entries occasionally
if [ $((RANDOM % 50)) -eq 0 ] && [ -f "$USAGE_LOG" ]; then
cutoff=$((current_time - 7776000))
tmp="$USAGE_LOG.tmp"
head -1 "$USAGE_LOG" > "$tmp"
tail -n +2 "$USAGE_LOG" | awk -F, -v c="$cutoff" '$1 >= c' >> "$tmp"
mv "$tmp" "$USAGE_LOG"
fi
# Build progress bar
pct_int=$(awk "BEGIN {printf \"%.0f\", ${used_pct:-0}}" 2>/dev/null || echo "0")
filled=$((pct_int / 10))
[ "$filled" -gt 10 ] && filled=10
empty=$((10 - filled))
bar=""
for ((i=0; i<filled; i++)); do bar+="█"; done
for ((i=0; i<empty; i++)); do bar+="░"; done
# Performance zone indicator
if [ "$pct_int" -ge 90 ]; then
perf="🔴 Critical"
elif [ "$pct_int" -ge 70 ]; then
perf="🟠 Warning"
elif [ "$pct_int" -ge 50 ]; then
perf="🟡 Caution"
else
perf="🟢 Good"
fi
# Output (2 lines)
# Line 1: Session context status
# Line 2: Burn rate + Usage history
printf "🤖 %s │ 📊 %s/%s %s %d%% %s │ ⬇%s ⬆%s │ 💡残%s │ ⏳~%s │ 🔄%d回\n🔥 %s │ 🕐 Daily:%s 🗓 Weekly:%s 📊 Monthly:%s" \
"$model" \
"$(fmt $current_used)" \
"$(fmt $context_size)" \
"$bar" \
"$pct_int" \
"$perf" \
"$(fmt $total_input)" \
"$(fmt $total_output)" \
"$(fmt $remaining_tokens)" \
"$eta_str" \
"$compress_count" \
"$burn_rate_str" \
"$(fmt $d_total)" \
"$(fmt $w_total)" \
"$(fmt $m_total)"
Step 2: 実行権限の付与
chmod +x ~/.claude/statusline.sh
Step 3: settings.json の編集
~/.claude/settings.json に以下の statusLine 設定を追加します。既存の設定がある場合は statusLine キーだけ追加・上書きしてください。
{
"statusLine": {
"type": "command",
"command": "cat | bash ~/.claude/statusline.sh"
}
}
Step 4: 動作確認
Claude Code を起動(または再起動)すると、ステータスラインが表示されます。最初のメッセージ送信後にすべての値が反映されます。
まとめ
全てClaude Code とのやりとりのみのため、作業としては15分ほどで完成しました。
他にも色々表示できそうなので、お好みのレイアウトでお試しください!
関連リンク









