Skip to main content
Glama
ddyy

tokenarchive

by ddyy

tokenarchive

AIコーディング利用状況の日次スナップショットを、永久に保存します。

ダッシュボード: デバイスごとの健全性、合計、日次コストの推移

ccusage は、Claude Code、Codex、Geminiなどのコストを教えてくれますが、それはマシン上のログが存在する範囲に限られ、ログはローテーションされます。tokenarchiveはccusageレポートを1日1回スナップショットし、すべてのスナップショットを追記専用のJSONアーカイブとして保持し、そこからダッシュボードを描画します。オプションで、Cloudflare Workerがアーカイブのコピーをマシン外にパスキーで保護して保持します。

ここでは2つの原則がすべてを形作ります:

  • 何も消去されません。 スナップショットがアーカイブであり、すべてのデータベースはそこから再構築できる派生コピーです。

  • 不在はゼロとして報告されません。 スナップショットがない日はその旨が示されます。$0.00は、私たちが確認して支出がゼロだったと主張することになります。

クイックスタート (macOS)

npx tokenarchive

インストーラーはデバイス名とオプションのWorker URLを求め、ランタイムを~/.local/share/tokenarchive/appに配置し、日次ジョブ(23:50とログイン時毎回 — スクリプトは冪等)をスケジュールし、securityに取り込みトークンをプロンプト表示させてインストーラーの手を経由しないようにし、実際の実行で全体を検証します。再設定はいつでも再実行できます。--uninstallはアーカイブ以外のすべてを削除します。

スナップショットは~/.local/share/tokenarchive/{device}/{date}.jsonに保存されます。何もインストールせずに一度試すには:

git clone https://github.com/ddyy/tokenarchive && cd tokenarchive && ./snapshot.sh

他のプラットフォーム: スケジューリングの接着部分以外はすべてポータブルです。sync.js、インポーター、ダッシュボードはプレーンなNodeです。snapshot.shをsystemdタイマーやcronジョブに移植すれば、残りはそのまま動作します。

Related MCP server: opencode-export

ダッシュボード

generate-dashboard.jsは、フレームワークもサーバーも外部リクエストもない、単一の自己完結型HTMLファイルを生成します。まず新しいスナップショットをローカルのSQLiteリードモデルにインポートし(import-snapshots.js)、再生成をインクリメンタルにします。

すべてのパネルはフィルターです: モデル、デバイス、エージェント、日、請求期間をクリックまたはドラッグすると、ページの残りが追従します(⌘で選択に追加、⇧で拡張)。フィルターはANDで次元を横断して合成され、URLフラグメントに保持されるため、ビューをブックマークできます。

表示切り替え — 合計の上、およびスクロールで見えなくなった後のスティッキーバーにも — ページ全体をドルまたはトークンで測定します: チャートとその軸、カバレッジの網掛け、請求期間、そしてすべてのリスト(それに合わせて並び替え)。行にホバーすると、省略された完全な名前、コスト、トークン、100万あたりの暗黙レート、画面に表示されているものに対する割合、プロジェクトの場合はセッション数とその期間が表示されます:

行ホバー詳細

カバレッジストリップは暦日ごとに1セルを表示するため、ギャップはギャップとして見えます — スナップショットがない日はゼロ使用日として描画されることはありません:

カバレッジストリップ

複数デバイス

アーカイブはファイルシステムレベルからデバイスごとに分割されています: スナップショットは{data}/{device}/{date}.jsonに置かれ、すべてのデータベース行はデバイスを保持し、インポートはupsertのみです。したがって、マシンが互いにマージしたり上書きしたりすることはなく、両方のマシンのファイルを1つのデータディレクトリに置くものはすべて、結合アーカイブを提供します — Worker、同期フォルダー、コピーされたディレクトリはすべて同じように機能します。

健全性はデバイスごとに判断されます: それぞれが独自の緑/黄/赤のドット、独自の最終スナップショット日付、独自の欠落日リストを持ちます。したがって、現在のマシンが静かになった別のマシンを隠すことはできません。報告を停止したデバイスはその履歴をすべて保持します — アーカイブは決して消去せず、ギャップを示すだけです。

以下のWorkerは、ファイルを手動で移動せずにこれを行う方法です。

Worker (オプション、推奨)

worker/ディレクトリは、スナップショットのプッシュを受け入れ、WebAuthnパスキーの背後でD1から同じダッシュボードを提供するCloudflare Workerです。生のスナップショットはR2にそのまま保持されます — それがビューではなくバックアップである理由です: /admin/replayはラップトップなしでバケットからD1を再構築できます。デプロイの5コマンドについてはworker/README.mdを参照してください。

デプロイ後、/auth/でパスキーを登録します — 最初のパスキーがアーカイブを主張します。別のデバイスのパスキーを追加するにはサインインが必要です。次に/adminでデバイスごとの取り込みトークンを生成し(トークン表示にはセットアップ手順が含まれます)、日次スナップショットジョブが自動的にプッシュします。同期しないマシンは何も失いません: ディスク上のファイルがアーカイブであり、次の成功した同期が追いつきます。古いプッシュは新しいデータを上書きできません — 取り込みは最新のスナップショットを保持します。

/adminは残りを管理します: 取り込みトークンと読み取り専用MCPトークン(一度だけ表示され、デバイスごとに失効可能)、セッションキーのローテーション、スナップショットのインベントリ、およびR2のオリジナルからD1を再構築する/admin/replay。

2台目のマシンを追加するには、同じWorker URLでインストーラーを実行し、独自の取り込みトークンを発行します — トークンは発行されたデバイスとしてのみ取り込むため、あるマシンが別のマシンとして書き込むことはできず、1つを失効させても他には影響しません。

MCP

エージェントに自分の利用状況を尋ねます。2つのサーバー、同じ4つの読み取り専用ツール(usage_summary、usage_by_project、usage_by_day、archive_health)、1つの共有実装:

  • ローカル、このマシン上のSQLiteアーカイブ上:

    claude mcp add tokenarchive node /path/to/tokenarchive/mcp-server.js
  • リモート、アーカイブを保持しないマシン向けにWorkerの/mcpで提供。/adminでmcpトークンを発行し、次に:

    claude mcp add --transport http tokenarchive https://YOUR-WORKER/mcp \
      --header "Authorization: Bearer YOUR-TOKEN"

構造上読み取り専用: 書き込み、削除、書き換えを行うツールはありません。

設定

すべて環境変数で上書き可能で、必須のものはありません:

変数

デフォルト

TOKENARCHIVE_DATA

~/.local/share/tokenarchive

TOKENARCHIVE_DB

{data}/tokenarchive.db

TOKENARCHIVE_DEVICE

短いホスト名

TOKENARCHIVE_URL

未設定 — 同期なし

TOKENARCHIVE_TOKEN

未設定 — ログインキーチェーンから読み取り(tokenarchive-ingest)

テスト

bash test/run.sh

ほとんどのスイートは密閉されています。3つ(static、interaction、tooltip)は、最後に生成した~/.local/share/tokenarchive/index.htmlのダッシュボードに対して実行されるため、マシンに実際のアーカイブが必要です — 最初にスナップショットを一度実行してください。

ライセンス

MIT

Related MCP Connectors

Related MCP Servers