AppReveal icon

MCP server for native apps

Debug-only framework that gives LLM agents structured access to your iOS, Android, Flutter, and React Native apps. Like Playwright, but for native -- with direct access to UI, state, navigation, network traffic, and WebView DOM.

iOS
Android
Flutter
React Native
44 MCP tools

Zero-config MCP server inside your app

One line of code starts a standards-compliant MCP server in your debug build. Agents find it automatically over the local network.

Your App (debug build) External Agent +-- AppReveal framework +-- mDNS browse for _appreveal._tcp +-- MCP Server (Streamable HTTP) <---+-- MCP client (curl, SDK, Claude, ...) +-- mDNS advertisement +-- LLM orchestration +-- Screen / element / state bridges +-- WebView DOM bridge
1

Integrate

Add the library and call AppReveal.start() in your debug build.

2

Advertise

An HTTP server starts on a dynamic port and advertises via mDNS on the LAN.

3

Discover

Any MCP client on the network discovers the service automatically.

4

Control

The agent calls MCP tools to inspect, navigate, and interact with the app.

Structured data, not pixels

Screenshot-based automation is fragile and token-expensive. AppReveal gives agents direct access to what they actually need.

Screenshot-only agents

Guess screen identity from pixels
Tap by fragile coordinates
Can't read app state directly
No access to network traffic
Can't inspect WebView DOM
High token cost per action

With AppReveal

Exact screen identity with confidence scores
Tap by stable element ID or CSS selector
Read login status, cart, flags directly
Full HTTP traffic with timing data
Complete DOM access and interaction
Token-efficient structured responses

Everything an agent needs

From UI inspection to network traffic capture, all through a standardized MCP interface.

Screen identification

Know exactly which screen is active with controller chains, route state, and confidence scoring.

Element inventory

Every visible interactive element with type, label, state, frame, and available actions.

UI interaction

Tap, type, scroll, navigate back, dismiss modals, switch tabs -- all by element ID.

App state

Read login status, user data, cart contents, feature flags, and navigation stack directly.

Network traffic

Every HTTP call with method, URL, status, duration, and response data. Sensitive headers redacted.

WebView DOM

Full DOM inspection and interaction inside WebViews -- click, type, select, evaluate JS.

44 tools, identical across platforms

Every tool works the same way on iOS, Android, Flutter, and React Native.

UI & Navigation 14

  • get_screen Current screen identity and metadata
  • get_elements Visible interactive elements
  • get_view_tree Full view hierarchy
  • tap_element Tap by element ID
  • tap_point Tap at coordinates
  • type_text Type into a field
  • clear_text Clear a text field
  • scroll Scroll a container
  • scroll_to_element Scroll until visible
  • screenshot Capture as PNG/JPEG
  • select_tab Switch tabs
  • navigate_back Pop navigation
  • dismiss_modal Dismiss modal
  • open_deeplink Open a URL

State & Diagnostics 8

  • get_state App state snapshot
  • get_navigation_stack Current routes and modals
  • get_feature_flags Active feature flags
  • get_network_calls Recent HTTP traffic
  • get_logs Recent app logs
  • get_recent_errors Captured errors
  • launch_context App and device info
  • device_info Hardware, OS, screen, battery

WebView -- DOM Access 14

  • get_webviews List all web views
  • get_dom_tree Full or partial DOM
  • get_dom_interactive Inputs, buttons, links
  • query_dom CSS selector query
  • find_dom_text Find by text content
  • web_click Click DOM element
  • web_type Type into input
  • web_select Select dropdown option
  • web_toggle Toggle checkbox/radio
  • web_scroll_to Scroll to element
  • web_evaluate Run JavaScript
  • web_navigate Navigate to URL
  • web_back Go back
  • web_forward Go forward

Token-Efficient & Batch 8

  • get_dom_summary Page overview
  • get_dom_text Visible text only
  • get_dom_links All links
  • get_dom_forms All forms with fields
  • get_dom_headings H1-H6 structure
  • get_dom_images All images
  • get_dom_tables Table data
  • batch Execute multiple tools at once

One line to start

Add the dependency, call start, and your app is agent-ready.

iOS
Android
Flutter
React Native
// Package.swift dependency
.package(url: "https://github.com/UnlikeOtherAI/AppReveal.git", from: "0.4.0")

// In your AppDelegate or @main struct
#if DEBUG
AppReveal.start()
#endif
// build.gradle.kts
debugImplementation("com.appreveal:appreveal")
releaseImplementation("com.appreveal:appreveal-noop")

// In your Application.onCreate()
if (BuildConfig.DEBUG) {
    AppReveal.start(this)
}
# pubspec.yaml
dependencies:
  appreveal:
    path: Flutter/appreveal

// main.dart
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  AppReveal.start();  // no-ops in release
  runApp(AppReveal.wrap(const MyApp()));
}
// Install
npm install react-native-appreveal
cd ios && pod install

// In your App.tsx
import { AppReveal } from 'react-native-appreveal';

if (__DEV__) {
  AppReveal.start();
}

Debug-only by design

Zero production footprint. Compile-time guarantees, not runtime checks.

iOS: #if DEBUG

All framework code is wrapped in compiler directives. Not a single byte ships in release builds.

Android: debugImplementation

Library is a debug dependency only. The no-op stub ensures release builds compile without code changes.

Local network only

The HTTP server binds to the local network interface. Not accessible from the internet.

Header redaction

Authorization, Cookie, and other sensitive headers are automatically redacted in network captures.