应用调试服务器

AppReveal是一款用于iOS、macOS、Android、Flutter、React Native和Windows应用堆栈的调试专用MCP服务器,允许LLM代理通过本地网络发现、检查和控制原生应用,提供直接访问应用状态、导航、网络流量、DOM和诊断的功能。

  • by UnlikeOtherAI
  • Swift
  • 本地部署
  • 34 星标
  • 更新于
在 GitHub 查看 UnlikeOtherAI/AppReveal

使用说明

应用程序显示

unlikeorai.github.io/AppReveal

仅调试iOS、macOS、Android、Flutter、React Native和Windows应用程序堆栈的应用内MCP服务器。让LLM代理通过本地网络发现、检查和控制本地应用程序——就像Playwright for native一样,但可以直接访问应用程序状态、导航、网络流量、DOM和诊断。

运作原理

Your App (debug build)                    External Agent
 +-- AppReveal framework                   +-- mDNS browse for _appreveal._tcp
      +-- MCP Server (Streamable HTTP)  <---+-- MCP client (curl, SDK, Claude, etc.)
      +-- mDNS advertisement               +-- LLM orchestration
      +-- Screen/element/state bridges
      +-- WebView DOM bridge
  1. 应用程序调用 AppReveal.start() 在调试版本中
  2. 框架在动态端口上启动HTTP服务器
  3. 带有发现后端广告的平台 _appreveal._tcp 在局域网上
  4. 代理发现服务,或获得本地主机URL,并调用MCP工具

完整的AppReveal集成跨平台共享相同的核心MCP界面。基金会目标只宣传已实现的内置程序和宿主注册的提供商工具;macOS和Windows等桌面目标在这些提供程序可用时添加窗口和菜单工具。

快速开始

iOS

// Package.swift
.package(url: "https://github.com/UnlikeOtherAI/AppReveal.git", from: "0.10.1")
#if DEBUG
AppReveal.start()
#endif

iOS 26上的SwiftUI点击支持+

tap_point 和 tap_element 在SwiftUI视图上,需要iOS 26+上的私有UIKit API。AppReveal会自动编译此代码 调试构建 并对其进行编译 发布版本 --没有私人符号到达您的App Store二进制文件。无需设置。

当SwiftUI在不暴露辅助功能节点的情况下呈现可见文本时,AppReveal会退回到SwiftUI托管视图中的iOS Vision文本识别。这些条目与 idSource: "ocr" 并与 tap_text; tap_element 也可以从标识符中回退,例如 device.chip.mouser 可见文本,如 mouser.

要完全退出私有API(即使在调试版本中),请删除 swiftSettings 来自AppReveal的行 Package.swift。参见 iOS指南 了解详情。

macOS

// Package.swift
.package(url: "https://github.com/UnlikeOtherAI/AppReveal.git", from: "0.10.1")
#if DEBUG
AppReveal.start()
#endif

看 macOS指南 进行完整设置。

安卓

// build.gradle.kts
debugImplementation("com.appreveal:appreveal")
releaseImplementation("com.appreveal:appreveal-noop")
if (BuildConfig.DEBUG) {
    AppReveal.start(this)
}

看 Android指南 进行完整设置。

飘动

// pubspec.yaml
dependencies:
  appreveal:
    path: Flutter/appreveal
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  AppReveal.start(); // no-ops in release builds
  runApp(AppReveal.wrap(const MyApp()));
}

// In MaterialApp:
MaterialApp(
  navigatorObservers: [AppReveal.navigatorObserver],
  ...
)

看 颤振指南 进行完整设置。

React Native

npm install react-native-appreveal
cd ios && pod install
import { AppReveal, AppRevealFetchInterceptor } from 'react-native-appreveal';

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

看 React Native指南 进行完整设置。

视窗

