mcpField
A
AI Usage

AI Usage

ローカル
github.comデータ・分析16 日前に更新

AI Usage について

AI Usageは、Claude Code、OpenCode、Codex CLIが記録したトークン使用量とコストを分析するローカルMCPサーバー兼コマンドラインツールです。履歴をSQLiteに保存し、独立した再読み込みで集計を照合するほか、キャッシュの問題、予算、使用状況の内訳を報告します。データはアップロードされません。

主な機能

  1. 01ローカルでのトークン・コストレポート
  2. 02SQLiteによる元データの保持期間を超えた履歴保存
  3. 03使用量集計の独立照合
  4. 04キャッシュ切れの検出とコスト分析
  5. 05予算予測と使用状況の内訳
  6. 06CSV・JSONエクスポート

活用シーン

  1. 01プロジェクトや日ごとのトークン使用量の比較
  2. 02セッションでのプロンプトキャッシュ消失の調査
  3. 03別モデルの料金で同じ使用量を試算
  4. 04Claude Codeのプラン上限と消費ペースの確認
  5. 05収集した集計値と元記録の照合

MCP 対応

MCPサーバーは、ローカルのClaude Code、OpenCode、Codex CLIのデータを使い、12の使用量分析ツールとリソース、プロンプトを提供します。データは端末内にとどまり、APIキーやアカウントは不要です。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"mohitbansal321-ai-usage": {
"command": "npx",
"args": [
"-y",
"ai-usage-mcp"
]
}
}
}
起動コマンドnpx -y ai-usage-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmai-usage-mcp0.16.1

ツール

11

掲載時のツール一覧 · 6 日前に更新

パラメーター型必須説明
daysintegerいいえ何日前まで遡るかを指定します。ローカル時間の午前 0 時から起算します。省略すると全期間が対象です。
sincestringいいえ期間の開始日時(ISO 8601、開始時刻を含む)。
todaybooleanいいえローカル時間で今日に限定します。
untilstringいいえ期間の終了日時(ISO 8601、終了時刻を含まない)。
clientanyいいえ指定したクライアントのいずれかに限定します。クライアント ID を 1 つだけ指定することもできます。
modelsarrayいいえクライアントが記録した値と完全に一致する、指定したモデル ID のいずれかに限定します。存在する ID を確認するには model_usage を使用してください。
compareenumいいえこの期間の直前にある同じ長さの期間と、その差分も報告します。固定長の期間が必要です。days、today、または since と until の併用を指定してください。開始のみ、終了のみ、全期間などの開放期間には同じ長さの直前期間がないため、比較なしで結果を返すのではなく、リクエストを拒否します。報告コストと推定コストの差分は別々に算出し、決して合算しません。previous
projectPathstringいいえ単一プロジェクトを指定する projectPaths の非推奨の表記です。引き続き使用できます。
projectPathsarrayいいえ各ターンが実行された絶対作業ディレクトリで指定した、いずれかのプロジェクトに限定します。各パスは完全一致する必要があります。利用可能なパスを確認するには project_usage を使用してください。どのレコードにも一致しない値は、空の期間を返すのではなく、その旨が報告されます。
includeSubagentsbooleanいいえサブエージェント/サイドチェーンのターンを含めます。実際にコストが発生するため、既定値は true です。false にするとメインスレッドのターンのみ表示します。

詳細

ai-usage-mcp

npm version CI npm downloads node license

コーディングエージェントに、いくらかかったのか、費用の内訳はどこなのかを尋ねましょう。 Claude Code、OpenCode、Codex CLIがすでにマシンに書き込んだデータをもとに回答するMCP サーバーです。アップロードは一切なく、APIキーもアカウントも不要です。

> Where are my tokens going, and what should I change?
> Where did this session lose its prompt cache?
> Which of my projects is getting more expensive, day by day?
> What would last week have cost on Sonnet instead of Opus?

