研究紹介
Claude Code が起動時に送る 39,810 トークンの内訳を実測した
· 読了まで約9分
目次
「Claude Code はプロンプトを読む前に 33k トークン送っている。OpenCode は 7k だ」という投稿が Hacker News で 396 コメントを集めていた。議論は例によって二分していて、片方は無駄が多すぎると言い、もう片方はキャッシュに載るのだから問題ないと言う。誰も自分の環境を測っていなかった。
このブログのリポジトリには、~/.claude/projects/ に Claude Code のセッションが 89 本分そのまま残っている。JSONL の transcript にはトークンの記録も入っている。そこで自分の環境を測った。今日の値は 最初の一言を読む前に 39,810 トークン。さらに有用なこととして、その内訳のどこに誰が座っているかまで割り出せた。
自分の transcript から実測する
transcript の assistant メッセージには usage が付いている。最初の 1 件を見れば、こちらが何か言う前にモデルへ渡された量が分かる。合計は 3 つのフィールドの和になる。新規入力、キャッシュへ書いた分、キャッシュから読んだ分の 3 つだ。
total = (u["input_tokens"]
+ u["cache_creation_input_tokens"]
+ u["cache_read_input_tokens"])
この区別は「キャッシュに載るのだから問題ない」という主張に対して効いてくる。キャッシュ読み出しは安いだけで無料ではなく、入力価格のおよそ 10 分の 1 はかかる。そして料金がどうであれ、コンテキストウィンドウの席は実際に占有している。39,810 トークンは値引きの効かない占有量として存在する。
89 本を時系列に並べると、値が一貫して右肩上がりになっていた。
| 日付 | プリフィル | CLAUDE.md | |
|---|---|---|---|
| 7/27 | 最初のセッション | 33,578 | 1,838 B |
| 7/29 | 36,437 | 4,801 B | |
| 8/03 | 38,202 | 7,275 B | |
| 8/07 | 39,807 | 9,240 B | |
| 8/11 | 直近 | 39,810 | 9,240 B |
89 本の分布は最小 30,089、中央値 37,425、最大 44,974。普通に記事を書いていた 16 日間で、下限が 18.6% 上がっている。Claude Code のバージョンもモデルも変えていないし、新しいツールも入れていない。プロジェクトに規約が溜まっただけで、以後のセッションはそれを毎回まとめて払っている。
1 つずつ足して差を取る
transcript から分かるのは合計だけで、内訳は出ない。内訳を知るには 1 つずつ変えて測り直すしかない。headless モードはこれに向いている。claude -p は実行ごとに自分の usage を返してくれる。
claude -p "hi" --model haiku --output-format json | python3 -c "
import json,sys
u = json.load(sys.stdin)['usage']
print(u['input_tokens'] + u['cache_creation_input_tokens'] + u['cache_read_input_tokens'])"
空のディレクトリで実行すればベースラインが出る。そこに 1 つ足してもう一度実行すれば、差がその 1 つの値段になる。以下はすべて Haiku 4.5 で、条件ごとに 2〜3 回繰り返した。測定のばらつきは ±241 トークンできれいに揃ったので、これより小さい差は何も無かったのと同じだ。
| 条件 | プリフィル | 差 |
|---|---|---|
| 空のディレクトリ | 26,177 | 基準 |
| MCP サーバー 7 個を無効化 | 25,932 | −241 |
| CLAUDE.md(9,240 B)を追加 | 29,640 | +3,463 |
| スキル 5 個を追加 | 25,956 | 0 |
| スキル 40 個を追加 | 26,248 | +57 |
分かったことは 3 つあり、そのうち 2 つは予想と違った。
MCP 7 個を切っても 241 トークンしか減らない
接続している MCP サーバーは 7 個ある。Context7、Gmail、Google カレンダー、Google ドライブ、Cloudflare、Three.js ビューア、sequential-thinking。この話題の定番は「MCP こそが高い」という説明で、使うかどうかに関係なく全サーバーのツール定義がコンテキストに載る、とよく書かれている。
7 個すべてを無効化して、変化は 241 トークンだった。ノイズと同じ大きさだ。
理由は遅延ロードにある。Claude Code は起動時に完全な JSON スキーマを流し込むのをやめ、ツールの名前だけを並べておいて、実際に必要になった時点でスキーマを取りに行くようになった。7 サーバー分のツールが名前の一覧に縮む。よく語られる「MCP のコンテキスト税」は実在したが、その後こっそり解消されていたことになる。エージェント内部の計測結果は賞味期限が短い、という教訓でもある。
追記。「解消」は言葉の選び方を誤っていた。1 週間後に残り半分を測ったところ、ツールは置いておくだけなら約 15 トークン、スキーマを読み込んだ瞬間に 300〜700 トークンになることがわかった。税金は消えたのではなく従量制になっていて、上の 241 はこの顔ぶれの名前リストの値段としてほぼ妥当な数字だった。
スキルは 40 個入れてもゼロ ── ただし headless の話
300 バイト程度の現実的な description を持つダミースキルを生成し、0 個から 40 個まで増やした。プリフィルは 26,191 から 26,248 になった。40 個で 57 トークン、ノイズの内側だ。
さすがにおかしいので、そもそも認識されているのかを確かめた。認識はされていて、lab-widget という名前のスキルが何個見えるかと聞くと 40 と答える。ところがファイル系のツールを禁止したうえで lab-widget-7 が何をするスキルかと聞くと、返ってきたのはこれだった。
NO-DESCRIPTION-VISIBLE
スキルが 5 個のときも同じ答えだった。headless モードの Claude Code がモデルに渡しているのはスキルの名前であって、description ではない。MCP が採用したのと同じ段階的開示になっている。description が読み込まれるのは、そのスキルが実際に起動するときだ。
対話セッションは事情が違う。そこが最後の計測になる。
headless 30,668、対話 39,810
同じリポジトリ、同じモデル、同じ日の測定値を並べる。
| 実行モード | プリフィル |
|---|---|
claude -p(headless) | 30,668 |
| 対話セッション | 39,810 |
| 差 | +9,142 |
この 9,000 トークンは、headless では要らないものの代金にあたる。全スキルの description 本文、使えるサブエージェントの一覧、遅延ロード対象のツール名リスト、そして人間と話すための作法。自作スキルもここに明細として並んでいて、そのうち 1 本は起動条件になる言い回しを列挙した description を持っている。この 1 本の description だけで 2,350 バイトあり、残り 9 本の合計を超えている。
つまり「スキルはコンテキストを食うのか」への正直な答えはこうなる。自動実行では食わない。対話では食う。そして値段を決めるのは description の饒舌さだけで、ここがスキルのうち常駐する唯一の部分になる。本体がどれだけ長くても、起動するまではディスクに置かれたままだ。スキルが起動したとき何がコンテキストに載るかや公開するスキルの監査は別途書いたが、あれと同じ構造をコスト側から眺めたものにあたる。
唯一、書くほど増えるのが CLAUDE.md
他の要素はどれも横ばいかタダだった。CLAUDE.md だけが線形に効き、そして自分の環境で毎週太っていく唯一の存在でもある。
| CLAUDE.md のサイズ | 増加トークン |
|---|---|
| 1,000 B | +202 |
| 2,000 B | +578 |
| 4,000 B | +1,327 |
| 6,000 B | +2,287 |
| 9,240 B | +3,463 |
大きいところで 1 KB あたりおよそ 375 トークン。ただしこの CLAUDE.md は日本語で書いてあり、日本語は UTF-8 でバイト数がかさむうえにトークンでも高くつく。最初の 1 KB は英語の見出し部分なので 1 KB あたり 200 トークン程度に収まっている。英語で書いている人はこの数字を半分にして読んでほしい。日本語や中国語なら、そのままでいい。
いずれにせよ、最初の表の謎はこのファイルが答えになる。16 日で 1,838 バイトから 9,240 バイトに増えた。見つけた規約を書き、同じ失敗を繰り返さないための注意を書き足した結果だ。そのたびにセッションの下限が上がり、以後どのセッションでも恒久的に払い続けることになった。
削るべきは MCP でもスキルでもなかった
結局まだ何も変えていない。それが測ったことの結論でもある。削れると思っていた 4 つのうち 3 つは、削っても何も戻ってこなかった。
冒頭のような HN スレッドを読んだあとに湧く衝動は、MCP サーバーを整理してスキルをアンインストールすることだ。この環境でそれをやると、39,810 のうち 241 と 57 が戻ってくる。一方、コストだとすら思っていなかったファイル ── ほぼ毎日書き足していて、しかも最もトークン効率の悪い言語で書かれているもの ── が 3,463 を占め、今も増えている。
見るべき数字は合計ではなく傾きのほうだ。16 日で 18.6%、しかも増やした要因は「気づいたことを書き留めた」だけである。この習慣を 1 年続ければ、CLAUDE.md だけで 5 桁に届く。とはいえここには本物の葛藤があって、その規約こそがエージェントを特定のコードベースで使い物にしている当のものでもある。書くのをやめる気はないし、この設定を持ち運ぶ話にはまた別の問題がある。ただ、CLAUDE.md は本番コードと同じ編集規律 ── 削除を含めて ── に値するファイルだとは言える。スキルのほうは description の 1 行さえ締まっていれば、いくら溜め込んでもほぼタダだ。
自分の数字が知りたければ、上の 2 つはどちらも 1 分で終わる。~/.claude/projects/ の最新の transcript に Python の断片をかけ、空のディレクトリで claude -p "hi" を実行する。その 2 つの差が、あなたのプロジェクト設定が毎セッション課している金額になる。