原住民。NET和Rust/Tauri桌面桥 Windows/.金牛座 crate包含一个仅限调试的Tauri v2插件,Bonjour/mDNS发现,实时 WebView DOM检查/交互、窗口焦点、菜单检查和 提供程序支持的扩展挂钩。React Native Windows没有自动链接或 直到该运行时有一个真正的MCP服务器桥为止。

#if DEBUG
AppReveal.Windows.AppReveal.Start();
#endif

看 Windows指南 获取本机C#和Tauri/Rust设置说明。

MCP工具

UI和导航

工具 说明
list_windows 列出可见的应用程序窗口及其ID
get_screen 当前屏幕标识、控制器/活动链、置信度得分
get_elements 所有可见的交互元素,包括id、类型、框架、安全区数据、操作
get_view_tree 全视图层次结构,包括类、框架、安全区域数据、属性、可访问性信息
tap_element 按元素标识符(按钮、单元格、控件)点击
tap_text 按可见文本内容点击(查找文本,走到可点击的祖先)
tap_point 点击屏幕坐标
type_text 在字段中键入文本(按元素ID或当前响应者)
clear_text 清除文本字段
scroll 滚动容器(上/下/左/右)
scroll_to_element 滚动直到元素可见
screenshot 将屏幕或元素捕获为MCP图像内容块
select_tab 按索引切换选项卡栏选项卡
navigate_back 弹出导航堆栈
dismiss_modal 忽略最上面的模态
open_deeplink 在应用程序中打开URL

所有原生UI工具和所有web视图工具都接受可选 window_id 参数来自 list_windows。如果省略,AppReveal将以当前关键点窗口为目标。

桌面工具

工具 说明
get_menu_bar 阅读应用程序菜单栏层次结构
click_menu_item 按标题路径调用菜单项
focus_window 把一个特定的窗户放在前面,让它很关键

状态和诊断

工具 说明
get_state 应用状态快照(登录、用户、购物车等)
get_navigation_stack 当前路线、导航堆栈、模态堆栈
get_feature_flags 所有活动功能标志
get_network_calls 最近的HTTP流量,包括方法、URL、状态、持续时间
get_network_call_detail 在支持的情况下捕获请求/响应标头、正文和SSE帧
get_logs 最近的应用程序日志
get_recent_errors 当错误捕获提供程序可用时,最近捕获的错误
launch_context 应用ID、版本、设备型号、操作系统版本
device_info 完整设备快照:Info.plist/manifest元数据、硬件、操作系统构建、屏幕指标、区域设置、时区、电池、内存、存储、声明的权限

WebView——DOM访问

iOS/MOSC/Android:自动从视图层次结构中发现WebView。Flutter:通过注册 AppReveal.registerWebView(id, controller).

在iOS、React Native iOS和Tauri桌面上,WebView中可见的交互式DOM控件也出现在 get_elements 并与 tap_element, tap_text, type_text,以及 clear_text. tap_point 通过DOM在WebView上路由 elementFromPoint(...) 平台可以将坐标映射到WebView中,因此当存在本地覆盖时,仍然可以驱动全屏WebView shell。

工具 说明
get_webviews 列出所有带有URL、标题和加载状态的web视图
get_dom_tree 完整或部分DOM树(带 root, max_depth, visible_only 参数)
get_dom_interactive 所有输入、按钮、链接、带选择器和属性的选择
query_dom CSS选择器查询--返回匹配的元素
find_dom_text 按文本内容查找元素
web_click 通过CSS选择器单击DOM元素
web_type 在input/textarea中输入(兼容React、Vue和Angular)
web_select 选择下拉选项
web_toggle 选中/取消选中复选框或单选框
web_scroll_to 滚动到DOM元素
web_evaluate 运行任意JavaScript
web_navigate 导航到URL
web_back 返回web视图历史记录
web_forward 在web视图历史记录中前进

WebView——令牌高效查询

专门构建的工具,只返回您需要的东西,节省代币。