トランスクリプトを読むだけではできない、3つのこと:

  • 履歴を保持します。 Claude Codeは30日後にトランスクリプトを削除します(cleanupPeriodDays)。確認したターンはすべて、その都度ローカルのSQLiteデータベースにコピーされるため、元ファイルがなくなった後も前四半期のデータが残ります — 2台のマシンのデータを1つにまとめることもできます。
  • キャッシュが失われた箇所を見つけます。 費用の大部分はキャッシュトークンです — 開発マシンでは全トークンの94.7%を占めています。cache_healthは、セッションのキャッシュ済みプレフィックスが失われ、コンテキスト全体を再度書き込む費用が発生したターンを特定し、考えられる原因(モデルの切り替え、5分のTTLを超えるアイドル状態、CLAUDE.mdの編集)を示して、追加費用を算出します。
  • 数値の根拠を示します。 Claude Codeは、コンテンツブロックごとに1行のJSONLを書き込み、各行で同じusageオブジェクトを繰り返すため、行を合計するとすべての数値が2~3倍に膨らみます。ai-usage verifyは、収集処理と集計コードを共有しない独立した別実装で両方のソースを読み直し、その結果を独自のデータベースと比較します。
$ ai-usage verify

== claude-code ==
  MATCH    claude JSONL, deduped by stop_reason line (independent rule)
  INFO     claude JSONL, naive sum of every usage line (NOT used -- shows the double count)
           delta:  cache-read 990,824,820 ...

RESULT: every client reconciles exactly against at least one independent read of its source.

さらに、Pro/Maxプランの制限にも対応します — Claude Codeが報告する5時間および週間の使用率を、ステータス行で保持し、使用率が100%に達する予測時刻も表示します — そのほか、counterfactual_cost(同じトークンを別モデルの料金で計算)、実行率と予測を含む予算、プロジェクト×日ごとの内訳、CSV/JSONエクスポートにも対応します。Claude CodeとOpenCodeをサポートし、12個のMCPツールに加え、リソース、プロンプト、ツールと同じテキストを出力するデバッグCLIを提供します。

数値を捏造することはありません。 ソースに記録されていない情報は、ゼロではなく「利用不可」として報告します。

出力例(サンプルデータ)
$ ai-usage stats --today
Usage summary -- today (local time)
Subagent/sidechain turns: INCLUDED (3 main + 1 subagent turns).

Records: 4   Sessions: 2

Tokens (all clients):
  Input:        1,871
  Output:       16,909 (16.9K)
  Cache read:   2,452,000 (2.45M)
  Cache write:  37,300 (37.3K)
  Reasoning:    2,600
  Total:        2,508,080 (2.51M)

  Cost (reported by client, exact): $0.41  [1 records]
  Cost (estimated, API-equivalent):  $1.50  [3 records]

By client:
  claude-code  --  3 records, 1 sessions
    Cache read:   2,238,000 (2.24M)
    Total:        2,280,001 (2.28M)
    Cost (estimated, API-equivalent):  $1.50  [3 records]

  opencode  --  1 records, 1 sessions
    Cache read:   214,000 (214.0K)
    Total:        228,079 (228.1K)
    Cost (reported by client, exact): $0.41  [1 records]

2つの費用項目が合算されることはありませんし、今後もありません — 費用の報告方法をご覧ください。

1つのコマンドで試す

設定もアカウント作成も必要ありません。Claude CodeとOpenCodeがこのマシンにすでに書き込んだデータを読み込みます:

npx -y -p ai-usage-mcp ai-usage report

初回実行時に履歴がローカルデータベースにコピーされます。数秒かかります。レポートには直近7日間の評価、トークンの使用先、変更すべき内容が表示されます。上記のような質問をエージェントにするには、MCP サーバーとしてインストールしてください。

ai-usageとccusageの比較

ccusageは定評のある優れたツールです。より多くのエージェントに対応しており、Claude Codeのトークン数はこのパッケージの数値と正確に一致します — 開発マシン上で2026年9月21~25日のデータをccusage 20.0.26と照合し、すべてのトークン種別、すべての日について確認済みです。多くのエージェントを対象に手早くレポートを出したい場合は、こちらをお使いください。

Claude Codeの30日間のクリーンアップ後も残る履歴、キャッシュ切れの検出と費用計算、仮定の料金による比較、予算、複数の切り口での内訳、報告された費用と推定費用の分離、verifyによる別の読み取りとの照合で裏付けられたトークン合計など、現在のトランスクリプトのレポートだけでは得られない情報が必要な場合は、こちらをお使いください。


