Claude Code のツール呼び出しカウンターと /tally
Claude のツール呼び出しをターンごと・セッションごとに数え、スピナーの横に件数を表示。/tally で内訳も確認できます。
権限
- ツール呼び出しを傍受Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
- UI を変更Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
- コマンド・ツールを追加あなたや Claude が呼び出せる新しいスラッシュコマンドやツールを登録します($.command.register / $.tool.register)。
- 検証バージョン
- v2.1.291
- 最終検証日
- 必要バージョン
- Claude Code ≥ 2.1.287
- 表示先
- スピナー、トランスクリプト、ステータス
- ソース
- ClaudeMods (MIT)
Claude Code 内でインストール:
/plugin install cm-tool-call-counter --marketplace rotbit/claudemods-marketplaceこのModでできること
ツール呼び出しカウンターは、Claude Code のツール呼び出しカウンターとして働く Mod です。Claude が作業している間、スピナーの行に · 7 tools のように現在のターンの呼び出し数が追加されるので、トランスクリプトをスクロールしなくても、そのターンがどれだけ忙しいかがわかります。いつでも /tally と入力すれば、ここまでのセッションの集計表が表示されます。
**Tool calls** · this turn: 7 · this session: 41 (2 errors)
| Tool | Calls | Errors |
| --- | ---: | ---: |
| Bash | 18 | 2 |
| Read | 15 | 0 |
| Edit | 8 | 0 |ターンに時間がかかった理由を知りたいとき、Claude が同じファイルを何度も読み直していないか確かめたいとき、シェルコマンドがどのくらいの頻度で失敗しているかを知りたいときに便利です。オプションで、ステータスラインに累計を 🔧 41 tool calls (2 errors) のように表示し続けることもできます。Claude Code 2.1.287 以降が必要です。
デモ
録画では、複数のツールを必要とするタスクを Claude に頼んでいます。呼び出しが行われるたびにスピナーの表示がカウントアップし、その後に /tally を実行するとツール別の表が表示されます。
インストール
インストールブロックにある方法のいずれかでインストールしてください。/tally はセッションの開始時に登録されます。
$ install cm-tool-call-counter
Claude Code 2.1.287 以上が必要
1.Claude Code 内で1行
/plugin install cm-tool-call-counter --marketplace rotbit/claudemods-marketplace実行中のセッション(v2.1.275 以降)に貼り付けます。最初に Claude Code がマーケットプレイスの追加を確認します。
2.シェルから
claude plugin marketplace add rotbit/claudemods-marketplace claude plugin install cm-tool-call-counter@claudemodsその後、すでに開いているセッションでは /reload-plugins を実行してください。
3.インストールせずに試す
git clone https://github.com/rotbit/claudemods-marketplace claude --plugin-dir ./claudemods-marketplace/cm-tool-call-counterその1セッションだけ Mod を読み込みます。設定には何も追加されません。
仕組み
カウントは、すべてのツールを観察する 1 つの tool.call フックで行われます。hooks/register.ts から抜粋します。
on('tool.call', async ($, e, next) => {
const tool = String(e.tool)
await update($, turn, t => addCall(t, tool))
const now = await update($, session, t => addCall(t, tool))
if (showInStatus) $.ui.status(statusText(now))
const ran = await next(e)
if (ran.deny !== undefined || ran.isError === true) {
await update($, turn, t => addError(t, tool))
const failed = await update($, session, t => addError(t, tool))
if (showInStatus) $.ui.status(statusText(failed))
}
return ran
}).catch(($, e, next) => next(e))
on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
if (!showInSpinner) return next(e)
const { count } = await read($, turn)
if (count === 0) return next(e)
return next({ ...e, props: { ...e.props, suffix: spinnerSuffix(e.props.suffix, count) } })
})呼び出しは開始時点で、2 つの $.state アトムに記録されます。turn.start フックでリセットされる turn と、session です。その後フックは next(e) で呼び出しを変更せずに渡し、結果が拒否されていたり isError が付いていたりした場合はエラーとして記録します。カウント処理が例外を投げても .catch が呼び出しを実行するので、この Mod がツールをブロックすることはありません。
Spinner の描画箇所に対する ui.render フックは、suffix プロパティだけを書き換え、それ以外はすべて next に渡します。そのため、スピナー自体は引き続き Claude Code が描画します。カウントは $.state にあるので、数値が変わるとすぐにスピナーが再描画されます。/tally は session.start で $.command.register によって登録され、tally 向けの command.run フックが hooks/tally.ts の formatTable で組み立てた { text } を返します。
カスタマイズ
以下のオプションは /config で変更できます。スピナーの文言は spinnerSuffix、ステータスの文言は statusText から来ており、どちらも hooks/tally.ts にあります。/tally の表の並び順を変えたい場合は、formatTable 内の sort の呼び出しを編集してください。
| 設定 | 型 | デフォルト | 説明 |
|---|---|---|---|
| showInSpinner | boolean | true | Show in spinner. Append " · N tools" (this turn's count) to the working spinner. |
| showInStatus | boolean | false | Show in status line. Also show the session's total tool calls and errors in the status line. |
Claude Code の /config で変更できます。Mod はホットリロードされます。
権限と安全性
ツール呼び出しを傍受 が表示されるのは、この Mod がすべてのツールの tool.call にフックしているためです。ただし観察するだけで、呼び出しを拒否したり変更したりすることはなく、ツール名以外の引数を見ることもありません。UI を変更 はスピナーの表示とオプションのステータス表示のためのものです。コマンド・ツールを追加 は /tally のためのものです。
コマンドの実行、ファイルの読み取り、ネットワークの利用は行わず、セッションをまたいで何かを保存することもありません。無効にするには /plugin disable cm-tool-call-counter を実行します。すべての Mod をオフにしてセッションを始めるには claude --safe-mode を使います。
- ツール呼び出しを傍受
- Claude が行うすべてのツール呼び出しを参照でき(tool.call / tool.check)、ブロックや変更も可能です。
- UI を変更
- Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
- コマンド・ツールを追加
- あなたや Claude が呼び出せる新しいスラッシュコマンドやツールを登録します($.command.register / $.tool.register)。
互換性とトラブルシューティング
macOS のターミナル上で Claude Code 2.1.291 にてテスト済みです。カウントが表示されない場合は、次を確認してください。
claude --versionが 2.1.287 以降であること、そして/pluginでこの Mod が有効になっていること。- シェルからインストールした後は
/reload-pluginsを実行すること。/tallyは、セッションが Mod を再起動した時点で使えるようになります。 - スピナーの表示は、そのターンで少なくとも 1 回ツール呼び出しが行われている間だけ表示されます。
/configでshowInSpinnerがオフになっている可能性があります。
カウントは、このプロセスで Mod が読み込まれてからの期間が対象なので、再読み込みするとリセットされます。
よくある質問
- ツール呼び出しカウンターはツール呼び出しを変更したり遅くしたりしますか?
- いいえ。呼び出しを数えた後、next(e) でそのまま変更せずに実行させ、呼び出しが失敗した場合にだけ後からエラーを数えます。カウント処理自体が失敗しても、.catch ハンドラーが呼び出しを実行します。
- /tally では何がエラーとして数えられますか?
- 結果が isError 付きで返ってきた呼び出しや、別のフックによって拒否された呼び出しです。たとえば、安全系の Mod が Bash コマンドを拒否した場合などが該当します。
- セッションのカウントは再起動後も残りますか?
- いいえ。カウントは $.state に保存され、現在の Claude Code プロセスが動いている間だけ保持されます。新しいセッションを始めたり Mod を再読み込みしたりすると、0 から数え直します。
- /tally はモデルを呼び出しますか?
- いいえ。command.run フックが、Mod の集めたカウントから直接応答します。そのため結果は即座に表示され、トークンも消費しません。
- /tally を開かずに合計を確認できますか?
- /config で showInStatus をオンにすると、セッションの合計数とエラー数がステータスラインに常に表示されます。
# 関連する Mod

コンテキストメーター
コンテキストウィンドウの使用率、5 時間・7 日間のプラン使用量、セッションのコストをステータスラインに表示し、上限が近づくと警告します。
- ステータス
- トースト
- UI を変更
v2.1.291 で検証済み

危険なコマンドのブロック
rm -rf /、main への force-push、DROP TABLE、curl | sh などの破壊的な Bash コマンドを実行前に拒否します。
- トースト
- ツール呼び出しを傍受
- UI を変更
v2.1.291 で検証済み

プロンプト上の Git ブランチ表示
Git のブランチ、変更ファイル数、ahead/behind の状態を Claude Code のプロンプトの上に 1 行で表示します。
- プロンプト上部
- コマンドを実行
- ツール呼び出しを傍受
- UI を変更
v2.1.291 で検証済み
同じカテゴリの Mod: スラッシュコマンド、コンテキスト、利用枠、コスト、ステータスラインとプロンプトバー。