Доступні інструменти
Повний довідник усіх 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: інструмент поводився неправильно, був незрозумілим або його бракує |