airi 开发日志解读:用 FastMCP 与 ADB 搭建 Android MCP 服务器,让 LLM 操作手机

发布时间:2026/10/16 3:27:12
airi 开发日志解读:用 FastMCP 与 ADB 搭建 Android MCP 服务器,让 LLM 操作手机 人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载导读本文是对 airi 项目 2025.04.22 开发日志原始文档的技术解读。日志记录了开发者 LemonNeko 用一个周末时间实现airi-android的过程——这是一个基于 MCPModel Context Protocol与 ADB 交互的服务器为 AIRI 以及任何 LLM 提供了操作 Android 手机的能力。读完本文你将理解 MCP 的 Resources / Prompts / Tools 三大核心概念、如何用 Python 的FastMCP快速搭建一个 ADB MCP 服务器、LLM 通过「截图 UI 自动化 点击滑动」操作手机的四步工作流以及图形渲染类 App、响应长度限制、动画与安全四个实战难点最后结合当前仓库源码你会看到这套思路最终在 airi 桌面端演化成了完整的 MCP 服务器接入体系。背景从桌宠到「让 AIRI 用手机」在正式展开之前需要交代这个 DevLog 的上下文。日志作者是 airi 的开发者之一 LemonNeko。两个月前团队把 AIRI 的 Web 界面移植到了 Electron当时对应 PR #7使 AIRI 能以桌面宠物的形式悬浮在屏幕上尽管后来该项目又用 Tauri 做了重构对应 PR #90「让 AI 拥有可以操作的外部设备」这个方向被保留了下来。而在 2025.04.20 那个周末作者花时间做出了一个能与ADBAndroid Debug Bridge交互的 MCP 服务器 Demoairi-android迈出了「让 AIRI 使用手机」的第一步。作者最初的想法其实更简单写一点 Tool Calling 代码、改一改提示词告诉 LLM「这些工具可以操作手机」就够了。但当时 MCP 太流行抱着尝试的心态最终选择用 MCP 实现并把服务器打包成了 Docker 镜像发布到了公开的 MCP 服务器列表上供其他 LLM 工具直接接入。仓库佐证如今 airi 主仓库中MCP 接入已经是一等公民。桌宠客户端 stage-tamagotchi 内置了完整的 MCP 服务器管理、连接测试与工具桥接能力仓库还维护着一个面向 macOS 桌面编排的专用服务 computer-use-mcp。这正是本文末尾要展开的「后续演化」内容。MCP 是什么标准化「应用如何给 LLM 提供上下文」要编写 MCP 服务器首先需要理解 MCP 本身。日志给出了非常通俗的定义MCPModel Context Protocol模型上下文协议是一个尝试标准化「应用如何为 LLM 提供上下文」的协议。它提出了三个核心概念Resources资源服务器可以把数据与内容作为上下文提供给 LLM。Prompts提示词创建可复用的提示词模板与工作流。Tools工具允许 LLM 通过你的服务器执行一些动作。日志里有个非常生动的小插曲作者看到「资源」这个词联想到 Ruby on Rails 中「用户就是一种资源」于是想当然地认为「ADB 设备应该也是资源」写出了第一版代码from mcp.server.fastmcp import FastMCP from ppadb.client import Client mcp FastMCP(airi-android) adb_client Client() mcp.resource(adb://devices) def get_devices(): return adb_client.devices()结果错了。当作者让 Cursor 去获取设备列表时它不知道该怎么操作——因为「主动去查看当前有哪些设备连接」本质上是一次主动性行为应该是一个工具Tool而非资源。这个例子很好地说明了 MCP 中三个概念的边界资源是被动提供的适合「你问我答」式的数据读取工具是主动执行的适合「帮我做一件事」式的动作调用例如查询设备列表、点击屏幕、滑动页面提示词是模板化引导适合把常用的指令组织成可复用的工作流。源码佐证在 airi 桌面端的 LLM 工具层MCP 能力正是通过两个内置工具暴露给模型的builtIn_mcpListTools先列出所有可用 MCP 工具与builtIn_mcpCallTool按serverName::toolName格式调用某个工具。其中arguments以 JSON 字符串传入由模型在运行时自行组装——这与日志里「让 LLM 主动决定调用哪个工具、传什么参数」的设计意图完全一致。LLM 操作手机的四步工作流Cursor 的做法作者在日志中坦承自己还没完全想清楚「具体怎么让 LLM 操作手机」于是采用「直接上手、让 Cursor 来用」的实践路线。观察 Cursor 的实际行为后总结出了 LLM 操作手机的标准套路使用截屏功能大略了解手机屏幕上的内容使用 UI 自动化工具获取想要操作的元素的精确位置点击或滑动该元素重复以上步骤直到任务完成。这个「观察 → 定位 → 操作 → 再观察」的闭环本质上就是今天各类 computer-use / GUI Agent 的共同范式视觉模型负责理解界面UI 自动化负责把语义目标换算成坐标点击与滑动负责执行。日志作者评价「目前看来运行良好」。四个待讨论的实战难点日志没有停留在「能跑」的层面而是提出了四个非常实际的工程问题这也正是 MCP 手机操作类项目普遍会遇到的坎难点 1图形 API 直绘内容无法被 UI 自动化定位。如果屏幕上是一个用图形 API如 OpenGL / Vulkan / 游戏引擎直接绘制的游戏画面而不是标准 UI 组件UI 自动化工具拿不到任何元素的位置信息自然也就无法操作它。这提示了一个方向在纯视觉内容面前坐标级的点击与滑动可能需要升级为「基于视觉理解 坐标推断」的方案。难点 2LLM 响应长度有限复杂操作需要分步触发。一个 LLM 响应能承载的内容是有上限的复杂的多步操作往往放不进一次响应。作者提出的设想是像 airi-factorio 那样每一步操作完成之后自动告诉 LLM 结果并触发它规划下一步从而把长任务拆解成「执行一步 → 回报一步 → 再规划一步」的循环绕开单次响应的长度限制。难点 3动画会干扰「操作后立刻截屏」的判断。部分 App 有酷炫的过渡动画操作完成后立刻截屏画面可能还没渲染到位导致模型误判操作失败。作者提出两个候选方案——操作完成后等待一段时间再截屏或者直接改用屏幕录制来获取连续的视觉反馈。难点 4让 AI 直接操作手机的安全风险。把操作系统级权限交给 LLM 意味着什么误操作、不可逆的破坏性动作如删数据、转账、隐私泄露等风险都需要认真评估。日志在此只是提出了问题、抛给大家讨论并未给出定论——这也是「AI 操作真实设备」类项目至今仍在演进的安全课题。仓库佐证安全与审批机制正是 airi 当前 MCP 体系的重点之一。在 computer-use-mcp 中可以看到终端命令、App 打开/聚焦、点击/输入等动作默认都需要审批denyApps会屏蔽敏感应用如密码管理器、系统设置、Activity MonitorAIRI 自身也在默认拒绝列表中以避免自我操作审批状态通过approval_required回传Electron 桌面端弹出原生审批对话框AIRI 再代表用户自动调用 approve/reject。这些设计正是对日志中「安全风险」问题的工程化回应。开发小技巧命令行启动 Android 模拟器日志还分享了一个对日常开发很实用的技巧完全可以用命令行直接启动 Android 模拟器而不必打开笨重的 Android Studio能显著降低内存压力emulator -avd Pixel_6_Pro_API_34-avd参数指定要启动的 AVDAndroid Virtual Device名称示例中的Pixel_6_Pro_API_34是一个 Pixel 6 Pro、API 级别 34 的虚拟设备配置。对需要反复调试 ADB 交互逻辑截图、UI 自动化、点击滑动的开发者来说这个命令让「起一个干净的测试环境」变成一行命令的事。从一篇 DevLog 到仓库里的 MCP 接入体系日志末尾作者预告了下一步给 AIRI 桌面宠物接上 MCP 服务器看看它自己想做什么——也许它会像现在的 ReLU 一样点开 Telegram 和人聊天只不过不通过 Telegram 的官方 API而是直接模拟真实操作。这个预告后来真的在仓库里落地了我们可以从当前源码中看到它的完整形态① mcp.json 配置文件用户数据目录桌面端把 MCP 服务器配置持久化在 Electron 的userData目录下的mcp.json中见 MCP 管理器的 getConfigPath首次启动自动写入{ mcpServers: {} }骨架。配置格式是标准的 MCP 服务器描述支持两种传输方式。② 配置 Schema 与校验shared/mcp-config.ts仓库把配置校验集中在了 shared/mcp-config.tsstdio 服务器command必填非空字符串 可选的args、env、cwd、enabledHTTP 服务器url必须是绝对 http/https 地址 可选的headers、enabled。url被刻意限制为 http/https是因为主进程会代替用户去请求该地址若允许file:或data:这类 scheme一份粘贴来的配置就会变成本地文件读取的原语——这是一个非常值得借鉴的安全细节。校验失败时错误信息会保留字段路径如mcpServers.fs.command: ...并做「union 分支最接近解释」方便用户在设置页直接定位问题。③ Electron 主进程的 MCP ManagerMCP 管理器 承担了完整的生命周期管理基于官方modelcontextprotocol/sdk的Client对 stdio 服务器通过StdioClientTransport拉起子进程记录 pid、接管 stderr对 HTTP 服务器通过StreamableHTTPClientTransport连接并逐请求附带 headers提供listTools列出每个会话暴露的工具命名为serverName::toolName与callTool支持对工具名做stdio::等前缀归一化的重试;提供testServer真实拉起/连接服务器并调用listTools带 10 秒请求超时、15 秒总超时的双重保护失败时只保留 stderr 尾部 16000 字符防止噪音淹没设置界面应用启动时执行applyAndRestart逐项报告每个服务器是started / failed / skipped被enabled: false禁用的记为 skipped并展示每个服务器的运行状态running / stopped / error 及其 pid 或 url、最后错误。④ 设置界面与连接测试设置页mcp.vue提供可视化表单编辑每个服务器条目支持 stdio/http 切换、启用开关、运行状态徽标、JSON 编辑器可格式化、从表单同步草稿、校验后应用以及逐条目的连接测试——测试会真实建立连接并列出工具返回ok / tools / durationMs。保存并应用后主进程重启全部会话界面会汇总started / failed / skipped数量。⑤ 工具桥接stage-ui / mcp.ts共享 UI 层 createMcpTools 把 MCP 能力包装成两个 LLM 可见的代理工具builtIn_mcpListTools与builtIn_mcpCallTool。桌宠渲染进程通过 tamagotchi-mcp-tools store 把 Electron 侧的listTools / callTool注入进来以mcp:前缀注册进 LLM 工具存储从而让模型可以「先列出、再调用」任意 MCP 服务器上的工具——这与日志中让 LLM 主动获取工具列表、主动决定操作方式的目标一脉相承。⑥ 从手机到桌面computer-use-mcp更进一步仓库中的 computer-use-mcp 把同样的思路扩展到了桌面端通过desktop_screenshot、desktop_click、desktop_type_text、desktop_open_app等 MCP 工具让 AIRI 观察并操作 macOS 桌面提供terminal_exec后台终端执行、browser_dom_*浏览器 DOM 桥接、workflow_*工作流编排以及审批队列与审计日志。它在mcp.json中通过pnpm -F proj-airi/computer-use-mcp start以 stdio 方式接入 AIRI并支持dry-run不注入任何输入、macos-localmacOS 本地执行、linux-x11遗留实验后端三种执行模式。可以说日志里「下一步给桌宠接上 MCP」的预告最终演化为了一整套「AIRI 作为控制面、本地执行层作为手脚」的 agent 体系。结语这篇 DevLog 的价值在于记录了一次真实的「从零到一」一个开发者如何因为 FOMO 开始研究 MCP、如何用错误的类比把设备当 Resources加深了对 Tools 的理解、如何用「让 Cursor 自己用」的办法快速验证思路并沉淀出「截图 UI 自动化 点击滑动 迭代循环」的手机操作范式。日志末尾留下的四个问题——纯图形内容、响应长度、动画时序、安全边界——在今天仓库的 MCP 体系里都能看到对应的工程答案。如果你也想给自己的 LLM 应用接入真实设备操作能力从FastMCP ADB起步、再参考 airi 的 mcp.json 配置与审批机制逐步加固是一条非常值得复刻的路线。赞分享人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手【免费下载链接】airi 自托管、归你拥有的 Grok 风格 AI 伴侣与 waifu / 赛博生命灵魂容器目标是接近 Neuro-sama 的高度支持实时语音聊天、Minecraft 和 Factorio 游玩支持 Web / macOS / Windows。项目地址https://gitcode.com/moeru-ai/airi点击查看免费下载相关推荐AIRI 开发日志用 MCP 让 AI 学会操作 Android 手机——从 ADB 设备交互到 Model Context Protocol 实战AIRI 开发日志用 MCP 让 AI 学会操作 Android 手机——从 ADB 设备交互到 Model Context Protocol 实战 本文是人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手后端让 AI 学会操作 Android 手机AIRI 的 MCP ADB 开发复盘与桌面端集成落地让 AI 学会操作 Android 手机AIRI 的 MCP ADB 开发复盘与桌面端集成落地 这篇技术笔记以 AIRI 项目 2025.04.22 的开人工智能AI AgentMCP 服务工具调用GUI 自动化语音数字人交互助手后端AIRI 桌宠接入 MCP用 ADB 让 AI 学会操作安卓手机DevLog 2025.04.22 技术解读AIRI 桌宠接入 MCP用 ADB 让 AI 学会操作安卓手机DevLog 2025.04.22 技术解读 2025 年 4 月 22 日的这篇开发日志人工智能AI 应用大模型AI Agent交互助手语音数字人后端前端桌面应用移动开发GUI 自动化MCP 服务上一篇如何在5分钟内开始使用afl.rs进行Rust代码模糊测试下一篇CodeGPT高级代理系统10个实用工具助你高效编程的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询