kao273183/mk-qa-master

kao273183/mk-qa-master

от kao273183
MCP-сервер для запуска тестов (pytest, Jest, Cypress, Go) с анализом DOM, историей запусков и AI-коучем. Генерирует тесты по URL, выявляет флаки, предлагает план оптимизации. Полезен QA и разработч...

mk-qa-master logo

MK QA Master

AI 測試大師 — your AI QA loop, from analyze to advise.

English · 繁體中文

PyPI CI Glama score License: MIT Buy Me a Coffee

Universal MCP server for running tests across pytest / Jest / Cypress / Go, with built-in DOM analyzer, run history, and a self-improvement coach. Stable since v1.0.0 (2026-06-02) — see Stability promise below.

A Model Context Protocol server that lets Claude Desktop / Cursor / any MCP client drive your test suite end-to-end: run tests, inspect failures (screenshot + video + trace), analyze a live URL to draft test cases, and — after each run — produce a prioritized action plan telling you exactly what to fix or write next.

QA_RUNNER Framework Language Target
pytest / pytest-playwright / playwright pytest + Playwright Python Web
jest Jest JavaScript Web
cypress Cypress JavaScript Web
go / go-test go test Go Backend
maestro / mobile Maestro YAML iOS + Android
schemathesis / api Schemathesis OpenAPI 3.x / Swagger 2.0 API (since v0.6.0)
newman / postman Newman Postman collection v2.x API (since v0.6.1)

Full design notes: docs/framework.md.

analyze_screen

Mobile 版的 analyze_url:通过 `maestro hierarchy` dump 当前 iOS Simulator / Android Emulator / 实体机 / BlueStacks(通过 QA_ANDROID_HOST)前台 app 的 view tree,再分类成 form(带 hint_text 的输入字段)、cta(enabled + 有文字的可点击组件)、tab_bar(selected 状态 + 同 y 对齐的 2+ 个 tab)三种模块,并附带 candidate_tcs。内置噪声过滤器自动排除 iOS 状态栏 + asset 命名标签(bg_* / *_filled / 纯数字 / 单个 ASCII 字符等),让结果信号集中。需要 Maestro CLI 已安装、设备已启动、app 已在台前。若给定 app_id + launch_app=true,会先用 launchApp 启动再 dump。

Mobile 版的 analyze_url:通过 `maestro hierarchy` dump 当前 iOS Simulator / Android Emulator / 实体机 / BlueStacks(通过 QA_ANDROID_HOST)前台 app 的 view tree,再分类成 form(带 hint_text 的输入字段)、cta(enabled + 有文字的可点击组件)、tab_bar(selected 状态 + 同 y 对齐的 2+ 个 tab)三种模块,并附带 candidate_tcs。内置噪声过滤器自动排除 iOS 状态栏 + asset 命名标签(bg_* / *_filled / 纯数字 / 单个 ASCII 字符等),让结果信号集中。需要 Maestro CLI 已安装、设备已启动、app 已在台前。若给定 app_id + launch_app=true,会先用 launchApp 启动再 dump。

Параметры

  • app_idstring

    選填,bundle id (iOS) / package name (Android),格式如 `com.example.app`。搭配 launch_app=true 使用,或為了在輸出標註是分析哪個 app。

  • launch_appboolean

    搭配 app_id:True 時在 hierarchy dump 前用 maestro launchApp 啟動 app。用 clearState: false(保留 app 狀態),確保看到「真實」起始畫面。省略則假設裝置上 app 已是當前前景。

  • timeout_msinteger

    選填,hierarchy 命令超時毫秒。預設 30000;BlueStacks / 遠端 ADB 較慢,QA_ANDROID_HOST 有設時會自動拉到 60000 起跳。

analyze_stream

v1.1.0 — Edge AI версия analyze_url / analyze_screen. Зондирует RTSP-поток (или путь к файлу для локального mediamtx) и возвращает базовую геометрию (ширина / высота / fps) плюс список candidate_tcs. Когда предоставлен аннотационный sidecar (JSON: ожидаемые обнаружения на кадр), в candidate_tcs добавляется по одной записи на каждый найденный класс И четыре стандартных записи (throughput, latency SLA, reconnect, empty-frame). Только строки — схема та же, что и у candidate_tcs из analyze_url. Чёрный список вендорских хостов (включён по умолчанию): блокирует RTSP-URL на известных доменах камер наблюдения / IoT-камер (Dahua / Hikvision / и т.д.), чтобы случайное зондирование публичных видеопотоков не попало на стандартный путь. Установите `QA_EDGE_ALLOW_VENDOR_HOSTS=true`, чтобы отключить проверку для тестирования собственных камер. Требует дополнений `[edge]` (`pip install "mk-qa-master[edge]"`) — opencv-python выступает драйвером зондирования. Инструмент возвращает `{error: missing_extras, hint}`, когда дополнения не установлены. При успехе возвращает: `{url, width, height, fps, labels, candidate_tcs}`. При отклонении возвращает: `{error: bad_request | forbidden_vendor_host | missing_extras | stream_unreachable, hint, ...}`.

v1.1.0 — Edge AI версия analyze_url / analyze_screen. Зондирует RTSP-поток (или путь к файлу для локального mediamtx) и возвращает базовую геометрию (ширина / высота / fps) плюс список candidate_tcs. Когда предоставлен аннотационный sidecar (JSON: ожидаемые обнаружения на кадр), в candidate_tcs добавляется по одной записи на каждый найденный класс И четыре стандартных записи (throughput, latency SLA, reconnect, empty-frame). Только строки — схема та же, что и у candidate_tcs из analyze_url. Чёрный список вендорских хостов (включён по умолчанию): блокирует RTSP-URL на известных доменах камер наблюдения / IoT-камер (Dahua / Hikvision / и т.д.), чтобы случайное зондирование публичных видеопотоков не попало на стандартный путь. Установите `QA_EDGE_ALLOW_VENDOR_HOSTS=true`, чтобы отключить проверку для тестирования собственных камер. Требует дополнений `[edge]` (`pip install "mk-qa-master[edge]"`) — opencv-python выступает драйвером зондирования. Инструмент возвращает `{error: missing_extras, hint}`, когда дополнения не установлены. При успехе возвращает: `{url, width, height, fps, labels, candidate_tcs}`. При отклонении возвращает: `{error: bad_request | forbidden_vendor_host | missing_extras | stream_unreachable, hint, ...}`.

Параметры

  • rtsp_urlstringобязательный

    Required. The stream to probe. Either an `rtsp://...` URL or a file path that the EdgeInferenceRunner will serve via mediamtx + ffmpeg at setup time.

  • annotations_pathstring

    Optional. JSON sidecar with per-frame expected detections (format: {fps, frames: {frame_idx: [{label, bbox}, ...]}}). When supplied, candidate_tcs lists one entry per discovered label. Missing / malformed files are non-fatal — the tool falls back to label-free candidates.

analyze_url

Проверяет живую веб-страницу в headless Chromium и возвращает структурированную карту тестируемых модулей и API-эндпоинтов, которые страница действительно вызвала. Веб-аналог analyze_screen. Поведение: - page.goto(url) с ожиданием DOMContentLoaded + 5s networkidle - DOM-зонд извлекает пять видов модулей: form (с полями fields[] + флагами required), nav (списки ссылок), dialog (модальные контейнеры), section (подписанные области), cta (кнопки действия, совпадающие с ключевыми словами действий, например 登入/送出/Login/Submit) - У каждого модуля появляется candidate_tcs[] — тестовые сценарии с учётом предметной области, готовые для вставки в generate_test - Записывает каждый fetch/XHR, который страница выполнила, удаляет дубли по (method, path), добавляет специфичные для эндпоинта кандидаты-тесты (401, 404, 4xx, payload-too-large…) - Сканирование переполнения макета: ищет видимые элементы, содержимое которых выходит за пределы контейнера более чем на 2 пикселя по горизонтали / 10 пикселей по вертикали (跑版 / text-overflow) Возвращает: {url, page_title, scanned_at, modules[], api_endpoints[], layout_warnings[]} Когда использовать: - Пользователь хочет тесты для конкретного URL или страницы - Разработка регрессионного покрытия на основе реального пользовательского поведения - Нужны подсказки по покрытию бэкендовых API (api_endpoints[] даёт методы + пути) - Исследование багов вёрстки при текущем viewport - Использовать в паре с generate_test(module=…) для одного выполняемого теста на модуль Когда НЕ использовать: - Мобильные приложения (нет DOM) → используйте analyze_screen - Нужен анализ + немедленная генерация тестов → используйте auto_generate_tests (одношаговая версия) - Поиск существующих тестов → используйте list_tests - Прототип тестирования одной страницы → используйте codegen Крайние случаи: - URL недоступен / таймаут → возвращает {error: «打開頁面失敗…», url} - На странице 0 форм / 0 cta → modules[] пуст, но вызов завершается успешно - Страница за логином без auth_cookie → анализирует страницу входа (менее полезно) — передайте auth_cookie, чтобы попасть на страницы после входа - SPA с отложенной гидратацией → увеличьте timeout_ms до 30000+ Планировочная вставка (v0.10.0): передайте `plan_id` из предыдущего вызова qa_plan, и ответ автоматически прикрепит `plan_verification`. Каждый обнаруженный модуль…