インストール

Node.js 22.13 以降が必要です。コンパイラー、ビルドツール、特定の npm バージョンは必要ありません。 ストレージには Node 組み込みの node:sqlite を使用しており、22.13.0 以降ではフラグなしで利用できます。必須のネイティブ依存関係はありません。

better-sqlite3 は、それより古い Node を使用しているホスト向けの任意のフォールバックとして残されています。必須ではありません。ビルドできない場合、npm はスキップし、サーバーは引き続き動作します。

Claude Code

プラグインとして — 推奨。 Claude Code 内で次の 2 つを実行します。

/plugin marketplace add MohitBansal321/ai-usage-mcp
/plugin install ai-usage@ai-usage-mcp

これにより、MCP サーバーが設定され、3 つのプロンプトが実際のスラッシュコマンドとしてインストールされます — /ai-usage:daily-review、/ai-usage:why-was-today-expensive、/ai-usage:project-cost — これらは、MCP プロンプトだけではほとんどのクライアントに表示されません。インストールの概要に Run /reload-plugins to activate. と表示された場合は、それを実行してください。シェルから同じ操作を行うには、 claude plugin marketplace add MohitBansal321/ai-usage-mcp を実行します。

このプラグインではサーバーとして npx -y ai-usage-mcp を指定しているため、サーバー自体は引き続き npm から取得され、コールドスタートのたびに再解決されます。そのため、プラグインの更新とサーバーの更新はそれぞれ独立しています — 詳しくは更新をご覧ください。

または、通常の MCP サーバーとして — マーケットプレイスを追加したくない場合はこちらです。事前のインストールは不要です — npx が必要に応じて取得します。

claude mcp add ai-usage -s user -- npx -y ai-usage-mcp

ネイティブ Windows(WSL ではない環境)では、代わりに cmd /c でラップします。

claude mcp add ai-usage -s user -- cmd /c npx -y ai-usage-mcp

理由:Windows では npx は npx.cmd であり、MCP TypeScript SDK はサーバーを shell: false で起動します。その方法では Node は .cmd ファイルを実行できません。Node のドキュメントによると、このようなファイルは「child_process.spawn() をシェルオプションを設定して呼び出すか、cmd.exe を起動し、.bat または .cmd ファイルを引数として渡すことで実行できます」。cmd /c は後者の方法です。これは Claude Code だけでなく、以下のすべての SDK ベースのクライアントに当てはまります。

-s user を指定すると、すべてのプロジェクトで利用できるようになります。省略すると、現在のプロジェクトにのみサーバーが追加されます。その後、Claude Code 内で /mcp を実行し、接続されたことを確認してください。

claude コマンドがありませんか?(VS Code / JetBrains 拡張機能のユーザー向け)

拡張機能は CLI と同じ設定を読み込むため、ファイルを編集すればサーバーを追加できます — CLI は必要ありません。希望する適用範囲を選んでください。

1 つのプロジェクトの場合 — プロジェクトのルートに .mcp.json を作成します。

{
  "mcpServers": {
    "ai-usage": {
      "command": "npx",
      "args": ["-y", "ai-usage-mcp"]
    }
  }
}

Claude Code は、プロジェクトスコープのサーバーを初めて読み込む際に、承認を求めます。チームでも利用できるようにする場合、このファイルは安全にコミットできます。

すべてのプロジェクトの場合 — ~/.claude.json(Windows では %USERPROFILE%\.claude.json)の最上位に、同じ mcpServers ブロックを追加します。

{
  "mcpServers": {
    "ai-usage": {
      "command": "npx",
      "args": ["-y", "ai-usage-mcp"]
    }
  }
}

このファイルはすでに存在し、ほかの設定も保持しています。ファイルを置き換えるのではなく、それらと並べて mcpServers キーを追加してください。

その後、ウィンドウを再読み込みし(VS Code では Developer: Reload Window)、/mcp を実行します。設定はセッションの開始時に読み込まれるため、すでに開いているセッションには反映されません。

OpenCode
opencode mcp add ai-usage       # choose a local server, command: ai-usage-mcp

または、~/.config/opencode/opencode.jsonc に追加します。

