基于MCP协议与Playwright实现AI远程操控手机Web页面的自动化方案
2026/8/26 7:39:22 网站建设 项目流程

1. 项目概述:当AI需要“动手”操作手机里的网页

最近在折腾AI Agent的时候,遇到一个挺有意思的瓶颈:很多想法停留在“想”的阶段,比如让AI帮我自动完成手机App里的一些重复性操作,或者测试某个H5页面的流程。想法很美好,但一到实操就卡壳了——AI模型再聪明,它也没法直接“伸手”去点我手机屏幕上的按钮。这就像给一个超级大脑配了一个瘫痪的身体,空有想法无法执行。

直到我遇到了mobile-bridge-mcp这个项目,它像是一座桥,精准地连接了AI的“大脑”和手机的“手指”。简单来说,它是一个实现了MCP(Model Context Protocol)协议的服务器,核心功能是让AI(比如通过Cursor、Claude Desktop等支持MCP的客户端)能够远程操控你手机浏览器中打开的Web页面。你可以把它理解为一个为AI配备的“远程触控器”,AI通过它发送指令,它则在真实的手机浏览器环境中执行点击、输入、滚动、截图等操作,并将结果反馈给AI。这不仅仅是简单的远程控制,而是为AI Agent赋予了在真实移动端Web环境中的交互和感知能力,打开了自动化测试、流程自动化、数据抓取等一系列应用场景的大门。

这个项目非常适合前端开发者、测试工程师、对AI自动化感兴趣的极客,以及任何想探索“AI+实际设备操作”边界的人。如果你曾想过“要是能让AI自动帮我抢票、自动填写表单、自动测试页面就好了”,那么mobile-bridge-mcp就是你实现这些想法的关键技术拼图。接下来,我会结合自己的踩坑经验,从设计思路到一行行代码配置,带你彻底搞懂怎么搭建并使用这座“桥”。

2. 核心设计思路与架构拆解

2.1 为什么是MCP协议?

在深入mobile-bridge-mcp之前,必须先理解它选择的基石——MCP协议。你可以把MCP想象成AI世界里的“USB标准”。在没有MCP之前,每个AI应用(客户端)想连接一个新的工具或数据源(服务器),都需要开发者为这个特定组合编写专门的“驱动程序”,耦合度高,扩展麻烦。

MCP协议的核心价值在于标准化了AI客户端与工具服务之间的通信方式。它定义了一套清晰的规范,包括资源(Resources,代表可获取的数据或状态)和工具(Tools,代表可执行的操作)的声明与调用机制。一旦一个服务按照MCP协议实现,它就能被任何支持MCP的客户端(如Cursor、Claude Desktop)即插即用地发现和调用。

对于mobile-bridge-mcp而言,采用MCP意味着:

  1. 无缝集成:无需修改AI客户端本身,只要客户端支持MCP,就能直接使用手机操控能力。
  2. 功能标准化:它将“操控手机Web页面”这一复杂能力,拆解并暴露为一系列标准的MCP工具,例如navigate_to(跳转)、click_element(点击)、input_text(输入)等。
  3. 上下文感知:AI可以通过MCP协议动态获取当前页面的信息(如URL、截图、元素树),使其决策基于实时环境,而不仅仅是静态指令。

2.2 整体架构与核心组件联动

整个系统的运行,可以看作一次“AI指令”在几个关键组件间的旅行。下图清晰地展示了这个流程:

flowchart TD A[AI客户端<br>如: Cursor, Claude Desktop] <-->|通过MCP协议通信| B[Mobile Bridge MCP Server] subgraph B [MCP服务器核心] B1[MCP协议适配层] B2[指令转换与路由] B3[Playwright控制器] end B <-->|通过WebSocket传输<br>Playwright指令与数据| C[Whistle代理服务器] C <-->|拦截并转发流量| D[移动设备<br>真实浏览器环境] D -->|执行结果<br>页面状态/截图| C C -->|返回数据| B B -->|格式化结果| A

