UI-dbugbridge-mcp
This server is a Mac-side MCP server that lets you interact with a physical iOS app through an in-app DebugBridge, enabling UI inspection, automation, log retrieval, and runtime auditing.
Discover and connect to a physical iOS device via CoreDevice tunnel or iproxy, and ensure the DebugBridge port is reachable.
Read the current semantic page, registered element IDs, or the full UIWindow/UIView hierarchy.
Perform UI actions by stable element ID: tap, toggle switches, replace or append text, and run multi-step UI flows.
Query or wait for in-memory app logs with optional filters for message text, level, and category.
Read live runtime nodes by accessibility identifier/anchor.
Audit the current UI against a Figma raw JSON frame and generate JSON/Markdown reports.
Capture screenshots when an external screenshot command is configured.
Optionally save page, runtime node, flow trace, and audit artifacts to disk.
Release the current session/iproxy when done.
Allows auditing runtime UI against a Figma design by comparing a Figma raw JSON export with the current DebugBridge page, generating a semantic alignment report.
Provides tools for inspecting and interacting with iOS apps running on physical devices, including reading the UI hierarchy, tapping elements, setting text or switches, running multi-step UI flows, reading in-app logs, and capturing screenshots.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@UI-dbugbridge-mcpInspect the current UI hierarchy on the device."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
UI-dbugbridge-mcp
UI-dbugbridge-mcp 是 Mac 侧的 MCP Server。它通过 stdio 接收 MCP 请求,再通过 iproxy 访问运行在 iOS App 内的 LookDebugBridge HTTP 服务。
本仓库只负责 MCP 编排,不负责编译、安装或启动 App。真机编译安装由 XcodeBuildMCP 的 build_run_device 完成。
两个仓库的职责
仓库 | 职责 |
| Mac 侧 MCP Server:真机预检、端口转发、UI 操作、UI 树读取、日志读取、运行态校验 |
| iOS Debug Pod:在 App 进程内启动 HTTP Bridge,提供 UI、UI 树和临时内存日志能力 |
Related MCP server: MCP Safari Server
当前运行约束
只发现物理设备上的 DebugBridge,不扫描 iOS Simulator,也不回退到 localhost。
ensure_ports/ping默认探测真机目标的 App 端口37777(与 Pod 默认值对齐),并在结果里返回discovered列表。通过
bundleID/sessionID/deviceUDID(或deviceID)/mode=device选择当前激活目标;设备选择器支持物理 UDID 和 CoreDevice ID。未指定选择器时,优先有线真机上的活桥,其次任意真机。
App 编译安装由 XcodeBuildMCP 负责;本仓库不激活 Xcode scheme,不发送
Command+R。不读取 Xcode Console,不调用 Lookin CLI。
真机优先走 CoreDevice tunnel;旧设备回退
iproxy。
端口与会话语义
维度 | 默认行为 | 说明 |
远端 App 端口 |
| 与 Pod 默认值对齐,同一真机/同一 App 只暴露一个端口;连续会话直接复用,不靠多端口隔离 |
CoreDevice 直连 |
| iOS 17+ 默认走 CoreDevice tunnel,MCP 直接访问 tunnelIP:37777, |
iproxy 回退 |
| 旧设备无 tunnelIP 时回退 iproxy; |
| 上下文标记,非并发隔离 | 默认(未传 |
连续会话 release | 下个会话可重连 | App 侧 |
若两个 MCP 会话并发控制同一 App,当前没有 ownership/lease 机制保护,仍可能互相覆盖 sessionID。仅适合"连续会话"(同一时刻只有一个活跃会话)场景。
App 侧接入
CocoaPods
正式接入使用独立 Pod 仓库:
target 'YourApp' do
use_frameworks!
pod 'LookDebugBridge',
:git => 'git@github.com:Immmmmmortal1/LookDebugBridgeService.git',
:tag => '0.1.17',
:configurations => ['Debug']
end不要再添加 LookinServer。执行:
pod install启动 Bridge
在 App 启动阶段,仅 Debug 构建启动服务:
#if DEBUG
import LookDebugBridge
Task { @MainActor in
LookDebugBridge.shared.startIfNeeded()
}
#endifBridge 启动后提供:
HTTP 接口 | 用途 |
| 检查 Bridge 是否可用 |
| 只读 bundleID / sessionID / port;Mac 侧 preflight 据此校验目标 App |
| 运行时注入 sessionID(上下文标记,非并发隔离);覆盖式写入,幂等可重入 |
| 读取当前语义页面和注册元素 |
| 读取当前 UIWindow/UIView 树 |
| 按 accessibility anchor 读取运行态节点 |
| 点击注册元素 |
| 设置 UISwitch |
| 替换 UITextField/UITextView 文本 |
| 追加 UITextField/UITextView 文本 |
| 查询或等待当前 App 进程的日志 |
/debug/identity与/debug/session中的sessionID是上下文标记(用于日志、identity 匹配),不代表真正并发隔离。两个 MCP 会话并发控制同一 App 仍需后续 ownership/lease 机制。
日志接入
业务 Debug 日志必须进入 LookDebugBridge.log,或由 App 的 Debug 日志入口统一转发:
#if DEBUG
LovOnDebugLog.error("request failed", category: "api")
#endif日志级别和分类是自由字符串,不限于固定枚举。level 和 category 查询为不区分大小写的精确匹配,query 为不区分大小写的消息子串匹配。
日志生命周期和查询规则
日志是 App 进程内的临时内存池:
不写本地文件;
不跨 App 进程保留;
App 重启后创建新的日志池;
不使用 cursor、offset 或读取位置;
read_app_logs直接检索当前进程已经产生的完整日志池,默认返回最近 500 条,最多 5000 条;wait_app_logs只等待本次请求开始后产生的、符合条件的新日志,最多等待 120 秒;sessionID是 App 本次进程生成的调试会话标识(上下文标记,不是文件目录,也不是日志游标,不作为并发隔离依据);DEV_FLOW_SESSION_ID是 DevFlow/MCP 上下文标识,作为上下文标记通过POST /debug/session注入 App(用于日志/identity),两者用途不同但语义都是上下文标记。
日志返回结构:
{
"success": true,
"sessionID": "app-process-session-id",
"status": "matched",
"lines": [
{
"timestamp": "2026-07-31T06:00:00Z",
"level": "error",
"category": "api",
"message": "request failed"
}
],
"error": null
}status 的含义:
status | 含义 |
| 找到符合条件的日志 |
| 当前池没有符合条件的日志(立即查询) |
| 等待超时,期间没有符合条件的新日志 |
查询示例:
{
"name": "read_app_logs",
"arguments": {
"query": "upload",
"category": "oss",
"limit": 50
}
}等待示例:
{
"name": "wait_app_logs",
"arguments": {
"query": "completed",
"level": "info",
"waitMs": 30000
}
}Mac 侧安装与配置
要求:
macOS;
Node.js 18+;
Xcode command line tools;
iproxy;已连接并信任的物理 iOS 设备。
Codex 配置示例:
[mcp_servers.ui_dbugbridge_mcp]
command = "/opt/homebrew/bin/node"
args = ["/absolute/path/UI-dbugbridge-mcp/src/server.js"]
startup_timeout_sec = 30.0
[mcp_servers.ui_dbugbridge_mcp.env]
# 默认不设置 BRIDGE_BASE_URL / BRIDGE_LOCAL_PORT:iproxy 模式下 localPort 动态分配,
# CoreDevice 隧道模式下 ensureBridgeReachable 用 tunnelIP 覆盖;二者均不需要固定本地端口
LOOKDEBUG_DEVICE_ID = "<core-device-id-or-physical-udid>"
IPROXY_PATH = "iproxy"
# 远端 App 端口默认 37777(与 Pod 对齐);1-65535,否则回退到 37777
# BRIDGE_REMOTE_PORT = "37777"
DEV_FLOW_SESSION_ID = "<devflow-session-id>"
DEV_FLOW_SESSION_ID只作为上下文标记写入 App(通过POST /debug/session),用于日志/identity 匹配,不作为并发隔离依据。同一时刻多个 MCP 会话并发控制同一 App 仍需后续 ownership/lease。
隧道模式 vs iproxy 模式(端口说明)
默认省略 BRIDGE_BASE_URL / BRIDGE_LOCAL_PORT:iproxy 模式下 localPort 动态分配,CoreDevice 隧道模式下用 tunnelIP 覆盖,二者均不需要固定本地端口:
模式 | 触发条件 | BRIDGE_BASE_URL / BRIDGE_LOCAL_PORT | 实际访问地址 |
CoreDevice 隧道(iOS 17+ 默认) | 设备暴露 | 忽略, |
|
iproxy(旧设备回退) | 无 tunnelIP,走 | 默认省略;如显式设置则在 iproxy 模式生效,否则动态分配本地端口转回设备 37777 |
|
门禁类探针不要直接探测 127.0.0.1:37777:隧道模式下该端口无监听,会误报桥不可用。请通过 MCP 工具(ping / ensure_ports)走 preflight 流程判断桥可达性。
配置项:
配置项 | 必须 | 说明 |
| 否 | 默认省略;省略时 iproxy 模式下动态生成实际本机转发地址,CoreDevice 隧道模式用 tunnelIP 覆盖。如显式设置:host 仅允许回环(127.0.0.1/localhost/::1),非回环需显式开启 |
| 否 | 指定优先使用的 XcodeBuildMCP/CoreDevice ID;也接受物理设备 UDID |
| 否 |
|
| 否 | 默认 |
| 否 | 默认省略,由 iproxy 模式动态分配本机端口;显式设置后固定使用指定端口(1-65535),若被其他转发占用则失败。仅 iproxy 模式生效,CoreDevice 隧道模式忽略 |
| 否 | 默认 |
| 否 | DevFlow 上下文标识,作为上下文标记通过 |
| 否 | 外部截图命令;使用 |
| 否 | artifact 根目录,设置后 |
| 否 | 危险开关,默认关闭。开启后允许 |
| 否 | 危险开关,默认关闭。开启后允许 |
截图不是 UI 树或日志的依赖能力。未配置 LOOKDEBUG_SCREENSHOT_COMMAND 时,get_screenshot 返回 screenshot_command_not_configured。配置后执行返回结果会带 warning: screenshot_command_executed_as_configured 提示。
标准真机调试流程
1. session_show_defaults
2. 未指定设备时,默认选中有线连接的第一台可用物理设备,再 build_run_device
3. 启动并确认 App 内 LookDebugBridge
4. MCP tools/call: ping 或任意业务工具(自动执行预检)
5. get_debug_page / inspect_ui
6. tap_element / set_switch / set_text / type_text / run_flow
7. read_app_logs 或 wait_app_logs 验证业务结果
8. get_runtime_node / audit_runtime 做运行态校验build_run_device、session_show_defaults 属于 XcodeBuildMCP,不是本仓库提供的 MCP 工具。本仓库不主动切换 Xcode scheme,也不模拟 Command+R。设备选择遵循上方「有线第一台」规则;LOOKDEBUG_DEVICE_ID(或旧版 LOOKDEBUG_DEVICE_UDID)仅用于显式覆盖。
MCP 工具契约
所有业务工具都通过 stdio 的 MCP tools/list 和 tools/call 暴露。工具结果统一包含:
{
"source": "debug_bridge",
"success": true,
"payload": {},
"error": null
}环境与连接
工具 | 参数 | 说明 |
|
| 扫描全部目标上的活桥并激活一个 |
|
| 释放本 MCP 实例的 iproxy;默认随后退出 server 进程 |
| 同上 | 同上;结果包含 |
UI 页面和节点
工具 | 主要参数 | 说明 |
|
| 读取当前语义页面、页面标题和注册元素 |
|
| 读取当前 UIWindow/UIView 节点树 |
|
| 按 |
| 同 | 兼容别名,已弃用 |
| 无 |
|
inspect_ui 示例:
{
"name": "inspect_ui",
"arguments": {
"depth": 8,
"includeHidden": false,
"maxNodes": 2000
}
}UI 操作
工具 | 必填参数 | 说明 |
|
| 点击注册元素 |
|
| 设置开关状态 |
|
| 替换输入控件文本 |
|
| 追加输入控件文本 |
|
| 按顺序执行多步 UI 流程 |
操作工具使用 DebugBridge 注册的稳定 id,不使用坐标。单步可附加 waitForPageID、waitForElement、timeoutMs、intervalMs 等等待条件。
run_flow.steps 支持:
tap
tap_if_present
set_switch
set_text
type_text
wait_for_page
wait_for_element
sleep流程示例:
{
"name": "run_flow",
"arguments": {
"steps": [
{"action": "set_text", "id": "login.email", "text": "user@example.com"},
{"action": "tap", "id": "login.submit", "waitForPageID": "home"},
{"action": "wait_for_element", "id": "home.content"}
]
}
}日志、截图和运行态审查
工具 | 必填参数 | 说明 |
| 无 | 查询当前 App 进程日志池 |
| 无 | 等待当前请求开始后的新匹配日志 |
| 无 | 调用配置的外部截图命令 |
|
| 将 Figma raw JSON 与当前 DebugBridge 页面做语义校对并生成报告 |
audit_runtime 可选 figmaNodeID、expectedPageID、labelAliases、artifactDir、outJsonPath、outMarkdownPath、timeoutMs、intervalMs。
页面、流程和审查工具的 artifact 默认写入 .devflow-ui/runtime;截图默认写入当前工作目录下的 .tmp/lookdebug-mcp。日志不写入这些目录。
常见错误
错误 | 处理 |
| 连接物理设备,开启开发者模式并确认 Developer Disk Image 服务可用 |
| 检查 |
| 设置 |
| 检查 |
| 确认 App 已启动 DebugBridge 且 |
| dev-flow commit 完成后调用,释放本 MCP 实例的 iproxy 并退出进程 |
| 当前页面没有可用的页面描述或 App 仍在切换页面 |
| 重新调用 |
| 当前元素不支持请求的操作 |
| 确认日志入口确实调用了 |
本地开发和验证
npm run build
npm test运行 MCP Server:
node src/server.js该进程使用 newline-delimited JSON 的 stdio MCP transport,支持 initialize、notifications/initialized、tools/list 和 tools/call。
发布与群通知
MCP 更新后的 Bridge 版本门禁
每次更新 MCP 代码或准备发布前,必须主动检查以下版本是否同步:
package.json的 MCP 版本LookDebugBridge.podspec的 Pod 版本独立
LookDebugBridgeService仓库的最新稳定 tagREADME 中示例 Pod 的 tag
执行联网校验:
npm run check:bridge-version校验无法访问远端或任一版本不一致时会以非零状态退出,禁止继续发布。仅检查本地文件一致性时可使用 npm run check:bridge-version:offline。
打 tag 发布新版本并 push 时,.githooks/pre-push 会自动推送飞书群机器人通知(仅发版触发,普通提交不通知)。
新 clone 后启用 hook(一次性):
git config core.hooksPath .githooks发布流程:
# 1. bump 版本(package.json 的 version)
# 2. npm run release:check
# 3. commit 改动
# 4. git tag -a <版本> -m "Release <版本>"
# 5. git push origin main && git push origin <版本> # 触发飞书通知默认 webhook 地址内置于 .githooks/pre-push,可用环境变量 LOOKDEBUG_LARK_WEBHOOK 覆盖。
Available Tools
16 toolsaudit_runtimeB
Compare a Figma raw frame with the current DebugBridge page and write semantic audit artifacts.
| Name | Required | Description | Default |
|---|---|---|---|
| timeoutMs | No | How long to retry /debug/page while the app is launching or transitioning. Defaults to 8000. | |
| intervalMs | No | Retry interval for transient /debug/page failures. Defaults to 300. | |
| artifactDir | No | Directory for JSON/Markdown report artifacts. Defaults to .devflow-ui/runtime. | |
| figmaNodeID | No | Optional target Figma node id when the raw file contains multiple nodes. | |
| outJsonPath | No | Optional exact JSON artifact path. | |
| figmaRawPath | Yes | Path to the raw Figma JSON artifact. | |
| labelAliases | No | Optional label alias map, e.g. {"Share":["分享"]}. | |
| artifactPrefix | No | Optional file prefix for saved report artifacts. | |
| expectedPageID | No | Optional expected DebugBridge pageID. | |
| outMarkdownPath | No | Optional exact Markdown artifact path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It mentions writing artifacts but does not specify side effects, permissions, what gets modified, or what the output contains. It also fails to clarify the semantics of 'semantic audit artifacts' or the comparison process. This ambiguity is risky for a tool with side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single-sentence description is concise and front-loaded, but it lacks important context. It is not verbose, but the brevity sacrifices essential information. A well-crafted description of this length can earn a higher score, but this one doesn't include usage or side-effect details, so it's adequate but not exemplary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 parameters, a nested object, no output schema, and no annotations. The description covers only the high-level purpose and fails to explain return values, artifact format, retry behavior, or how the comparison works. The schema provides parameter details, but the description leaves significant contextual gaps, making it incomplete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the schema already documents all 10 parameters. The description does not add additional parameter semantics beyond referencing 'Figma raw frame' and 'current DebugBridge page', which loosely correspond to figmaRawPath and expectedPageID. This meets the baseline but adds little value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: comparing a Figma raw frame with the current DebugBridge page and writing semantic audit artifacts. This verb+resource phrasing distinguishes it from sibling tools like get_debug_page or get_runtime_node, which focus on retrieval rather than comparison/audit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention prerequisites, exclusions, or compare-and-contrast with sibling tools. It only states what the tool does, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ensure_portsB
Require a connected physical device and ensure the DebugBridge port is forwarded.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for disclosing behavior. It mentions the device requirement and port forwarding goal, but it does not explain side effects, failure behavior if no device is present, whether it merely checks or actively modifies port forwarding, or any permissions required. This is a significant gap for a tool that likely sets up the debugging environment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, immediately front-loading the key requirement ('Require a connected physical device') and the main action ('ensure the DebugBridge port is forwarded'). It is appropriately sized for a tool with no parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and no parameter details, the description is too thin to fully understand the tool's role in a workflow. It does not specify success/failure conditions, preconditions beyond device connection, whether port forwarding is persistent, or how this tool relates to sibling tools like 'get_debug_page' or 'run_flow'. The description only provides a high-level statement without enough operational context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so there is nothing to document beyond the schema itself. Per the baseline rule for 0 params, a score of 4 is appropriate. The description does not add parameter-level detail because none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it requires a connected physical device and ensures the DebugBridge port is forwarded. The verb 'ensure' and the resource 'DebugBridge port' are specific. However, it does not explicitly distinguish this from sibling tools like 'ping' which also deal with device connectivity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives. It implies it is a prerequisite for other debugging operations but does not state when to call it, what conditions warrant its use, or whether there are alternative tools for similar setups. The context signals show many siblings, but the description offers no differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_debug_pageB
Get semantic page and registered actionable element IDs from the in-app DebugBridge, optionally saving an artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| timeoutMs | No | How long to retry while the app is launching or transitioning. Defaults to 8000. | |
| intervalMs | No | Retry interval for transient /debug/page failures. Defaults to 300. | |
| artifactDir | No | Directory for saved artifacts. Defaults to .devflow-ui/runtime. | |
| saveArtifact | No | Save the captured page JSON to artifactDir. Defaults to false. | |
| artifactPrefix | No | Optional file prefix for saved artifacts. | |
| expectedPageID | No | Optional expected pageID. When provided, mismatch returns an error with the captured page payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must disclose behavior, but it only mentions optional artifact saving. It does not explain retry/timeout behavior, error conditions, side effects of saving, or whether the operation is read-only, leaving significant behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the core purpose and adds the optional artifact-saving behavior without redundant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the tool having six parameters, retry logic, and no output schema, the description provides no return structure, retry semantics, or usage context. The one-sentence description is too sparse for the tool's complexity, leaving gaps beyond what the schema covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the input schema. The description adds little beyond the schema, only restating the artifact-saving capability, which the saveArtifact parameter already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and identifies a unique resource: the semantic page and registered actionable element IDs from the in-app DebugBridge. It distinguishes this from sibling tools like get_page/get_ui_hierarchy by emphasizing DebugBridge and actionable element IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance on when to use this tool over alternatives such as get_page or get_ui_hierarchy. It implies a debugging context but lacks exclusions or fallback conditions, leaving the agent to infer the appropriate scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pageA
Deprecated alias of get_debug_page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the deprecated status, which is useful behavioral context. However, with no annotations, it does not disclose what the tool actually does (e.g., side effects, safety, return format). The behavior is only implied via the alias, so the agent must inspect get_debug_page to fully understand.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the most important fact (deprecated) and the alternative. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For what is essentially a deprecated alias with no parameters and no output schema, the description is completely sufficient. It tells the agent everything needed: don't use this, use get_debug_page instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to provide parameter details. The schema confirms this with an empty properties object. The baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a deprecated alias of get_debug_page, which tells the agent its purpose by referencing the canonical tool. It does not directly state what the tool does, but the alias relationship makes the purpose evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Deprecated alias' and names the alternative tool (get_debug_page). This is a clear directive to avoid this tool and use get_debug_page instead, providing both when-to-use (never) and an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runtime_nodeA
Read a live UIKit node by runtime anchor/accessibilityIdentifier via the in-app DebugBridge, optionally saving a runtime detail artifact.
| Name | Required | Description | Default |
|---|---|---|---|
| anchor | Yes | Runtime anchor to match against UIView.accessibilityIdentifier, for example figma.1739_13055. | |
| artifactDir | No | Directory for saved artifacts. Defaults to .devflow-ui/runtime. | |
| saveArtifact | No | Save the captured runtime node JSON to artifactDir. Defaults to false. | |
| artifactPrefix | No | Optional file prefix for saved artifacts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It correctly frames the operation as a read (suggesting non-destructive) and flags the optional artifact saving side effect. However, it omits important behavioral context such as prerequisites (DebugBridge must be active), failure behavior when the anchor isn't found, and whether saving artifacts affects the app or filesystem beyond creating files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence. It leads with the core action and resource, mentions the mechanism, and appends the optional artifact behavior in a compact clause. No filler words or redundant information present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 4 parameters, no annotations, and no output schema. The description explains the primary read operation and optional artifact saving, but it fails to mention what the response contains (e.g., JSON structure) or any runtime prerequisites like DebugBridge being enabled. This leaves a significant gap for an agent deciding whether to call the tool and interpreting its result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is fully described with 100% coverage, including defaults and types. The description adds no extra meaning about parameters beyond what the schema already provides, so the baseline of 3 applies. There are no examples or clarifications for the anchor format or artifact naming beyond schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Read' and the specific resource 'live UIKit node' via an anchor/accessibilityIdentifier, which distinguishes it from siblings like get_ui_hierarchy or get_page that operate on broader structures. The reference to DebugBridge and optional artifact saving adds specificity without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool should be used when a runtime anchor is available and one needs the corresponding node details. However, it does not explicitly state when not to use it or name alternatives (e.g., get_ui_hierarchy for whole-hierarchy queries), leaving usage criteria implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_screenshotA
Capture a screenshot using the configured screenshot command.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It mentions 'using the configured screenshot command,' which hints at an external configuration, but it does not disclose what happens with the screenshot (e.g., saved file, base64 output), whether it is synchronous, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no superfluous words. It is concise and fast to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, zero parameters, and lack of an output schema, the description is adequate but leaves a notable gap: it does not specify what the agent receives as a result (e.g., file path, image data) or any caveats about the 'configured screenshot command.' The core action is clear, but operational details are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there is nothing for the description to add about parameters. The baseline of 4 applies because no parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function with a specific verb ('Capture') and resource ('screenshot'). It is distinct from sibling tools that fetch pages or UI hierarchies, leaving no ambiguity about the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, nor are there any exclusions, prerequisites, or context hints. The intended usage is only implicitly derived from the verb and noun.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ui_hierarchyA
Deprecated alias of inspect_ui using the current App UIWindow/UIView tree.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It only mentions the deprecated alias and the UIWindow/UIView tree source, but does not disclose what the tool returns, whether it is read-only, potential errors, or deprecation consequences (e.g., may be removed). This is minimal behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. It front-loads the key fact (deprecated alias) and includes the tree source, making it appropriately concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no params, no output schema), the description covers the essential guidance to avoid using it in favor of `inspect_ui`. However, it does not describe what the tool actually returns or any behavior, leaving the agent without a full picture if it were to use it. The deprecation warning helps, but completeness is moderate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the input schema is empty with 100% coverage (vacuously). The baseline for no parameters is 4, and the description adds no parameter information because none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states it is a 'Deprecated alias of inspect_ui' and mentions 'current App UIWindow/UIView tree', which clearly indicates the tool retrieves the UI hierarchy. However, it does not explicitly state what the tool returns or directly define its function beyond being an alias, so it is clear but not fully independent of the sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly labels the tool as 'Deprecated alias of inspect_ui', which strongly implies that users should use `inspect_ui` instead. This provides an explicit alternative and exclusion, making the usage guidance very clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_uiB
Read the current App UIWindow/UIView tree directly from DebugBridge.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Deprecated compatibility field; ignored. | |
| depth | No | Optional tree depth limit. | |
| maxNodes | No | Maximum nodes returned. Defaults to 2000. | |
| includeHidden | No | Include hidden or transparent nodes. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description uses the verb 'Read,' which signals a non-mutating operation, and mentions 'directly from DebugBridge' for context. However, no annotations are present, and the description does not disclose further behavioral details such as return format, error conditions, or performance implications. It adds limited value beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no unnecessary words, front-loading the core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the basic operation but does not address usage context, distinguish from get_ui_hierarchy, or describe the output format. With simple optional parameters and no output schema, the description is adequate but lacks completeness for an agent comparing related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are documented in the schema with descriptions, giving 100% coverage. The description itself does not add additional parameter information, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the current App UIWindow/UIView tree from DebugBridge, with a specific verb and resource. However, it does not distinguish itself from the sibling get_ui_hierarchy, which likely serves a similar purpose, so it lacks explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_ui_hierarchy. The description does not mention any prerequisites or exclusions, leaving the agent without direction for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pingA
Require a connected physical iOS device, then check the in-app DebugBridge.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It mentions a prerequisite but does not explain what 'check' entails (e.g., whether it sends a ping, returns a boolean, or has side effects). The agent is left guessing about the tool's operational effect on the DebugBridge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It immediately states the key requirement and the action, making it highly concise and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description should explain what the agent can expect after calling this tool, such as return values or success/failure indicators. It does not, leaving the tool's output behavior completely unspecified. For a simple ping, this is a notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to explain beyond the schema. The baseline for no params is 4, and the description adds no unnecessary parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'check' with a specific resource 'in-app DebugBridge', making it clear the tool verifies the debug bridge connection. It does not explicitly differentiate from siblings like ensure_ports or get_debug_page, but the action is distinct enough for a ping-like tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states a prerequisite: 'Require a connected physical iOS device', which tells the agent when this tool can be used. It does not explicitly list alternatives or exclusions, but the prerequisite provides strong context for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_app_logsA
Search the current app run's in-memory DebugBridge log pool. Logs are temporary and are not written to disk or addressed by cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Optional exact level filter, such as debug, info, or error. | |
| limit | No | Maximum most-recent matching entries. Defaults to 500. | |
| query | No | Optional case-insensitive substring matched against log messages. | |
| category | No | Optional exact category filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It adds meaningful context by noting logs are temporary, not written to disk, and not addressed by cursor, but it does not explicitly state side effects, return behavior, or permissions, leaving some uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the core purpose ('Search...log pool') and add essential caveats in the second sentence. Every word earns its place, with no redundant or vague filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the source and temporary nature of logs but does not describe return format, ordering, or how results are presented. With no output schema, the agent is left to infer the result structure, making the description adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides 100% coverage with descriptions for all four parameters, including their optionality and semantics. The description adds little beyond the schema, only implying that the parameters serve as filters. Baseline 3 is appropriate given the schema's thoroughness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Search') and a specific resource ('current app run's in-memory DebugBridge log pool'). It distinguishes from siblings by emphasizing 'current' and 'in-memory', differentiating it from tools like wait_app_logs or persistent log readers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context such as 'current app run' and 'in-memory', implying the tool is for temporary, ephemeral logs, but it does not explicitly state when to use this tool versus alternatives like wait_app_logs, nor does it mention exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_flowC
Run a UI operation flow against the current app page using DebugBridge IDs or labels.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | Ordered UI steps. Supported actions: tap, tap_if_present, set_switch, set_text, type_text, wait_for_page, wait_for_element, sleep. | |
| artifactDir | No | Directory for saved artifacts. Defaults to .devflow-ui/runtime. | |
| saveArtifacts | No | Save flow trace and final page JSON artifacts. Defaults to false. | |
| artifactPrefix | No | Optional file prefix for saved artifacts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure, but it only says 'Run a UI operation flow.' It does not mention side effects (navigation, state changes), execution behavior (sequential, wait conditions), failure handling, or return values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that directly states the tool's core purpose without fluff or repetition. Every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (ordered step flows, many optional parameters, wait behavior), the description is too thin. It relies entirely on the schema for context and offers no high-level guidance about execution semantics, suitable scenarios, or expected outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters in detail. The description adds only 'using DebugBridge IDs or labels,' which is already reflected in the id/label property descriptions, so no meaningful semantic value is added beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run a UI operation flow against the current app page using DebugBridge IDs or labels.' It distinguishes from sibling single-action tools (tap_element, set_text, etc.) by emphasizing 'flow,' though it doesn't explicitly contrast with those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus the sibling single-action tools. The name and description imply multi-step flows, but there is no stated context, exclusions, or mention of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_switchB
Set a UISwitch by stable DebugBridge ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Debug element identifier, for example AutomationTest.toggleSwitch. | |
| isOn | Yes | Target switch state. | |
| timeoutMs | No | How long to wait for post-action page availability or target criteria. Defaults to 8000. | |
| intervalMs | No | Polling interval after changing the switch. Defaults to 300. | |
| waitAfterMs | No | Delay after setting the switch before reading the next page. Defaults to 350. | |
| waitForLabel | No | Optional exact element label to wait for after changing the switch. | |
| waitForPageID | No | Optional pageID to wait for after changing the switch. | |
| waitForElement | No | Optional element criteria to wait for after changing the switch. | |
| waitForPageIDs | No | Optional acceptable pageIDs to wait for after changing the switch. | |
| waitForElementID | No | Optional element ID to wait for after changing the switch. | |
| waitForLabelIncludes | No | Optional element label substring to wait for after changing the switch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must disclose behavior. It only states the action and identifier, but omits important details such as waiting behavior, failure handling, or whether the switch state is forced. The many wait parameters in the schema are not referenced in the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no redundancy, making it efficient. However, its brevity omits useful context, though for a simple action it is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters, a nested object, and no annotations or output schema, the one-sentence description is insufficient to guide an agent on using the optional wait parameters and understanding post-action behavior. The schema helps but the description does not integrate this context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have descriptions in the schema (100% coverage), so the baseline is 3. The description's mention of 'stable DebugBridge ID' aligns with the id parameter but adds little beyond the schema's param descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Set') and resource ('a UISwitch'), and identifies the identifier mechanism ('stable DebugBridge ID'). This distinguishes it from other input tools like set_text and tap_element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when/when-not or alternatives are mentioned, but the tool's name and description imply it is for changing a switch state, contrasting with sibling tools for text/typing. However, there is no discussion of prerequisites or conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_textB
Replace text in a UITextField or UITextView by stable DebugBridge ID, focusing the control and firing editing-change events.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Debug element identifier, for example photoComment.input. | |
| text | Yes | Exact text to set. | |
| timeoutMs | No | How long to wait for post-action page availability or target criteria. Defaults to 8000. | |
| intervalMs | No | Polling interval after setting text. Defaults to 300. | |
| waitAfterMs | No | Delay after setting text before reading the next page. Defaults to 350. | |
| waitForLabel | No | Optional exact element label to wait for after setting text. | |
| waitForPageID | No | Optional pageID to wait for after setting text. | |
| waitForElement | No | Optional element criteria to wait for after setting text. | |
| waitForPageIDs | No | Optional acceptable pageIDs to wait for after setting text. | |
| waitForElementID | No | Optional element ID to wait for after setting text. | |
| waitForLabelIncludes | No | Optional element label substring to wait for after setting text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It mentions focusing the control and firing editing-change events, which are important side effects. However, it does not describe post-action waiting behavior or potential issues, despite the schema including many wait parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, efficiently communicating the core action, target, and side effects. It is appropriately concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite the core action being clear, the description lacks context on when to use this tool versus type_text and does not mention the built-in waiting/timeout behavior after setting text—important given the many wait-related parameters. No output schema exists, so the description should have provided more post-condition context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 11 parameters. The description adds little beyond the schema, only clarifying that 'id' is a stable identifier and the action is to replace text. It does not elaborate on timeout or wait parameters, but the schema already does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (replace text), target (UITextField/UITextView), method (by stable DebugBridge ID), and side effects (focusing, firing editing-change events). This specificity distinguishes it from siblings like type_text, which likely simulates typing rather than replacing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool versus alternatives like type_text or tap_element. The description does not state prerequisites, exclusions, or preferred scenarios, leaving the agent to infer usage from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tap_elementC
Tap an element by stable DebugBridge ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Debug element identifier, for example AutomationTest.primaryButton. | |
| timeoutMs | No | How long to wait for post-tap page availability or target criteria. Defaults to 8000. | |
| intervalMs | No | Polling interval after tap. Defaults to 300. | |
| waitAfterMs | No | Delay after tap before reading the next page. Defaults to 350. | |
| waitForLabel | No | Optional exact element label to wait for after tap. | |
| waitForPageID | No | Optional pageID to wait for after tap. | |
| waitForElement | No | Optional element criteria to wait for after tap. | |
| waitForPageIDs | No | Optional acceptable pageIDs to wait for after tap. | |
| waitForElementID | No | Optional element ID to wait for after tap. | |
| waitForLabelIncludes | No | Optional element label substring to wait for after tap. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description must disclose behavioral traits. It only states the core action, omitting the fact that the tool waits after tapping (timeoutMs, waitAfterMs, waitFor* parameters), potential side effects, and error behavior. The description adds no behavioral context beyond the tool's name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with a front-loaded verb (Tap) and no fluff. It is concise and well-structured, though extremely terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 10 parameters, nested objects, no annotations, and no output schema. The one-sentence description fails to explain the overall behavior (tap then wait for conditions), the meaning of the wait parameters, or return semantics. It is severely inadequate for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 10 parameters have descriptions in the input schema (100% coverage). The tool description adds no additional parameter semantics beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Tap) and the target (element), and specifies the identification method (stable DebugBridge ID). This distinguishes it from sibling interaction tools like set_text or type_text, which perform different actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. Usage context is only implied by the action name, not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
type_textA
Append text to a UITextField or UITextView by stable DebugBridge ID, focusing the control and firing editing-change events.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Debug element identifier, for example photoComment.input. | |
| text | Yes | Text to append. | |
| timeoutMs | No | How long to wait for post-action page availability or target criteria. Defaults to 8000. | |
| intervalMs | No | Polling interval after typing text. Defaults to 300. | |
| waitAfterMs | No | Delay after typing text before reading the next page. Defaults to 350. | |
| waitForLabel | No | Optional exact element label to wait for after typing text. | |
| waitForPageID | No | Optional pageID to wait for after typing text. | |
| waitForElement | No | Optional element criteria to wait for after typing text. | |
| waitForPageIDs | No | Optional acceptable pageIDs to wait for after typing text. | |
| waitForElementID | No | Optional element ID to wait for after typing text. | |
| waitForLabelIncludes | No | Optional element label substring to wait for after typing text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It explicitly states that the tool focuses the control and fires editing-change events, which adds valuable side-effect information beyond the name. It does not cover all potential edge cases, but it provides meaningful transparency for a text-entry tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the core action, target, identifier method, and side effects. Every element earns its place, with zero wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has many parameters (11), but the schema descriptions cover them thoroughly, so the description need not repeat them. The core purpose and side effects are stated clearly, and the description is sufficient for selecting this tool over siblings. It could mention the wait/post-action behavior, but the schema already documents that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add parameter details beyond the schema; it only confirms the 'id' and 'text' purpose. No additional semantic value is provided for the wait-related parameters, but the schema already covers those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Append') with a resource ('text to a UITextField or UITextView') and identifier type ('stable DebugBridge ID'), clearly distinguishing it from siblings like set_text. It also explains the focusing behavior, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool to append text to a text field/view by ID, which implies it is not for replacing text (set_text would be for that). However, it does not explicitly mention alternatives or exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_app_logsA
Wait for a new matching entry in the current app run's in-memory DebugBridge log pool; no cursor is required or returned.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Optional exact level filter, such as debug, info, or error. | |
| limit | No | Maximum most-recent matching entries. Defaults to 500. | |
| query | No | Optional case-insensitive substring matched against log messages. | |
| waitMs | No | Maximum wait time. Defaults to 30000. | |
| category | No | Optional exact category filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It reveals the blocking nature and the in-memory pool, but lacks critical details such as timeout behavior (empty result vs. error), whether it returns single or multiple entries, and whether entries are consumed. This is a notable gap for a wait operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundant words. It efficiently conveys the core purpose and a key distinguishing feature (no cursor).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and moderate complexity (5 optional parameters, blocking behavior), the description is incomplete. It does not explain what the tool returns when a match is found or on timeout, and the singular 'entry' potentially conflicts with the 'limit' parameter. Given this ambiguity, a score of 3 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds minimal parameter-related value—it mentions 'matching entry' and 'no cursor' but does not elaborate on interaction between parameters (e.g., query vs. level) or return semantics. The schema already documents each parameter adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('Wait for a new matching entry') and the resource ('current app run's in-memory DebugBridge log pool'). It distinguishes itself from sibling tools like read_app_logs by emphasizing the waiting and new-entry behavior, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is a blocking operation for new log entries, and explicitly notes that no cursor is required or returned, which guides usage. However, it does not explicitly name alternatives (e.g., read_app_logs) or state when not to use this tool, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v0.1.5- First observed
audit_runtime - First observed
ensure_ports - First observed
get_debug_page - First observed
get_page - First observed
get_runtime_node - First observed
get_screenshot - First observed
get_ui_hierarchy - First observed
inspect_ui - First observed
ping - First observed
read_app_logs - First observed
run_flow - First observed
set_switch - First observed
set_text - First observed
tap_element - First observed
type_text - First observed
wait_app_logs
TDQS
Scored across 16 tools
Each tool serves a clear, distinct purpose, such as connection setup, UI inspection, element interaction, log retrieval, or runtime auditing. The two deprecated aliases are explicitly labeled as such, minimizing confusion despite their overlap with get_debug_page and inspect_ui.
All tool names follow a consistent snake_case verb_noun pattern (e.g., get_debug_page, tap_element, run_flow). Deprecated aliases also adhere to this pattern, so the naming style is uniform throughout.
With 16 tools, the count is slightly above the typical 3-15 range, primarily due to two deprecated aliases. Excluding those, the 14 unique tools cover the domain comprehensively, making the count reasonable but marginally padded.
The tool set covers the full lifecycle of UI debugging: connection verification, port forwarding, UI tree inspection, runtime node retrieval, element interaction (tap, switches, text), log searching/waiting, screenshots, and Figma-based auditing. No significant gaps are evident for the stated purpose.
Related MCP Connectors
remote debug iOS/Android/Unity/Godot/Flutter/RN/Web on real-device.ui-tree/screenshots/taps,tests.
Drive real devices from your AI Coding tool. Embed a client SDK (Unity, Godot, Flutter, iOS/macOS, Android, React Native, Web) in your app, then capture screenshots, traverse the UI tree, inject taps and key events, and run automated test tasks on the physical device over a secure relay.
Build, run, and inspect iOS apps in disposable hosted Simulators from cloud coding agents.
Live browser debugging for AI assistants — DOM, console, network via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceBridges React Native DevTools, enabling AI assistants to debug, profile, and inspect React Native applications through a standardized protocol.16 npm4MIT
- AlicenseAqualityDmaintenanceEnables programmatic control of Safari browser on macOS for web automation, testing, and debugging via the Model Context Protocol.166 npm4MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect and verify mobile UI hierarchies, nodes, styles, screenshots, and runtime attributes of iOS apps in simulators or on USB devices.123 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceTouchBridge is a local-first MCP server for iOS simulators and physical devices, enabling AI to see, control, test, and redesign iPhone screens through a structured screenshot bridge and tool surface.5MIT