Проверяет живую веб-страницу в headless Chromium и возвращает структурированную карту тестируемых модулей и API-эндпоинтов, которые страница действительно вызвала. Веб-аналог analyze_screen. Поведение: - page.goto(url) с ожиданием DOMContentLoaded + 5s networkidle - DOM-зонд извлекает пять видов модулей: form (с полями fields[] + флагами required), nav (списки ссылок), dialog (модальные контейнеры), section (подписанные области), cta (кнопки действия, совпадающие с ключевыми словами действий, например 登入/送出/Login/Submit) - У каждого модуля появляется candidate_tcs[] — тестовые сценарии с учётом предметной области, готовые для вставки в generate_test - Записывает каждый fetch/XHR, который страница выполнила, удаляет дубли по (method, path), добавляет специфичные для эндпоинта кандидаты-тесты (401, 404, 4xx, payload-too-large…) - Сканирование переполнения макета: ищет видимые элементы, содержимое которых выходит за пределы контейнера более чем на 2 пикселя по горизонтали / 10 пикселей по вертикали (跑版 / text-overflow) Возвращает: {url, page_title, scanned_at, modules[], api_endpoints[], layout_warnings[]} Когда использовать: - Пользователь хочет тесты для конкретного URL или страницы - Разработка регрессионного покрытия на основе реального пользовательского поведения - Нужны подсказки по покрытию бэкендовых API (api_endpoints[] даёт методы + пути) - Исследование багов вёрстки при текущем viewport - Использовать в паре с generate_test(module=…) для одного выполняемого теста на модуль Когда НЕ использовать: - Мобильные приложения (нет DOM) → используйте analyze_screen - Нужен анализ + немедленная генерация тестов → используйте auto_generate_tests (одношаговая версия) - Поиск существующих тестов → используйте list_tests - Прототип тестирования одной страницы → используйте codegen Крайние случаи: - URL недоступен / таймаут → возвращает {error: «打開頁面失敗…», url} - На странице 0 форм / 0 cta → modules[] пуст, но вызов завершается успешно - Страница за логином без auth_cookie → анализирует страницу входа (менее полезно) — передайте auth_cookie, чтобы попасть на страницы после входа - SPA с отложенной гидратацией → увеличьте timeout_ms до 30000+ Планировочная вставка (v0.10.0): передайте `plan_id` из предыдущего вызова qa_plan, и ответ автоматически прикрепит `plan_verification`. Каждый обнаруженный модуль…

