Claude Codeがどのような形でClaude.mdをサーバーに送り、skillの原文をサーバーに送っているのかを確認できるproxyツールを作りました。
(github.com/kangraemin)Claude Codeで作業していてふと、CLAUDE.mdファイルやスキル、rules / memoryのようなデータをClaudeサーバーはどう認識しているのだろう?と気になりました。
そこで、自分でMITMプロキシを作ってトラフィックを確認できるツールを作ってみました。
Claude codeを実行するときにbaseURLを変更し、claude code内で発生するHTTP通信をキャプチャして表示する仕組みです。
このツールを使って分かったことは次のとおりです。
hello のひと言だけで12KBが付いて送られる
- Claude codeを起動してすぐに、helloを送ったときの状況です。
content[0]にスキル一覧が約2KB、content[1]にCLAUDE.mdが約10KB、content[2]に実際の入力であるhelloテキストが送られます。- つまり、CLAUDE.mdが500行あると毎回のリクエストで丸ごと送信されるため、CLAUDE.mdを簡潔に保つべき理由が分かります。
会話が積み重なるほど、各リクエストは雪だるま式に大きくなる
messages[]全体が毎回のリクエストで再送されます。— 1ターンで15KB、10ターンで200KB、30ターンで1MB+- しかもClaudeが返答した内容もrequest messageに含まれます。
- コンテキストウィンドウに対して定期的に
/clearを行わないと、トークンの無駄が増えるだけでなく、前の文脈が後の文脈に常に付いて回ることで性能低下が起こり得ることが分かりました。
MCPツールは必要なときだけロードされる
- 最初はビルトインのN個だけがロードされ(Claudeのバージョンによって異なります)、MCP toolを使う必要がある場合、サーバー側で
ToolSearchを呼び出して使用するツールを探します。 - その後は、呼び出しのたびに上で見つかったツールが追加された形で呼び出されます。
- つまりMCP Toolは動的にロードされるため、使っていなかったMCPのツールは実際には大きなトークン消費を起こさないことが分かりました。
サブエージェントは完全に隔離されたコンテキストで実行される
- サブエージェントは、親の会話履歴がまったくない新しいセッションが開かれるのと同じです。
- Inspectorでは親/サブエージェントの2つの呼び出しを並べて目で比較できます。
画像を1枚添付すると数百KBが追加される
- スクリーンショットを添付するとbase64エンコードされ、JSONボディにインラインで挿入されます。
- 画像がリクエストをどれだけ大きくするかをリアルタイムで確認できます。
以下のコマンドでインストールできます。
brew install --cask kangraemin/tap/claude-inspector && sleep 2 && open -a "Claude Inspector"
GitHub: https://github.com/kangraemin/claude-inspector
まだmacOS専用で初期バージョンですが、改善提案があれば積極的に取り入れたいと思います。
使ってみて、学習の助けになればうれしいです。ありがとうございます!
4件のコメント
suspiciously precise floats, or,
how I got Claude's real limits 記事では、API料金とは異なり、サブスクリプションプランではキャッシュ読み取りコストがないという分析がありました。セッションが長くなるほど、計算されたコストと実際のコストの間に多少の誤差が出そうでもあります。
おお……まったく知らなかった投稿ですね……一度確認してみます!ありがとうございます
https://github.com/badlogic/lemmy/tree/main/apps/claude-trace
これでプロンプトやどんなツールを使ったのか見てみましたが、作られたものも使ってみないとですね。
共有ありがとうございます。 :+1:
さらに、リクエスト後のresponse内で、そのrequestに使われたトークン量を確認できます!
モデル: claude-sonnet-4-6
リクエストサイズ: 68.9 KB
"usage": {
"input_tokens": 3,
"cache_creation_input_tokens": 12394,
"cache_read_input_tokens": 6499,
"cache_creation": {
"ephemeral_5m_input_tokens": 0,
"ephemeral_1h_input_tokens": 12394
},
"output_tokens": 74,
"service_tier": "standard",
"inference_geo": "not_available"
}
また、モデルごとの価格を適用してrequestごとのcostも計算してあるので、ぜひたくさん使ってください(笑)
キャッシュ読み取り: 6.5K tok × $0.3/MTok = $0.0019
キャッシュ書き込み: 12.4K tok × $3.75/MTok = $0.0465
非キャッシュ入力: 3 tok × $3/MTok = $0.0000
出力: 74 tok × $15/MTok = $0.0011
合計: $0.0495
キャッシュヒット率: 34%