{
  "mcp": {
    "ai-usage": {
      "type": "local",
      "command": ["npx", "-y", "ai-usage-mcp"],
    },
  },
}

opencode mcp list で確認します。

Codex CLI
codex mcp add ai-usage -- npx -y ai-usage-mcp

Codex の使用状況は ~/.codex/sessions(または $CODEX_HOME)から読み取られます。Codex はコストを記録しないため、コストは API 相当額の推定値となるか、料金表にないモデルでは利用できません。サポートは新しく、これまでに 2 つのセッションで検証されています。ai-usage verify を実行すると、お使いの環境で確認できます。

その他の MCP クライアント

Cursor、Google Antigravity、Windsurf、Claude Desktop では、同じ npx -y ai-usage-mcp ブロックを使用します。異なるのは設定ファイルだけです。質問に使用するクライアントは、計測対象のクライアントと同じである必要はありません。Cursor から質問しても、Claude Code の使用状況が取得できます。パスと詳細については、docs/INSTALL.md をご覧ください。

デバッグ CLI

MCP サーバーのインストールは不要です。ai-usage CLI も PATH に追加するには:

npm install -g ai-usage-mcp
ai-usage status

インストールせずに実行することもできます:

npx -y -p ai-usage-mcp ai-usage stats --today

Windows: 特定の npm は不要になりました。以前このインストールを失敗させていた node-gyp のエラーは、ネイティブの better-sqlite3 依存関係が原因でしたが、現在はオプション扱いとなり、Node 22.13 以降では使用されません。npm が引き続きビルドエラーを報告する場合、そのメッセージはオプションの依存関係がスキップされたことを示しており、インストールの失敗ではありません。ai-usage status で SQLite driver: node:sqlite と表示され、すべて正常に動作します。

更新

npx -y ai-usage-mcp はコールドスタートのたびにバージョンを再解決するため、クライアントを再起動するとリリースが適用されます。グローバルインストールではバージョンが固定されます:npm install -g ai-usage-mcp@latest。 ai-usage status と MCP サーバーは、どちらも更新が必要な場合に通知します。 docs/INSTALL.md では、インストールの種類ごとに必要なことと、チェックで行う 1 回のリクエストについて説明しています。

互換性

両方のソース形式は内部形式でバージョン管理されていないため、クライアントの更新で変更される可能性があります。確認済みの内容と方法は次のとおりです:

クライアント最終検証それ以前の検証
Claude Code2.1.308、2026-10-232.1.2xx、2.1.251
OpenCode2.0.32、2026-10-231.18.25、2.0.30
Codex CLI0.162.0-alpha.17.2 および 0.114.0、2026-10-23(2 セッション)
Node.jsCI で 22.13 以降および 24
OSCI で Linux、macOS、Windows

「検証済み」とは、ai-usage verify が、クライアント自身のデータを独立して再読み込みした結果と照合し、すべてのトークンクラスが完全に一致したことを意味します(Claude Code のトランスクリプト 715 MB、opencode.db 251 MB、Codex のセッションロールアウト)。同期時に読み込んだものと同じバイト列を比較するため、書き込み中のセッションが不一致として表示されることはありません。 クライアントの更新によって収集に問題が生じた場合、クライアントは引き続き書き込みを行っているものの、新しいターンが届いていないことを ai-usage status が警告します。

質問する

接続したら、自然な言葉で質問できます:

How many tokens have I used today?
Show my usage for this session.
Which model consumed the most tokens?
How much did Claude Code cost me today?
Show all usage from the last 7 days.
Which repository is my spend going to?
Break my last 7 days down day by day.

MCP ツール