Параметры

  • urlstringобязательный

    要分析的網頁 URL,需含 protocol(http:// 或 https://)。

  • timeout_msinteger

    選填,page.goto 等待 DOMContentLoaded 的逾時毫秒數。之後額外 wait 5 秒讓 networkidle(XHR 載入)穩定。預設 15000。慢站 / 需要 SSR / 重 JS hydration 的網站可拉到 30000+。

  • auth_cookiestring

    選填,預先注入登入 cookie,格式:`name1=value1; name2=value2`(一行 cookie header)。用法:先在瀏覽器 DevTools / Application / Cookies 複製值再貼進來。用於分析需要登入後才看得到的頁面。

  • plan_idstring

    選填,v0.10.0+. Plan id returned by qa_plan. When supplied, the response gains a `plan_verification` envelope that checks every critical point against the discovered modules. Each module is passed as evidence with its `kind` field (form / cta / nav / etc.) preserved; CPs target the kind/name/selector to assert module discovery.

auto_generate_tests

Выполняет полную доставку одной командой: последовательно запускает analyze_url, затем для каждого обнаруженного module с содержимым candidate_tcs запускает generate_test, записывает полный каркас pytest-тестов в PROJECT_ROOT/tests/. Это автоматизированная версия ручного запуска `generate_test` N раз для каждого module после `analyze_url`. Подходит для быстрого покрытия в стиле «дай мне URL, остальное сделай сам». Каждый candidate_tc становится docstring соответствующей test-функции; после run_tests HTML-отчёт отображает docstring как имя тестового сценария. Возвращает список путей сгенерированных файлов и количество тестов на каждый module. По умолчанию — 1 тест на module, для более плотного покрытия увеличьте `tests_per_module`. Plan bookend (v0.10.0): передаёте `plan_id` из предыдущего вызова `qa_plan`, и ответ автоматически подключает `plan_verification`. Каждая сгенерированная запись теста (или ошибка генерации) становится строкой evidence с полями kind=generated_test, path, covers_module (form/cta/nav и т.д.), module_name, error (None при успехе) и source url. CPs могут проверять покрытие («модуль form произвёл ≥1 тест») или инварианты отсутствия ошибок («ни один module не имел ошибок генерации»).

Выполняет полную доставку одной командой: последовательно запускает analyze_url, затем для каждого обнаруженного module с содержимым candidate_tcs запускает generate_test, записывает полный каркас pytest-тестов в PROJECT_ROOT/tests/. Это автоматизированная версия ручного запуска `generate_test` N раз для каждого module после `analyze_url`. Подходит для быстрого покрытия в стиле «дай мне URL, остальное сделай сам». Каждый candidate_tc становится docstring соответствующей test-функции; после run_tests HTML-отчёт отображает docstring как имя тестового сценария. Возвращает список путей сгенерированных файлов и количество тестов на каждый module. По умолчанию — 1 тест на module, для более плотного покрытия увеличьте `tests_per_module`. Plan bookend (v0.10.0): передаёте `plan_id` из предыдущего вызова `qa_plan`, и ответ автоматически подключает `plan_verification`. Каждая сгенерированная запись теста (или ошибка генерации) становится строкой evidence с полями kind=generated_test, path, covers_module (form/cta/nav и т.д.), module_name, error (None при успехе) и source url. CPs могут проверять покрытие («модуль form произвёл ≥1 тест») или инварианты отсутствия ошибок («ни один module не имел ошибок генерации»).

Параметры

  • urlstringобязательный

    要分析並批次產測的 URL,需含 protocol(http:// 或 https://)。

  • timeout_msinteger

    選填,analyze_url 內部 page.goto 等 DOMContentLoaded 的逾時毫秒。預設 15000,慢站可拉到 30000+。

  • auth_cookiestring

    選填,登入後分析所需 cookie,格式:`name1=value1; name2=value2`。從 DevTools / Application / Cookies 抓現成值貼進來。

  • tests_per_moduleinteger

    選填,每個 module 從 candidate_tcs 取前 N 條各產一條 test。1-10,預設 1(最少噪音)。想要更密的覆蓋拉 3-5;拉到 10 通常會產 garbage tests,因為 candidate_tcs 後段是泛例。

  • plan_idstring

    選填,v0.10.0+. Plan id returned by qa_plan. When supplied, the response gains a `plan_verification` envelope. Each generated test record (success or failure) becomes one evidence row with kind=generated_test, path, covers_module, module_name, error (None on success), and source url.

codegen

Запускает интерактивную запись тестов для активного бегуна. Полезно как построитель базовой линии перед уточнением с помощью generate_test. Поведение: - pytest-playwright: запускает `playwright codegen -o <output> <url>`: открывается настоящее окно Chromium, вы кликаете, вводите, переходите, Playwright записывает каждое действие в исполняемый код pytest, результат сохраняется в PROJECT_ROOT/<output> при закрытии браузера. - Maestro: возвращает человекочитаемую подсказку, указывающую на `maestro studio` (для него не существует готового codegen, который можно вызвать из оболочки). - jest / cypress / go runners: такая же подсказка-заглушка, как у Maestro. Возвращает: строку с сохранённым путём или подсказкой для ручной записи. Когда использовать: - Интерактивное построение базового happy-path теста (вы кликаете, он записывает). - Сайт со сложной аутентификацией / JS-состоянием, которое проще не прописывать вручную. - Быстрый прототип перед уточнением с помощью generate_test. - Пользователь говорит «record / 錄製 / use codegen / 紀錄操作». Когда НЕ использовать: - Безголовые CI / контейнерные окружения: нельзя открыть Chromium. - Нужна структурированная, управляемая AI генерация тестов на основе анализа: используйте generate_test или auto_generate_tests. - Покрытие тестами модулей за один проход: используйте auto_generate_tests. - Потоки мобильного UI: всё равно вернёт подсказку, лучше используйте analyze_screen + generate_test. Крайние случаи: - `output` содержит `..` или является абсолютным путём: блокируется защитным ограждением. - Chromium не установлен: playwright codegen завершается ошибкой; пользователь увидит подсказку `playwright install` в stderr.

Запускает интерактивную запись тестов для активного бегуна. Полезно как построитель базовой линии перед уточнением с помощью generate_test. Поведение: - pytest-playwright: запускает `playwright codegen -o <output> <url>`: открывается настоящее окно Chromium, вы кликаете, вводите, переходите, Playwright записывает каждое действие в исполняемый код pytest, результат сохраняется в PROJECT_ROOT/<output> при закрытии браузера. - Maestro: возвращает человекочитаемую подсказку, указывающую на `maestro studio` (для него не существует готового codegen, который можно вызвать из оболочки). - jest / cypress / go runners: такая же подсказка-заглушка, как у Maestro. Возвращает: строку с сохранённым путём или подсказкой для ручной записи. Когда использовать: - Интерактивное построение базового happy-path теста (вы кликаете, он записывает). - Сайт со сложной аутентификацией / JS-состоянием, которое проще не прописывать вручную. - Быстрый прототип перед уточнением с помощью generate_test. - Пользователь говорит «record / 錄製 / use codegen / 紀錄操作». Когда НЕ использовать: - Безголовые CI / контейнерные окружения: нельзя открыть Chromium. - Нужна структурированная, управляемая AI генерация тестов на основе анализа: используйте generate_test или auto_generate_tests. - Покрытие тестами модулей за один проход: используйте auto_generate_tests. - Потоки мобильного UI: всё равно вернёт подсказку, лучше используйте analyze_screen + generate_test. Крайние случаи: - `output` содержит `..` или является абсолютным путём: блокируется защитным ограждением. - Chromium не установлен: playwright codegen завершается ошибкой; пользователь увидит подсказку `playwright install` в stderr.

Параметры

  • urlstringобязательный

    受測 URL。Playwright codegen 會開瀏覽器 navigate 到此網址、從這頁開始錄製你的互動。

  • outputstring

    選填,輸出檔名(相對於 PROJECT_ROOT,不可絕對路徑、不可含 `..`)。預設 `recorded_test.py`。

generate_html_report

把最近一次 `run_tests` 的结果渲染成一个单文件自包含的 HTML——以 base64 形式嵌入的截图、嵌入式 step list、history sparkline 走势、折叠的 Passed 区块、展开的 Failed cards。没有外部 CSS/JS 依赖,可以直接发邮件、丢到静态托管、贴到 Slack。默认输出 `PROJECT_ROOT/report.html`。实现在 `reporters/html.py`,沿用 `sample_report.html` 同款设计。

把最近一次 `run_tests` 的结果渲染成一个单文件自包含的 HTML——以 base64 形式嵌入的截图、嵌入式 step list、history sparkline 走势、折叠的 Passed 区块、展开的 Failed cards。没有外部 CSS/JS 依赖,可以直接发邮件、丢到静态托管、贴到 Slack。默认输出 `PROJECT_ROOT/report.html`。实现在 `reporters/html.py`,沿用 `sample_report.html` 同款设计。

Параметры

  • outputstring

    選填,輸出檔名(相對於 QA_PROJECT_ROOT)。預設 `report.html`。

generate_test

Создайте скелет теста для pytest-playwright. Рекомендуемый процесс: сначала вызовите analyze_url, чтобы получить candidate_tcs, затем для каждого TC, который хотите покрыть, вызовите один раз generate_test, передав всю строку candidate_tc в качестве description — она автоматически станет docstring тестовой функции, а в HTML-отчёте будет отображаться как имя кейса. Если указаны url+module (из modules[] от analyze_url), selectors будут предзаполнены исполняемой версией. Если нужно обработать весь URL сразу, не составляя тесты вручную, используйте auto_generate_tests.

Создайте скелет теста для pytest-playwright. Рекомендуемый процесс: сначала вызовите analyze_url, чтобы получить candidate_tcs, затем для каждого TC, который хотите покрыть, вызовите один раз generate_test, передав всю строку candidate_tc в качестве description — она автоматически станет docstring тестовой функции, а в HTML-отчёте будет отображаться как имя кейса. Если указаны url+module (из modules[] от analyze_url), selectors будут предзаполнены исполняемой версией. Если нужно обработать весь URL сразу, не составляя тесты вручную, используйте auto_generate_tests.

Параметры

  • descriptionstringобязательный

    test 的描述文字。會直接寫成產出 test 函式的 docstring(pytest)或 YAML 開頭註解(Maestro),HTML 報告會用這段當 case 名稱顯示。建議直接傳 analyze_url / analyze_screen 回來的某個 candidate_tc 整段字串。

  • filenamestringобязательный

    輸出檔名,相對於 PROJECT_ROOT。pytest 用 .py、Maestro 用 .yaml、Jest 用 .test.js、Cypress 用 .cy.js、Go 用 _test.go。不可絕對路徑、不可含 `..`(會被 security guardrail 擋)。

  • urlstring

    選填,受測 URL;提供後 page.goto 會預填

  • moduleobject

    選填,analyze_url 結果 modules[] 中的一個項目;提供後會用 selectors 預填

  • business_contextstring

    選填,業務規則 / 歷史 Bug / 標準斷言文字 等領域知識。提供後會以 `# Business context:` 註解區塊印進 test 函式內,讓人類 reviewer 與後續 AI 都能看到設計依據。建議先 call get_qa_context() 拿到相關 section 再傳入。

get_failure_details

Извлекает полные материалы для анализа первопричин для каждого упавшего теста в последнем прогоне. Поведение: - Читает report.json, фильтрует тесты, где outcome == 「failed」 - pytest: парсит Playwright trace.zip → извлекает реальную последовательность вызовов API (события Frame.*, Page.*, Locator.*, ElementHandle.*) как steps[] - Maestro: парсит flow YAML на наличие директив `takeScreenshot:` → определяет путь к <name>.png в корне PROJECT_ROOT - По мере возможности определяет пути к screenshot / trace.zip / video / recording из директорий артефактов --output / --debug-output Возвращает: list[{nodeid, title, message, duration, steps[], screenshot, trace, video}] Когда использовать: - run_tests только что сообщил о наличии > 0 упавших тестов → углубиться в каждый случай - Пользователь спрашивает 「почему упало / покажи трейс / что сломалось」 - Создание бага в JIRA → использовать пути к артефактам для прикрепления screenshot+trace - Сравнение сигнатур падений между прогонами (в паре с get_test_history) Когда НЕ использовать: - Нужно только общее количество → используй get_test_report (легче) - Тесты ещё не запускались → возвращает [{error: 「找不到報告」}] - Нужны детали и по ПРОЙДЕННЫМ тестам → здесь не поддерживается; HTML-отчёт отображает их по другому пути Граничные случаи: - Подстрока test_id не соответствует ничему → пустой список, без ошибки - screenshot / trace / video отсутствуют на диске → эти поля равны null, но запись остаётся - Перезапуск исправил флак (был упавшим, теперь прошёл) → здесь не отображается; вместо этого показывается в summary.flaky_in_run

Извлекает полные материалы для анализа первопричин для каждого упавшего теста в последнем прогоне. Поведение: - Читает report.json, фильтрует тесты, где outcome == 「failed」 - pytest: парсит Playwright trace.zip → извлекает реальную последовательность вызовов API (события Frame.*, Page.*, Locator.*, ElementHandle.*) как steps[] - Maestro: парсит flow YAML на наличие директив `takeScreenshot:` → определяет путь к <name>.png в корне PROJECT_ROOT - По мере возможности определяет пути к screenshot / trace.zip / video / recording из директорий артефактов --output / --debug-output Возвращает: list[{nodeid, title, message, duration, steps[], screenshot, trace, video}] Когда использовать: - run_tests только что сообщил о наличии > 0 упавших тестов → углубиться в каждый случай - Пользователь спрашивает 「почему упало / покажи трейс / что сломалось」 - Создание бага в JIRA → использовать пути к артефактам для прикрепления screenshot+trace - Сравнение сигнатур падений между прогонами (в паре с get_test_history) Когда НЕ использовать: - Нужно только общее количество → используй get_test_report (легче) - Тесты ещё не запускались → возвращает [{error: 「找不到報告」}] - Нужны детали и по ПРОЙДЕННЫМ тестам → здесь не поддерживается; HTML-отчёт отображает их по другому пути Граничные случаи: - Подстрока test_id не соответствует ничему → пустой список, без ошибки - screenshot / trace / video отсутствуют на диске → эти поля равны null, но запись остаётся - Перезапуск исправил флак (был упавшим, теперь прошёл) → здесь не отображается; вместо этого показывается в summary.flaky_in_run

Параметры

  • test_idstring

    選填,僅回傳 nodeid 含此關鍵字的 case(substring match,不分大小寫)。省略則回傳全部失敗 case。常用模式:先全部抓→看到特定模式後再用 test_id 收斂。

get_optimization_plan

Объединяет modules, обнаруженные через history/снэпшоты, telemetry tool-usage и analyze_url, и формирует трёхуровневый самоусиливающийся анализ: (1) Качество набора тестов: для каждого теста вычисляется строка outcomes (например, «PFPFP») → flake_score, затем fingerprint-сравнение signal-ов ошибок: 3 последовательных совпадения одного signal — признак broken, ухудшение duration более чем в 1.5 раза — slow_regression, иначе stable_passing. (2) Шаблоны использования MCP: top tool, повторяющиеся args, частота ошибок, типичные цепочки вызовов (совместное появление A→B). (3) Эффективность AI-сгенерированных тестов: появляется ли тест, написанный generate_test, в следующем прогоне, соответствует ли module, обнаруженный analyze_url, тестовому файлу (coverage adoption vs coverage gap). Возвращает структурированный JSON и синхронно записывает в PROJECT_ROOT/optimization-plan.md. Каждый раз после завершения run_tests автоматически срабатывает один раз, поэтому этот tool используется для «чтения результатов в реальном времени».

Объединяет modules, обнаруженные через history/снэпшоты, telemetry tool-usage и analyze_url, и формирует трёхуровневый самоусиливающийся анализ: (1) Качество набора тестов: для каждого теста вычисляется строка outcomes (например, «PFPFP») → flake_score, затем fingerprint-сравнение signal-ов ошибок: 3 последовательных совпадения одного signal — признак broken, ухудшение duration более чем в 1.5 раза — slow_regression, иначе stable_passing. (2) Шаблоны использования MCP: top tool, повторяющиеся args, частота ошибок, типичные цепочки вызовов (совместное появление A→B). (3) Эффективность AI-сгенерированных тестов: появляется ли тест, написанный generate_test, в следующем прогоне, соответствует ли module, обнаруженный analyze_url, тестовому файлу (coverage adoption vs coverage gap). Возвращает структурированный JSON и синхронно записывает в PROJECT_ROOT/optimization-plan.md. Каждый раз после завершения run_tests автоматически срабатывает один раз, поэтому этот tool используется для «чтения результатов в реальном времени».

Параметры

  • history_limitinteger

    選填,套件品質分析會看最近 N 次 history 快照。1-100,預設 10。flake score 至少要 5 次以上才穩,深度分析建議 30+。

  • telemetry_limitinteger

    選填,MCP 使用模式分析會看 telemetry 最近 N 筆 tool-call。10-5000,預設 500。長期使用模式分析拉到 2000+,近期問題排查 100-200 就夠。

get_qa_context

Читает `qa-knowledge.md` тестируемого проекта (бизнес-правила / исторические баги / стандартные строки утверждений / User Journeys и другие области знаний), разбивает их на секции с заголовками `## H2`. Использование: сначала вызови, чтобы получить весь документ или указанную секцию, затем передай соответствующие абзацы как `business_context` в `generate_test` — сгенерированные тесты автоматически получат аннотации с бизнес-знаниями, уходя от monkey testing. Если файл отсутствует, используется встроенная общая база: семь принципов ISTQB + эквивалентное разбиение + граничные значения + таблица решений + переходы состояний + Mobile checklist — можно применять и так; позже запусти `init_qa_knowledge`, чтобы создать версию, специфичную для проекта.

Читает `qa-knowledge.md` тестируемого проекта (бизнес-правила / исторические баги / стандартные строки утверждений / User Journeys и другие области знаний), разбивает их на секции с заголовками `## H2`. Использование: сначала вызови, чтобы получить весь документ или указанную секцию, затем передай соответствующие абзацы как `business_context` в `generate_test` — сгенерированные тесты автоматически получат аннотации с бизнес-знаниями, уходя от monkey testing. Если файл отсутствует, используется встроенная общая база: семь принципов ISTQB + эквивалентное разбиение + граничные значения + таблица решений + переходы состояний + Mobile checklist — можно применять и так; позже запусти `init_qa_knowledge`, чтобы создать версию, специфичную для проекта.

Параметры

  • sectionstring

    選填,只取單一 H2 section(不區分大小寫、支援部分匹配)。省略則回整份檔 + 所有 section 名稱清單。

get_runner_info

Возвращает текущий тестовый runner, выбранный переменной окружения QA_RUNNER (один из пяти: pytest / jest / cypress / go / maestro), а также полный список всех runner'ов, встроенных в сервер при компиляции. Рекомендуется вызывать этот инструмент первым в каждом сеансе — AI использует его, чтобы решить, генерировать ли Playwright .py или Maestro .yaml дальше, нужен ли headed browser, и избежать ошибочного шаблона. Также применяется для проверки корректности настройки окружения проекта: QA_PROJECT_ROOT указывает на правильную директорию, QA_RUNNER не содержит опечаток. Формат возврата: {active: 'pytest', available: ['pytest', 'jest', ...]}.

Возвращает текущий тестовый runner, выбранный переменной окружения QA_RUNNER (один из пяти: pytest / jest / cypress / go / maestro), а также полный список всех runner'ов, встроенных в сервер при компиляции. Рекомендуется вызывать этот инструмент первым в каждом сеансе — AI использует его, чтобы решить, генерировать ли Playwright .py или Maestro .yaml дальше, нужен ли headed browser, и избежать ошибочного шаблона. Также применяется для проверки корректности настройки окружения проекта: QA_PROJECT_ROOT указывает на правильную директорию, QA_RUNNER не содержит опечаток. Формат возврата: {active: 'pytest', available: ['pytest', 'jest', ...]}.

Параметры

Без параметров.

get_test_history

Перебирает снимки test-results/history/*.json (автоматически архивируются после каждого run_tests), возвращает сводку по каждому запуску: timestamp / total / passed / failed / skipped / duration / pass_rate (0-100). Используется для анализа флаков («этот тест всю прошлую неделю падал?»), анализа деградации скорости («duration всё растёт?») и графика тренда покрытия. По умолчанию возвращает последние 10 записей, limit можно настроить от 1 до 100. Если нужны исполняемые рекомендации, подключи get_optimization_plan — он уже объединяет history + telemetry.

Перебирает снимки test-results/history/*.json (автоматически архивируются после каждого run_tests), возвращает сводку по каждому запуску: timestamp / total / passed / failed / skipped / duration / pass_rate (0-100). Используется для анализа флаков («этот тест всю прошлую неделю падал?»), анализа деградации скорости («duration всё растёт?») и графика тренда покрытия. По умолчанию возвращает последние 10 записей, limit можно настроить от 1 до 100. Если нужны исполняемые рекомендации, подключи get_optimization_plan — он уже объединяет history + telemetry.

Параметры

  • limitinteger

    選填,回最近 N 次 run 的摘要。1-100,預設 10。長期 flake 分析建議 30+。

get_test_report

Читает report.json, оставшийся от последнего run_tests, и возвращает лёгкую сводку: total / passed / failed / skipped / flaky_in_run (количество спасённых авто-повтором) / duration (сек). Намного дешевле повторного прогона — подходит для частой проверки состояния между последовательными операциями. Если тесты не запускались, возвращает {error: 找不到報告,請先執行 run_tests}. Если в сводке failed > 0, вызывать get_failure_details для получения деталей ошибок. v1.3.0+: Edge AI runner добавляет опциональный блок `edge_metrics` к каждой записи теста ({p95_latency_ms, fps, iou_per_frame, labels_covered}). `get_optimization_plan` читает эти метрики и выводит 4 сигнала флака, специфичных для Edge (latency_p95_exceeded_sla, fps_variance_across_runs, iou_jitter_per_tc, coverage_gap_per_label), наряду со стандартными категориями flake/broken/slow_regression. В обычных (не Edge) прогонах поле `edge_metrics` отсутствует, и сигналы не меняются.

Читает report.json, оставшийся от последнего run_tests, и возвращает лёгкую сводку: total / passed / failed / skipped / flaky_in_run (количество спасённых авто-повтором) / duration (сек). Намного дешевле повторного прогона — подходит для частой проверки состояния между последовательными операциями. Если тесты не запускались, возвращает {error: 找不到報告,請先執行 run_tests}. Если в сводке failed > 0, вызывать get_failure_details для получения деталей ошибок. v1.3.0+: Edge AI runner добавляет опциональный блок `edge_metrics` к каждой записи теста ({p95_latency_ms, fps, iou_per_frame, labels_covered}). `get_optimization_plan` читает эти метрики и выводит 4 сигнала флака, специфичных для Edge (latency_p95_exceeded_sla, fps_variance_across_runs, iou_jitter_per_tc, coverage_gap_per_label), наряду со стандартными категориями flake/broken/slow_regression. В обычных (не Edge) прогонах поле `edge_metrics` отсутствует, и сигналы не меняются.

Параметры

Без параметров.

init_qa_knowledge

В корне тестируемого проекта (PROJECT_ROOT) создать начальный шаблон qa-knowledge.md, содержащий 5 разделов H2: бизнес-правила / исторические баги / стандартный текст утверждений / User Journeys / технические ограничения. Каждый раздел содержит подсказку TODO. Idempotent: если файл уже существует, он не будет перезаписан (если только overwrite=true). Новым пользователям рекомендуется при первом запуске MCP сразу вызвать его один раз. Этот файл впоследствии будет прочитан get_qa_context, передан как business_context в generate_test, что позволит AI писать тесты с бизнес-логикой (а не примеры monkey testing).

В корне тестируемого проекта (PROJECT_ROOT) создать начальный шаблон qa-knowledge.md, содержащий 5 разделов H2: бизнес-правила / исторические баги / стандартный текст утверждений / User Journeys / технические ограничения. Каждый раздел содержит подсказку TODO. Idempotent: если файл уже существует, он не будет перезаписан (если только overwrite=true). Новым пользователям рекомендуется при первом запуске MCP сразу вызвать его один раз. Этот файл впоследствии будет прочитан get_qa_context, передан как business_context в generate_test, что позволит AI писать тесты с бизнес-логикой (а не примеры monkey testing).

Параметры

  • overwriteboolean

    強制覆蓋既存檔案(會丟失你已填的內容、請先備份)

inspect_visual_challenge

Обнаруживает задачу reCAPTCHA v2 типа «сетка изображений» на активной странице, делает её скриншот и возвращает метаданные плиток. Клиент ИИ (Claude / Cursor / Gemini — мультимодальный) использует собственное зрение, чтобы определить, какие плитки нужно нажать, затем вызывает solve_visual_challenge с выбранными индексами. Требуется установить QA_VISUAL_CHALLENGE_CONSENT=true на уровне сервера; без этого возвращает структурированную ошибку `consent_required` с полным юридическим отказом от ответственности. Возвращает: {challenge_id, screenshot_base64, challenge_text, grid_layout ('3x3'|'4x4'), tile_count, tiles[{index, viewport_x, viewport_y, w, h}], expires_at, fingerprint}. Формы ошибок: consent_required / unauthorized_domain / forbidden_domain / no_challenge_present / no_active_page / detection_failed — та же обёртка {error, retryable, hint}, что и у всех остальных раннеров. Область применения: только reCAPTCHA v2 image-grid в v0.7.0 (hCaptcha → v0.7.1; v3 / Turnstile навсегда вне области). Используется в паре с solve_visual_challenge — этот инструмент сам по себе никогда ничего не нажимает.

Обнаруживает задачу reCAPTCHA v2 типа «сетка изображений» на активной странице, делает её скриншот и возвращает метаданные плиток. Клиент ИИ (Claude / Cursor / Gemini — мультимодальный) использует собственное зрение, чтобы определить, какие плитки нужно нажать, затем вызывает solve_visual_challenge с выбранными индексами. Требуется установить QA_VISUAL_CHALLENGE_CONSENT=true на уровне сервера; без этого возвращает структурированную ошибку `consent_required` с полным юридическим отказом от ответственности. Возвращает: {challenge_id, screenshot_base64, challenge_text, grid_layout ('3x3'|'4x4'), tile_count, tiles[{index, viewport_x, viewport_y, w, h}], expires_at, fingerprint}. Формы ошибок: consent_required / unauthorized_domain / forbidden_domain / no_challenge_present / no_active_page / detection_failed — та же обёртка {error, retryable, hint}, что и у всех остальных раннеров. Область применения: только reCAPTCHA v2 image-grid в v0.7.0 (hCaptcha → v0.7.1; v3 / Turnstile навсегда вне области). Используется в паре с solve_visual_challenge — этот инструмент сам по себе никогда ничего не нажимает.

Параметры

  • page_idstring

    Reserved for future multi-page sessions; ignored in v0.7.0 (the tool operates on the active Playwright page handed in by the runner).

  • selectorstring

    Optional override for the iframe selector. Default auto-detection tries `iframe[title*="recaptcha challenge"]` (English UI) then `iframe[src*="recaptcha/api2/bframe"]` (URL pattern, locale-agnostic).

list_tests

Использует собственный механизм сборки runner для перечисления всех исполняемых тестов в тестируемом проекте: pytest запускает `pytest --collect-only`, Jest — `npx jest --listTests`, Cypress — glob `cypress/e2e/*.cy.*`, Go — `go test -list .*`, Maestro — рекурсивный поиск по `*.yaml`. Возвращает построчный список nodeid / имён файлов. Используется: перед run_tests — проверить, что сборка полная; перед generate_test — избежать дублирования с существующими кейсами.

Использует собственный механизм сборки runner для перечисления всех исполняемых тестов в тестируемом проекте: pytest запускает `pytest --collect-only`, Jest — `npx jest --listTests`, Cypress — glob `cypress/e2e/*.cy.*`, Go — `go test -list .*`, Maestro — рекурсивный поиск по `*.yaml`. Возвращает построчный список nodeid / имён файлов. Используется: перед run_tests — проверить, что сборка полная; перед generate_test — избежать дублирования с существующими кейсами.

Параметры

Без параметров.

qa_plan

v0.9.1 — Сохраняет список контрольных точек перед выполнением задачи QA. Хост-LLM объявляет, как выглядит успех (тест проходит, сканер находит X, скриншот показывает Y), этот инструмент сохраняет это и возвращает `plan_id`. Позже вызывайте `verify_plan` с доказательствами (строки результатов тестов, находки сканера, строки логов, пути к скриншотам) и получайте вердикт pass/fail по каждой контрольной точке. Вдохновлён паттерном plan.md из microsoft/Webwright: объявление критериев успеха заранее заставляет верификатор честно оценивать, выполнена ли работа. Планы живут 30 минут (TTL кэша) в памяти и ограничены LRU до 50 активных. v0.9.3 — сохранение на диск: когда установлена `QA_PROJECT_ROOT` (или `QA_PLAN_PERSIST=true`), план также атомарно сбрасывается в `<QA_PROJECT_ROOT>/test-results/plans/<plan_id>.json`. `verify_plan` прозрачно падает на диск при промахах в памяти, так что планы переживают перезапуски процесса и вытеснение из кэша. Истечение срока действия по-прежнему учитывается при чтении с диска — просроченный план не будет молча загружен заново. Сохранение делается по возможности: ошибки файловой системы никогда не всплывают к вызывающему коду. Возвращает: `{plan_id` (12 шестнадцатеричных символов), `task`, `kind`, `critical_points` [{id, description, verification_hint}], `created_at`, `expires_at`, `persisted_to` (путь файловой системы или null, когда сохранение выключено)}. Формы ошибок: no_task / no_critical_points / bad_critical_points (дублирующийся id, отсутствует description, неправильный тип) / bad_kind.

v0.9.1 — Сохраняет список контрольных точек перед выполнением задачи QA. Хост-LLM объявляет, как выглядит успех (тест проходит, сканер находит X, скриншот показывает Y), этот инструмент сохраняет это и возвращает `plan_id`. Позже вызывайте `verify_plan` с доказательствами (строки результатов тестов, находки сканера, строки логов, пути к скриншотам) и получайте вердикт pass/fail по каждой контрольной точке. Вдохновлён паттерном plan.md из microsoft/Webwright: объявление критериев успеха заранее заставляет верификатор честно оценивать, выполнена ли работа. Планы живут 30 минут (TTL кэша) в памяти и ограничены LRU до 50 активных. v0.9.3 — сохранение на диск: когда установлена `QA_PROJECT_ROOT` (или `QA_PLAN_PERSIST=true`), план также атомарно сбрасывается в `<QA_PROJECT_ROOT>/test-results/plans/<plan_id>.json`. `verify_plan` прозрачно падает на диск при промахах в памяти, так что планы переживают перезапуски процесса и вытеснение из кэша. Истечение срока действия по-прежнему учитывается при чтении с диска — просроченный план не будет молча загружен заново. Сохранение делается по возможности: ошибки файловой системы никогда не всплывают к вызывающему коду. Возвращает: `{plan_id` (12 шестнадцатеричных символов), `task`, `kind`, `critical_points` [{id, description, verification_hint}], `created_at`, `expires_at`, `persisted_to` (путь файловой системы или null, когда сохранение выключено)}. Формы ошибок: no_task / no_critical_points / bad_critical_points (дублирующийся id, отсутствует description, неправильный тип) / bad_kind.

Параметры

  • taskstringобязательный

    Required. The natural-language goal — what the user wants done. Will be echoed back in verify_plan's output.

  • critical_pointsarrayобязательный

    Required, non-empty. Each entry is either a string (used as description+verification_hint) or a dict {id?, description, verification_hint?}. IDs auto-assigned as CP1..CPn if omitted. verification_hint defaults to description — pick a substring that will literally appear in the evidence you'll later pass.

  • kindenum

    Optional. Hint for downstream verifiers about which evidence stream to expect. Omit if unsure.

    rungeneratescandebugcaptcha
run_api_security_scan

v0.8.0: сканер на основе правил OWASP API Security Top 10 (2023). Загружает спецификацию OpenAPI 3.x, обходит каждый путь × метод и применяет 5 правил из v0.8 — BOLA (API1), Broken Authentication (API2), Mass Assignment (API3, опционально), Function-Level Authz (API5), Security Misconfiguration (API8). Возвращает блок отчёта безопасности v0.8 с для каждой находки: rule_id, severity (critical/high/medium/low/info), endpoint, evidence dict и remediation_hint. Требует QA_API_SECURITY_CONSENT=true на уровне сервера. Хосты не из localhost должны быть указаны в QA_API_SECURITY_AUTHORIZED_DOMAINS (через запятую). mass_assignment изменяет состояние сервера — включите его, передав в `categories`. Фикстура первого уровня (`examples/sample_vulnerable_api/`) поставляется с пакетом для самопроверки. v0.9.4 — Передайте `plan_id` (из qa_plan), чтобы автоматически проверить результаты сканирования по критическим точкам плана в том же вызове. Ответ получает блок `plan_verification` (чеклист по каждой КТ + общий статус). Эквивалент одного вызова последовательности qa_plan → run_api_security_scan → verify_plan. Возвращает: {scan_id, spec_url, base_url, categories_run, rules_ran, ops_scanned, severity_threshold, findings[...], summary{total, by_severity}, findings_below_threshold_count, plan_verification (только если передан plan_id)}. Формы ошибок: consent_required / unauthorized_domain / spec_load_failed / no_base_url / unknown_categories / bad_severity_threshold.

v0.8.0: сканер на основе правил OWASP API Security Top 10 (2023). Загружает спецификацию OpenAPI 3.x, обходит каждый путь × метод и применяет 5 правил из v0.8 — BOLA (API1), Broken Authentication (API2), Mass Assignment (API3, опционально), Function-Level Authz (API5), Security Misconfiguration (API8). Возвращает блок отчёта безопасности v0.8 с для каждой находки: rule_id, severity (critical/high/medium/low/info), endpoint, evidence dict и remediation_hint. Требует QA_API_SECURITY_CONSENT=true на уровне сервера. Хосты не из localhost должны быть указаны в QA_API_SECURITY_AUTHORIZED_DOMAINS (через запятую). mass_assignment изменяет состояние сервера — включите его, передав в `categories`. Фикстура первого уровня (`examples/sample_vulnerable_api/`) поставляется с пакетом для самопроверки. v0.9.4 — Передайте `plan_id` (из qa_plan), чтобы автоматически проверить результаты сканирования по критическим точкам плана в том же вызове. Ответ получает блок `plan_verification` (чеклист по каждой КТ + общий статус). Эквивалент одного вызова последовательности qa_plan → run_api_security_scan → verify_plan. Возвращает: {scan_id, spec_url, base_url, categories_run, rules_ran, ops_scanned, severity_threshold, findings[...], summary{total, by_severity}, findings_below_threshold_count, plan_verification (только если передан plan_id)}. Формы ошибок: consent_required / unauthorized_domain / spec_load_failed / no_base_url / unknown_categories / bad_severity_threshold.

Параметры

  • spec_urlstringобязательный

    OpenAPI 3.x URL (http:// or https://) or local path (file:// or bare). YAML and JSON both accepted.

  • authobject

    Auth config. `token` enables single-user rules (headers + broken_auth). Add `alt_user_token` to enable two-user rules (bola + function_authz). For BOLA: also provide `bola_test_ids: {user_a: [...], user_b: [...]}` listing the ids of objects each user owns.

  • categoriesstring[]

    Rules to run. Default: headers + broken_auth + bola + function_authz (mass_assignment excluded — it mutates server state, opt in explicitly).

  • severity_thresholdenum

    Minimum severity to include in `findings`. Lower-severity findings counted in `findings_below_threshold_count`.

    criticalhighmediumlowinfo
  • base_urlstring

    Override spec's `servers[0].url`. Use when the spec is hosted separately from the API.

  • timeout_sinteger

    Per-request timeout. Default 30s.

  • plan_idstring

    v0.9.4 — Optional. plan_id returned by qa_plan. When supplied, the scan auto-verifies its findings against the plan's critical points and adds a `plan_verification` block to the response (per-CP checklist + overall passed/incomplete/failed status). Only findings ABOVE severity_threshold are seen by the verifier — if a CP targets a low-severity finding, lower the threshold to 'low' or 'info' accordingly.

run_failed

Запускает только тесты, упавшие в прошлый раз — это намного быстрее, чем прогонять весь набор, и подходит для итеративной проверки после исправления ошибки. pytest использует флаг `--lf` (last-failed), Jest — `--onlyFailures`, Cypress анализирует массив failures[] из последнего report.json и находит соответствующие spec-файлы для повторного запуска, Go извлекает имена упавших тестов, составляет из них regex и передаёт флагу `-run`, Maestro находит nodeid и перезапускает соответствующий .yaml. Для работы требуется хотя бы один предшествующий запуск run_tests (иначе report.json не существует). Возвращает данные в той же структуре, что и run_tests; их можно просматривать с помощью get_test_report / get_failure_details тем же способом.

Запускает только тесты, упавшие в прошлый раз — это намного быстрее, чем прогонять весь набор, и подходит для итеративной проверки после исправления ошибки. pytest использует флаг `--lf` (last-failed), Jest — `--onlyFailures`, Cypress анализирует массив failures[] из последнего report.json и находит соответствующие spec-файлы для повторного запуска, Go извлекает имена упавших тестов, составляет из них regex и передаёт флагу `-run`, Maestro находит nodeid и перезапускает соответствующий .yaml. Для работы требуется хотя бы один предшествующий запуск run_tests (иначе report.json не существует). Возвращает данные в той же структуре, что и run_tests; их можно просматривать с помощью get_test_report / get_failure_details тем же способом.

Параметры

Без параметров.

run_tests

Выполняет тестовый набор под активным QA_RUNNER и формирует структурированный отчёт. Самый часто вызываемый инструмент: вызывайте каждый раз, когда пользователь говорит «跑/run/test/check/驗證/執行», после generate_test (проверить новый тест) или после исправления (подтвердить, что баг исчез). Поведение: - Вызывает собственный CLI раннера в QA_PROJECT_ROOT: pytest с --screenshot=on / --tracing=on / --video=retain-on-failure, или `npx jest --json`, `npx cypress run --reporter json`, `go test -json`, `maestro test --format junit` - Необязательный `filter` сужает область: pytest -k expr, jest -t pattern, cypress --spec glob, go -run regex, maestro flow-name substring - Записывает report.json (структура pytest-json-report, не зависящая от раннера) + XML JUnit - Сохраняет снимок запуска в history/ и автоматически запускает optimizer.write_plan() → optimization-plan.md обновляется - Maestro: автоматически повторяет потоки, упавшие при первой попытке (MAESTRO_RETRY=true), показывает количество flaky_in_run Возвращает: {exit_code, raw_exit_code, stdout_tail, stderr_tail, retry_enabled, flaky_in_run, ...} Когда использовать: - После написания нового теста → убедиться, что он действительно проходит. - Дымовое тестирование перед релизом. - Когда бы запрос пользователя ни содержал глагол запуска/тестирования. Когда НЕ использовать: - Просмотр последних результатов без повторного запуска → используйте get_test_report (дешевле). - Повторный запуск только упавших случаев → используйте run_failed (гораздо быстрее). - Перечисление существующих тестов → используйте list_tests. Граничные случаи: - Ни один тест не соответствует `filter` → exit_code != 0, в stderr_tail «no tests ran». - Превышено QA_TIMEOUT_SECONDS → exit_code 124 + тег `[TIMEOUT…]` в stderr_tail. - `filter`, начинающийся с `-` или содержащий `..` → блокируется защитным механизмом, возвращает {error: …}. Обрамление плана (v0.10.0): передайте `plan_id` из предыдущего вызова qa_plan, и ответ автоматически прикрепит `plan_verification` — критические точки проверяются по только что записанному report.json через тот же поток, что использует run_api_security_scan. Опустите `plan_id`, чтобы сохранить устаревшую форму (без ключа plan_verification). Когда verify_plan завершается неудачей (неизвестный / истёк…)

Выполняет тестовый набор под активным QA_RUNNER и формирует структурированный отчёт. Самый часто вызываемый инструмент: вызывайте каждый раз, когда пользователь говорит «跑/run/test/check/驗證/執行», после generate_test (проверить новый тест) или после исправления (подтвердить, что баг исчез). Поведение: - Вызывает собственный CLI раннера в QA_PROJECT_ROOT: pytest с --screenshot=on / --tracing=on / --video=retain-on-failure, или `npx jest --json`, `npx cypress run --reporter json`, `go test -json`, `maestro test --format junit` - Необязательный `filter` сужает область: pytest -k expr, jest -t pattern, cypress --spec glob, go -run regex, maestro flow-name substring - Записывает report.json (структура pytest-json-report, не зависящая от раннера) + XML JUnit - Сохраняет снимок запуска в history/ и автоматически запускает optimizer.write_plan() → optimization-plan.md обновляется - Maestro: автоматически повторяет потоки, упавшие при первой попытке (MAESTRO_RETRY=true), показывает количество flaky_in_run Возвращает: {exit_code, raw_exit_code, stdout_tail, stderr_tail, retry_enabled, flaky_in_run, ...} Когда использовать: - После написания нового теста → убедиться, что он действительно проходит. - Дымовое тестирование перед релизом. - Когда бы запрос пользователя ни содержал глагол запуска/тестирования. Когда НЕ использовать: - Просмотр последних результатов без повторного запуска → используйте get_test_report (дешевле). - Повторный запуск только упавших случаев → используйте run_failed (гораздо быстрее). - Перечисление существующих тестов → используйте list_tests. Граничные случаи: - Ни один тест не соответствует `filter` → exit_code != 0, в stderr_tail «no tests ran». - Превышено QA_TIMEOUT_SECONDS → exit_code 124 + тег `[TIMEOUT…]` в stderr_tail. - `filter`, начинающийся с `-` или содержащий `..` → блокируется защитным механизмом, возвращает {error: …}. Обрамление плана (v0.10.0): передайте `plan_id` из предыдущего вызова qa_plan, и ответ автоматически прикрепит `plan_verification` — критические точки проверяются по только что записанному report.json через тот же поток, что использует run_api_security_scan. Опустите `plan_id`, чтобы сохранить устаревшую форму (без ключа plan_verification). Когда verify_plan завершается неудачей (неизвестный / истёк…)

Параметры

  • filterstring

    選填,測試名稱關鍵字。pytest 走 -k 表達式(支援 and/or/not)、Jest 走 -t、Cypress 走 --spec '**/*<filter>*'、Go 走 -run regex、Maestro 在 flow 檔名作子字串比對。

  • headedboolean

    選填,僅對 pytest-playwright 有效。True 時瀏覽器有 UI 模式跑(適合 debug、看 flake 視覺現象);預設 headless 跑、CI / 大量套件用這個。

  • browserenum

    選填,僅對 pytest-playwright 有效,指定 Playwright 啟用的 browser engine。需事先 `playwright install <browser>` 過。

    chromiumfirefoxwebkit
  • plan_idstring

    選填,v0.10.0+。Plan id returned by qa_plan. When supplied, the response gains a `plan_verification` envelope that checks every critical point against the just-written report.json. Same shape as run_api_security_scan's plan bookend.

solve_visual_challenge

Применяет выбранные AI-клиентом плитки, выполняет цепочку кликов, нажимает Verify, ожидает токен reCAPTCHA и возвращает результат. Работает в паре с inspect_visual_challenge - должен вызываться с `challenge_id`, возвращённым предыдущим вызовом inspect. Требует `confirm: true` в качестве предохранителя - случайный вызов без confirm возвращает `confirm_required` без выполнения кликов. Также требует `QA_VISUAL_CHALLENGE_CONSENT=true` на уровне сервера. DYNAMIC-REPLACE MODE (v0.7.4): когда в приглашении задачи написано 'Click verify once there are none left' (en) / '確定沒有遺漏' (zh), нажатые плитки заменяются новыми изображениями. solve обнаруживает это и возвращает `status: 'continue'` со СВЕЖИМ скриншотом + сеткой плиток вместо нажатия Verify. AI должен посмотреть на новый скриншот и снова вызвать solve со следующими совпадениями. Для завершения (нажать Verify и проверить токен) передайте пустой `selected_tile_indices: []`. Возвращает: {status: 'passed' | 'continue' | 'failed' | 'expired' | 'consent_required' | 'confirm_required' | 'challenge_not_found' | 'error', challenge_id, attempts_remaining, token (только при passed), hint, а при 'continue': screenshot_base64, tiles, tile_count, grid_layout, rounds_used}. Телеметрия записывает только boolean-результат - скриншоты, текст задачи и выбранные плитки никогда не сохраняются. Plan bookend (v0.10.0): передаёт `plan_id` из предыдущего вызова qa_plan, и ответ автоматически присоединяет `plan_verification`. Доказательство - сводка из одной записи {kind: 'captcha_solve', status, token_populated, rounds_used, fingerprint, challenge_id} - сырой `token` НИКОГДА не включается (гигиена телеметрии). Верификация срабатывает только после того, как solve действительно выполняется; consent_required, confirm_required, challenge_not_found, expired - все они обходят верификацию, так как это ошибки использования, а не результаты solve.

Применяет выбранные AI-клиентом плитки, выполняет цепочку кликов, нажимает Verify, ожидает токен reCAPTCHA и возвращает результат. Работает в паре с inspect_visual_challenge - должен вызываться с `challenge_id`, возвращённым предыдущим вызовом inspect. Требует `confirm: true` в качестве предохранителя - случайный вызов без confirm возвращает `confirm_required` без выполнения кликов. Также требует `QA_VISUAL_CHALLENGE_CONSENT=true` на уровне сервера. DYNAMIC-REPLACE MODE (v0.7.4): когда в приглашении задачи написано 'Click verify once there are none left' (en) / '確定沒有遺漏' (zh), нажатые плитки заменяются новыми изображениями. solve обнаруживает это и возвращает `status: 'continue'` со СВЕЖИМ скриншотом + сеткой плиток вместо нажатия Verify. AI должен посмотреть на новый скриншот и снова вызвать solve со следующими совпадениями. Для завершения (нажать Verify и проверить токен) передайте пустой `selected_tile_indices: []`. Возвращает: {status: 'passed' | 'continue' | 'failed' | 'expired' | 'consent_required' | 'confirm_required' | 'challenge_not_found' | 'error', challenge_id, attempts_remaining, token (только при passed), hint, а при 'continue': screenshot_base64, tiles, tile_count, grid_layout, rounds_used}. Телеметрия записывает только boolean-результат - скриншоты, текст задачи и выбранные плитки никогда не сохраняются. Plan bookend (v0.10.0): передаёт `plan_id` из предыдущего вызова qa_plan, и ответ автоматически присоединяет `plan_verification`. Доказательство - сводка из одной записи {kind: 'captcha_solve', status, token_populated, rounds_used, fingerprint, challenge_id} - сырой `token` НИКОГДА не включается (гигиена телеметрии). Верификация срабатывает только после того, как solve действительно выполняется; consent_required, confirm_required, challenge_not_found, expired - все они обходят верификацию, так как это ошибки использования, а не результаты solve.

Параметры

  • challenge_idstringобязательный

    Required. The challenge_id returned by inspect_visual_challenge. Expires after 5 minutes; re-inspect to get a fresh id.

  • selected_tile_indicesinteger[]обязательный

    Required. The tiles the AI client wants to click, by index (0..tile_count-1). For a 3x3 grid: tile 0 = top-left, 4 = center, 8 = bottom-right. For a 4x4 grid: 0..15 row-major.

  • confirmboolean

    Safety latch. MUST be set to true for the click chain to execute. Without it, returns `confirm_required` and clicks nothing — this prevents an accidental tool call from auto-submitting a CAPTCHA.

  • plan_idstring

    選填,v0.10.0+. Plan id returned by qa_plan. When supplied AND solve actually executes, the response gains a `plan_verification` envelope with single-record evidence {kind: 'captcha_solve', status, token_populated, rounds_used, fingerprint, challenge_id}. Raw token never appears in evidence — CPs check token_populated.

verify_plan

v0.9.1 (расширенная v0.9.2 с автообнаружением) — Проходит по критическим точкам плана и проверяет каждую на соответствие свидетельствам. Работает в паре с `qa_plan` — должен вызываться с `plan_id`, возвращённым предыдущим вызовом `qa_plan`. Возвращает структурированный чеклист со статусом выполнения по каждой КТ и общим статусом (passed / incomplete / failed). Правило сопоставления: КТ считается выполненной, когда её `verification_hint` встречается (без учёта регистра, как подстрока) в строковом представлении любого элемента свидетельства. Элементы свидетельств могут быть строками, словарями или вложенными структурами — проверяющий их уплощает. v0.9.2 — Режим auto_discover: установите `auto_discover: true`, и проверяющий читает pytest-json-report проекта по пути `<QA_PROJECT_ROOT>/report.json` (или `MK_QA_REPORT_PATH`, или аргумент `report_path`) и добавляет список его `tests` в поток свидетельств. По возможности — отсутствующий или повреждённый отчёт молча пропускается, это НЕ жёсткая ошибка. Поле `evidence_sources` в ответе сообщает, что было использовано. Семантика статусов: - `'passed'`: все КТ выполнены - `'incomplete'`: некоторые выполнены, некоторые нет - `'failed'`: ни одна КТ не выполнена (или свидетельства пусты) Даже если хост утверждает «всё хорошо», `verify_plan` возвращает `'incomplete'`, когда любая КТ не выполнена. Это заложено в дизайн — факты важнее заявлений о возможностях. v0.9.3 — Когда включено сохранение (см. `qa_plan`), промах кэша в памяти прозрачно переключается на диск. Поле `plan_source` в ответе сообщает, откуда взят план: `'memory'` (попадание в кэш) или `'disk'` (загружен из `<plans_dir>/<plan_id>.json` после перезапуска или вытеснения). Возвращает: {plan_id, task, kind, status, checklist[{id, description, verification_hint, satisfied, matched_evidence}], unmet[], summary{total, satisfied, unsatisfied}, evidence_sources{explicit_count, autodiscovered, autodiscovered_count, report_path}, plan_source ('memory' или 'disk'), verified_at}. Формы ошибок: no_plan_id / plan_not_found / no_evidence (только когда опущены и явные свидетельства, и auto_discover) / bad_evidence.

v0.9.1 (расширенная v0.9.2 с автообнаружением) — Проходит по критическим точкам плана и проверяет каждую на соответствие свидетельствам. Работает в паре с `qa_plan` — должен вызываться с `plan_id`, возвращённым предыдущим вызовом `qa_plan`. Возвращает структурированный чеклист со статусом выполнения по каждой КТ и общим статусом (passed / incomplete / failed). Правило сопоставления: КТ считается выполненной, когда её `verification_hint` встречается (без учёта регистра, как подстрока) в строковом представлении любого элемента свидетельства. Элементы свидетельств могут быть строками, словарями или вложенными структурами — проверяющий их уплощает. v0.9.2 — Режим auto_discover: установите `auto_discover: true`, и проверяющий читает pytest-json-report проекта по пути `<QA_PROJECT_ROOT>/report.json` (или `MK_QA_REPORT_PATH`, или аргумент `report_path`) и добавляет список его `tests` в поток свидетельств. По возможности — отсутствующий или повреждённый отчёт молча пропускается, это НЕ жёсткая ошибка. Поле `evidence_sources` в ответе сообщает, что было использовано. Семантика статусов: - `'passed'`: все КТ выполнены - `'incomplete'`: некоторые выполнены, некоторые нет - `'failed'`: ни одна КТ не выполнена (или свидетельства пусты) Даже если хост утверждает «всё хорошо», `verify_plan` возвращает `'incomplete'`, когда любая КТ не выполнена. Это заложено в дизайн — факты важнее заявлений о возможностях. v0.9.3 — Когда включено сохранение (см. `qa_plan`), промах кэша в памяти прозрачно переключается на диск. Поле `plan_source` в ответе сообщает, откуда взят план: `'memory'` (попадание в кэш) или `'disk'` (загружен из `<plans_dir>/<plan_id>.json` после перезапуска или вытеснения). Возвращает: {plan_id, task, kind, status, checklist[{id, description, verification_hint, satisfied, matched_evidence}], unmet[], summary{total, satisfied, unsatisfied}, evidence_sources{explicit_count, autodiscovered, autodiscovered_count, report_path}, plan_source ('memory' или 'disk'), verified_at}. Формы ошибок: no_plan_id / plan_not_found / no_evidence (только когда опущены и явные свидетельства, и auto_discover) / bad_evidence.

Параметры

  • plan_idstringобязательный

    Required. The plan_id returned by qa_plan.

  • evidencearray

    Optional when `auto_discover: true`. Each item is searched for each CP's verification_hint. Pass structured payloads — test result rows from `get_test_report`, scan findings from `run_api_security_scan`, log lines, screenshot paths, etc.

  • auto_discoverboolean

    v0.9.2 — When true, read the project's pytest-json-report and add its `tests` array to the evidence stream. Useful for verifying a CP set against the most recent test run without manually copying report rows into the call.

  • report_pathstring

    v0.9.2 — Override the report.json location when auto_discover is true. Defaults to `MK_QA_REPORT_PATH` env, then `<QA_PROJECT_ROOT>/report.json`, then `./report.json`.

Другие проверенные MCP-сервера

nteract/semiotic

nteract/semiotic

Semiotic — React-библиотека визуализации данных со встроенным MCP-сервером. AI-ассистенты могут рендерить графики, проверять конфигурации и получать рекомендации по чартам. Сотни типов диаграмм — о...

TypeScript2685
keboola/keboola-mcp-server

keboola/keboola-mcp-server

официальный

MCP сервер для подключения AI-агентов к Keboola: он открывает доступ к данным, SQL-запросам и трансформациям без написания кода. Идеален для аналитиков и разработчиков, которые хотят кормить ИИ актуальными данными напрямую.

Python84
Github MCP

Github MCP

официальный

MCP-сервер для подключения AI-агентов к GitHub: читает код и репозитории, управляет issues и PR, анализирует коммиты и CI/CD. Cервер автоматизирует workflow через естественный язык. Полезен разрабо...

Go31546
fireproof-storage/mcp-database-server

fireproof-storage/mcp-database-server

официальный

Этот MCP сервер на базе Fireproof предоставляет простое хранилище JSON документов с CRUD-операциями и сортировкой по любому полю. Подходит для интеграции с AI ассистентами вроде Claude Desktop и по...

JavaScript31
line/line-bot-mcp-server

line/line-bot-mcp-server

официальный

MCP-сервер для интеграции AI-агентов с LINE Official Account через Messaging API. Отправляет текстовые и гибкие сообщения, управляет богатыми меню, получает профили пользователей и список подписчик...

TypeScript608
aliyun/alibaba-cloud-ops-mcp-server

aliyun/alibaba-cloud-ops-mcp-server

официальный

MCP сервер для управления облачной инфраструктурой Alibaba Cloud через AI-ассистентов. Поддерживает ECS, VPC, RDS, OSS и Cloud Monitor, а также автоматический деплой приложений на EC2 с анализом ст...

Python125
© Каталог MCP, 2026. Все права защищены.
Проект не аффилирован с Anthropic и любыми упомянутыми продуктами.
Все названия и торговые марки принадлежат их владельцам.
Контакты для связи: hi@mcp-katalog.ru

Лука Никитин