ExecBro
← до документації

Доступні інструменти

Повний довідник усіх MCP-інструментів ExecBro.

Посібник з використання

ІнструментОпис
get_usage_guideРекомендовані сценарії для всіх інструментів. Без параметрів повертає огляд, з темою (setup, inspect, layout, interact, logs, network, state, bundle, native) повний посібник

Підключення та логи

ІнструментОпис
scan_metroШукає сервери Metro й автоматично підключається. Агент викликає його сам на початку сесії. Також показує вікна Electron і Chrome на типовому debug-порту 9222, не підключаючись до них, і підключає нативні Android-застосунки з execbro-sdk-android (preview)
connect_metroПідключення до конкретного порту Metro. Зазвичай викликається автоматично: вручну потрібен лише для нестандартних портів або щоб під’єднати вікно Electron чи Chrome на debug-порту, обравши вікно за назвою чи адресою сторінки, коли їх кілька. Також підключає нативний Android-застосунок за назвою пакета
electron_launch_appЗапускає Electron-проєкт із теки з вихідним кодом з відкритим debug-портом і підключається до його вікон. Застосунок для цього змінювати не потрібно, а якщо він сам обирає порт, інструмент це відстежить. Приймає лише теки з вихідним кодом, ніколи не зібраний застосунок
disconnect_metroВідключається від усіх серверів Metro і звільняє слот CDP. Підключитися знову можна через scan_metro
get_appsСписок підключених застосунків. Якщо жодного немає, спершу запустіть scan_metro
get_connection_statusДетальний стан підключення: здоров’я, час роботи та останні розриви
ensure_connectionПеревіряє або встановлює підключення з перевірками здоров’я
get_logsПовертає логи консолі (фільтрація, обрізання, зведення). source="native" дає логи пристрою (Android logcat та iOS os_log, відфільтровані до вашого застосунку), де видно краші, ANR та завершення через нестачу пам’яті, які ніколи не доходять до JavaScript-консолі. Нативні результати згруповані в події, тож backtrace краша займає один рядок, а не сорок
search_logsПошук тексту в логах (з обрізанням)
get_log_detailsРозгортає одну подію логу в повний вміст: повний нативний backtrace, стек JavaScript або завелике повідомлення. Приймає id з get_logs
clear_logsОчищає буфер логів
list_devicesПерелічує всі симулятори iOS, емулятори Android і підключені фізичні пристрої на машині однією структурованою відповіддю
logboxВзаємодія з оверлеєм LogBox у React Native (лише dev-режим): закрити всі записи й отримати їхній вміст або показати повідомлення в банері помилок

Відстеження мережі

