Mmcp.market

Metro MCP server

by steve228uk·io.github.steve228uk/metro-mcp·v0.15.0

MCP server for React Native/Expo runtime debugging, inspection, and automation via Metro/CDP

B74/100grade B
What users say
No reviews yet
Be the first
Safety scan
B74/100

full report

Adoption
Established

81 stars432 downloads/wk

Reviews

Write one

Nobody has reviewed Metro MCP yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

Metro MCP tools (89, 4 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • add_recording_annotation

    Add a human-readable annotation (comment marker) to the current recording.

  • app_lifecycle

    Launch, terminate, install, or uninstall an app on the simulator/emulator.

  • audit_accessibility

    Audit the current screen within bounded Fiber traversal limits. Checks labels, roles, testIDs, and alt text; returns issues, summary, and traversal coverage.

  • check_element_accessibility

    Check accessibility properties of a specific component by name or testID.

  • clear_console_logs

    Clear the console log buffer.

  • clear_errors

    Clear the error buffer.

  • clear_network_requests

    Clear the network request buffer.

  • delete_filewrite action

    Delete a file from the app sandbox.

  • dispatch_redux_action

    Dispatch a Redux action to the store.

  • evaluate_jswrite action

    Execute 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_components

    Search for components by name inside the app runtime. Check traversal.complete before treating no matches as definitive.

  • generate_test_from_recording

    Convert the most recent recording into a test file.

  • generate_wdio_config

    Generate a minimal but runnable wdio.conf.ts for Appium + React Native testing, along with the npm install command.

  • get_accessibility_summary

    Quick overview: counts of elements with and without proper accessibility props.

  • get_all_storage

    Dump all AsyncStorage key-value pairs.

  • get_app_directories

    Get known app sandbox directory paths (documents, cache, temp, library).

  • get_app_info

    Get information about the connected React Native app (bundle URL, platform, device name).

  • get_build_info

    Return 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_errors

    Get recent Metro compilation/transform errors.

  • get_component_tree

    Get 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_status

    Check the connection status to Metro bundler.

  • get_console_logs

    Get recent console output. Filter by level or search text.

  • get_current_route

    Get the currently focused route name and params.

  • get_env_vars

    Return 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_errors

    Get recent uncaught exceptions from the React Native app.

  • get_expo_config

    Return expo-constants manifest/expoConfig fields if the app uses Expo, otherwise null.

  • get_file_info

    Get file or directory metadata: size, modification date, and whether it is a directory.

  • get_flamegraph

    Return the current profiling results as a human-readable text chart.

  • get_memory_info

    Get current JavaScript heap memory usage from the running app.

  • get_native_logs

    Get native platform logs from iOS simulator (syslog) or Android device (logcat).

  • get_navigation_state

    Get the full React Navigation / Expo Router state tree including current route, params, and stack history.

  • get_network_requests

    Get recent network requests from the React Native app.

  • get_network_stats

    Get aggregated network statistics: breakdown by domain, status code, and response times.

  • get_platform_constants

    Return the full Platform.constants object from React Native, including OS-specific build details.

  • get_profile_status

    Check whether profiling is active, which mode is in use, and whether a previous profile is available.

  • get_react_renders

    Read React render timing data collected via <Profiler onRender={trackRender}>.

  • get_redux_actions

    Get recent Redux actions (requires metro-mcp client SDK for real-time tracking).

  • get_redux_state

    Get 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_details

    Get full details of a specific network request including headers and body.

  • get_response_body

    Get response body for a network request (cached if small; requires active session if large).

  • get_route_history

    Get the navigation back stack / history.

  • get_screen_orientation

    Get the current screen orientation of the device.

  • get_storage_item

    Read a specific AsyncStorage key value.

  • get_storage_keys

    List all AsyncStorage keys in the React Native app.

  • get_testable_elements

    Get elements with testID or accessibilityLabel. Check traversal.complete before treating an empty elements array as definitive.

  • grant_permission

    Grant a permission to the app on the connected iOS simulator or Android emulator.

  • hello_world

    A sample tool — replace with your own logic

  • inspect_at_point

    Inspect the smallest measured host component at screen coordinates. Uses awaited Fabric/Paper measurement and returns traversal completeness metadata.

  • inspect_component

    Get props, state, and hooks for the first exact component-name match, with traversal completeness metadata.

  • install_certificate

    Install a root certificate on the iOS simulator or Android device.

  • list_commands

    List all custom commands registered by the app. Commands are registered on global.__METRO_BRIDGE__.commands or global.__METRO_BRIDGE_COMMANDS__.

  • list_debug_globals

    Auto-discover well-known global debugging objects (Redux stores, Apollo Client, Expo Router, React DevTools hook, etc.) available in the app runtime.

  • list_devices

    List connected devices and debuggable targets from Metro bundler.

  • list_directory

    List files and directories in an app sandbox path.

  • list_elements

    Get labelled or interactive elements from the focused React screen. Check traversal.complete before treating an empty elements array as definitive.

  • list_permissions

    List all app permission statuses on the connected iOS simulator or Android emulator. Returns compact text: one name=status line per permission.

  • list_routes

    List registered route names from available navigation state. Uninitialized nested navigators are not discoverable.

  • list_simulators

    List available iOS simulators or Android emulators.

  • list_test_recordings

    List all previously saved test recordings in ~/.metro-mcp/recordings/.

  • list_url_schemes

    List URL schemes registered by an installed iOS app or Android package.

  • load_test_recording

    Load a previously saved recording from disk and make it available for test generation.

  • long_press

    Long 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_settings

    Open the connected app's system settings page using React Native Linking.openSettings().

  • open_deeplink

    Open a URL or deep link on the connected iOS simulator or Android device.

  • open_devtools

    Open 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_button

    Press a device button (HOME, BACK, VOLUME_UP, etc.).

  • profile_action

    Profile a specific JavaScript expression or code path in a single call.

  • read_file

    Read the contents of a file from the app sandbox.

  • reload_app

    Reload 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_permissions

    Reset 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_permission

    Revoke a permission from the app on the connected iOS simulator or Android emulator.

  • run_commandwrite action

    Execute a custom command registered by the app. Pass parameters as a JSON object.

  • save_test_recording

    Save the current recording events to disk as JSON so they can be reloaded later.

  • search_network

    Search network requests by URL pattern, method, or status code.

  • setup_statuslinewrite action

    Writes the Metro CDP connection status script to ~/.claude/metro-mcp-statusline.sh.

  • start_heap_sampling

    Start Hermes heap allocation sampling via CDP HeapProfiler.

  • start_profiling

    Start profiling the running React Native app.

  • start_test_recording

    Inject interaction interceptors into the running app via the React fiber tree.

  • stop_heap_sampling

    Stop heap allocation sampling and return the top allocation sites.

  • stop_profiling

    Stop profiling and return an analysis of the captured data.

  • stop_test_recording

    Stop the active recording, retrieve all captured events, and store them for test generation.

  • swipe

    Scroll 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.

  • symbolicate

    Symbolicate a stack trace using Metro bundler source maps. Converts minified/bundled locations back to original source files.

  • take_screenshot

    Capture a screenshot from the connected iOS simulator or Android device.

  • tap_element

    Tap 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_text

    Type 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_condition

    Poll a JavaScript expression in the app until it returns a truthy value, then return that value.

  • wait_for_element

    Poll the component tree until an element matching the given testID or accessibilityLabel appears.

  • wait_for_navigation

    Poll the active navigation route until it matches the expected route name, then return.

Public scan report

scanner v0.1.9 · 2026-09-20 · same rubric, same numbers if you re-run it

1 high
  • Code scan73 source files scanned13/25
  • Live reliabilityno gateway calls yet and no remote to proben/a
  • Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitylocal package, no credentials required12/15
  • Maintenancelast push 16 days ago15/15
  • Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10

Findings (1)

  • highShell command built from a string (injection risk)exec.shell-concat
    dist/bin/metro-mcp.js: …allations.push(customChromePath); } execSync(`${LSREGISTER} -dump` + " | grep -i 'google…
Overall 74/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

What the publisher says

From the Metro MCP repository's README, as published. We do not edit it. Read it on GitHub

metro-mcp

A plugin-based MCP server for React Native runtime debugging, inspection, and automation. Connects to Metro bundler via Chrome DevTools Protocol — no app code changes needed for most features.

Works with Expo, bare React Native, and any project using Metro + Hermes.

Contents

  • Quick Start
  • Requirements
  • How It Works
  • Features
  • Chrome DevTools
  • Claude Code Status Bar
  • Test Recording
  • App Integration
  • Configuration
  • Custom Plugins
  • Compatibility

Quick Start

Claude Code

claude mcp add metro-mcp -- npx -y metro-mcp
# or with Bun
claude mcp add metro-mcp -- bunx metro-mcp

Codex

codex mcp add metro-mcp -- npx -y metro-mcp
# or with Bun
codex mcp add metro-mcp -- bunx metro-mcp

Codex stores MCP servers in ~/.codex/config.toml by default, and the Codex CLI and IDE extension share that configuration.

If you prefer to configure it manually:

[mcp_servers.metro-mcp]
command = "npx"
args = ["-y", "metro-mcp"]

OpenCode

Run OpenCode's interactive MCP installer:

opencode mcp add

Choose a local server, name it metro-mcp, and use npx -y metro-mcp as the command.

If you prefer to configure it manually, add this to opencode.json in your project, or to ~/.config/opencode/opencode.json for a global install:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "metro-mcp": {
      "type": "local",
      "command": ["npx", "-y", "metro-mcp"],
      "enabled": true
    }
  }
}

