AI-тестировщик веб-приложений: токен-голод MCP vs CLI, опыт оптимизации | AiManual
AiManual Logo Ai / Manual.
03 Май 2026 Гайд

Как создать AI-тестировщика веб-приложений: опыт борьбы с токен-голодом Playwright MCP и сравнение с CLI

Разбор проблемы расхода токенов Playwright MCP (50-60x больше, чем CLI) и практическое создание open-source инструмента для AI-тестирования. Бенчмарк токенов, а

Вы тестируете сайт, но ваш 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 0004 20068x
Корзина (2 страницы)720 00011 50063x
Оформление заказа (3 страницы + скриншоты)2 100 00024 00088x

Причина такого разрыва — не только скриншоты. 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 MCPPlaywright 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-тестировщик с контролем бюджета. Если у вас есть идеи или вы хотите контрибьютить — добро пожаловать.

💡
Главный урок, который я вынес: не верьте маркетингу MCP как универсальному решению. Для рутинных тестов CLI в 2026 году остаётся на порядок дешевле. А MCP используйте точечно, как швейцарский нож — только когда нужно резать сложно.

Не повторяйте моих ошибок — проверяйте расход токенов на первом же прогоне. И да, я всё ещё сам пишу много тестов руками, просто теперь точно знаю, когда можно довериться AI, а когда — дешевле сделать обычный assert.

Подписаться на канал