ІнструментОпис
get_network_requestsПовертає мережеві запити (фільтрація, зведення)
search_networkПошук запитів за шаблоном URL
get_request_detailsВідкриває один перехоплений запит: заголовки, тіло, статус, таймінги. Велике JSON-тіло спершу повертається у вигляді структури (усі шляхи ключів збережено, масиви й об’єкти позначено їхніми реальними розмірами), щоб ви побачили, чи існує потрібне поле, перш ніж його витягати. Попросіть поле за шляхом, і отримаєте саме його повністю: інша сторона обміну та її заголовки не заважають. Облікові дані не з’являються взагалі: токен у заголовку, тілі чи URL замінюється коротким дескриптором, тож живий секрет не потрапляє в розмову, і жоден параметр інструмента його не розкриє
clear_networkОчищає буфер мережевих запитів
network_mockЗмінює те, що отримує застосунок, щоб спрацювала його справжня обробка помилок. Поверніть заготовлену відповідь для URL, що збігається, або отримайте справжню й змініть її: приберіть поле, задайте вкладене значення, перевизначте статус. Правило може спрацювати обмежену кількість разів, і саме так відтворюється збій, який минає після повторної спроби. Для GraphQL-застосунків, де всі операції йдуть на один URL, правило може назвати одну операцію (operation=) і не чіпати решту. Змінені відповіді позначено в кожному списку, тож замоканий трафік ніколи не сплутати зі справжнім
network_conditionІмітує відсутність мережі або повільне з’єднання. Режим offline змушує падати кожен запит з боку JavaScript, а також повідомляє NetInfo, що пристрій відключено (якщо застосунок ним користується), тож банери офлайну з’являються так само, як у реальному житті. Повільний режим затримує відповіді, не змінюючи їх, і саме так виявляються відсутні стани завантаження та кнопки, які можна натиснути двічі
network_replayНадсилає перехоплений запит повторно, за потреби зі зміненим тілом, заголовком чи URL. Корисно, коли API щось відхилив і треба з’ясувати, яке поле йому не сподобалося, не проходячи застосунок заново, щоб створити той самий запит ще раз
http_requestНадсилає HTTP-запит з вашої машини, а не зсередини застосунку, з обліковими даними, якими агент може користуватися, але не може їх прочитати. Це «чиста» пара до app_request: жодні сертифікати, налаштування проксі, cookies чи правила мокання застосунку тут не діють, тож запустивши обидва й порівнявши відповіді, можна відрізнити проблему сервера від проблеми клієнта. Якщо запит тут відхилено, а запит самого застосунку проходить, це вже відповідь: бекенд перевіряє, що виклик справді надійшов із вашого застосунку
list_secretsПоказує, які облікові дані вже перехоплено, за назвами дескрипторів, разом із хостом, до якого кожен належить, як давно його бачили і коли він спливає. Самі значення ніколи не показуються. Тут ви знайдете назву, яку треба передати в http_request, і тут прострочений токен стане очевидним, перш ніж спричинить незрозуміле відхилення
vault_captureЗабирає облікові дані з запущеного застосунку і кладе їх просто в сховище, жодного разу не показуючи. Для випадків, які більше нічим не покрити: свіжа сесія ще до першого автентифікованого виклику, токен, тихо оновлений у фоні, або токен у keychain чи захищеному сховищі, де жодне спостереження за трафіком його не знайде

Інспекція застосунку та виконання коду

ІнструментОпис
execute_in_appВиконує JavaScript-вираз усередині застосунку. Store, клієнт Apollo, роутер і робочий require уже знайдено й доступно, тож шукати глобальні змінні доводиться рідко. Великі результати повертаються у вигляді структури, а не обрізаються посеред рядка: масиви й об’єкти підсумовано з реальними кількостями, тож видно, що там є, і можна попросити потрібну частину. Promise, що виконується довше за ліміт, не губиться: він далі працює в застосунку й повертає дескриптор, результат за яким можна забрати пізніше, чекаючи на сервері замість опитування
list_debug_globalsЗнаходить доступні debug-об’єкти (Apollo, Redux, Expo Router тощо)
inspect_globalДосліджує глобальний об’єкт: його властивості та методи, які можна викликати. У нативному Android-застосунку читає одне зареєстроване значення стану
run_app_commandВиконує команду, яку нативний Android-застосунок зареєстрував через execbro-sdk-android (preview), наприклад скидання онбордингу чи заповнення тестовими даними, і повертає її результат
app_requestНадсилає HTTP-запит зсередини запущеного застосунку від імені користувача, що увійшов. Запит іде через власний мережевий стек застосунку, тож сертифікати, проксі й заголовки поводяться так само, як у звичайному використанні, а токен доступу знаходиться в застосунку, а не вставляється в розмову
reload_appПерезавантажує застосунок (за потреби підключається сам і після цього перепідключається). Щойно перезавантажений бандл часто ще стартує, коли виклик повертається, і відповідь про це прямо каже, а не стверджує, що підключення вже є: перепідключення завершується саме за кілька секунд. Використовуйте помірно: більшість змін обробляє Fast Refresh
redux_get_stateЧитає стан зі store Redux, прив’язаного до Provider застосунку, знайденого наживо через дерево React fiber
redux_dispatchНадсилає Redux action у той самий store, запускаючи підписників useSelector і повторні рендери React. Передайте список дій замість однієї, і їх буде надіслано по черзі за один обмін, так можна повернути slice налаштувань до попереднього стану без окремого виклику на кожне поле

Інспекція макета та компонентів