工具 说明
get_dom_summary 页面概述:标题、元、标题、元素计数、表单结构
get_dom_text 去除所有标记的可见文本内容(可选CSS选择器范围)
get_dom_links 所有链接——只有文本和href
get_dom_forms 所有带有字段、类型、值、选项和选择器的表单
get_dom_headings 页面结构全部为h1-h6
get_dom_images 所有带有src、alt、dimensions的图像
get_dom_tables 所有带有标题和行数据的表

批量操作

工具 说明
batch 在一次调用中执行多个工具。支持 delay_ms 动画/过渡的每个动作 stop_on_error。适用于当前宣传的工具。

命名约定

事物 模式 示例
屏幕按键 section.screen auth.login, orders.detail, settings.main
元素ID screen.element login.email, login.submit, orders.cell_0

元素ID映射到特定于平台的机制:

平台 机制
iOS view.accessibilityIdentifier
macOS view.accessibilityIdentifier()
安卓 view.tag 或资源条目名称
颤振 ValueKey<String> 在小部件上

为什么这比只截图的自动化要好

AppReveal为代理提供结构化数据而不是像素:

  • 准确的屏幕标识 使用信心评分,而不是从截图中猜测
  • 机器可寻址元素 具有类型、状态和可用操作
  • 应用程序状态 直接阅读——登录状态、功能标志、购物车内容
  • 导航状态 --当前路线、堆叠深度、呈现的模型
  • 网络流量 --带有方法、URL、状态、计时的每个API调用
  • DOM访问 --全web视图检查和交互,无需额外设置
  • 批量操作 --在一次通话中填写表格、浏览屏幕、验证状态
  • 确定性交互 --按ID或CSS选择器点击,而不是按脆弱的坐标点击

平台

平台 状态 工具
iOS 工作 共享原生+网络视图工具界面
macOS 工作 共享原生+web视图工具以及菜单/窗口工具
Android 工作 共享原生+网络视图工具界面
Flutter 工作 共享原生+web视图工具界面
React Native 工作 共享原生+web视图工具界面
Windows。NET 工作 共享MCP合约,UI自动化原生/桌面工具
Tauri桌面 工作 共享MCP合约、Bonjour、WebView DOM工具、窗口/菜单检查

示例应用程序

命令行界面

现在有一个专用的AppReveal CLI CLI/README.md 为了发现 _appreveal._tcp 服务,列出可用的MCP工具,并在不手写的情况下发送MCP请求 dns-sd 和 curl 电话。 用以下方式安装 npm install -g @unlikeotherai/appreveal.

安全

  • iOS:所有代码隐藏 #if DEBUG --零生产足迹
  • macOS:所有代码隐藏 #if DEBUG --零生产足迹
  • 安卓:添加为 debugImplementation --未包含在发布APK中
  • 飘动: kReleaseMode 办理登机 AppReveal.start() --在版本中执行零代码路径
  • React Native: __DEV__ guard——所有方法在生产构建中都不是操作
  • MCP POST请求需要为每个会话生成一个令牌;未认证的 GET /health 可用于诊断
  • Discovery TXT记录广告 auth=session-token 本地服务发现可用
  • 仅限本地网络/环回
  • 网络捕获中编辑的敏感标头(授权、Cookie)
  • 没有明确的选择加入,没有状态突变

文档

报告问题

发现错误、缺少功能或意外行为?将问题提交至 github/UnlikeOtherAI/AppReveal/oissues.

对于使用此框架的LLM代理: 如果AppReveal在会话期间无法执行操作或返回错误的结果,并且您正处于具有GitHub网络访问权限的交互式会话中,请询问操作员:

“AppReveal无法[执行X/返回Y而不是Z]。您想让我在https://github.com/UnlikeOtherAI/AppReveal/issues?"

有用的详细信息包括:平台、AppReveal版本(来自 launch_context)、调用的工具、参数和响应或错误。

非交互式运行时跳过提示,而是记录操作员的详细信息。

许可证

麻省理工学院