Available Tools
Complete reference for all MCP tools provided by ExecBro.
Usage Guide
| Tool | Description |
|---|---|
| get_usage_guide | Get recommended workflows for all tools. Call without params for overview, with a topic (setup, inspect, layout, interact, logs, network, state, bundle) for the full guide |
Connection & Logs
| Tool | Description |
|---|---|
| scan_metro | Scan for Metro servers and auto-connect. Called automatically by the agent at session start |
| connect_metro | Connect to a specific Metro port. Usually called automatically — use manually only for non-standard ports |
| disconnect_metro | Disconnect from all Metro servers. Frees the CDP slot. Reconnect with scan_metro |
| get_apps | List connected apps. Run scan_metro first if none connected |
| get_connection_status | Get detailed connection health, uptime, and recent disconnects |
| ensure_connection | Verify/establish connection with health checks |
| get_logs | Retrieve console logs (filtering, truncation, summary). Use source="native" for device logs — Android logcat and iOS os_log, filtered to your app — which surface crashes, ANRs and out-of-memory kills that never reach the JavaScript console. Native results are grouped into events, so a crash backtrace costs one row instead of forty |
| search_logs | Search logs for specific text (truncation) |
| get_log_details | Expand one log event into its full payload — a complete native backtrace, JavaScript stack trace, or oversized message. Takes an id from get_logs |
| clear_logs | Clear the log buffer |
| list_devices | List every iOS simulator, Android emulator, and connected physical device on the host machine, in one structured response |
| logbox | Interact with React Native's LogBox overlay (dev mode only) — dismiss all entries and return their content, or push a message to the error banner |
Network Tracking
| Tool | Description |
|---|---|
| get_network_requests | Retrieve network requests (filtering, summary) |
| search_network | Search requests by URL pattern |
| get_request_details | Get full details of a request (headers, body with truncation) |
| clear_network | Clear the network request buffer |
App Inspection & Execution
| Tool | Description |
|---|---|
| execute_in_app | Run a JavaScript expression inside the app. The store, Apollo client, router and a working require are already resolved and in scope, so you rarely have to hunt for globals first. Large results come back shaped rather than cut off mid-string: arrays and objects are summarised with the real counts intact, so you can see what is there and ask again for the part you want |
| list_debug_globals | Discover available debug objects (Apollo, Redux, Expo Router, etc.) |
| inspect_global | Inspect a global object to see its properties and callable methods |
| app_request | Send an HTTP request from inside the running app, as the signed-in user. It travels through the app's own network stack, so certificates, proxies and headers behave exactly as they do in normal use, and the access token is found in the app rather than pasted into the conversation |
| reload_app | Reload the app (auto-connects if needed). Use sparingly — Fast Refresh handles most changes |
| redux_get_state | Read state from the Redux store bound to the app's Provider, resolved live via the React fiber tree |
| redux_dispatch | Dispatch a Redux action to that same store, triggering useSelector subscribers and React re-renders |
Layout & Component Inspection
| Tool | Description |
|---|---|
| get_screen_layout | Screen map of visible components with positions, sizes, and text content. Use extended=true for layout styles |
| get_component_tree | Full React fiber tree. Use structureOnly=true for compact output |
| find_components | Find components by name pattern. Use includeLayout=true for styles |
| inspect_component | Inspect a component's props, state (hooks), and children |
| inspect_at_point | Inspect component at (x, y) coordinates — frame, props, styles |
| get_images | Access shared image buffer (screenshots, tap verification frames) |
| get_pressable_elements | Every element that is tappable right now, with real coordinates. An element missing from this list means "not on screen yet", not "not in the app" |
| get_screen_state | Screenshot-free snapshot of the current screen: active route and params, blocking overlays (sheets, modals, alerts), and every on-screen element in one call |
| measure | On-screen geometry {x, y, width, height} for a named React component instance, via measureInWindow on the matched fiber |
Bundle Tools
| Tool | Description |
|---|---|
| get_bundle_status | Get Metro bundler status and build state |
| get_bundle_errors | Get compilation errors with file locations |
| get_refresh_status | Did the JS runtime accept a Fast Refresh (HMR) update since a given time? Returns lastUpdateAt, updateCount, and recent updates |
UI Interaction (Cross-Platform)
| Tool | Description |
|---|---|
| navigate | Move the app to another screen and confirm it actually got there. Expo Router apps are addressed by path and React Navigation apps by screen name; a name that does not exist is refused up front, with the closest real names offered, instead of quietly doing nothing |
| tap | Unified tap — auto-detects platform, tries fiber tree → accessibility → OCR → coordinates. Accepts text, testID, component name, or pixel coordinates |
| swipe | Unified swipe — auto-detects platform and routes to the correct backend. Accepts screenshot pixel coordinates. Use for scrolling lists (especially virtualized FlatList/SectionList), paging carousels, and pull-to-refresh |
| input_text | Write text into a field and confirm it landed. Give it a testID and it focuses the field itself — no separate tap — then reads the value back and compares it exactly, retrying once before reporting a mismatch. If the target matches several inputs it refuses and lists them with their labels rather than guessing, which matters on forms where every field shares one placeholder. Cyrillic, Chinese and accented Latin all work, none of which the keyboard drivers can type |
| ocr_screenshot | Extract all visible text with tap-ready coordinates (works on iOS/Android) |
| dismiss_keyboard | Blur the currently focused TextInput, dismissing the on-screen keyboard |
iOS (Simulator)
| Tool | Description |
|---|---|
| ios_screenshot | Take a screenshot from an iOS simulator |
| ios_launch_app | Launch an app by bundle ID |
| ios_open_url | Open a URL (deep links or web URLs) |
| ios_terminate_app | Terminate a running app |
| ios_boot_simulator | Boot a simulator by UDID |
| ios_input_text | Type text into the already-focused field via the simulator driver (requires IDB/AXe). A fallback: input_text handles focusing and verification, and reaches text this driver cannot type |
| ios_button | Press hardware button: HOME, LOCK, SIRI (requires IDB) |
Android (ADB)
| Tool | Description |
|---|---|
| android_screenshot | Take a screenshot from an Android device/emulator |
| android_launch_app | Launch an app by package name |
| android_list_packages | List installed packages (with optional filter) |
| android_long_press | Long press at specific coordinates |
| android_input_text | Type text at the current focus point via adb. A fallback: input_text handles focusing and verification, and reaches text adb cannot type |
| android_key_event | Send key events (HOME, BACK, ENTER, etc.) |
Account & License
| Tool | Description |
|---|---|
| get_license_status | Your installation ID, license tier, and this month's usage against the free cap |
| activate_license | Activate a Pro license using an activation token from your dashboard, linking your account to this MCP installation |
| delete_account | Permanently delete your account and reset this installation. Requires explicit confirmation |
| send_feedback | Report feedback about the ExecBro tools themselves — one that behaved incorrectly, was confusing, or is missing |