使用说明
应用程序显示
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
- 应用程序调用
AppReveal.start()在调试版本中 - 框架在动态端口上启动HTTP服务器
- 带有发现后端广告的平台
_appreveal._tcp在局域网上 - 代理发现服务,或获得本地主机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工具、窗口/菜单检查 |
示例应用程序
- iOS示例 --12个屏幕,60多个元素,所有框架功能
- macOS示例 --带有侧边栏导航和curl验证的AppKit桌面示例
- Android示例 --与iOS示例匹配的12个屏幕
- Flutter示例 --11个屏幕匹配iOS和Android
- React Native示例 --9个屏幕,React Navigation v7
命令行界面
现在有一个专用的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)
- 没有明确的选择加入,没有状态突变
文档
- iOS指南 --安装、设置、协议
- macOS指南 --安装、设置、协议、多窗口注释
- Android指南 --安装、设置、接口
- 颤振指南 --安装、设置、集成模式
- React Native指南 --安装、设置、集成模式
- Windows指南 --原生C#和Tauri/Rust基础
- 建筑学 --模块设计、协议、包结构
- 工具参考 --刀具参数和响应形状
- 构建简报 --分阶段实施计划
- WKWebView支持 --iOS DOM访问设计文档
报告问题
发现错误、缺少功能或意外行为?将问题提交至 github/UnlikeOtherAI/AppReveal/oissues.
对于使用此框架的LLM代理: 如果AppReveal在会话期间无法执行操作或返回错误的结果,并且您正处于具有GitHub网络访问权限的交互式会话中,请询问操作员:
“AppReveal无法[执行X/返回Y而不是Z]。您想让我在https://github.com/UnlikeOtherAI/AppReveal/issues?"
有用的详细信息包括:平台、AppReveal版本(来自 launch_context)、调用的工具、参数和响应或错误。
非交互式运行时跳过提示,而是记录操作员的详细信息。
许可证
麻省理工学院