ツール戻り値
usage_report最初に確認してください:判定、使用量の内訳、使用量の多いセッション、変更すべき点
usage_summary期間ごとの合計をクライアント別に表示。トークン数とコスト
session_usage1 つのセッションのクライアント、モデル、所要時間、トークンの内訳、コスト
model_usageモデル別のトークン数とコスト
client_usageクライアント別(Claude Code と OpenCode)のトークン数とコスト
recent_sessionsプロジェクト、クライアント、トークン数、コストを含む最近のセッション
project_usageターンが実行されたディレクトリ別のプロジェクトごとのトークン数とコスト
daily_usage日別のトークン数とコスト。新しい日付から表示
usage_breakdown2 つ以上のディメンションを同時に表示 -- プロジェクト × 日、モデル × 日、クライアント × 日
counterfactual_costこれらのトークンを別のモデルの標準料金で計算し、実際のコストと並べて表示
cache_health1 つのセッションにおけるキャッシュの問題:キャッシュ済みプレフィックスが失われた時期と理由、およびコスト
plan_usagePro/Max の 5 時間および週間の上限使用量、各上限のリセット時期、使用ペース
まずはここから:usage_report

Pro、Max、またはTeamプランでは料金が固定されているため、「いくらかかったか」は適切な問いではありません。知りたいのは、利用上限のうち、実際の作業にどれだけ使われたかです。usage_report(またはai-usage report)は、デフォルトで直近7日間の状況を表示します。

Verdict: High waste -- a large share of this usage re-read or rebuilt old context.

Where it went (share of usage, weighted by API-equivalent price):
   37.1%  re-reading context above 100k tokens (1,021 turns; largest context 735.2K)
   10.2%  rebuilding a lost cache (12 times, 12 after an idle break)

What to change:
  1. Compact earlier. ... 5 session(s) grew past 200k tokens of context ...
  2. Don't resume a session that has gone cold. ...

Heaviest sessions:
   47.7%  Admission transfer tariff services and roles linking  [development, claude-code]

トークン数だけをもとに、2種類の無駄を測定します。コンテキストの持ち越しが発生するのは、各メッセージで会話全体を再送信するためです。そのため、コンテキストが300kのターンでは、1ステップ進むために300kトークンを読み直します。100kを超える部分は、事前にコンパクションしていれば持ち越さずに済んだ分です。キャッシュの再構築は、キャッシュされたプレフィックスが失われ、コンテキスト全体が再書き込みされたターンです(cache_healthと同じ検出方法です)。セッション名にはクライアントが付けたタイトルと、そのセッションが実行されたGitブランチが使われます。Claude Codeに記録されたブランチがない場合(通常、Gitリポジトリ外で開始されたセッション)はno branchと表示されます。どちらの無駄も完全に回避できるとは限らず、その割合は利用状況の内訳を把握するための目安であって、上限の正確な消費量ではありません。Anthropicは、サブスクリプションの上限において各トークン種別がどのように重み付けされるかを公開していません。

プランの上限、ステータスライン、コンテキストの警告

Claude CodeはPro/Maxの5時間および週間の上限をファイルに書き込みませんが、ステータスラインには渡します。ai-usage statuslineを設定すると、上限がリセット時刻とともに記録され、現在のペースで100%に達する時刻も表示されます。その横には今日のコストと、セッションのキャッシュヒット率およびブレイク数が表示されます。また、会話内からもplan_usageで同じ情報を確認できます。ai-usage hookは、セッションのコンテキストを再送信するコストが高くなる前にプロンプトの送信を警告します。ai-usage statusでは、それぞれが有効になっているかを確認できます。設定方法と詳細はdocs/STATUS_LINE.mdをご覧ください。

リソースとプロンプト

ツール呼び出しを依頼する代わりに、@メンションで会話に取り込めるリソースが3つあります。

リソース内容
usage://today今日の合計。クライアント別に表示
usage://session/latest直近のセッションの詳細
usage://status応答しているビルド、そのソース、古い情報かどうか

プロンプトを表示するクライアントでは、3つのプロンプトがスラッシュコマンドとして表示されます。

プロンプト内容
daily-review今日はいくら使い、何に使ったか
why-was-today-expensive今日のコストを押し上げたモデル、セッション、プロジェクトは何か
project-costあるプロジェクトに期間内でいくらかかったか

各プロンプトには呼び出すツールが指定され、報告値と推定値のコストを区別するルールも含まれます。そのため、言い換えた要約で2種類のコスト基準が知らないうちに混同されることはありません。

ほとんどのクライアントはMCPプロンプトを表示しません。そのためClaude Code プラグインには、同じ3つの機能が実際のスラッシュコマンド (/ai-usage:daily-reviewなど)として含まれています。2つの表示方法から同じ機能を利用でき、テストによって両方の一覧が食い違わないことを確認しています。