ІнструментОпис
get_screen_layoutКарта екрана з видимими компонентами, їхніми позиціями, розмірами й текстом. extended=true додає стилі макета
get_component_treeПовне дерево React fiber. structureOnly=true дає компактний вивід
find_componentsПошук компонентів за шаблоном назви. includeLayout=true додає стилі
inspect_componentДосліджує props, стан (хуки) і дочірні елементи компонента
inspect_at_pointДосліджує компонент у координатах (x, y): frame, props, стилі
get_imagesДоступ до спільного буфера зображень (скриншоти, кадри перевірки тапів)
get_screen_stateЗнімок поточного екрана без скриншота: активний маршрут і параметри, оверлеї, що перекривають екран (шторки, модальні вікна, алерти), і всі елементи на екрані за один виклик, кожен з центром для тапу та frame. Перемикачі та чекбокси показано з поточним значенням увімк./вимк., тож видно, які з них уже встановлено, ще до того, як щось чіпати
measureГеометрія на екрані {x, y, width, height} для названого екземпляра React-компонента. Повідомлене значення відповідає тому, де компонент справді є: на екрані, показаному як модальна шторка, iOS зсуває весь екран униз на величину, яку React Native сам ніколи не враховує, і цей зсув виправлено тут і в усіх інших інструментах, що повертають координати

Інструменти бандла

ІнструментОпис
get_bundle_statusСтан бандлера Metro і збірки
get_bundle_errorsПомилки компіляції з розташуванням у файлах
get_refresh_statusЧи прийняв JS-рантайм оновлення Fast Refresh (HMR) після заданого часу? Повертає lastUpdateAt, updateCount і останні оновлення

Взаємодія з UI (кросплатформна)

ІнструментОпис
navigateПереводить застосунок на інший екран і перевіряє, що він справді туди потрапив. До застосунків на Expo Router звертаються за шляхом, до застосунків на React Navigation за назвою екрана; неіснуючу назву відхилено одразу з найближчими справжніми варіантами, а не тихо проігноровано. До застосунків, які ніколи не передають ref своєму navigation container, звертаються через змонтований екран, і саме так написано більшість застосунків на React Navigation; цей шлях не може перелічити екрани, тож список маршрутів повертається порожнім, а перевірку назви пропущено, щоб не перевіряти проти порожнечі, і відповідь каже, яким шляхом пішов інструмент
tapУніфікований тап: сам визначає платформу і пробує дерево fiber → accessibility → OCR → координати. Приймає текст, testID, назву компонента або піксельні координати. Задайте тривалість, і він утримуватиме дотик, а не відпустить його: так відкривається контекстне меню, починається перетягування чи множинний вибір, а після цього інструмент скаже, чи має натиснутий елемент обробник довгого натискання, тож меню, яке не відкривається, можна відрізнити від меню, яке ніколи не було під’єднане. Перемикачі й чекбокси можна називати так само, хоча власного обробника натискання в них немає, а значення зчитується після дії, тож перемикач, що змінив не той рядок, не виглядає успіхом
swipeУніфікований свайп: сам визначає платформу і направляє дію у відповідний бекенд. Координати в тому самому просторі екрана, що й у інструментах макета та на скриншотах, нічого перераховувати не треба. Для прокручування списків (особливо віртуалізованих FlatList/SectionList), гортання каруселей і pull-to-refresh
pinchМасштабування щипком двома справжніми пальцями, а не імітованим жестом. Емулятор отримує два справжні дотики одночасно, як від великого й вказівного пальців людини, тож реагує все, що на екрані: карта, фотогалерея, вбудована вебсторінка, незалежно від того, чи це React Native. Збільшення чи зменшення навколо центру або будь-якої вказаної точки, а у відповіді сказано, чи щось справді змінилося. Поки що емулятори Android; iOS у роботі
input_textЗаписує текст у поле і перевіряє, що він туди потрапив. Дайте testID, і інструмент сам сфокусує поле (без окремого тапу), потім зчитає значення і порівняє точно, повторивши спробу один раз, перш ніж повідомити про розбіжність. Якщо під ціль підходить кілька полів, він відмовляє і перелічує їх з підписами, а не вгадує, що важливо у формах, де всі поля мають однаковий placeholder. Кирилиця, китайська і латиниця з діакритикою працюють, хоча жоден драйвер клавіатури їх не набирає. На екрані взагалі без підключення React Native (системний діалог, не-RN екран) інструмент автоматично друкує в те, що ОС вважає сфокусованим; native:true веде цим шляхом напряму. testID на обгортці навколо поля, а не на самому полі, тепер теж знаходиться (звична форма для власного компонента вводу, що тримає id на контейнері), якщо під ним рівно одне поле вводу; обгортку навколо цілої форми відхилено, а не вгадано. Текст, що пішов як звичайний ASCII, а повернувся іншим алфавітом, названо прямо: це активна розкладка клавіатури симулятора переінтерпретувала натискання, а не поле відхилило значення. Екранну клавіатуру залишено як була; showKeyboard=true піднімає її, коли вона потрібна для перевірки макета
press_keyНатискає клавішу, яка не є текстом: Enter для відправки, Escape для закриття, Tab для переходу фокуса, стрілки, Backspace або комбінацію на кшталт Shift+Tab чи Cmd+K. Може спершу сфокусувати елемент за testID чи текстом і повторити клавішу кілька разів. Працює у вікнах Electron і Chrome, на Android і в симуляторі iOS. На Android немає клавіш-модифікаторів, тож комбінації там відхиляються
screenshotРобить скриншот того, до чого ви підключені: симулятора iOS, iPhone чи iPad, підключеного через USB (лише знімок), пристрою Android (React Native або нативний застосунок з execbro-sdk-android) чи вікна Electron або Chrome
handle_dialogПриймає або закриває JavaScript-діалог alert, confirm, prompt чи діалог виходу зі сторінки у вікні Electron або Chrome і вводить відповідь у prompt. Відкритий діалог заморожує сторінку, тож поки він відкритий, інструменти взаємодії повідомляють про діалог замість того, щоб зависати
dismiss_keyboardЗнімає фокус із поточного TextInput і ховає екранну клавіатуру. Якщо нічого не сфокусовано і клавіатура вже прихована, це вважається виконаним, а не помилкою, тож ніхто не шукатиме поле, якого немає. Якщо нічого не сфокусовано, а клавіатура все одно відкрита, нею володіє нативне поле (системний діалог, WebView, не-RN екран), і інструмент так і скаже, бо зняття фокуса в React її не закриє

