<小ネタ>Claude Code で常時コンテキスト使用量を把握できるようにしてみた

<小ネタ>Claude Code で常時コンテキスト使用量を把握できるようにしてみた

2026.02.08

はじめに

クラウド事業本部、あきやまです。

みなさん、Claude Code使っていますか?
私はクラスメソッドに入社して本格的に利用しています。
現在、Maxプランで利用しているのですが自分のコンテキストの利用状況って
どんなもんやろと、ふと疑問に思いました。

Claude Codeにはコンテキスト使用量を確認するためにぱっと思いつくとこで以下コマンドがあります。

  • /context というコマンドを実行するとコンテキストの使用状況を確認できます。
    スクリーンショット 2026-02-08 11.11.45

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

色々調べていたところ、見た目が自分好みにカスタマイズできそうな/statusline
利用して今回は設定していきたいと思います。

環境

項目
OS macOS Tahoe 26.2
Claude Code v2.1.37
モデル Opus 4.6

準備

  • Claude Codeがインストール済みであること
  • jq コマンドが利用可能であること(JSON パース用)

最初に結論

最終的には以下レイアウトになりました!Claude Codeで/statusline実行のやりとりのみでブラッシュアップしていった感じです。設定方法の箇所では作成されたスクリプトとjsonを記載しておりますのでよかったらお試しください!

スクリーンショット 2026-02-08 13.21.57

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 のインストール(未導入の場合)

bash
# 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分ほどで完成しました。
他にも色々表示できそうなので、お好みのレイアウトでお試しください!

関連リンク

https://code.claude.com/docs/ja/statusline

この記事をシェアする

FacebookHatena blogX

関連記事