Or with Bun:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "metro-mcp": {
      "type": "local",
      "command": ["bunx", "metro-mcp"],
      "enabled": true
    }
  }
}

Cursor / VS Code

{
  "mcpServers": {
    "metro-mcp": {
      "command": "npx",
      "args": ["-y", "metro-mcp"]
    }
  }
}

Or with Bun:

{
  "mcpServers": {
    "metro-mcp": {
      "command": "bunx",
      "args": ["metro-mcp"]
    }
  }
}

Install across multiple agents

If you use several MCP clients, add-mcp can write the config for supported agents, including Claude Code, Codex, Cursor, OpenCode, and VS Code:

npx add-mcp metro-mcp --all -g -y

metro-mcp supports multiple agents at the same time. Standard stdio installs start or reuse a local shared daemon for the same project directory and Metro/config options, so Codex, Claude Code, Cursor, and other clients can connect concurrently to the same running Metro app and see the same logs, network requests, errors, and runtime state.

Shared HTTP server / Supergateway

If you want to expose one long-lived MCP endpoint yourself, start the shared server explicitly:

npx -y metro-mcp serve --mcp-port 8765

This serves Streamable HTTP at http://127.0.0.1:8765/mcp. The endpoint supports both the 2025-era MCP handshake and the 2026-07-28 negotiation; /sse and /messages are intentionally unavailable. Tools such as supergateway can point at the Streamable HTTP endpoint instead of launching a fresh stdio process per request.

With custom Metro port

Shortened. The full README is on GitHub.

Nothing above is checked by us. What we check is on the safety report.

Install directly

Runs npx -y metro-mcp on your machine. Read the scan report first; the gateway never runs local packages.

claude mcp add metro-mcp -- npx -y metro-mcp
Add to Cursor

Metro MCP: common questions

Is Metro MCP server safe?
Mostly: it is graded B (74/100). Read the Metro MCP safety report
How do I install Metro MCP?
It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
Does Metro MCP need an API key?
Not as far as the registry entry and our scan can tell: no credentials are declared or required.
Is Metro MCP maintained?
The last commit was 16 days ago (2026-09-04). The latest release is v0.15.0.
What can I use instead of Metro MCP?
Servers from other publishers that do the same job: ExecBro MCP server.

Alternatives to Metro MCP

Same job from other publishers: the closest match first, then the best rated.

  • ExecBro
    Gives AI agents eyes and hands into running React Native apps: logs, REPL, tap, screenshots
    A

More from steve228uk