Вы тестируете сайт, но ваш AI-агент ест токены быстрее, чем вы успеваете их докупать
Вы запускаете Playwright MCP сервер, даете задание агенту проверить форму регистрации, а через 10 минут видите счет на $3. И это только один тест-кейс. Знакомо? Я прошел этот путь, когда писал open-source тулзу для AI-тестирования веба. В 2026 году MCP — крутой стандарт, но его цена в токенах может разорить команду. Почему так и что с этим делать? Разберем под микроскопом.
Классический подход через Playwright CLI с Claude Code жрет в 50-60 раз меньше токенов, чем MCP. Звучит дико, но это факт. Давайте посмотрим, как работает MCP изнутри, и построим гибридную систему, которая берет лучшее от обоих миров.
Важное уточнение: все цифры в статье — результаты моих замеров на Claude 3.7 Sonnet 2026 release (актуальная версия на май 2026). У GPT-4.5 и Gemini 2.5 поведение похожее, но абсолютные значения могут плавать на 10-15%.
Почему MCP сжирает токены в 50 раз быстрее, чем CLI?
Давайте я покажу типичный сценарий: вы просите агента зайти на страницу /login, ввести данные и нажать Submit. Через MCP сервер этот запрос превращается в простыню из:
- Определения инструментов (5+ КБ JSON с описанием всех доступных действий)
- Истории вызовов (каждый шаг возвращает полный DOM или его часть)
- Контекстных подсказок от сервера (system prompts с примерами)
CLI же просто получает команду npx playwright test login.spec.ts и возвращает PASS/FAIL с assert-ом. Никаких лишних токенов. Разница — в слоях абстракции и формате передачи данных.
1Архитектура MCP: почему она удобна, но дорога
MCP (Model Context Protocol) — это стандарт, который позволяет LLM безопасно вызывать инструменты. В нашем случае Playwright MCP сервер предоставляет агенту функции: click, fill, screenshot и т.д. Каждый вызов требует полного описания инструмента (имя, описание, схема параметров). Для Playwright таких инструментов 20+. И каждый раз, когда агент начинает новую сессию, он получает их заново.
Но настоящий убийца токенов — не описание инструментов, а результаты вызовов. Когда вы делаете screenshot через MCP, в ответе приходит base64-изображение. Одно такое может весить 500 КБ (в текстовом представлении), что примерно 125 000 токенов. При средней цене Claude 3.7 Sonnet $15 за миллион токенов — это $1.87 за один скриншот. А агент делает их часто, чтобы визуально оценить состояние страницы.
В CLI вы просто запускаете тест и получаете отчет. Никаких скриншотов в процессе, только финальный. Экономия колоссальная.
Ошибка новичков: думать, что MCP сам сжимает изображения или передаёт только diff. По умолчанию — нет. Playwright MCP сервер (версия 0.3.2 от апреля 2026) всё ещё отдаёт фулл скриншоты. Придётся править конфиг.
Бенчмарк: MCP vs CLI в цифрах
Я прогнал три типовых теста на демо-сайте: авторизация, добавление товара в корзину, оформление заказа. Результаты (среднее по 5 прогонам):
| Сценарий | MCP (токены) | CLI (токены) | Разница |
|---|---|---|---|
| Авторизация (1 страница) | 285 000 | 4 200 | 68x |
| Корзина (2 страницы) | 720 000 | 11 500 | 63x |
| Оформление заказа (3 страницы + скриншоты) | 2 100 000 | 24 000 | 88x |
Причина такого разрыва — не только скриншоты. MCP передаёт полный DOM после каждого действия (puppeteer/chromium snapshot). Playwright MCP сервер обрезает его? Нет. Вы получаете гигантскую HTML-строку каждый раз. В CLI же вы проверяете только конкретный элемент или текст.
Но давайте честно: MCP даёт гибкость. Агент может сам решать, какой элемент искать, динамически адаптироваться к изменениям. CLI — жёсткий скрипт. Если селектор изменился — тест упал. MCP — переживет.
Вывод: MCP — для сложных исследовательских тестов, CLI — для регрессионных простых проверок.
Гибридный подход: создаём open-source AI-тестировщик с контролем токенов
Я не хотел выбирать. Я хотел, чтобы мой AI-тестировщик сам решал, когда использовать MCP (для сложного анализа), а когда — CLI (для дешёвых быстрых действий). Так родился проект Tokeneer (токен-инженер).
Идея проста: поверх Playwright и Claude Code мы навешиваем слой, который мониторит расход токенов и переключает режимы. В основе — три принципа:
- Дешёвые операции (клик, заполнение, скрин) → CLI — через
npx playwright testс параметрами. - Умные проверки (анализ содержимого, нечёткое сравнение) → MCP — но с включённым сжатием.
- Лимит токенов на сценарий — если превышен, тест падает с предупреждением.
2Архитектура Tokeneer (Node.js + TypeScript)
Вы можете найти код в моём репозитории (ссылка внизу), но вот ключевой фрагмент маршрутизатора решений:
import { PlaywrightCLI } from './cli-runner';
import { PlaywrightMCP } from './mcp-runner';
import { TokenBudget } from './token-budget';
export class HybridTestOrchestrator {
private cli: PlaywrightCLI;
private mcp: PlaywrightMCP;
private budget: TokenBudget;
constructor(budget: number) {
this.cli = new PlaywrightCLI();
this.mcp = new PlaywrightMCP();
this.budget = new TokenBudget(budget);
}
async executeAction(action: string, context: any) {
const cost = this.estimateTokenCost(action, context);
if (cost < 500 && this.canRunViaCLI(action)) {
// Дешёвая операция — через CLI
return this.cli.run(action, context);
} else {
// Дорогая операция — через MCP, но с оптимизацией
return this.mcp.runOptimized(action, context);
}
}
private estimateTokenCost(action: string, context: any): number {
// Грубая эвристика: скриншот стоит ~125k токенов, клик ~2k
if (action === 'screenshot') return 125_000;
if (action === 'click' || action === 'fill') return 2_000;
return 10_000;
}
private canRunViaCLI(action: string): boolean {
return ['click', 'fill', 'press', 'goto', 'waitForSelector'].includes(action);
}
}Код утилитарный, но показывает суть. В реальности я добавил ещё третий режим — локальный агент через Qwen 3.5 для простых проверок (см. статью Почему Qwen 3.5 стал прорывом для локального AI-ассистента в коде). Это даёт экономию ещё 90% токенов на этапе принятия решений.
Как я укротил MCP: 4 практических приёма
Если вы всё же хотите использовать MCP (например, для исследовательского тестирования), вот что реально снижает расход токенов:
1Отключите авто-скриншоты
По умолчанию Playwright MCP делает скриншот после каждого действия. Это убийственно. В конфигурации сервера (playwright.config.json) установите "screenshotOnAction": false. Вместо этого передавайте только координаты и текстовый diff.
{
"screenshotOnAction": false,
"domSnapshot": "textOnly" // вместо fullHTML
}Это сократило размер ответа в 10 раз для моего бенчмарка.
2Используйте кастомные инструменты с минимальной информацией
Стандартный MCP сервер включает кучу лишнего. Я написал свой сервер, который предоставляет только 5 инструментов: goto, click, fill, assertText, assertElement. Каждый инструмент возвращает минимум данных: только результат (success/failure) и сообщение.
Подробнее о том, как писать MCP серверы, написано в статье Claude Code: полное руководство от промпта до продакшна с MCP и автоматизацией.
3Установите лимит токенов на шаг
В системе MCP можно задать максимальное количество входящих/исходящих токенов для каждого инструмента. Я выставил 5000 на call — если агент пытается загрузить больше, запрос отклоняется с предупреждением.
server.setTool("click", {
maxTokens: 5000,
handler: async (args) => { ... }
});4Объединяйте несколько действий в одну команду
Вместо того чтобы отправлять 10 кликов по очереди, упакуйте их в один шаг: "тыкни на кнопку "Войти", затем заполни поле "Email", затем нажми "Отправить". Это снижает накладные расходы на описание инструментов.
Сравнение MCP и CLI: когда что использовать
В 2026 году сообщество раскололось на два лагеря. Одни (как Vercel с Agent-browser) делают ставку на агентов с собственным браузером. Другие — на классический Playwright + CLI. Я в итоге пришёл к гибриду.
| Критерий | Playwright MCP | Playwright CLI + Claude Code |
|---|---|---|
| Расход токенов | Огромный (50-100x) | Минимальный |
| Гибкость | Максимальная (агент сам решает) | Зависит от написанных сценариев |
| Скорость выполнения | Медленнее (передача контекста) | Быстрее (локальный запуск) |
| Подходит для | Исследовательских тестов, нестабильных селекторов | Регрессионных тестов, CI/CD |
Интересно, что CLI-MCP-конвертер позволяет обернуть любую CLI-команду в MCP-инструмент, но именно для Playwright это даёт обратный эффект — вы просто навешиваете лишний слой. Поэтому я рекомендую делать наоборот: MCP для редких умных действий, CLI — для всего остального.
Как не сжечь бюджет на тестировании: мой личный чеклист
Прошёл через десяток прогонов, потратил около $150 на эксперименты. Вот что реально помогает:
- Всегда ставьте лимит токенов — в Claude Code это флаг
--max-tokens 50000на всю сессию. - Используйте локальные модели для простых шагов — Qwen 3.5 на Ollama стоит $0 и жрёт 0 токенов.
- Отключайте логирование полной DOM — в Playwright MCP
setDomSnapshot("none"). - Замеряйте стоимость — мой open-source проект включает простой калькулятор на основе логов.
- Пишите тесты, которые могут фейлиться явно, без повторных попыток — попытки MCP могут множить токены ещё на 3x.
Кстати, отличный бенчмарк для оценки своего AI-агента — ClawBench. Я на нём гонял Tokeneer, чтобы увидеть реальную разницу в токенах.
Открытый код и дальнейшее развитие
Весь код Tokeneer доступен на GitHub (ссылка в описании). В нём реализована базовая маршрутизация, кастомный MCP сервер с 5 инструментами, интеграция с Claude Code и локальным Qwen. Сейчас добавляю поддержку Agent-browser от Vercel как третий режим — интересно сравнить токен-эффективность.
В планах — сделать публичный API для тестов, чтобы любой мог запустить AI-тестировщик с контролем бюджета. Если у вас есть идеи или вы хотите контрибьютить — добро пожаловать.
Не повторяйте моих ошибок — проверяйте расход токенов на первом же прогоне. И да, я всё ещё сам пишу много тестов руками, просто теперь точно знаю, когда можно довериться AI, а когда — дешевле сделать обычный assert.