iOS (симулятор)

ІнструментОпис
ios_screenshotСкриншот із симулятора iOS або з фізичного iPhone/iPad, підключеного через USB (лише знімок: фізичні пристрої не підтримують тап, свайп чи введення тексту)
ios_launch_appЗапускає застосунок за bundle ID
ios_open_urlВідкриває URL (deep links або вебадреси)
ios_terminate_appЗавершує запущений застосунок. Застосунок, який уже закрився, позначається як зупинений, а не як помилка, бо саме такого стану й хотіли. Для застосунку, який ніколи не встановлювали, симулятор відповідає так само, тож результат ніколи не заявляє про завершення, якого не може довести
ios_boot_simulatorЗапускає симулятор за UDID
ios_buttonНатискає апаратну кнопку: HOME, LOCK, SIRI (потрібен IDB)

Android (ADB)

ІнструментОпис
android_screenshotСкриншот із пристрою чи емулятора Android
android_launch_appЗапускає застосунок за назвою пакета
android_list_packagesСписок встановлених пакетів (з необов’язковим фільтром)
android_long_pressДовге натискання за сирими координатами, для утримання на екрані без підключення React Native. До всього, що всередині вашого застосунку, краще дістатися через tap із тривалістю, який сам знайде елемент
android_key_eventНадсилає події клавіш (HOME, BACK, ENTER тощо)

Акаунт і ліцензія

ІнструментОпис
get_license_statusІдентифікатор вашого встановлення, рівень ліцензії та використання за цей місяць відносно безкоштовного ліміту
activate_licenseАктивує Pro-ліцензію токеном активації з вашого кабінету, пов’язуючи акаунт із цим встановленням MCP
delete_accountНазавжди видаляє ваш акаунт і скидає це встановлення. Потребує явного підтвердження
send_feedbackВідгук про самі інструменти ExecBro: інструмент поводився неправильно, був незрозумілим або його бракує