デバッグCLI

同じサービスレイヤーを別のフロントエンドから利用するため、両者の結果が食い違うことはありません。

ai-usage report      # start here: verdict, where usage went, what to change (last 7 days)
ai-usage status      # collectors, data stores, db path, record counts, last sync, hooks on/off
ai-usage sync        # run the collectors
ai-usage stats       # totals   (--today, --days N, --since/--until)
ai-usage models      # per-model
ai-usage clients     # per-client
ai-usage projects    # per-project  (--limit N)
ai-usage sessions    # recent sessions
ai-usage session ID  # one session in detail
ai-usage daily       # per-day breakdown
ai-usage counterfactual  # these tokens on another model (--target-models a,b)
ai-usage verify      # re-read the sources and diff them against the local database
ai-usage hook        # Claude Code UserPromptSubmit hook: warns when context is large

任意のコマンドに--jsonを追加すると、機械可読形式で出力できます。

詳しくはdocs/CLI.mdをご覧ください。

  • 複数のプロジェクト、モデル、クライアントへの絞り込み
  • CSVおよびJSONへのエクスポート
  • Claude Codeの30日間のクリーンアップ後も履歴を保持する方法と、2台のマシンのデータをマージする方法
  • キャッシュのコスト効率
  • 実行レートと予測を含む予算
  • スクリプトやアラート向けの単一の値と終了コード
  • プロジェクト×日ごとの内訳、傾向、期間比較、ページング

コストの報告方法

コストが複数の値を混ぜ合わせた単一の数値になることはありません。すべての数値には基準が付いています。

基準意味
reportedクライアントがコストを通知しました。OpenCode が該当します。正確な値です。
estimatedバージョン管理された料金表に基づいて算出しました。Claude Code はコストを記録しません。
unavailable信頼できる数値を算出できませんでした(例:そのモデルの価格がない場合)。

これらに加え、すべてのレポートでは、モデルの料金表エントリがないレコードの件数を集計します。これにより、実際に無料のモデルと、価格が設定されていないモデルを区別できます。クライアントが独自のコストを報告する場合、価格未設定のモデルについて通常どおり $0 を記録しますが、これだけでは無料の場合とまったく同じに見えてしまいます。

opencode  --  6,841 records, 280 sessions
  Cost (reported by client, exact): $0.48  [6,841 records]
  No estimate attempted for 6,813 record(s) -- no price in table builtin-2026-10-23 for
  that model: big-pickle, gpt-5.5, z-ai/glm-5.2 and 16 more. Any $0 above covers only what
  was reported, not those records.

--json と MCP の structuredContent では、これらは cost.unpricedRecords と cost.unpricedModels です。呼び出し側から価格設定済みモデルのリストが渡されていない場合、どちらも 0 ではなく存在しません。「尋ねていない」ことと「該当なし」は同じではありません。

Claude Code の数値は「API 換算の推定コスト」です。つまり、これらのトークンを Anthropic API の定価で使用した場合のコストです。Claude Pro または Max のサブスクリプションを利用している場合、リクエストごとの限界費用は**$0**であり、この数値は実際に支払った金額ではありません。これはワークロードの比較には役立ちますが、請求額の照合には使えません。

報告されたコストと推定コストは別々の行に表示され、合算してはいけません。

キャッシュトークンには入力とまとめて課金するのではなく、適切な料金が適用されます。

  • キャッシュの読み取りは、ほとんどのモデルで入力料金の0.1倍、Opus 5.5/Sonnet 5.5では0.05倍、Fable 5.1/Mythos 5.1では0.025倍で課金されます。
  • キャッシュの書き込みは、TTLが5分の場合は1.25倍、TTLが1時間の場合は2倍で課金されます。

この2種類のキャッシュ書き込みTTLは、実際にはどちらも頻繁に使われるため、別々に記録しています。このパッケージの開発に使用したマシンでは、キャッシュ書き込みトークン27.2Mのうち18.0Mで1時間のTTLが使われていました。そのため、料金を平均するとコストを大幅に過小評価してしまいます。

価格が設定されているモデル、公開後のモデルに価格が自動設定される仕組み、価格を自分で追加または修正する方法については、docs/PRICING.md を参照してください。

