docs/content/zh-Hans/blog/DevLog-2025.04.22/index.md
大家好,我是 @LemonNeko,这次有我来参与撰写 DevLog 和大家分享开发的故事。
在两个月前,我们将 AIRI 的网页端移植到了 Electron 上 #7(现在已经被我们使用 Tauri 重构 🤣 #90),它可以作为桌宠出现在我们的屏幕上,于此同时,我出现了允许 AIRI 使用手机的想法,但是迟迟没有动手。
在上个周末(2025.04.20),我花了点时间,做了一个能与 ADB 交互的 MCP 服务器 Demo airi-android,给 AIRI 提供了最基础的与手机交互的能力(事实上大部分 LLM 都可以通过它与手机交互),这是演示视频:
<ThemedVideo controls muted src="./assets/cursor-open-settings.mp4" />我也把它打包成了 Docker 镜像,提交到了 MCP 服务器列表,有兴趣的可以试试。
实际上我一开始的思路是写一写 Tool Calling 的代码,改一改提示词,告诉 LLM 我们可以使用这些工具来与手机交互,就结束了。但是最近 MCP 实在太火了,我有点 FOMO,所以选择了 MCP 来实现它。
要想编写 MCP 服务器,就不得不先了解 MCP 是什么(虽然我从来不是好好学理论再去实践的人,我选择直接上手,然后让 Cursor 来尝试使用它)。MCP(Model Context Protocol)模型上下文协议,是一个尝试去标准化应用如何给 LLM 提供上下文的协议,它提出了一些核心概念:
啊,资源,这个我知道的啊,在 Ruby on Rails 里,用户就是一种资源,那 ADB 设备是不是也是资源,让 LLM 查看连接的设备列表,是不是就可以写成:
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 来获取设备列表的时候,它并不知道怎么操作,它说它想主动去看有哪些设备连接了,所以它是工具,嗯,看来我没有理解透彻。
我还没有想好具体应该怎么让 LLM 操作手机,想和大家讨论,但是 Cursor 是这样操作的:
目前看来运行良好,但是我有一些小小的问题:
一些感想。
这是我第一次和 AI 写代码的时候感受到像人类一起写代码一样,不知道是不是因为我的目的就是让 AI 来使用我的工具,所以它变成了我的客户,我需要不停地根据它给的反馈来调整我的代码,它也变成了我的同事,我需要和它一起思考,一起解决问题。看这个截屏,是不是确实很像?
在开发过程中还学了一些小技巧,比如我们可以使用命令行来启动 Android 模拟器,这样就不用打开 Android Studio 了,内存压力也小了很多。
emulator -avd Pixel_6_Pro_API_34
下一步,我打算给 AIRI 桌宠接上 MCP 服务器,看看它会想做什么,也许它会点开 Telegram 和我们聊天,就像现在的 ReLU 那样,只不过不是用 Telegram 的 API。
感谢你看完这篇可能有点啰嗦而且干货不多的 DevLog,我们下次再见!