Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
MAH_VLM_URLNoExternal vision endpoint URL (OpenAI-compatible), e.g. http://127.0.0.1:11434/v1/chat/completions.
MAH_VLM_MODELNoExternal vision model name.
MAH_VISION_MODENoVision enhancement mode: off, client, or endpoint.
AGENT_SERIAL_USBNoUSB serial fallback (e.g. 0123456789abcdef).
MAH_FRAME_STREAMNoSet to 1 to enable the H.264 frame stream for observation tools.
AGENT_SERIAL_DEFAULTNoDevice serial used when --serial/ANDROID_SERIAL is absent (e.g. 192.168.1.23:5555).

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": false
}

Tools

Functions exposed to the LLM to take actions

NameDescription
ui.dumpC

全量节点树 JSON(实时桥数据):class/id/text/desc/bounds/checked/clickable 等语义

ui.findC

语义查找节点(GKD 风格选择器),返回节点句柄摘要列表

ui.get_textC

读取选择器命中节点的文本(只读不点击)

ui.wait_forA

轮询等待选择器出现/消失(等弹窗、加载完成、页面跳转),超时返回 ok=false

ui.clickC

节点级点击(选择器解析,非裸坐标)

ui.long_clickC

节点级长按

ui.set_textB

精确输入到指定组件(优先 ACTION_SET_TEXT;无 selector 时输入到聚焦框)

ui.scrollC

滚动(down=查看下方内容,手指上滑)

ui.backC

系统返回键

ui.homeB

回到桌面

app.launchB

启动应用并等待前台空闲

app.currentB

当前前台应用

app.wait_idleC

等待应用前台且稳定

app.stopD

停止应用

app.listB

列出已安装应用包名(third_party=true 仅用户应用)

vision.screenshotB

截屏存盘(视觉兜底/证据);路径会记住,作为 vision.diff 缺省基线

vision.diffB

界面变化检测:当前截图 vs 基线的像素差异(变化占比+差异框);ocr=true 附文本增删

vision.ocrB

OCR(懒加载 rapidocr_onnxruntime;未安装则明确报错);path=本地图片离线 OCR,缺省截屏

vision.vlmA