ここでのトークン数が信頼できる理由

どちらのソース形式も内部仕様で、ドキュメント化されていません。また、どちらにも額面どおりに受け取ると数値が大きく狂う落とし穴があります。このツールでは、次のように対処しています。

  • Claude Code はコンテンツブロックごとに1行を書き込み、累積した output_tokens を含む同じ usage オブジェクトを繰り返します。 これらの行を合計すると、トークンクラスに応じて数値が2.15~3.05倍に膨らみます(測定結果)。requestId と message.id でレコードを重複排除し、各フィールドの最大値を採用します。
  • usage.iterations[] はすでにトップレベルの合計に含まれているため、合計には加えません。
  • サブエージェントのターンは別ファイル(<session>/subagents/…)にあり、実際には一度も設定されない isSidechain フラグでは判別できません。 パスに基づいて分類します。
  • <synthetic> はモデルではないため、除外します。
  • OpenCode の session 集計列は古くなっている場合があります。 これはキャッシュされた集計値で、開発用マシンでは4セッション分の入力トークン545,977個が失われていました。このツールは代わりに message 粒度のデータを読み込みます。このデータは、独立した part テーブルとバイト単位で一致することが確認されています。OpenCode 2.x ではこの粒度のデータは session_message に書き込まれ(part 行は書き込まれなくなり)ます。そのため、新しいターンには照合できる2つ目のテーブルがありません。
  • 推論トークンの意味はクライアントによって異なります。 Claude Code では思考トークンは output_tokens の_内側_に含まれますが、OpenCode では reasoning は output の_兄弟_項目です。それぞれのクライアントに応じて合計を計算するため、推論トークンが二重にカウントされることはありません。
  • キャッシュトークンは他のすべてをはるかに上回ります(キャッシュ読み取りが800M、入力が24Kという比率は実際にあります)。そのため、トークンクラスは常に個別に表示し、ひとまとめの合計として示すことはありません。

ai-usage verify を実行すると、自分で確認できます。このコマンドは、コレクターと集計コードを共有しない_独立した2つ目の実装_で両方のソースを再読み込みし、その結果をデータベースと比較します。

== opencode ==
  MATCH    opencode.db message grain (what we collect)
  MATCH    opencode.db part/step-finish grain (independent corroboration)
  INFO     opencode.db session rollup grain (what `opencode stats` headline shows)
           delta:  input -545,977 ...

== claude-code ==
  MATCH    claude JSONL, deduped by stop_reason line (independent rule)
  INFO     claude JSONL, naive sum of every usage line (NOT used — shows the double count)
           delta:  cache-read 990,824,820 ...

RESULT: every client reconciles exactly against at least one independent read of its source.

verify は最初に同期を行い、共有のカットオフ時点より前のアクティビティだけを比較します。読み込み中も両方のクライアントがそれぞれのストアにデータを追加するため、カットオフを設けないと、ソース側が常に数件のリクエスト分だけ先行して見えてしまいます。

ソースにまだ残っているセッションだけを比較します。どちらのクライアントも独自に履歴を削除します。Claude Code は既定で30日間の cleanupPeriodDays が経過するとトランスクリプトを削除します。一方、ローカルデータベースには収集済みのデータが残るため、1か月後にはデータベースにソースより多くのデータが正当に保持されていることがあります。こうしたセッションは不一致として数えるのではなく、別の Retained, not compared 行に表示されます。データベースにないソースレコードがあれば、ソース側の範囲は狭められないため、チェックは失敗します。

サブエージェントのターン

サブエージェントのターンは実際に費用が発生するため、既定で含まれます。すべてのレポートに含めたかどうかが示され、--no-subagents / includeSubagents: false で除外できます。session_usage では、メインとサブエージェントの内訳が常に個別に表示されます。


マシン上にとどまるもの

