All reports

metro-mcp

io.github.steve228uk/metro-mcp · version 0.15.0 · 3,186 weekly npm downloads · audited 2026-11-03

MCPVetter badge Notes

Findings

No hidden-instruction or invisible-character findings in any tool, prompt, or resource description.

Claude Connectors Directory readiness

Checks the directory's published tool requirements that are visible from tools/list. Passing them does not guarantee acceptance.

What this server's tools can do

Not a vulnerability by itself. It tells you what an injected prompt could ask this server to do, so you can decide which tools need approval.

Supply chain

Tools (88)

NameTitleHintDescription
get_console_logsread-onlyGet recent console output. Filter by level or search text.
clear_console_logsdestructiveClear the console log buffer.
get_network_requestsread-onlyGet recent network requests from the React Native app.
get_request_detailsread-onlyGet full details of a specific network request including headers and body.
get_response_bodyread-onlyGet response body for a network request (cached if small; requires active session if large).
search_networkread-onlySearch network requests by URL pattern, method, or status code.
clear_network_requestsdestructiveClear the network request buffer.
get_network_statsread-onlyGet aggregated network statistics: breakdown by domain, status code, and response times.
get_errorsread-onlyGet recent uncaught exceptions from the React Native app.
clear_errorsdestructiveClear the error buffer.
get_bundle_errorsread-onlyGet recent Metro compilation/transform errors.
evaluate_jsdestructiveExecute a JavaScript expression in the running React Native app and return the result. Use this for inspecting variables, calling functions, or querying app state.
list_devicesread-onlyList connected devices and debuggable targets from Metro bundler.
get_app_inforead-onlyGet information about the connected React Native app (bundle URL, platform, device name).
get_connection_statusread-onlyCheck the connection status to Metro bundler.
reload_appnoneReload the connected app and verify a fresh runtime. Uses Page.reload, with a directed Metro message fallback only for a verified app/device peer.
symbolicateread-onlySymbolicate a stack trace using Metro bundler source maps. Converts minified/bundled locations back to original source files.
get_redux_stateread-onlyGet the current Redux state tree or a specific slice. Works without client SDK if Redux DevTools extension is present or store is exposed globally.
dispatch_redux_actionnoneDispatch a Redux action to the store.
get_redux_actionsread-onlyGet recent Redux actions (requires metro-mcp client SDK for real-time tracking).
get_component_treeread-onlyGet a paged flat React component tree. Follow nextCursor to complete the snapshot and check traversal.complete before treating an empty page as authoritative.
find_componentsread-onlySearch for components by name inside the app runtime. Check traversal.complete before treating no matches as definitive.
inspect_componentread-onlyGet props, state, and hooks for the first exact component-name match, with traversal completeness metadata.
get_testable_elementsread-onlyGet elements with testID or accessibilityLabel. Check traversal.complete before treating an empty elements array as definitive.
get_storage_keysread-onlyList all AsyncStorage keys in the React Native app.
get_storage_itemread-onlyRead a specific AsyncStorage key value.
get_all_storageread-onlyDump all AsyncStorage key-value pairs.
take_screenshotnoneCapture a screenshot from the connected iOS simulator or Android device.
list_simulatorsread-onlyList available iOS simulators or Android emulators.
install_certificatedestructiveInstall a root certificate on the iOS simulator or Android device.
get_native_logsread-onlyGet native platform logs from iOS simulator (syslog) or Android device (logcat).
app_lifecycledestructiveLaunch, terminate, install, or uninstall an app on the simulator/emulator.
get_screen_orientationread-onlyGet the current screen orientation of the device.
open_deeplinknoneOpen a URL or deep link on the connected iOS simulator or Android device.
list_url_schemesread-onlyList URL schemes registered by an installed iOS app or Android package.
list_permissionsread-onlyList all app permission statuses on the connected iOS simulator or Android emulator. Returns compact text: one name=status line per permission.
grant_permissiondestructiveGrant a permission to the app on the connected iOS simulator or Android emulator.
revoke_permissiondestructiveRevoke a permission from the app on the connected iOS simulator or Android emulator.
reset_permissionsdestructiveReset one or all permissions for the app on the connected iOS simulator or Android emulator. On iOS, omitting service resets all services. On Android, omitting service resets all runtime permissions.
open_app_settingsnoneOpen the connected app's system settings page using React Native Linking.openSettings().
list_elementsread-onlyGet labelled or interactive elements from the focused React screen. Check traversal.complete before treating an empty elements array as definitive.
tap_elementnoneTap by label, testID, or logical device-point coordinates. Uses React handlers, then installed SimView or IDB on iOS and adb on Android. Coordinates use native input directly; native results identify the backend and disp…
type_textnoneType text into an input field. Targets a specific input by testID/label, or the first visible TextInput. Uses the React handler first, then SimView or IDB on iOS and the selected ADB serial on Android.
long_pressnoneLong press using a React handler by label/testID, then semantic native input through SimView or IDB when the handler is unavailable. Explicit coordinates use native input directly; native results identify the backend and…
swipenoneScroll through React, then use installed SimView or IDB on iOS and the selected ADB serial on Android. Native results identify the backend and dispatch state.
press_buttonnonePress a device button (HOME, BACK, VOLUME_UP, etc.).
get_navigation_stateread-onlyGet the full React Navigation / Expo Router state tree including current route, params, and stack history.
get_current_routeread-onlyGet the currently focused route name and params.
get_route_historyread-onlyGet the navigation back stack / history.
list_routesread-onlyList registered route names from available navigation state. Uninitialized nested navigators are not discoverable.
audit_accessibilityread-onlyAudit the current screen within bounded Fiber traversal limits. Checks labels, roles, testIDs, and alt text; returns issues, summary, and traversal coverage.
check_element_accessibilityread-onlyCheck accessibility properties of a specific component by name or testID.
get_accessibility_summaryread-onlyQuick overview: counts of elements with and without proper accessibility props.
list_commandsread-onlyList all custom commands registered by the app. Commands are registered on global.__METRO_BRIDGE__.commands or global.__METRO_BRIDGE_COMMANDS__.
run_commanddestructiveExecute a custom command registered by the app. Pass parameters as a JSON object.
start_test_recordingnoneInject interaction interceptors into the running app via the React fiber tree. Captures taps, text entry, long presses, keyboard submits, and scroll/swipe gestures — with no changes to your app code. Works with ScrollVie…
stop_test_recordingwritesStop the active recording, retrieve all captured events, and store them for test generation. Returns a summary of what was recorded. Call generate_test_from_recording next to produce Appium, Maestro, or Detox test code.
generate_test_from_recordingread-onlyConvert the most recent recording into a test file. Supports three formats: appium (WebdriverIO + Mocha), maestro (YAML), and detox (Jest). Call stop_test_recording first.
generate_wdio_configread-onlyGenerate a minimal but runnable wdio.conf.ts for Appium + React Native testing, along with the npm install command.
add_recording_annotationnoneAdd a human-readable annotation (comment marker) to the current recording. Useful for labelling major flow checkpoints like "reached checkout", "error appeared here", "navigated to payment". Annotations appear as code co…
save_test_recordingnoneSave the current recording events to disk as JSON so they can be reloaded later. Useful for regenerating the same flow in a different test format without re-recording. Files are saved to ~/.metro-mcp/recordings/<filename…
load_test_recordingread-onlyLoad a previously saved recording from disk and make it available for test generation. After loading, call generate_test_from_recording with any format to regenerate the test. Use list_test_recordings to see available fi…
list_test_recordingsread-onlyList all previously saved test recordings in ~/.metro-mcp/recordings/. Returns filenames and sizes. Use load_test_recording to load one for test generation.
start_profilingnoneStart profiling the running React Native app. Primary path: injects into the React DevTools hook (__REACT_DEVTOOLS_GLOBAL_HOOK__) via evalInApp — captures all component render durations without requiring <Profiler> wrapp…
stop_profilingwritesStop profiling and return an analysis of the captured data. DevTools hook mode: returns top components by total render duration across all commits. CDP mode: returns top JS functions by self time and total time. Must cal…
get_profile_statusread-onlyCheck whether profiling is active, which mode is in use, and whether a previous profile is available.
get_flamegraphread-onlyReturn the current profiling results as a human-readable text chart. Shows React DevTools component profile (if captured), CPU flamegraph (if CDP profile captured), and React render data from <Profiler> components (if se…
get_react_rendersread-onlyRead React render timing data collected via <Profiler onRender={trackRender}>. Returns all recorded renders sorted by actualDuration descending, with memoization savings from baseDuration. Requires importing trackRender …
get_memory_inforead-onlyGet current JavaScript heap memory usage from the running app. Returns used heap, total heap, and heap size limit (when available). Call repeatedly to track memory growth over time or to detect leaks.
profile_actionread-onlyProfile a specific JavaScript expression or code path in a single call. Starts profiling, evaluates the expression, waits for it to complete (plus optional extra duration), then stops and returns the top functions by sel…
start_heap_samplingnoneStart Hermes heap allocation sampling via CDP HeapProfiler. Records memory allocation call stacks to identify where objects are being allocated. Call stop_heap_sampling to retrieve the top allocation sites.
stop_heap_samplingwritesStop heap allocation sampling and return the top allocation sites. Shows which functions are allocating the most memory, useful for diagnosing memory leaks. Must call start_heap_sampling first.
wait_for_elementread-onlyPoll the component tree until an element matching the given testID or accessibilityLabel appears. Returns element info on success. Use after tap_element, navigate(), or any action that triggers async screen transitions o…
wait_for_conditionread-onlyPoll a JavaScript expression in the app until it returns a truthy value, then return that value. Useful for waiting on state changes, loading flags, API responses, or any async condition. Example: wait for globalThis.myS…
wait_for_navigationread-onlyPoll the active navigation route until it matches the expected route name, then return. Requires the navigation plugin to be set up (get_current_route must work). Use after tap_element on a link or after dispatching a na…
setup_statuslinenoneWrites the Metro CDP connection status script to ~/.claude/metro-mcp-statusline.sh. Does not modify settings.json — tell the user to add it to their status line themselves (e.g. ask Claude: "/statusline add the script at…
list_debug_globalsread-onlyAuto-discover well-known global debugging objects (Redux stores, Apollo Client, Expo Router, React DevTools hook, etc.) available in the app runtime.
inspect_at_pointread-onlyInspect the smallest measured host component at screen coordinates. Uses awaited Fabric/Paper measurement and returns traversal completeness metadata.
open_devtoolsnoneOpen the React Native DevTools debugger panel in Chrome. Connects through the CDP proxy so DevTools and the MCP can share the same Hermes connection.
get_app_directoriesread-onlyGet known app sandbox directory paths (documents, cache, temp, library). Returns absolute paths usable with list_directory and read_file.
list_directoryread-onlyList files and directories in an app sandbox path. Call get_app_directories first to obtain the root path.
read_fileread-onlyRead the contents of a file from the app sandbox. Enforces a configurable size cap (default 50 KB, max 1 MB) to avoid flooding context.
get_file_inforead-onlyGet file or directory metadata: size, modification date, and whether it is a directory.
delete_filedestructiveDelete a file from the app sandbox. Requires confirm: true to prevent accidental deletion.
get_build_inforead-onlyReturn build-time and runtime flags for the running React Native app: __DEV__, platform, OS version, RN version, Hermes engine, New Architecture, and expo-application fields if available.
get_env_varsread-onlyReturn a filtered subset of process.env from the running app. Credential-like keys (SECRET, KEY, TOKEN, PASSWORD, etc.) are redacted by default. Use filter to search by key name substring.
get_platform_constantsread-onlyReturn the full Platform.constants object from React Native, including OS-specific build details.
get_expo_configread-onlyReturn expo-constants manifest/expoConfig fields if the app uses Expo, otherwise null.

Check your own setup

npx mcpvetter scan --live

Badge

Add this to a README:

[![MCPVetter](https://mcpvetter.com/badge/metro-mcp.svg)](https://mcpvetter.com/servers/metro-mcp)

Publish this server?

Get the MCPVetter verified badge, a re-audit within 24 hours of every npm release, and an email whenever tools, findings, or Claude directory readiness change. $29 per server per month. You prove ownership first, free.