组件职责详解:

  1. AI客户端 (MCP Client):这是整个流程的起点和大脑。例如你在Cursor的Chat界面中键入“帮我在手机百度上搜索AI最新动态”,Cursor(作为MCP客户端)会解析你的意图,并调用它从mobile-bridge-mcp服务器发现的相应工具(如navigate_to,input_text,click_element)。

  2. Mobile Bridge MCP Server:这是项目的核心,扮演着“翻译官”和“指挥官”的角色。

    • MCP协议适配层:负责与AI客户端通信,按照MCP规范声明自己有哪些工具(Tools)和资源(Resources)。
    • 指令转换与路由:将AI客户端发来的标准化MCP工具调用(如click_element),转换为Playwright能理解的浏览器自动化指令。
    • Playwright控制器:使用Playwright库,以编程方式创建和控制浏览器实例。但关键点在于,它控制的浏览器连接到了一个特殊的代理
  3. Whistle代理服务器:这是实现“手机远程操控”的魔法中间层。它是一个基于Node.js的跨平台Web调试代理工具。在本项目中,它承担了两个核心使命:

    • 流量转发与隧道:在电脑上启动Whistle,并设置手机Wi-Fi代理指向电脑的Whistle服务。这样,手机的所有Web流量都会经过电脑。MCP Server中的Playwright控制器启动一个浏览器,并将其代理设置为这个Whistle地址。于是,Playwright的浏览器和你的手机浏览器,看到了完全相同的网络环境和页面内容
    • 双向通信桥梁:Whistle不仅转发HTTP/HTTPS流量,还可以通过其插件机制或WebSocket,在MCP Server和手机端(通常需要一个配套的Web页面注入脚本)之间建立一条数据通道,用于传输点击坐标、输入文本等指令,以及回传触摸事件、页面DOM状态等。
  4. 移动设备与真实浏览器:这是最终的执行终端。你的物理手机(iOS/Android)通过Wi-Fi代理连接到Whistle,打开浏览器(如Safari、Chrome)访问目标网页。此时,页面加载的流量来自真实网络,但经由电脑“中转”。MCP Server通过Whistle隧道发送的指令,最终会以模拟触摸事件或JavaScript执行的方式在手机的真实浏览器中生效。

为什么选择Playwright + Whistle这个组合?

  • Playwright:微软开源,对现代Web标准支持极好,跨浏览器(Chromium, Firefox, WebKit)且API强大稳定,远超早期的Selenium或Puppeteer在移动端模拟的局限性。
  • Whistle:轻量、高性能、配置灵活,其强大的规则系统和插件能力,非常适合构建这种需要深度拦截和修改网络请求、建立额外通信链路的场景。

这个架构的精妙之处在于,它没有尝试在电脑上模拟一个手机环境(那往往不真实),也没有直接远程控制手机系统(需要复杂权限),而是巧妙地利用网络代理这一层,让AI控制的“虚拟浏览器”和你的“真实手机浏览器”共享同一份页面状态,从而实现对真实设备的精准操控。

3. 环境搭建与核心配置实战

理论清晰后,我们进入实战环节。搭建环境是第一步,也是坑最多的一步。我会以macOS/Linux环境为例,Windows用户请自行调整路径等细节。

3.1 基础环境准备

首先确保你的开发机已安装:

  • Node.js (>= 18):这是运行Whistle和MCP Server的基础。建议使用nvm管理Node版本。
  • Python (>= 3.8):部分依赖或脚本可能需要Python环境。
  • Git:用于克隆项目代码。

打开终端,我们一步步来。

3.2 部署Whistle代理服务器

Whistle是整个链路的枢纽,必须先把它跑起来。

  1. 全局安装Whistle

    npm install -g whistle

    安装完成后,可以使用w2 help命令验证。

  2. 启动Whistle服务

    w2 start

    默认会启动在http://127.0.0.1:8899。你可以在浏览器打开这个地址,看到Whistle的管理界面。

  3. 配置关键规则:Whistle的强大在于规则。我们需要创建规则文件让Whistle知道如何处理流量。 在终端执行:

    w2 add

    这会打开默认编辑器(如vim)。你需要写入核心规则,目的是将特定流量转发到MCP Server将要监听的端口,并开启WebSocket支持。一个基础的规则配置如下:

    # 将手机端对目标测试页面的访问,代理到MCP Server控制的浏览器实例 # 假设你的MCP Server运行在本地3000端口 www.your-test-site.com http://127.0.0.1:3000 # 允许WebSocket连接通过,这对于双向通信至关重要 ^ws://www.your-test-site.com ws://127.0.0.1:3000 ^wss://www.your-test-site.com wss://127.0.0.1:3000 # 注入通信脚本(关键!) # 你需要准备一个JavaScript文件,用于在手机端页面注入,接收指令并执行 www.your-test-site.com resBody://{path/to/your/inject.js}

    注意inject.js是连接手机端页面和Whistle/MCP Server的“神经末梢”。mobile-bridge-mcp项目通常会提供一个基础的注入脚本,你需要根据项目文档找到它,并替换上面的路径。它的核心作用是监听来自Whistle/MCP Server的指令(如通过WebSocket),并将其转化为页面内的真实操作(如模拟点击事件、填充表单)。

  4. 手机连接代理

    • 确保你的手机和电脑在同一个局域网(连接同一个Wi-Fi)。
    • 在电脑上查看本机IP地址(在macOS/Linux上使用ifconfig,在Windows上使用ipconfig)。
    • 在手机的Wi-Fi设置中,找到当前连接的Wi-Fi,进入“配置代理”或“高级选项”,选择“手动”,服务器填写电脑的IP地址,端口填写Whistle的默认端口8899
    • 保存后,在手机浏览器访问http://127.0.0.1:8899,如果能看到Whistle的管理页面,说明代理连接成功。

