MetroBLOCK
🚇 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.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
[](https://vscode.dev/redirect/mcp/install?name=metro-mcp&config=%7B%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22metro-mcp%22%5D%2C%22env%22%3A%7B%7D%7D) [](https://cursor.com/en/install-mcp?name=metro-mcp&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIm1ldHJvLW1jcCJdLCJlbnYiOnt9fQ==)
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 th
166cd90168bbOBSERVED · 2026-10-07Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.
claude mcp add metro-mcp -- npx -y [email protected]
Exposed tools (39)
38 read · 1 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
Errors | read | Recent uncaught exceptions from the React Native app |
accessibility | read | Accessibility auditing via fiber tree inspection |
action | read | The user action to trace (e.g., |
automation | read | Wait and polling tools for reliable E2E automation with async state changes |
bundleId | read | iOS bundle ID or Android app package (required for Appium) |
commands | read | Custom app commands via global.__METRO_BRIDGE__.commands |
components | read | React component tree inspection via bounded fiber traversal |
console | read | Console log collection and filtering |
debug-globals | read | Discover well-known global debugging objects in the app runtime |
deeplink | read | Cross-platform deep link testing |
description | read | Optional: describe what you were doing when the crash occurred |
device | read | Device and connection information |
devtools | read | Open React Native DevTools via the CDP proxy |
environment | read | Inspect app runtime environment: build flags, platform constants, and a filtered subset of process.env |
error_message | read | Optional: specific error message to investigate |
errors | read | Exception collection with auto-symbolication |
evaluate | read | JavaScript expression evaluation in the app runtime |
filesystem | read | Browse and read files in the app sandboxed directories |
flow | read | Flow to record (e.g. |
format | read | Output format: appium, maestro, or detox (default: appium) |
inspect-point | read | Coordinate-based React component inspection (experimental) |
metro-endpoint-fixture | read | Exposes the current Metro endpoint for runtime tests |
navigation | read | React Navigation / Expo Router state inspection |
network | read | Network request tracking via CDP Network domain |
permissions | read | Inspect and manage app permissions on iOS Simulator and Android Emulator |
platform | read | Target platform for Appium: ios, android, or both (default: ios) |
profiler | read | CPU profiling via React DevTools hook (primary) or CDP Profiler domain, plus React render tracking |
profiler-data | write | Raw JSON profiling data: React DevTools commit data or CDP Profile object, plus React render records. |
profiler-flamegraph | read | Human-readable profiling output: React DevTools component chart or CPU flamegraph, plus React render chart from <Profiler> components. |
prompts | read | Guided debugging and testing workflows |
redux | read | Redux state inspection via Runtime.evaluate |
scenario | read | Description of the interaction that causes the leak (e.g. |
simulator | read | Unified iOS simulator / Android emulator device control |
source | read | Stack trace symbolication via Metro |
statusline | read | Writes CDP connection state to a file for Claude Code status bar integration |
storage | read | AsyncStorage reading via Runtime.evaluate |
test-recorder | read | Unified mobile test recorder: captures taps, text entry, swipes and navigation via fiber patching; generates Appium, Maestro, and Detox tests |
ui-interact | read | UI automation via React handlers, SimView, IDB, and adb |
url_pattern | read | Optional: URL pattern to focus on |
Trust audit
BLOCKgrade D · trust 64/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | FAIL |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | WARN |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- declared (3 observation(s))
- Shell
- declared (4 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (15)
payload.ts
exec(command: string): Promise<string>;
exec(command: string): Promise<string>;
preact ~ react
const resp = await fetch(`http://127.0.0.1:${lockData.port}/json`, {<span style="color: var(--vp-c-text-2); font-size: 0.9em;">{{ formatDate(release.date) }}</span>evalInApp: async (expression) => new Function('globalThis', `return ${expression};`)(runtime),const evaluateExpression = new Function(
import { definePlugin } from '../../src/plugin.js';import { definePlugin, nativeToolResult } from '../../src/plugin.js';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.
Streamable HTTP is available at `http://127.0.0.1:8765/mcp` for both supported client eras. `/sse` and `/messages` return `404`.
url = 'http://127.0.0.1:8765/mcp',
return await fn(`http://127.0.0.1:${port}/mcp`);@babel/parser, @clack/prompts, @modelcontextprotocol/client, @modelcontextprotocol/node, @modelcontextprotocol/server, chrome-launcher, chromium-edge-launcher, metro-bridge
Gates applied: no_behavioural_pass.
166cd90168bbfull audit observations/trust-audit/mcp-server/steve228uk__metro-2.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-07 | 166cd90168bb | BLOCK | D | 64 | first audit |
Questions
What is the Metro MCP server?
🚇 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.
What tools does Metro expose?
39 in total: 38 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is Metro safe to connect to an agent?
No — not without reading the findings first. The audit graded it D (64/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What credentials does Metro need?
No credential environment variables were found in its source, so it appears to need none.
How does Metro run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as metro-mcp at 0.15.0.
How current is this page?
The grade is for one exact copy of the source (166cd90168bb), read on 2026-10-07. The repository is watched and re-audited when it changes.