Skip to main content
Glama
flaviozantut

ai-usage-mcp

by flaviozantut

AI Usage Dash

Панель метрик использования AI на работе, с фокусом на точные (оплачиваемые) токены, собираемые автоматически через хуки во время сессии — вам не нужно запускать никакой сборщик, и не нужно держать запущенным сервер.

Три независимых слоя:

  1. Сбор (через хуки) — хуки конца хода записывают точное использование напрямую в локальный файл SQLite (lib/db.mjs). Никакого демона, никакого HTTP.

  2. Хранение — один файл SQLite (metrics.db) через встроенный node:sqlite из Node (без нативных зависимостей, без шага сборки). WAL + busy_timeout позволяют конкурентным писателям-хукам и MCP-читателю безопасно работать с ним.

  3. Запрос/анализ — read-only MCP-сервер (stdio, запускается по требованию клиентом), который потребляют Claude и Cursor для построения графиков (артефакты / canvas).

Контракт событий (src/types.ts) связывает три слоя вместе. Токены — поля первого класса.

Как точный токен появляется автоматически

Работает на 100% локально на вашей машине — хуки — это короткоживущие процессы node, которые открывают файл SQLite, записывают события хода и завершаются. Ничего не слушает порт.

Клиент

Хук

Что делает

Требования

Claude Code

Stop → hooks/claude-code-hook.mjs

Читает transcript_path каждый ход, просматривает транскрипт и извлекает message.usage (точные входящие/исходящие/кэш)

ничего — 100% локально

Cursor

stop → hooks/cursor-hook.mjs

(1) сразу записывает активность хода; (2) с админ-ключом получает точные токены из Admin API

CURSOR_API_KEY для точных токенов

⚠️ Почему Cursor нужен API-ключ. Оплачиваемое количество токенов Cursor не существует на машине: хук Cursor не получает токены, а в локальной БД есть только оценки контекста. Точное число существует только на стороне сервера (Admin API, тариф Team/Business). Хук автоматизирует этот запрос — вам по-прежнему ничего не нужно запускать — но без админ-ключа вы сможете видеть только активность, а не токены.

Related MCP server: MCP Database Bridge

Установка

npm install                 # no native build — uses Node's built-in SQLite
npm link                    # puts the ai-usage-* commands on your PATH
cp .env.example .env

npm link предоставляет каждый инструмент как команду, которую можно вызывать по имени (ai-usage-claude-hook, ai-usage-cursor-hook, ai-usage-mcp, ai-usage-stats, …), поэтому нигде ниже не захардкожен абсолютный путь к этому репозиторию. Каждая команда сама определяет своё расположение, поэтому работает из любой директории. (Не хотите глобальную ссылку? Запускайте их из репозитория через npx ai-usage-<name>, или используйте node ./hooks/<file>.mjs с путём.)

Нет сервиса, который нужно запускать. Хуки пишут в БД напрямую, а MCP-сервер запускается по требованию вашим клиентом. БД по умолчанию находится в metrics.db в корне репозитория; установите IA_USAGE_DASHBOARD_DB_PATH, только если храните её в другом месте:

export IA_USAGE_DASHBOARD_DB_PATH="$HOME/somewhere/metrics.db"   # optional; the commands find the repo DB by default

1. Включите хук Claude Code

Зарегистрируйте хук в ~/.claude/settings.json:

{
  "hooks": {
    "Stop": [
      { "hooks": [{ "type": "command", "command": "ai-usage-claude-hook" }] }
    ],
    "SubagentStop": [
      { "hooks": [{ "type": "command", "command": "ai-usage-claude-hook" }] }
    ]
  }
}

Готово — с этого момента каждый ход Claude Code сам записывает точное использование. Хук молчалив и никогда не блокирует Claude Code; если запись когда-либо не удастся, он просто повторит попытку в следующем ходе.

2. Включите хук Cursor

Создайте ~/.cursor/hooks.json (или <project>/.cursor/hooks.json) — см. пример в hooks/cursor-hooks.example.json:

{ "version": 1, "hooks": { "stop": [{ "command": "ai-usage-cursor-hook" }] } }

Для точных токенов Cursor также экспортируйте админ-ключ (Cursor Dashboard → Settings → Cursor Admin API Keys):

export CURSOR_API_KEY=<cursor-admin-key>

3. Зарегистрируйте read-only MCP (Claude / Cursor)

claude mcp add ai-usage -- ai-usage-mcp

Для Cursor в репозитории уже есть .cursor/mcp.json (запускает npm run mcp из репозитория — путь не нужен).

В клиенте: "используй инструмент token_usage (период 30д, group_by model) и построй столбчатую диаграмму" → артефакт/canvas.

Инструменты запросов (MCP)

Инструмент

Что возвращает

by_task

AI-усилия по задаче/тикету (Jira и т.д.): токены, сообщения, инструменты, ошибки, сессии

token_usage

