- doc/staffdeck/KNOWLEDGE_BASE.md:接入方式(MCP http://<host>:8033/mcp 首选/REST 备选)、服务端配置项、19 个 de_* 工具清单(读写分类)、通用约定(serial/坐标空间/busy 占用锁/错误码)、推荐操作模式与常见配方、红线、当前边界 - doc/staffdeck/JOB_SPEC.md:岗位描述、看板摘要(指标口径+文本/JSON 汇报模板)、岗位执行约束(L0-L3 授权分级/硬红线/操作规范/失败重试/审计)、SOP 工作流、应拒绝与转人工清单 - doc/DEVELOPMENT.md:§7 文档索引与 §5.6 同步映射登记这两份
152 lines
9.3 KiB
Markdown
152 lines
9.3 KiB
Markdown
# 知识库 · 设备自动化平台(auto_control)接入说明
|
||
|
||
> 读者:StaffDeck 数字员工(外部 Agent)。
|
||
> 目的:让你知道**能做什么、怎么调、什么不能做**,从而安全地代为操作手机设备。
|
||
> 版本:2026-09-10 | 权威工具清单以 `doc/MCP.md` 为准,配置以 `mcp_server/config.py` 为准。
|
||
|
||
---
|
||
|
||
## 1. 这个平台是什么
|
||
|
||
一台**安卓设备自动化中台**:管理一批手机(网络 `IP:5555` 或 USB 串号),支持定时任务、步骤编排、看屏/操作,以及本知识库要用的 **MCP 工具**。
|
||
|
||
- 平台本体:Web 服务(默认 `http://<host>:18050`),提供任务/分组/设备/看板等管理能力。
|
||
- 你能用的入口:**MCP Server(推荐)**,它把平台已有的设备能力封装成 19 个工具。
|
||
|
||
---
|
||
|
||
## 2. 接入方式
|
||
|
||
### 2.1 首选:MCP(HTTP / streamable)
|
||
- 地址:`http://<host>:8033/mcp`(FastMCP,`transport="http"`)。
|
||
- 调用方式:支持 MCP 的客户端直接连;工具名即 `de_*`(见 §3)。
|
||
- **鉴权现状**:MCP 层**无独立鉴权**——它自身用 `MCP_PLATFORM_USER/PASS` 登录平台(会话 + CSRF 由服务端内部处理,你不用管)。因此**谁能访问 8033 谁就能操控设备**,务必只在内网/Tailscale 内暴露,不要裸露公网。
|
||
- **审计**:每次调用(含只读)都会写一行 JSON 审计(工具、serial、参数摘要、结果)。
|
||
|
||
### 2.2 备选:平台 REST(`http://<host>:18050`)
|
||
仅在你不支持 MCP 时使用。认证是「表单登录 → 会话 Cookie + `X-CSRF-Token`」,无 API Token,接入成本较高。常用端点见 §9。
|
||
|
||
### 2.3 服务端配置(由部署方设置,你只需知道含义)
|
||
|
||
| 变量 | 默认 | 含义 / 对你的影响 |
|
||
|---|---|---|
|
||
| `MCP_HTTP_HOST` / `MCP_HTTP_PORT` | `0.0.0.0` / `8033` | 监听地址与端口 |
|
||
| `MCP_ALLOW_WRITE` | `0`(**只读**) | `1` 才允许点按/滑动/输入等**写操作**;为 0 时写工具返回 `write_disabled` |
|
||
| `MCP_ALLOWED_SERIALS` | 空 | 逗号分隔设备白名单;非空时只允许这些 serial。**注意:为空时当前代码只校验 serial 非空,并不自动限平台设备池**——如需收紧请让部署方配置白名单 |
|
||
| `MCP_PLATFORM_URL` | `http://127.0.0.1:18050` | 平台地址 |
|
||
| `MCP_PLATFORM_USER` / `_PASS` | `admin` / 空 | 服务端登录平台用,与你无关 |
|
||
| `MCP_PLATFORM_TIMEOUT` | `30` | 平台请求超时(秒) |
|
||
| `MCP_SCREENSHOT_WIDTH` / `MCP_JPEG_QUALITY` | `540` / `70` | 截图缩放宽/JPEG 质量(见坐标约定) |
|
||
| `MCP_AUDIT_FILE` | `/var/log/mcp/audit.log` | 审计文件路径 |
|
||
|
||
启动(部署方操作,供排障参考):
|
||
- 220 生产容器:`scripts/start.sh` 会自动后台拉起(`MCP_ENABLED=0` 可关)。
|
||
- 本机/手工:`MCP_ALLOW_WRITE=1 MCP_PLATFORM_USER=admin MCP_PLATFORM_PASS=<密码> python -m mcp_server.mcp_server`
|
||
|
||
---
|
||
|
||
## 3. 工具清单(19 个 `de_*`)
|
||
|
||
### 只读(观测,不触发设备占用锁;任务运行中也安全)
|
||
| 工具 | 入参 | 返回要点 | 用途 |
|
||
|---|---|---|---|
|
||
| `de_list_devices()` | — | `[{serial, model, online, worker_status, foreground_app}]` | 先看有哪些设备可用 |
|
||
| `de_screenshot(serial)` | serial | `{image(JPEG base64), width, height, native_size, screen_state}` | 看当前屏(**必须**先截图才能坐标点按) |
|
||
| `de_ui_tree(serial, limit=150)` | serial, limit | `{count, elements:[{text,id,desc,class,clickable,bounds}]}` | 拿可点击元素(**优先用它定位**) |
|
||
| `de_ocr(serial)` | serial | `{count, texts:[{text,score}]}` | UI 树里没有的渲染文字(WebView/图片) |
|
||
| `de_foreground_app(serial)` | serial | `{foreground_app: pkg}` | 当前前台 App |
|
||
| `de_list_apps(serial, keyword?)` | serial, keyword | `{count, packages:[pkg]}` | 找包名(配合 `de_open_app`) |
|
||
| `de_read_clipboard(serial)` | serial | `{clipboard}` | 读剪贴板 |
|
||
| `de_list_tasks()` | — | 平台任务计划列表 | 只读了解平台任务(**不能增改**) |
|
||
|
||
### 写操作(会先检查设备是否被任务占用;`MCP_ALLOW_WRITE=1` 才可用)
|
||
| 工具 | 入参 | 说明 |
|
||
|---|---|---|
|
||
| `de_tap_text(serial, text)` | serial, text | **首选**语义点击:按屏上文字找并点(UI 树→OCR 兜底);找不到返回 `text_not_found` |
|
||
| `de_tap_element(serial, by, value, index=1)` | by=`text/id/desc/text_contains/desc_contains`, value, index | 元素定位点击(配合 `de_ui_tree`) |
|
||
| `de_tap(serial, x, y)` | serial, x, y | 坐标点击(截图坐标系,自动吸附到最近可点元素;返回 `snapped`/`label`) |
|
||
| `de_swipe(serial, x1,y1,x2,y2, duration?)` | 坐标 | 滑动 |
|
||
| `de_press_key(serial, key)` | key=`back/home/enter/menu/recent/delete` | 按键 |
|
||
| `de_type_text(serial, text)` | serial, text | 输入文字(中文/引号/换行可用) |
|
||
| `de_set_clipboard(serial, text)` | serial, text | 写剪贴板 |
|
||
| `de_open_app(serial, package)` | serial, package | 冷启动 App(adb monkey) |
|
||
| `de_stop_app(serial, package)` | serial, package | 强制结束 App |
|
||
| `de_wake(serial)` / `de_sleep(serial)` | serial | 亮屏解锁 / 息屏(走平台 `/api/device/screen_all`) |
|
||
|
||
> 平台级工具(**任务创建/修改/启停、分组、设备池管理、备份等**)**目前没有 MCP 工具**,只有上面这些设备能力;需要它们时请通过 REST(§9)或在平台 Web 后台操作。
|
||
|
||
---
|
||
|
||
## 4. 通用调用约定
|
||
|
||
### 4.1 设备标识 `serial`
|
||
- 网络设备:`IP:5555`(如 `100.100.10.13:5555`、`192.168.20.206:5555`)。
|
||
- USB 设备:纯串号(无冒号,如 `ZY322XXXX`)。
|
||
- 用 `de_list_devices()` 获取当前可用清单,**不要凭空猜 serial**。
|
||
|
||
### 4.2 坐标空间(重要)
|
||
- `de_screenshot` 返回的是**缩放图(≤540px 宽)+ `native_size`(原生分辨率)**。
|
||
- `de_tap` / `de_swipe` 的坐标用**截图坐标系(display 空间)**,服务端按最近一次截图比例换算原生。
|
||
- **必须先 `de_screenshot` 再坐标操作**,否则报「请先执行 de_screenshot」。
|
||
- 屏幕可能旋转/滚动,坐标随时会变——**优先文字/元素定位,坐标仅兜底**。
|
||
|
||
### 4.3 设备占用锁(busy)
|
||
- 写工具执行前会检查该设备是否有平台任务在跑:`running`/`connecting` → 返回 **`device_busy`**(“AI 不与任务抢设备”)。此时**换设备或等待**,不要硬重试。
|
||
- 只读工具(截图/UI树/OCR/列表)不受此限制。
|
||
|
||
### 4.4 错误码
|
||
| 错误 | 含义 | 应对 |
|
||
|---|---|---|
|
||
| `write_disabled` | 服务端未开写门控 | 告知部署方开 `MCP_ALLOW_WRITE=1` |
|
||
| `device_busy` | 设备正被任务占用 | 换设备 / 等任务结束 |
|
||
| `device_offline` | 设备不可达 | 换设备;报运维 |
|
||
| `device_not_allowed` | 不在白名单 | 换设备;让部署方加白名单 |
|
||
| `text_not_found` | 屏上没有该文字 | 截图确认;改用 `de_ui_tree`/`de_ocr` |
|
||
| `platform_unavailable` | 平台不可达 | 稍后重试;报运维 |
|
||
| `invalid_param` | 参数不合法 | 修参数 |
|
||
|
||
---
|
||
|
||
## 5. 推荐操作模式(务必遵守,能显著提高成功率)
|
||
|
||
1. **文字语义点击优先**:`de_tap_text("关注")` > `de_ui_tree` 找元素 + `de_tap_element` > `de_tap` 坐标兜底。
|
||
2. **每关键步后截图验证**:操作是否生效看截图/UI 树,别连续盲点。
|
||
3. **不重复同坐标**:点击后画面无变化,禁止反复点同一坐标(多数 App 会误触)。
|
||
4. **先确认前台与页面**:`de_foreground_app` / 截图确认在正确页面再操作。
|
||
5. **一次一个明确目标**:拆成小步,每步可验证。
|
||
|
||
### 常见配方
|
||
- **看视频养号(示意)**:`de_list_devices` → 选设备 → `de_open_app(pkg)` → 循环〔`de_screenshot` 确认在视频页 → 等待 → `de_swipe` 上滑〕→ 结束 `de_stop_app`。
|
||
- **打开指定 App**:`de_list_apps(keyword)` 拿包名 → `de_open_app(package)` → 截图确认首页。
|
||
- **输入文字**:`de_tap_text` 或 `de_tap_element` 点输入框 → `de_type_text` → 截图确认。
|
||
- **巡检截图**:`de_screenshot` + `de_foreground_app` + `de_ocr`,只读汇报。
|
||
|
||
---
|
||
|
||
## 6. 红线与安全(**不可违反**)
|
||
|
||
1. **绝不 `adb kill-server`、绝不 `adb disconnect`**(会断开所有设备共享的 adb 通道,影响全部运行中任务)。你也不需要这些操作。
|
||
2. **不抢任务设备**:遇到 `device_busy` 就避开。
|
||
3. **写操作前先确认**:不确定后果的操作(发送评论/私信、删除、支付类)**不要执行**,先截图回报请人工确认。
|
||
4. **不做破坏性动作**:卸载应用、清除数据、改系统设置等一律不做。
|
||
5. **留痕**:你的每次调用都进审计,请让动作与目标一致。
|
||
6. **隐私**:不要把设备上读到的个人信息/凭据复述或外传。
|
||
|
||
---
|
||
|
||
## 7. 当前边界(别越界期待)
|
||
|
||
- MCP **没有任务创建/修改/启停**(只有只读 `de_list_tasks`)。
|
||
- MCP **无独立鉴权**(靠网络隔离),不要假设有 token。
|
||
- `MCP_ALLOWED_SERIALS` 为空时**不会**自动限制为平台设备池(设计语义未实现)。
|
||
- 平台 REST 的 CSRF 校验在当前版本可能未强制(按端点契约使用即可)。
|
||
|
||
---
|
||
|
||
## 8. 相关文档
|
||
|
||
- 工具手册(逐工具参数/返回/示例):`doc/MCP.md`
|
||
- MCP 设计/分层与现状对照:`doc/MCP_DESIGN.md`
|
||
- 平台接口目录:`doc/API.md`
|
||
- AI 生成任务(规划,未实现):`doc/AI_TASK_GEN.md`
|