Metro MCP
MCP server for React Native/Expo runtime debugging, inspection, and automation via Metro/CDP
Connector by steve228uk · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/steve228uk-metro-mcp
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 25, 2026.
- Tools
- 58 read · 14 write · 11 delete · 5 not yet classified
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Node.js package
Tools by what they do 88
Read from the source code; the running server may list different tools.
Read 58 · Look things up without changing anything.
audit_accessibilitycheck_element_accessibilityfind_componentsgenerate_test_from_recordinggenerate_wdio_configget_accessibility_summaryget_all_storageget_app_directoriesget_app_infoget_build_infoget_bundle_errorsget_component_tree
Show 46 more tools
get_connection_statusget_console_logsget_current_routeget_env_varsget_errorsget_expo_configget_file_infoget_flamegraphget_memory_infoget_native_logsget_navigation_stateget_network_requestsget_network_statsget_platform_constantsget_profile_statusget_react_rendersget_redux_actionsget_redux_stateget_request_detailsget_response_bodyget_route_historyget_screen_orientationget_storage_itemget_storage_keysget_testable_elementsinspect_at_pointinspect_componentlist_commandslist_debug_globalslist_deviceslist_directorylist_elementslist_permissionslist_routeslist_simulatorslist_test_recordingslist_url_schemesload_test_recordingprofile_actionread_filesearch_networksymbolicatetake_screenshotwait_for_conditionwait_for_elementwait_for_navigation
Write 14 · Create, change, send or run things.
add_recording_annotationlong_presspress_buttonsave_test_recordingsetup_statuslinestart_heap_samplingstart_profilingstart_test_recordingstop_heap_samplingstop_profilingstop_test_recordingswipe
Show 2 more tools
tap_elementtype_text
Delete 11 · Delete, drop, revoke or wipe things.
app_lifecycleclear_console_logsclear_errorsclear_network_requestsdelete_fileevaluate_jsgrant_permissioninstall_certificatereset_permissionsrevoke_permissionrun_command
Not yet classified 5 · We could not tell from the name and description.
dispatch_redux_actionopen_app_settingsopen_deeplinkopen_devtoolsreload_app
Network hosts it talks to 5
api.github.com· found in codegithub.com· found in codemetromcp.dev· found in codewebdriver.io· found in codewix.github.io· found in code
Files it touches
/tmp/metro-mcp-status.json- Your home directory (~)
Tools (88)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
add_recording_annotationAdd 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 comments in generated tests.
app_lifecyclecan change or delete dataLaunch, terminate, install, or uninstall an app on the simulator/emulator.
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.
clear_console_logscan change or delete dataClear the console log buffer.
clear_errorscan change or delete dataClear the error buffer.
clear_network_requestscan change or delete dataClear the network request buffer.
delete_filecan change or delete dataDelete a file from the app sandbox. Requires confirm: true to prevent accidental deletion.
dispatch_redux_actionDispatch a Redux action to the store.
evaluate_jscan change or delete dataExecute a JavaScript expression in the running React Native app and return the result. Use this for inspecting variables, calling functions, or querying app state.
find_componentsread-onlySearch for components by name inside the app runtime. Check traversal.complete before treating no matches as definitive.
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.
get_accessibility_summaryread-onlyQuick overview: counts of elements with and without proper accessibility props.
get_all_storageread-onlyDump all AsyncStorage key-value pairs.
Show 73 more tools
get_app_directoriesread-onlyGet known app sandbox directory paths (documents, cache, temp, library). Returns absolute paths usable with list_directory and read_file.
get_app_inforead-onlyGet information about the connected React Native app (bundle URL, platform, device name).
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_bundle_errorsread-onlyGet recent Metro compilation/transform errors.
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.
get_connection_statusread-onlyCheck the connection status to Metro bundler.
get_console_logsread-onlyGet recent console output. Filter by level or search text.
get_current_routeread-onlyGet the currently focused route name and params.
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_errorsread-onlyGet recent uncaught exceptions from the React Native app.
get_expo_configread-onlyReturn expo-constants manifest/expoConfig fields if the app uses Expo, otherwise null.
get_file_inforead-onlyGet file or directory metadata: size, modification date, and whether it is a directory.
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 set up). Call stop_profiling first to populate the profile data.
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.
get_native_logsread-onlyGet native platform logs from iOS simulator (syslog) or Android device (logcat).
get_navigation_stateread-onlyGet the full React Navigation / Expo Router state tree including current route, params, and stack history.
get_network_requestsread-onlyGet recent network requests from the React Native app.
get_network_statsread-onlyGet aggregated network statistics: breakdown by domain, status code, and response times.
get_platform_constantsread-onlyReturn the full Platform.constants object from React Native, including OS-specific build details.
get_profile_statusread-onlyCheck whether profiling is active, which mode is in use, and whether a previous profile is available.
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 from metro-mcp/client. Use clear=true to reset the buffer.
get_redux_actionsread-onlyGet recent Redux actions (requires metro-mcp client SDK for real-time tracking).
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.
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).
get_route_historyread-onlyGet the navigation back stack / history.
get_screen_orientationread-onlyGet the current screen orientation of the device.
get_storage_itemread-onlyRead a specific AsyncStorage key value.
get_storage_keysread-onlyList all AsyncStorage keys in the React Native app.
get_testable_elementsread-onlyGet elements with testID or accessibilityLabel. Check traversal.complete before treating an empty elements array as definitive.
grant_permissioncan change or delete dataGrant a permission to the app on the connected iOS simulator or Android emulator.
inspect_at_pointread-onlyInspect the smallest measured host component at screen coordinates. Uses awaited Fabric/Paper measurement and returns traversal completeness metadata.
inspect_componentread-onlyGet props, state, and hooks for the first exact component-name match, with traversal completeness metadata.
install_certificatecan change or delete dataInstall a root certificate on the iOS simulator or Android device.
list_commandsread-onlyList all custom commands registered by the app. Commands are registered on global.__METRO_BRIDGE__.commands or global.__METRO_BRIDGE_COMMANDS__.
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.
list_devicesread-onlyList connected devices and debuggable targets from Metro bundler.
list_directoryread-onlyList files and directories in an app sandbox path. Call get_app_directories first to obtain the root path.
list_elementsread-onlyGet labelled or interactive elements from the focused React screen. Check traversal.complete before treating an empty elements array as definitive.
list_permissionsread-onlyList all app permission statuses on the connected iOS simulator or Android emulator. Returns compact text: one name=status line per permission.
list_routesread-onlyList registered route names from available navigation state. Uninitialized nested navigators are not discoverable.
list_simulatorsread-onlyList available iOS simulators or Android emulators.
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.
list_url_schemesread-onlyList URL schemes registered by an installed iOS app or Android package.
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 files.
long_pressLong 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 dispatch state.
open_app_settingsOpen the connected app's system settings page using React Native Linking.openSettings().
open_deeplinkOpen a URL or deep link on the connected iOS simulator or Android device.
open_devtoolsOpen the React Native DevTools debugger panel in Chrome. Connects through the CDP proxy so DevTools and the MCP can share the same Hermes connection.
press_buttonPress a device button (HOME, BACK, VOLUME_UP, etc.).
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 self time. Use instead of calling start_profiling / stop_profiling manually for focused measurements.
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.
reload_appReload the connected app and verify a fresh runtime. Uses Page.reload, with a directed Metro message fallback only for a verified app/device peer.
reset_permissionscan change or delete dataReset 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.
revoke_permissioncan change or delete dataRevoke a permission from the app on the connected iOS simulator or Android emulator.
run_commandcan change or delete dataExecute a custom command registered by the app. Pass parameters as a JSON object.
save_test_recordingSave 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>.json.
search_networkread-onlySearch network requests by URL pattern, method, or status code.
setup_statuslineWrites 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 ~/.claude/metro-mcp-statusline.sh"). Only works with Claude Code.
start_heap_samplingStart 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.
start_profilingStart 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> wrappers, works on all architectures. Fallback (legacy arch only): CDP Profiler domain for JS CPU call-graph sampling. Perform the interaction you want to measure, then call stop_profiling.
start_test_recordingInject 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 ScrollView, FlatList, SectionList, FlashList, and other scroll containers. Call stop_test_recording when done, then generate_test_from_recording to get the test.
stop_heap_samplingStop 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.
stop_profilingStop 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 call start_profiling first.
stop_test_recordingStop 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.
swipeScroll 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.
symbolicateread-onlySymbolicate a stack trace using Metro bundler source maps. Converts minified/bundled locations back to original source files.
take_screenshotCapture a screenshot from the connected iOS simulator or Android device.
tap_elementTap 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 dispatch state.
type_textType 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.
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.myStore?.isLoaded === true.
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 or data loading — instead of immediately calling the next tool. Returns traversal metadata immediately when the bounded search is incomplete.
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 navigate() action.
Signals
- Stars
- 85
- Forks
- 8
- Open issues
- 2
- Contributors
- 6
- Last commit
- Sep 4, 2026 (1 month ago)
- Last release
- Sep 4, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.steve228uk/metro-mcp- Version
- 0.15.0
- Auth
- No auth
- Packages
- npm metro-mcp
- License
- MIT
- Repository
- github.com/steve228uk/metro-mcp
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Cite this page
Metro MCP. Agent Mart. https://agentmart.dev/connectors/steve228uk-metro-mcp (last updated 2026-10-24)