3.3 配置与启动Mobile Bridge MCP Server

接下来是主角登场。

  1. 获取项目代码

    git clone https://github.com/your-org/mobile-bridge-mcp.git # 替换为实际仓库地址 cd mobile-bridge-mcp
  2. 安装依赖

    npm install # 或 pnpm install / yarn install

    这个过程会安装Playwright等核心依赖。Playwright首次安装时会自动下载浏览器内核,请保持网络通畅。

  3. 关键配置文件解析: 项目根目录通常会有配置文件(如config.jsonserver.js中的配置对象)。你需要重点关注以下几个参数:

    // 示例配置结构 { "server": { "port": 3000, // MCP Server自身服务的端口,需与Whistle规则对应 "host": "0.0.0.0" // 监听所有网络接口 }, "playwright": { "headless": false, // 建议初期设为false,方便观察浏览器行为 "channel": "chromium" // 或 “msedge”, “chrome” }, "whistle": { "proxyServer": "http://127.0.0.1:8899", // Whistle代理地址 "injectScriptUrl": "http://your-pc-ip:8899/path/to/inject.js" // 注入脚本的完整可访问URL }, "mcp": { // MCP协议相关配置,如声明工具列表 } }
    • whistle.proxyServer:必须指向你正在运行的Whistle服务地址。这告诉Playwright浏览器将所有流量发送到Whistle。
    • whistle.injectScriptUrl:这是最容易出错的地方。这个URL必须是你的手机能通过网络访问到的。你不能用file://路径,也不能用localhost。必须使用你电脑的局域网IP(如http://192.168.1.100:8899/inject.js),并确保Whistle配置了正确的规则将该JS文件提供给手机。
  4. 启动MCP Server

    npm start # 或 node server.js

    如果看到类似 “MCP server running on port 3000” 和 “Playwright browser connected” 的日志,说明服务启动成功。

3.4 连接AI客户端(以Cursor为例)

最后一步,让AI“认识”这个新工具。

  1. 打开Cursor编辑器,进入Settings(或Preferences)。
  2. 找到关于MCP Servers的配置部分(可能在Advanced或Features标签下)。
  3. 添加一个新的MCP Server配置。连接方式通常是Stdio(进程标准输入输出)。
    • Command:node
    • Args:/absolute/path/to/your/mobile-bridge-mcp/server.js(这里必须填写你项目server.js或主入口文件的绝对路径)
    • Env: 可以留空,或根据需要添加环境变量。
  4. 保存配置并重启Cursor。

重启后,当你新建一个Chat会话,你应该能在Cursor的Tool列表里看到一系列新的工具,比如mobile_navigate,mobile_click,mobile_screenshot等。这标志着AI客户端已经成功发现了你的mobile-bridge-mcp服务器。

4. 核心工具详解与自动化脚本编写

环境打通后,我们来看看AI具体能通过哪些工具来操作手机,以及如何编写有效的指令。

4.1 核心MCP工具清单与使用范例

mobile-bridge-mcp暴露的工具通常围绕浏览器自动化核心操作。以下是一个典型工具集的示例及在Cursor中的调用方式:

