4つの AI の使用状況を、家のサーバーのトップに5分ごとに表示する ― 上限の %・今日のトークン・動いている作業の数
Claude Code・Codex・Gemini(Antigravity)・Grok の4つの AI を、3台の Mac で使い分けています。困るのは、どの AI がいま上限にどれだけ近いのかが、それぞれの画面を開かないとわからないことです。そこで、家のサーバーのトップページ(家の中だけで見る案内ページ)に、4つの AI の使用状況を5分ごとに表示するようにしました。
表示するのは、上限に対する使用率(%)、今日使ったトークン数(AI が読み書きした文字の量の単位)、いま動いている作業の数の3つです。これまでの記事:Orca で複数の AI をまとめる、4つの AI から自分の LINE に知らせる。
全体の構成

- 集めるもの:各 AI が手元に残している作業の記録と、上限を表示する
/usageコマンドの結果 - 集め方:各 Mac で集計用のスクリプトを5分ごとに動かし、数値だけを JSON にして家のサーバーへ送る。会話の中身は送らない
- 見せ方:トップページが5分ごとに JSON を読み直して表示する。ページは家の中からしか見えない
1. 4つの AI から何が取れるか

最初に、それぞれの AI が手元に何を残しているかを調べました。取れるものは AI ごとにかなり違います。
- Claude Code:
claude -p /usageで上限の使用率が文字で返ってくる。トークンは消費しない。トークン数は作業の記録(~/.claude/projects)の応答ごとのusageから集計できる - Codex:作業の記録(
~/.codex/sessions)に、5時間枠と週の枠の使用率(rate_limits)とトークン数が毎回書かれている。コマンドを実行しなくても記録を読むだけで済む - Gemini(Antigravity CLI):
agy -p /usage --output-format jsonで、モデルのグループごとの残り(週・5時間枠)が JSON で返ってくる。トークン数は記録が独自の形式で、今回は取れなかった - Grok:会話ごとの記録(
updates.jsonl)に、トークン数と料金が書かれている。上限の使用率は対話画面の/usageでしか見られなかった
上限の使用率はアカウントに対する値なので、3台のどの Mac で調べても同じです。そこで上限は1台(mac3)だけで調べ、トークン数と作業の数は3台それぞれで集計することにしました。
2. 集計用のスクリプト
Python で1本のスクリプト ~/bin/ai_usage_collect.py にまとめました。Mac に最初から入っている Python(3.9)だけで動き、追加のライブラリはいりません。主なところを抜き出して紹介します。
Claude Code の上限:/usage の文字を読む
r = subprocess.run([CLAUDE, "-p", "/usage", "--output-format", "json", "--no-session-persistence"],
capture_output=True, text=True, timeout=90, cwd=HOME)
text = json.loads(r.stdout)["result"]
# 例:Current session: 68% used · resets Nov 2 at 11pm (Asia/Tokyo)
for m in re.finditer(r"^Current ([^:]+): (\d+(?:\.\d+)?)% used(?: · resets (.+))?$", text, re.M):
...
--no-session-persistence を付けると、この呼び出しが作業の記録として残りません。5分ごとに呼ぶので、これがないと記録が1日に約 300 個増えてしまいます。
Codex の上限とトークン:記録の token_count を読む
for line in f.open(errors="ignore"):
if '"token_count"' not in line:
continue
p = json.loads(line)["payload"]
# rate_limits:primary が5時間枠、secondary が週の枠(used_percent と resets_at)
if p.get("rate_limits"):
latest = p["rate_limits"]
# last_token_usage:その1回の応答で使ったトークン数。今日の分を足し合わせる
u = (p.get("info") or {}).get("last_token_usage")
Gemini の上限:残りの割合を使用率に直す
r = subprocess.run([AGY, "-p", "/usage", "--output-format", "json"], capture_output=True, text=True,
timeout=90, cwd=HOME, stdin=subprocess.DEVNULL)
for g in json.loads(r.stdout)["command"]["data"]["groups"]:
for b in g["buckets"]:
percent = (1 - b["remaining_fraction"]) * 100 # 「残り」で返ってくるので「使った割合」に直す
グループは「Gemini のモデル」「Claude・GPT のモデル」(それぞれ週と5時間枠)と、別枠の「Argon」(週)でした。
Grok のトークンと料金:turn_completed の usage を足す
if '"turn_completed"' in line and '"usage"' in line:
u = json.loads(line)["params"]["update"]["usage"]
t["output"] += u.get("outputTokens", 0)
t["cost_usd"] += u.get("costUsdTicks", 0) / 1e10 # 10^10 で割るとドル
1回のやり取りが終わるたびに、その回の使用量が書かれる形とみて足し合わせています。何回もやり取りした会話の記録がまだ手元になく、累計の値で書かれている可能性は確かめきれていません。
起動中と作業中の数
- 起動中:
psでclaude・codex・agy・grokのプロセスを数える。スクリプト自身が呼ぶ-p付きのものは数えない - 作業中:記録の最後のやり取りの時刻が5分以内の会話を数える
3. 5分ごとに動かして、家のサーバーへ送る
Mac の定期実行の仕組み(launchd)に登録しました。~/Library/LaunchAgents/ に次のファイルを置き、launchctl bootstrap gui/$(id -u) ファイル名 で読み込みます。
<dict>
<key>Label</key><string>org.example.ai-usage</string>
<key>ProgramArguments</key><array>
<string>/usr/bin/python3</string><string>-I</string>
<string>/Users/you/bin/ai_usage_collect.py</string>
<string>mac3</string> <!-- 端末名 -->
<string>/Users/you/.local/bin/claude</string> <!-- 上限を取らない Mac では none -->
<string>/opt/homebrew/bin/agy</string> <!-- 同上 -->
</array>
<key>StartInterval</key><integer>300</integer>
<key>RunAtLoad</key><true/>
</dict>
集計した結果は、鍵認証の SSH でそのまま家のサーバーに書き込みます。いったん別名で書いてから名前を変えるので、ページが書きかけのファイルを読むことはありません。
dest = f"/var/www/html/data/ai_usage_{HOST}.json"
subprocess.run(["ssh", "-o", "BatchMode=yes", "home-server",
f"cat > {dest}.tmp && mv {dest}.tmp {dest}"], input=body, text=True, check=True)
4. トップページに表示する