сумма точных токенов (вход/выход/кэш) + стоимость, по дню/модели/источнику/пользователю/проекту/задаче

latency_stats

задержка на ход: среднее, p50, p95, максимум — по дню или модели

tool_stats

самые используемые инструменты + доля ошибок (ошибки/использования) + веб-поиск/загрузка

stop_reasons

распределение stop_reason (усечения max_tokens, отказы)

productivity

Cursor: доля принятия кода и вкладок, принятые/отклонённые строки

query_usage

количество событий по дню/пользователю/проекту/инструменту/источнику

top_tools

самые используемые инструменты

sessions_summary

сводка по сессиям с длительностью

Метрики, собираемые для каждого события

  • message (Claude Code и Cursor): точные токены, model, и в meta: stop_reason, latency_ms (время хода), n_tools, tools, web_search/web_fetch, gitBranch.

  • tool_use: по одному на каждый вызванный инструмент (питает top_tools/tool_stats).

  • error: по одному на tool_result с ошибкой (знаменатель = tool_use → доля ошибок).

  • productivity (Cursor, ежедневно): добавленные/принятые строки, показанные/принятые вкладки, применения.

Связь задачи (Jira/тикета) с сессией

Каждая AI-сессия связана с задачей, чтобы измерять AI-усилия по тикету. Определение происходит автоматически в начале сессии, в порядке точности:

  1. .dash-task — файл в корне репозитория с ID (явное переопределение).

  2. Git-ветка — ID в стиле Jira в имени ветки (feature/PROJ-123-... → PROJ-123).

  3. Промпт пользователя — упомянутый ID или явный маркер #task PROJ-123 (можно исправить в любое время).

  4. Если ни один из вышеперечисленных не даёт точного результата → хук SessionStart внедряет контекст, инструктирующий Claude спросить пользователя об ID перед началом (best-effort — хук SessionStart не может блокировать, поэтому модель может пропустить вопрос). Независимо от того, задаёт ли он вопрос, ответ перехватывается отдельно хуком UserPromptSubmit, поэтому гарантированные способы задать задачу — это .dash-task, имя ветки или #task PROJ-123.

Задействованные хуки (зарегистрированы в ~/.claude/settings.json):

"SessionStart":    [{ "hooks": [{ "type": "command", "command": "ai-usage-session-task" }] }],
"UserPromptSubmit":[{ "hooks": [{ "type": "command", "command": "ai-usage-task-capture" }] }]

Шаблон ID настраивается через DASH_TASK_PATTERN (регулярное выражение). По умолчанию — стиль Jira (PROJ-123). task_id становится полем первого класса для каждого события; запрашивайте его через by_task или token_usage group_by=task_id.

Слэш-команда /dash_stats

Запрос статистики задачи прямо из Claude Code:

/dash_stats DEMO-100   → stats for the given task
/dash_stats            → uses the ACTIVE task of the current session

Возвращает токены (вход/выход/кэш), сообщения, вызовы инструментов + долю ошибок, p50/p95 задержку, разбивку по моделям и топ инструментов — всё для этого тикета.

Компоненты: команда ai-usage-stats (scripts/task-stats.mjs — определяет задачу и читает локальную БД SQLite напрямую через taskStats() в lib/db.mjs) + команда в ~/.claude/commands/dash_stats.md. Запускайте как ai-usage-stats DEMO-100 (или npm run stats -- DEMO-100 из репозитория). Укажите нестандартную БД через IA_USAGE_DASHBOARD_DB_PATH. Активная задача — это самое последнее состояние задачи в сессии.

Обратное заполнение истории (опционально, запускается один раз)

Хуки собирают данные с этого момента. Чтобы импортировать ВСЮ существующую историю один раз:

npm run collect:claude                       # scans ~/.claude/projects/**.jsonl
CURSOR_API_KEY=<key> npm run collect:cursor

Обе команды идемпотентны (дедупликация по ext_id) — повторный запуск не создаёт дубликатов.

Следующие шаги

  • Стоимость Claude Code (токены × таблица цен по моделям).

  • Фиксированные дашборды (HTML) помимо артефактов по запросу.

  • Миграция SQLite → Postgres (заменить только lib/db.mjs).

  • Сбор с нескольких машин — если БД когда-либо понадобится разместить вне машины, добавьте тонкий ingest-эндпоинт перед insertEvents() (сейчас он работает однопользовательски на машине, напрямую в файл).

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Local-first dashboard + MCP server that parses Claude Code and Codex JSONL files into a SQLite cost / token tracker. Per-MCP and per-tool breakdown, session drill-down, dedup by request_id; never talks to vendor APIs
    5
    87 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Read-only MCP server for querying PostgreSQL, MySQL, and SQLite from AI agents — multi-database, safe by default.
    4
    6 npm
    1
    ISC
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server for SQLite databases, enabling AI assistants to safely query and inspect database schemas without write access.
    MIT