すべてです。 使用状況データがマシンの外に送信されることはありません。

  • テレメトリ、分析、クラッシュレポート、ホームへの通信はありません。
  • クラウド同期、アカウント、API キーはありません。このツールが LLM API を呼び出すことはありません。
  • 外部へのリクエストは2つあります。どちらも公開ファイルへの通常の GET リクエストで、使用状況データや識別子は送信されません。どちらも1日あたり最大1回で、AI_USAGE_NO_UPDATE_CHECK=1 で無効になります。
    • 更新チェックでは、npm レジストリから公開済みの最新バージョン番号を取得します(ai-usage status の実行時、およびハンドシェイク後に MCP サーバーがバックグラウンドで実行)。
    • 価格の更新では、組み込みのテーブル以降にリリースされたモデルの価格を取得できるよう、LiteLLM の公開価格リストをダウンロードします(ai-usage sync の実行時、およびハンドシェイク後に MCP サーバーがバックグラウンドで実行)。AI_USAGE_NO_PRICING_REFRESH=1 を設定すると、このリクエストのみ無効になります。
  • 会話の内容がデータベースに読み込まれることはありません。 コレクターが抽出するのは、トークン数、モデル ID、タイムスタンプ、セッション ID、プロジェクトパスです。プロンプト、完了内容、ツールの入力、ファイルの内容は読み込みません。
  • ソースデータは読み取り専用で開きます。実行中の OpenCode に影響を与えることはありません。コレクターは読み取り専用の接続でデータベースを開き、それに失敗した場合に限り、一時的なスナップショットコピー(.db + -wal + -shm)を使用します。
  • すべてのデータは、ローカルの SQLite ファイル1つに保存されます。
~/.local/share/ai-usage-mcp/usage.db          # override with AI_USAGE_DB

そのファイルを削除すれば、このツールが把握している情報はすべて消去されます。

注:データベースのパスでは意図的に XDG_DATA_HOME を無視しています。たとえば VSCode snap のようなサンドボックス化されたランチャーは、独自の XDG_DATA_HOME を設定します。その結果、開発マシンでは OpenCode の履歴が2つのデータベースに分かれてしまいました。MCP サーバーと CLI は、常に同じファイルを使用する必要があります。


トラブルシューティング

docs/TROUBLESHOOTING.md では、次の項目について説明しています。

  • コレクターが利用不可と報告された
  • 数値が opencode stats より小さい
  • 追加のストア
  • /mcp でサーバーが失敗として表示される
  • node-gyp エラー
  • 推定値のないモデル
  • 再同期後に合計が変わった
  • 新しいターンが発生していない間も書き込みを続けるクライアント

開発

npm install
npm run check          # typecheck, lint, format check, build, tests -- what CI runs

個別に実行する場合:

npm run typecheck      # tsc, covering src and tests
npm run lint           # eslint (type-aware)
npm run format         # prettier --write
npm run build          # emit dist/
npm test               # collectors, services, formatter, MCP integration, parity, packaging
npm run test:coverage  # with coverage report

アーキテクチャ — 最も重要な原則は、MCP はデータの取得元を把握しないことです。

MCP tools ─┐
           ├─> UsageService ─> collectors ─> Claude Code JSONL / OpenCode SQLite
debug CLI ─┘        │
                    └─> local SQLite

ビジネスロジックは src/services/ にあります。MCP ハンドラーと CLI コマンドは、どちらも UsageService を利用する薄いフロントエンドであり、共通のフォーマッターを通して出力します。

2つのソースについて、実データを調査して修正が必要だった内容も含め、ディスク上の形式を検証した結果は docs/DATA_SOURCES.md を、リリース手順は docs/PUBLISHING.md をご覧ください。

コントリビューション

Issue やプルリクエストを歓迎します。このプロジェクトで特に重視する点は2つあります。

  1. 数値を決して捏造しないでください。 ソースに記録されていない情報は、ゼロではなく利用不可として示す必要があります。
  2. 変更がコレクターに関わる場合、ai-usage verify の差分は引き続きゼロでなければなりません。 また、ディスク上の形式の解釈方法を変更する場合は、同じ変更で docs/DATA_SOURCES.md も更新してください。両方のソース形式は内部向けでバージョン管理されていないため、実際に確認された内容を記録しているのはこのファイルだけです。

npm run check で CI の全チェックを実行できます。CONTRIBUTING.md には、セットアップ、構成、プルリクエストのチェックリストが記載されています。

リンク

ライセンス

MIT — LICENSE をご覧ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。