- AI ごとに、上限の使用率を棒グラフとリセットの時刻で表示する。3台のうち、いちばん新しい値を使う
- その下の表に、端末ごとの今日の入力・出力・キャッシュ読込(前に読んだ内容の使い回し)のトークン数、起動中・作業中の数を並べる。Grok は料金も出す
- 15分以上更新がない端末には「止」を付ける。ノートの Mac を閉じてスリープしたときなどに出る
- 取れないものは空けずに、「上限の値は自動では取れません」と書いておく
つまずいたところ
1台だけ、自動で実行すると claude -p が止まる
mac1 では、手で実行すると3秒で終わる claude -p /usage が、launchd から動かすと 90 秒たっても終わりませんでした。パスワードを保管する仕組み(キーチェーン)の確認待ちになっている可能性がありますが、原因はまだわかっていません。上限の値は3台で同じなので、無理に直さず、取るのは mac3 だけにしました。
作業していないのに「作業中」になる
最初は、記録のファイルの更新日時が5分以内なら「作業中」としていました。ところが、AI をまとめて扱うアプリ(Orca)が、やり取りがなくてもファイルの更新日時を変えることがあり、使っていない Mac でも作業中になりました。ファイルの末尾を読み、最後に書かれたやり取りの時刻で判定するように直しました。
grok -p /usage は、AI への質問として送られる
Claude Code や Antigravity と同じつもりで grok -p /usage を実行したところ、コマンドとしては扱われず、「/usage とは何か」を調べる質問として AI に送られました。この1回で約 0.04 ドルかかりました。Grok の上限は、今のところ自動では取らないことにしています。
Mac の Python 3.9 では日時が読めないことがある
記録の日時は 2026-11-02T12:04:49.705Z のような形です。Python 3.9 の datetime.fromisoformat は、末尾の Z や、小数点以下が3桁・6桁以外の書き方を読めません。小数点以下を6桁にそろえ、Z を +00:00 に置き換えてから読むようにしました。
まとめ
- 4つの AI の上限の使用率・今日のトークン数・動いている作業の数を、家のサーバーのトップページに5分ごとに表示した
- Claude Code と Gemini は
-p /usage、Codex は作業の記録から上限が取れる。Grok はトークンと料金だけ - 上限はアカウント共通なので1台だけで調べ、トークンと作業の数は各 Mac で集計する
- 送るのは数値だけで、会話の中身は送らない。ページも家の中だけで見る
