context-tax считает, во что обходится контекст Claude Code

Автор context-tax замерил на одной реальной машине, что один встроенный инструмент Claude Code весит 11 402 токена из 47 700 в первом запросе. Выходит почти четверть всего, что уходит в модель до вашей первой реплики. Цифру получили напрямую: интерактивную сессию запустили дважды, с правилом permissions.deny для этого инструмента и без него.
Такой учёт утилита, показанная на Show HN, ведёт сама. Запускается она одной командой npx context-tax: без установки, аккаунта, телеметрии и вызовов LLM. Код и подробное описание лежат на GitHub. Автор замечает, что все статьи про раздутый MCP-контекст кончаются одинаково: проверьте, какие инструменты агент правда вызывает, и уберите остальное. Делать это предлагают руками, а context-tax этот совет автоматизирует.
Откуда берутся цифры
Свежие версии Claude Code пишут в транскрипт сессии, что именно ушло в модель: список навыков в том виде, в каком его отправили, имена инструментов, каждый файл инструкций, собственные инструменты клиента и его системный промпт. Утилита читает эти записи и не гадает по конфигу. Из тех же транскриптов, со всей машины, она достаёт блоки tool_use, то есть реальные вызовы, а потом перемножает одно на другое. Если подходящей сессии на машине нет, строки оцениваются по конфигу, и отчёт пишет об этом под таблицей.
Итог на ход точный. Он равен медиане первого запроса по usage, за который вам выставили счёт, по десяти последним сессиям (окно меняется флагом --window). Строки внутри итога оцениваются по тексту из расчёта четыре символа на токен. Автор заранее зафиксировал это соотношение и потом проверил: подключение одного MCP-сервера к реальному промпту Claude Code стоило 912 токенов при прогнозе 948, расхождение в пределах 4%. Остаток между точным итогом и оценками выведен отдельной строкой unattributed и по строкам не размазан. Если сумма строк когда-нибудь превысит оплаченный итог, программа сообщит об ошибке оценщика и завершится с ненулевым кодом, отрицательного остатка вы не увидите.
Ещё одна деталь из раздела про доверие к цифрам. Claude Code записывает один ответ API несколькими строками транскрипта, по строке на блок контента, и в каждой повторяет usage ответа. Версии до 0.4.0 считали строки, поэтому число ходов и стоимость вызова у них выходили примерно вдвое выше правды. С 0.4.0 каждый ответ учитывается один раз, по его id.
Прочерк и ноль в таблице означают разное. Прочерк ставится серверу, который настроен, но выключен: его не запускали, и вес неизвестен. Ноль получает сервер, к которому сессия пыталась подключиться и не смогла. Он ничего не отправил, находки по нему нет, а строка помечена could not connect. Долларов в отчёте нет совсем: автор считает, что неверная сумма в долларах убеждает сильнее неверного числа токенов.
Чтобы узнать вес сервера, его приходится запустить. Утилита делает то же рукопожатие initialize и tools/list, что агент при старте сессии, по stdio, streamable HTTP или старому SSE. Схемы кешируются на неделю с ключом по именам переменных окружения, без их значений. Проектные серверы не запускаются из каталога, где вас нет, потому что так пришлось бы исполнить код из чужого репозитория. Флаг --no-spawn обходится кешем и встроенной таблицей для известных серверов.
Как читать пример
Все числа и имена в README автор выдумал для иллюстрации на несуществующем конфиге, настоящий там только рендерер. В примере 96 сессий, 42 900 ходов и 1,7 миллиарда токенов перенесённого контекста. На каждый ход до первого слова уходит 40 000 токенов, 20% окна примерно в 200 000. Долю окна утилита печатает, только если сессия доказала размер окна. Иначе процента нет, «потому что процент от предполагаемого окна это догадка с десятичной точкой».
Самая крупная строка принадлежит самому клиенту. Четырнадцать встроенных инструментов занимают 22 000 токенов (55%), системный промпт 3 200, а все MCP-серверы вместе 2 600, около восьмой части веса встроенных инструментов. Почти всё в блоке CLAUDE CODE ITSELF выключить нельзя. Исключение составляют инструменты: правило в permissions.deny убирает инструмент из отправляемого.
Колонка, ради которой утилиту стоит запустить, называется per call. Стоимость сервера делится на число его использований. У sentry в примере 400 токенов на ход, 42 900 ходов и один вызов: 400 × 42 900 = 17 160 000 токенов постоянной платы за одно использование. У linear 300 токенов на те же 42 900 ходов при трёх вызовах дают 4 290 000. Автор объясняет, почему считает именно так: итоговая сумма у всех выглядит как неизбежные расходы, а цена за использование читается как счёт.
У linear в примере эта цифра помечена как верхняя граница. Возраст сервера берётся из git log, а для плагинов из записи об установке, но никогда из mtime: git checkout переписывает время файлов, и на свежем клоне каждый сервер выглядел бы добавленным сегодня. Серверам из ~/.claude.json дату взять неоткуда, их возраст объявляется неизвестным, и знаменатель считается по всем сессиям в истории. По той же логике claude mcp remove -s user, который снимает сервер во всех проектах, никогда не советуется по молчанию одного проекта. Рычаги для всей машины утилита оценивает по истории всей машины, проектные по истории проекта.
Два счёта за один сервер
Колонка deferred появилась из той же проверки соотношения символов и токенов. Текущий Claude Code не кладёт в промпт схемы инструментов MCP-сервера. Он отправляет имена инструментов и инструкции сервера, а схему подгружает, когда она понадобилась. Поэтому у сервера две цены, которые платятся в разное время: постоянная на каждый ход и отложенная при загрузке схем. У github в примере это 700 токенов на ход и ещё 3 680 за схемы.
Раньше всё было тяжелее. В ноябре 2025 года в issue #11364 к claude-code пользователь davidmoneil насчитал 67 300 токенов определений инструментов от семи MCP-серверов, 33,7% окна в 200 тысяч. Один GitHub MCP весил около 18 тысяч токенов за 27 инструментов, даже в сессиях без единого обращения к GitHub. По данным MCP.Directory, начиная с Claude Code v2.1.7 Tool Search включён по умолчанию. Встроенные инструменты клиента context-tax тоже оценивает. Находка 8 в примере как раз о них: Workflow (2 300 токенов, 2 сессии из 96) и ScheduleWakeup (2 000, 1 из 96) вместе дают 4 300 токенов на ход.
Навыки без описаний
Когда такое случается, эта находка идёт в отчёте первой: она единственная о том, чего агенту не хватает, остальные о том, за что вы переплачиваете. Claude Code выделяет списку навыков бюджет в 1% окна, считая в символах: 8 000 при окне в 200 000 токенов, 40 000 при миллионе. Имя сохраняет каждый навык, а описания делят то, что осталось. Проигравшие уходят в модель голым именем, по которому модели не из чего выбирать. Навык, поставленный неделю назад, может быть невидим во всех сессиях с тех пор, и на экране этого не видно. В сентябре мы писали о скане skillcrossroads, где «навык не срабатывает» назван проблемой номер один. Здесь причина другая: описание просто не доехало.
В примере 9 из 31 навыка ушли без описания: 7 из 12 у плагина design-kit и 2 из 14 собственных (release-notes, db-migrate). Лимит около 8 000 символов, а списку нужно примерно 11 640. Обычно, пишет автор, свои навыки вытесняет один крупный плагин. Счёт ведётся по списку, который сессия реально отправила, поэтому в него входят и встроенные навыки клиента, которых нет ни в одном файле. Окно утилита не предполагает, а выводит обратно: бюджет лежит между размером отправленного и тем, что потребовало бы самое маленькое выброшенное описание. Отсюда «около» на экране.
Выхода два. Флаг context-tax fix --restore-descriptions ставит skillListingBudgetFraction в 0,015, и все описания проходят ценой примерно 910 токенов на каждом ходу. В обычный fix этот шаг не входит, потому что он единственный делает каждый ход дороже, и уже выставленный более высокий бюджет он никогда не понижает. Второй путь: выключить ненужные навыки и отдать их место нужным. Тут есть ловушка. Пока список превышает бюджет, отключение навыков почти ничего не экономит, освободившиеся символы просто занимает чужое описание.
Что меняет fix
Запись в настройки вынесена в отдельную подкоманду, чтобы до неё нельзя было дойти, добавив одно слово к команде отчёта. Порядок такой: fix --dry-run показывает дифф и останавливается, fix показывает дифф, спрашивает «Write this file? [y/N]», копирует заменяемый файл в ~/.cache/context-tax/backups/ (каталог 0700, файлы 0600) и пишет через временный файл с переименованием. Без терминала на stdin запись идёт только с --yes. Файл, который не парсится, не трогается, потому что обычно это недописанная ручная правка. Повторный запуск отвечает already applied.
У каждой находки свой рычаг. Сервер из .mcp.json попадает в disabledMcpjsonServers в .claude/settings.local.json. Для сервера из ~/.claude.json утилита печатает claude mcp remove с нужным scope и оставляет команду вам: этот файл лежит рядом с API-ключами и bearer-токенами, его не правят и даже не бэкапят, ведь резервная копия стала бы второй копией всех учётных данных. Плагин выключается через enabledPlugins, неиспользуемый встроенный инструмент уходит в permissions.deny, агент без вызовов получает правило Agent(<name>). У списка агентов лимита нет, поэтому эта экономия реальна. Для коннектора claude.ai, который не объявлен ни в одном файле, утилита только подсказывает: /mcp в сессии покажет, откуда он подключён, а выключается он в настройках claude.ai.
В примере из README навык design-review не выключен, а понижен до user-invocable-only: команда /design-review работает, а из промпта уходит только описание. Рядом в диффе видна правка, о которой никто не просил. fix переписывает весь файл с отступом в два пробела, и массив allow, записанный в одну строку, возвращается по элементу на строку. Её оставили в диффе, чтобы вы увидели её до того, как ответите yes.
Цифры экономии в примере расходятся. Отчёт называет 1 900 токенов на ход, которые можно вернуть по восьми находкам. Сам fix записывает 700, и это целиком два сервера, figma и sentry. Linear требует вашей команды claude mcp remove, а два навыка из того же диффа к 700 ничего не добавляют, потому что их место достаётся выброшенным описаниям. Встроенные инструменты отключают уровни: safe по умолчанию снимает то, чем вы не пользуетесь, lean добавляет инструменты Claude Code и плагины, используемые реже чем в одной сессии из 20, max реже чем в одной из 5. Каждая строка говорит, что перестанет работать. После правки первые строки отчёта показывают первый запрос до и после, как только пройдёт новая сессия.
Остальные команды нужны для показа. Команда receipt выдаёт те же итоги без имён серверов, навыков и путей. Команда session рисует одну сессию «пилой»: контекст растёт, клиент сжимает, график падает, но не до нуля. В примере 640 ходов, пик 186 000 токенов, четыре компакции и минимум 41 200 при старте в 40 000. Флаг --svg сохраняет картинку файлом. Работает всё только с Claude Code. Проход measure говорит на чистом MCP, так что поддержка другого клиента сводится в основном к новым resolve и evidence. Каждый проход экспортирован как библиотека, а в зависимостях пусто, что проверяет тест по графу импортов.
Одну вещь утилита не умеет, и пишет об этом в самом отчёте: она знает, сколько стоят ваши CLAUDE.md и файлы памяти, но не знает, какие инструкции из них агент использовал. По логу этого не узнать, нужен доступ к вниманию модели, а не к истории.
Все проверки в пакете автор прогнал мутационно: возвращал баг и ждал, что тест упадёт. Три найденных так бага оказались уверенными нулями, которые на экране выглядели вполне правдоподобно, и все три нашлись при запуске на реальных проектах. Отсюда правило, которое автор называет ловушкой всей категории таких инструментов: «a finding the tool cannot defend line by line is a bug in the tool».
Дальше
Команда Claude Code отдала чтение кода машинам
Команда Claude Code отдала большую часть чтения кода машинам, и с июня по сентябрь слитых pull request стало более чем вдвое больше, а доля откатов упала более чем на 40%. Вы бы пустили в main правку, которую прочёл только Claude, или всё же глянули бы сами?
Читайте также
- /design-sync отучает Claude Design выдумывать кнопки
- 57% субагентов Claude Code наследуют Bash вызвавшего
- Toolog ведёт локальный журнал вызовов Claude Code
- Stemma компилирует CLAUDE.md и AGENTS.md из одного источника
- Portal by Spotify уводит чтение файлов из Claude Code
- Context Engineering Kit: /reflect и спецификации arc42
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите, чтобы оставить комментарий. Он появится после модерации.