工具名 (Tool Name)描述参数示例在Cursor中的自然语言调用范例
navigate_to控制手机浏览器跳转到指定URL{“url”: “https://m.baidu.com”}“请让手机浏览器打开百度移动版首页。”
click_element点击页面上的某个元素{“selector”: “#search-btn”}“点击搜索按钮。”
input_text向输入框填充文本{“selector”: “#kw”, “text”: “AI大模型”}“在搜索框里输入‘AI大模型’。”
get_page_content获取当前页面的文本内容或HTML结构{“mode”: “text”}“把当前页面的主要内容摘要给我。”
capture_screenshot截取当前手机屏幕{}“给当前屏幕截个图发我看看。”
scroll_page滚动页面{“direction”: “down”, “pixels”: 500}“向下滚动一点。”
execute_script在页面上下文中执行JavaScript{“script”: “alert(‘Hello from AI!’)”}“弹出一个提示框。”

实操心得:选择器的获取让AI精准点击或输入的关键在于“选择器”。最可靠的方式是结合使用:

  1. 手动辅助:在电脑上,通过Chrome DevTools的远程调试功能(chrome://inspect)连接手机浏览器,使用检查元素工具获取稳定且唯一的CSS选择器(如[data-testid="submit-button"]优于.btn)。
  2. 让AI分析截图:可以先让AI执行capture_screenshot,然后将截图提供给AI(某些客户端支持上传图片),并询问“如果要点击登录按钮,应该用什么选择器?”。虽然AI不能直接生成完美选择器,但可以描述特征,辅助你判断。
  3. 使用get_page_content获取DOM结构:让AI获取页面简化后的DOM树,从中分析元素层级关系,推导出可能的选择器。

4.2 构建一个完整的自动化任务流

单一指令意义不大,组合起来才能发挥威力。假设我们要自动化“在手机百度上搜索信息并获取第一条结果”。

步骤分解与AI指令序列:

  1. 启动与导航

    • AI指令:“打开手机百度。”
    • 背后调用navigate_to({“url”: “https://m.baidu.com”})
    • 检查点:通过get_page_contentcapture_screenshot确认页面加载成功。
  2. 定位与输入

    • AI指令:“找到搜索框,输入‘Playwright自动化测试’。”
    • 背后调用
      • input_text({“selector”: “#index-kw”, “text”: “Playwright自动化测试”})
    • 注意:百度移动版搜索框的ID可能是#index-kw,这需要提前探查。
  3. 触发搜索

    • AI指令:“点击搜索按钮。”
    • 背后调用click_element({“selector”: “#index-bn”})
    • 等待策略:点击后需要等待结果页加载。可以在指令中明确要求“等待页面加载完成”,或者配置MCP Server在关键操作后自动等待网络空闲。
  4. 提取结果

    • AI指令:“获取搜索结果列表的第一条标题和链接。”
    • 背后调用
      • get_page_content({“mode”: “html”})获取整个结果页HTML。
      • 或者,更精准地使用execute_script执行一段JavaScript来提取特定元素:
      // 这是一个通过execute_script执行的示例 const firstResult = document.querySelector(‘.result.c-container h3 a’); if (firstResult) { return { title: firstResult.innerText, link: firstResult.href }; } return null;
  5. 汇总与报告

    • AI指令:“将提取到的标题和链接整理成一句话总结。”
    • 背后调用:这一步由AI大模型本身完成,它基于上一步execute_script返回的数据进行理解和格式化。

在Cursor中,你可以这样组织一次对话:

我:请帮我用手机百度搜索“开源AI Agent框架”,并告诉我第一个结果是什么。 (Cursor会自动规划并调用上述工具序列) AI: 好的,我将开始操作。 > 调用 `navigate_to` 打开百度... > 调用 `input_text` 输入关键词... > 调用 `click_element` 点击搜索... > 调用 `execute_script` 提取第一条结果... 操作完成。第一条结果是:“LangChain - 构建LLM应用的框架”,链接是:https://www.langchain.com/。

4.3 错误处理与状态管理

自动化不会一帆风顺,必须考虑异常。

  • 元素找不到click_elementinput_text可能因选择器错误或页面未加载完而失败。MCP Server应返回明确的错误信息(如ElementNotFound)。在给AI的指令中,可以加入“如果按钮找不到,请先截图让我看看当前页面状态”这样的容错逻辑。
  • 页面跳转/弹窗:操作可能触发页面跳转或弹出模态框。在关键操作后,主动调用capture_screenshotget_page_content来验证状态,是一个好习惯。
  • 超时设置:在MCP Server配置中,为每个工具调用设置合理的超时时间,避免因网络或页面卡顿导致整个进程挂起。
  • 会话保持:确保一次对话中的所有操作都在同一个Playwright浏览器上下文(Context)和页面(Page)中进行,以维持登录状态、Cookie等。

5. 高级应用场景与性能优化

掌握了基础操作后,我们可以探索一些更高级、更有价值的应用场景。

5.1 场景一:跨平台H5页面自动化测试

这是最直接的应用。传统移动端测试需要编写大量Appium或WebDriver脚本,维护成本高。利用mobile-bridge-mcp,你可以:

  1. 用自然语言编写测试用例:测试人员或产品经理可以直接描述测试步骤。“登录,检查首页轮播图,点击第一个商品,加入购物车,验证购物车数量。”
  2. AI生成并执行测试脚本:AI将描述转化为一系列MCP工具调用,并自动执行。
  3. 视觉回归测试:在关键步骤后调用capture_screenshot,AI可以对比基线图片,或由人工复核截图。
  4. 兼容性快速验证:通过切换Whistle规则,将手机流量代理到不同版本的后端服务或不同域名,快速验证同一H5页面在不同环境下的表现。

优势:用例编写门槛极低,变更维护灵活(只需修改自然语言描述),且运行在真实手机环境,结果可信。

5.2 场景二:数据抓取与工作流自动化

对于需要从手机端网页获取数据,或完成固定工作流的任务,AI Agent可以成为7x24小时不知疲倦的助手。

  • 竞品监控:每天定时让AI打开竞品App的H5页面(或分享页),抓取价格、活动信息等。
  • 数据填报:将Excel中的数据,让AI自动填入手机端的管理后台表单。你需要预先教会AI每个字段对应的选择器。
  • 社交媒体自动化:在支持Web端的平台,完成一些简单的发布、点赞、关注操作(务必遵守平台规则)。

重要提示:此类自动化必须严格遵守目标网站的robots.txt协议和服务条款,尊重数据所有权和隐私,避免对目标服务器造成过大压力。

5.3 场景三:辅助开发与调试

对于前端开发者,这同样是一个利器。

  • 远程调试:在电脑上通过AI指令,操控远处测试机的手机页面,复现和测试特定用户操作路径下的bug。
  • 性能检测:通过execute_script注入性能监测代码(如performance.timingAPI),并将数据取回分析。
  • 一键执行复杂操作:在开发过程中,需要反复进行“清空缓存->登录->进入某个深层页面”的操作,可以保存为一个AI指令集,一键完成。

5.4 性能优化与稳定性提升技巧

当任务复杂或长时间运行时,稳定性至关重要。

  1. 连接保活:手机Wi-Fi可能休眠,电脑也可能睡眠。需要配置系统/路由器保持常亮,或编写守护脚本定期发送心跳请求。
  2. 操作间增加延迟:在连续的click_elementinput_text操作之间,让MCP Server内置一个短暂的延迟(如300-500ms),模拟真人操作间隔,避免因页面响应慢导致后续操作失败。
  3. 智能等待:不要单纯使用固定延迟。利用Playwright的page.waitForSelectorpage.waitForNavigation等API,在MCP Server内部实现基于条件的等待,提高成功率。
  4. 错误重试机制:在MCP Server层面或AI指令层面,为可能失败的操作(如网络超时)设计重试逻辑。
  5. 资源清理:定期重启Playwright浏览器实例,防止内存泄漏。对于长时间运行的Agent,可以设计定时任务来清理和重建浏览器上下文。

6. 常见问题排查与实战心得

最后,分享一些我踩过的坑和解决方案,希望能帮你节省大量时间。

6.1 连接类问题

问题:手机已设置代理,但无法访问互联网或Whistle管理界面。

  • 排查
    1. 检查电脑防火墙是否放行了8899端口。
    2. 确认电脑IP地址是否正确,手机和电脑是否在同一网段(例如,电脑是192.168.1.x,手机也应是192.168.1.x)。
    3. 在电脑上ping一下手机的IP,确保双向网络可达。
  • 解决:关闭电脑防火墙临时测试,或添加入站规则。确保家庭路由器没有启用“客户端隔离”功能。

问题:Whistle管理页面能打开,但目标网站无法加载或样式错乱。

  • 排查:检查Whistle规则是否正确,特别是HTTPS网站。Whistle需要安装根证书才能解密HTTPS流量进行调试。
  • 解决:在手机浏览器访问http://127.0.0.1:8899,点击“HTTPS”标签页,根据指引下载并安装Whistle的根证书到手机。注意:在iOS上安装证书后,还需进入“设置”->“通用”->“关于本机”->“证书信任设置”,完全信任此根证书。

6.2 指令执行类问题

问题:AI可以调用工具,但手机页面没反应。

  • 排查
    1. 首先确认inject.js是否成功注入。在手机浏览器打开目标页,通过远程调试查看页面源代码或控制台,检查inject.js是否被加载,是否有错误。
    2. 查看MCP Server日志,看Playwright浏览器是否成功启动并导航到了目标URL。
    3. 检查Whistle的WebSocket规则是否正确,inject.js与MCP Server之间的WebSocket连接是否建立。
  • 解决:这是最复杂的一环。建议开启MCP Server和Whistle的详细日志模式,一步步追踪指令流。确保injectScriptUrl是手机可访问的绝对URL。

问题:点击或输入的位置总是不对。

  • 排查:选择器问题。手机端页面可能是响应式,DOM结构在不同尺寸下可能变化。
  • 解决
    • 使用更稳定的选择器,如>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询