本地视觉小模型问图(crop-and-ask):缺省整屏,传 box 只裁剪该区域提问(推荐:小图快且准)。需本地 OpenAI 兼容视觉端点:设 MAH_VLM_URL 与 MAH_VLM_MODEL(如 ollama:MAH_VLM_URL=http://127.0.0.1:11434/v1/chat/completions,MAH_VLM_MODEL=qwen2.5vl:3b)。定位:图集外未知图标的语义兜底层

vision.askA

通用识图增强入口(增强层,非主链路)。MAH_VISION_MODE 决定策略:client=截图以 MCP image 内容块返回,由具备视觉能力的客户端模型自己判读(零额外部署);endpoint=转发问题到外部部署的视觉端点(MAH_VLM_URL/MAH_VLM_MODEL,同 vision.vlm);off=关闭(默认,仅用 ui.snapshot/ui2.*/图集等确定性证据层)

shell.runA

执行 shell(root=true 走 su,设备需已 root);风险命令需 allow_risk。script=多行脚本模式:base64 推到手机 /data/local/tmp 执行(规避嵌套引号/管道符转义地狱),与 cmd 二选一

state.prefsC

root 读应用 shared_prefs XML 并解析

state.dbC

root 拉取应用 sqlite 库到 PC 临时目录并执行只读 SQL

file.pushB

PC→手机传文件:base64 分块管道(WiFi adb push 二进制不可靠的替代),MD5 校验

file.pullA

手机→PC 传文件:base64 读出解码(绕开 adb pull 的不可靠/权限问题),MD5 校验

net.httpC

发 HTTP 请求(proxy 参数可接 mitmproxy 等审计代理;verify 默认关闭以适配自签代理证书)

device.wake_unlockA

亮屏 + 按需解除非安全锁屏 + 清理残留弹窗(agent 自身 setup,非人工干预)

harness.listB

列出已加载的 harness 与工具

harness.check_versionsA

读取设备上各 harness 目标 app 的 versionName,与 versionRange(>=/<=/* /通配) 比对;不匹配 → stale 需重蒸馏

harness.runC

运行某 harness 工具(steps 由语义选择器组成)

input.tapB

裸坐标点击(通用层原语:不解析选择器,直接注入;长按调大 duration_ms)

input.swipeC

裸坐标滑动(通用层原语)

input.keyC

按键注入(back/home/menu/volume_up/volume_down/power/enter... 或键码整数)

input.clipboardB

剪贴板读写(set=写入设备剪贴板;get 读回,需 u2 支持)

events.captureC

执行动作同时捕获瞬时 Toast/弹层(Monitor 接线;action=click 可带 selector;expect 为正则过滤)

events.snapshotB

单次前台状态快照(含游离窗口节点=toast/悬浮窗候选)

events.record_startB

后台连拍+状态流开始(record_stop 收结果)

events.record_stopA

停止后台记录,返回 toasts/帧数/目录

ui.snapshotA

读屏默认首选:a11y 语义裁剪快照,元素编号 e0/e1/...(token 约为 ui.dump 的 1/10)。k 类型 btn/input/toggle/scroll/icon/text;i=可交互 e=可输入 s=可滚动 v=开关态。用 ui.click_handle/ui.text_handle 按句柄操作

ui.click_handleA

按快照句柄点击/长按(a11y 元素先重定位防漂移,纯视觉元素用快照中心)

ui.hold_readA

长按读悬浮提示(hover/tooltip):后台线程长按目标,按住期间读屏对比,返回新出现的提示文本。适合悬浮说明、图标长按菜单等按住才显示的提示。ocr=false 只比 a11y 树(快,~1s,普通 app 用);ocr=true 加 OCR 对比(~6s,canvas/自绘界面用)

ui.text_handleB

按句柄向输入元素写文本(a11y 元素走 set_text 原生通道链;纯视觉元素先点中心聚焦)

task.beginA

开始一个业务任务:声明目标(如'领所有商品的券')。返回 task_id,后续 task.note/task.end 回传它

task.noteB

记录当前想法/判定/预期(业务化历史的核心):比如'我判断这个按钮是搜索入口,点击预期出现搜索框'。可能错,先声明后验证

task.endB

结束任务:实际结果与目标对照(成功/失败/原因)

ui2.find_templatesA

图标模板匹配:在当前屏幕上找声明图集里的图标(无需 hover,图标在屏即命中),返回位置+置信度+manifest 里声明的语义。templates 缺省匹配图集全部;图集用 template.add 从截图裁剪声明

ui2.screen_evidenceB

屏幕证据采集(只出证据不下结论):overlay=灰屏/暗化覆盖(HSV)、motion=两帧运动量、color=色相分布、filter=vignette/flash、layout=UI 热区网格、hud=动作栏图标在位性(图集 kind=hud 模板)。防幻觉纪律:缺证据时列备选假设,不得凭单一特征断言状态

ui2.scene_matchA

场景/花纹零样本分类(小模型层):给候选标签短语(如 '设置页面'/'聊天列表页'),CLIP 类模型计算图文相似度返回各候选得分——加新场景=加一个标签,无需训练。定位:色彩/布局等像素统计概括不了的花纹与场景语义。需可选依赖:pip install 'mobile-agent-harness[scene]';模型经 MAH_SCENE_MODEL 配置(中文标签用 OFA-Sys/chinese-clip-vit-base-p16,英文标签默认 openai/clip-vit-base-patch32)

template.addA

声明图标模板:从截图(缺省最近一次 vision.screenshot)按 box 裁剪图标,写入 templates// 并更新 manifest。这是'图标→语义'声明层的一次性成本,之后 ui2.find_templates 永久可匹配(无需 hover)

knowledge.listB

列出已加载知识包(guide=上下文面,templates/states=运行时面)

knowledge.guideA

读取知识包的 guide(上下文面:业务流程/使用时机/注意事项)。用某 app 前先看对应包的 guide

ui2.check_statesB

按知识包的状态判别式求值当前屏幕:先采证据(同 ui2.screen_evidence),再对声明状态逐个判别式求值——全满足=ok,缺证据单列(不出具结论)。这是'证据与判读分离'的声明面

events.tailB

事件面:最近的设备事件(page_change/app_start/app_crash/visual_change)——'刚才发生了什么'的场景感知,推送非轮询

events.waitA

等一个匹配事件(推送,非 sleep 轮询):type=page_change/app_start/app_crash/visual_change;可限定 pkg。事件到后仍应用帧/快照验证防误报

ui2.stateB

结构化 UI 状态 v2:a11y×OCR 融合——a11y 提供零误报可交互性,OCR 补 canvas/自绘文本(src=ocr 的元素为启发式推断)。元素带句柄,ui.click_handle 直接操作。canvas/自绘界面必用

ui2.diffC

界面变更检测:对比两次融合状态的文本元素增删

ui2.wait_changeB

等画面变化(点了按钮后确认生效),变化时返回新界面的可交互元素

sys.capabilitiesB

能力发现:各缝当前可用 provider 及 privilege/stealth 元数据;插件热载入口

com.android.settings__launchA

[harness:com.android.settings] 打开设置并等待其稳定到前台

com.android.settings__searchB

[harness:com.android.settings] 点搜索入口并输入关键词(AOSP: Search settings;OEM 中文变体走 target_alt)

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

C2.5/5.0

Scored across 60 tools

Disambiguation2/5

Many tools overlap heavily across layers: ui.click vs ui.click_handle vs input.tap; ui.set_text vs ui.text_handle; ui.dump vs ui.snapshot vs ui2.state; vision.ocr vs vision.vlm vs vision.ask. Descriptions try to explain preferred/default vs fallback vs primitive, but an agent still faces multiple plausible choices for the same action.

Naming Consistency3/5

Most names use a readable namespace.verb_noun pattern such as ui.get_text, app.launch, vision.screenshot, but the set mixes ui vs ui2, dot-delimited namespaces, and harness-specific double-underscore names like com.android.settings__launch. The convention is largely understandable but not uniform.

Tool Count1/5

With 60 tools, the server is far beyond a well-scoped set and likely overwhelms tool selection. The layering of ui, ui2, input, vision, events, harness, and fallback tools suggests internal architecture leaking directly into the exposed surface.

Completeness4/5

The surface covers app lifecycle, UI interaction, vision/OCR, files, shell, state, events, tasks, templates, harnesses, and knowledge packages, which is very comprehensive for phone automation. Some device-level domains such as telephony, notifications, sensors, or media remain absent, but core agent workflows are well represented.

Maintenance

ActivityMaintained
ResponsivenessNo issues