使用说明
iphone mcp
从macOS控制物理iPhone的MCP服务器。截取屏幕截图、点击、滑动、键入文本等——所有这些都是通过 模型上下文协议.
用途 iPhone镜像 (macOS Sequoia 15+)而不是WebDriver Agent,因此没有Xcode设置,没有配置文件,也没有XCTest会话来保持活动。只要插上你的iPhone就可以了。
快速开始
# 1. Clone and build
git clone https://github.com/yev-yev-yev/iphone-mcp.git
cd iphone-mcp
corepack enable
yarn install
yarn build
# 2. Check your setup
yarn doctor
# 3. Add to Claude Code
claude mcp add iphone-mcp node /absolute/path/to/iphone-mcp/dist/index.js
就是这样。让克劳德“给我的iPhone截图”以验证它是否正常工作。
运作原理
MCP Client ──stdio──> iphone-mcp ──> iPhone Mirroring window
├── screencapture + sharp (PNG screenshot, 1x default)
├── CGEvent injection (clicks, drags, scroll wheel)
└── AppleScript keystroke (text input)
iPhone镜像 是一个macOS Sequoia应用程序,可以将iPhone的屏幕镜像到macOS窗口。此服务器以编程方式与该窗口交互:
- 截图 通过
screencapture+sharp--将镜像窗口捕获为PNG格式,调整大小,覆盖网格,并在单个窗口中夹紧尺寸sharp管道 - 点击和滑动 通过
CGEvent(JXA/osascript)——在右侧屏幕坐标处注入鼠标事件 - 滚动 通过
CGEventCreateScrollWheelEvent--触控板风格的滚轮事件,实现流畅的内容滚动(根据macOS“自然滚动”偏好自动校正) - 文本输入 通过AppleScript
keystroke--键入所关注的任何领域
需求
- macOS红杉15+ (iPhone镜像需要它)
- iOS 18+ 在iPhone上
- Node.js 24+
- 相同的Apple ID 已在Mac和iPhone上登录
- 蓝牙和WiFi 在两台设备上均已启用
- 通过USB连接的iPhone,可信(接受“信任此计算机?”)
权限
承载MCP服务器的应用程序(例如终端、VS代码、克劳德桌面)需要两个macOS权限:
| 权限 | 它允许什么 | 在哪里授予 |
|---|---|---|
| 无障碍 | 点击、滑动、滚动、键入(CGEvent注入) | 系统设置>隐私和安全>辅助功能 |
| 屏幕录制 | 屏幕截图(屏幕截图) | 系统设置>隐私和安全>屏幕录制 |
服务器 自动提示 对于首次启动时的辅助功能权限,macOS将打开“系统设置”,您可以在其中切换主机应用程序的开关。屏幕录制权限会自动检查。如果未授予任何一个权限,工具响应将包括一条警告消息,指出哪个应用程序需要访问(例如“终端未授予可访问性权限”)。
跑 yarn doctor 检查是否授予了权限。
安装
# Enable Corepack for Yarn 4
corepack enable
# Install dependencies
yarn install
# Build
yarn build
# Verify your environment
yarn doctor
用法
使用克劳德代码
claude mcp add iphone-mcp node /absolute/path/to/iphone-mcp/dist/index.js
然后和克劳德谈谈:
- “为我的iPhone截图”
- “点击设置图标”
- “在设置中向下滚动”
- “向左滑动到下一个主屏幕页面”
- “在搜索字段中键入‘hello world’”
使用克劳德桌面
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"iphone": {
"command": "node",
"args": ["/absolute/path/to/iphone-mcp/dist/index.js"]
}
}
}
重新启动克劳德桌面。
与MCP检查员一起
npx @modelcontextprotocol/inspector node dist/index.js
打开一个web UI,您可以在其中以交互方式浏览和调用所有工具。
开发模式
yarn dev
使用以下命令运行服务器 tsx watch 用于在文件更改时自动重新启动。
工具
屏幕信息
| 工具 | 说明 | 参数 |
|---|---|---|
get_screen_info |
获取屏幕尺寸和比例因子 | 无 |
截图
| 工具 | 说明 | 参数 |
|---|---|---|
screenshot |
截图(返回PNG图像) | 无 |
用户界面自动化
| 工具 | 说明 | 参数 |
|---|---|---|
tap |
点击坐标(以屏幕截图像素为单位)。支持多抽头(双抽头、三抽头等) | x, y, numTaps?, screenshotDelay? |
long_press |
在坐标处按住一段时间 | x, y, duration (秒), screenshotDelay? |
swipe |
在两点之间滑动——最适合定向手势(关闭、拉刷新、拖放) | startX, startY, endX, endY, duration?, easing?, screenshotDelay? |
scroll |
在某一点上滚动内容——最适合滚动列表、网页、提要和主屏幕页面(触控板风格的滚动事件) | x, y, direction?, distance?, screenshotDelay? |
type_text |
在焦点输入字段中键入文本。支持特殊按键: \b 退格, \t 选项卡, \x7f 正向删除, \x1b 逃跑 |
text, screenshotDelay? |
press_button |
按下设备按钮(主页、app_switch、聚光灯) | button, screenshotDelay? |
剪贴板
| 工具 | 说明 | 参数 |
|---|---|---|
get_clipboard |
获取剪贴板文本(通用剪贴板) | 无 |
set_clipboard |
设置剪贴板文本(通用剪贴板) | content, screenshotDelay? |
实用
| 工具 | 说明 | 参数 |
|---|---|---|
get_coordinates |
将网格标签转换为精确的像素坐标,以便点击/滑动/滚动 | column, row, xPercent, yPercent |
AI如何导航
与传统的自动化框架不同,没有 find_element 或可访问性树。AI使用 愿景:它截取屏幕截图,查看屏幕,然后点击它想要与之交互的坐标。这更简单、更稳健,并且与多模式AI代理的实际工作方式相匹配。
坐标网格叠加
原始的基于视觉的坐标估计是每个多模式代理的致命弱点——LLM在将“点击设置图标”转换为精确的像素坐标时是出了名的不精确。我们用一个 参考网格 在到达模型之前,它被合成到每个屏幕截图上。
┌──────────────────────────────────┐
│ margin A B C D │ <- column labels (X axis)
│ ┌─────────────────────┐ │
│ A ─────│─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ │ <- labeled reference lines
│ │ │ │ at fixed intervals
│ B ─────│─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ │
│ │ iPhone screen │ │
│ C ─────│─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ │
│ │ │ │
│ D ─────│─ ─ ─ ─ ─ ─ ─ ─ ─ ─│ │
│ └─────────────────────┘ │
└──────────────────────────────────┘
^
row labels (Y axis)
每个屏幕截图都被包裹在四周的深色边缘中 标记网格线 以固定的时间间隔。网格布局(间距、填充)是根据图像尺寸和配置的分割数动态计算的。MCP服务器指令告诉模型每个标签的确切像素值,给它一个可以直接从图像中读取的空间坐标系,而不是猜测。该模型识别最近的网格标签和调用 get_coordinates 通过百分比偏移来确定地获得精确的像素值。
结果:AI从“屏幕中间的某个地方”移动到“X轴上的网格线C和D之间,Y轴上的F线上”,并调用 get_coordinates 以计算精确的像素坐标。这实际上消除了对图标、按钮和文本字段等小目标的误点击。
事实证明,这是整个系统中最具影响力的部分之一。没有网格,基于视觉的代理会不断错过小点击目标——按钮、图标、文本字段都变成了猜谜游戏。网格为模型提供了一种可以精确推理的共享空间语言,将模糊的“粗略地点击这里”转化为确定性的坐标查找。这是一个简单的想法,但在实践中却产生了令人惊讶的巨大差异。
脚本
| 命令 | 描述 |
|---|---|
yarn build |
与tsup捆绑 dist/ |
yarn start |
运行已编译的服务器 |
yarn dev |
在更改时自动重新启动运行 |
yarn doctor |
飞行前检查(macOS、权限、设备) |
yarn screenshot |
使用网格覆盖捕捉iPhone屏幕,保存到 _screenshots/ |
yarn tap <x> <y> |
点击屏幕截图坐标 |
yarn scroll <x> <y> [direction] [distance] |
在一个点上滚动(方向:上/下/左/右,距离:像素,默认值:半屏幕尺寸) |
yarn swipe <startX> <startY> <endX> <endY> |
在两点之间滑动 |
yarn test |
运行所有测试 |
yarn typecheck |
不发射的类型检查 |
yarn lint |
ESLint棉绒 |
yarn format |
带Prettier的格式 |
yarn check |
格式+棉绒固定+字体检查 |
配置
通过环境变量进行配置(所有变量都以 IPHONE_MCP_):
| 变量 | 默认值 | 描述 |
|---|---|---|
IPHONE_MCP_LOG_LEVEL |
info |
日志级别(debug, info, warn, error, silent) |
IPHONE_MCP_SCREENSHOT_SCALE |
1 |
屏幕截图分辨率倍数。更高的值会增加细节和令牌使用量 |
IPHONE_MCP_GRID_DIVISIONS |
9 |
坐标叠加上的网格划分数。更多分割=更精细的精度 |
IPHONE_MCP_PNG_PALETTE |
true |
为较小的屏幕截图启用基于调色板的PNG(256色)(true/false/1/0) |
IPHONE_MCP_PNG_COMPRESSION_LEVEL |
6 |
PNG zlib压缩级别,0-9(较高=文件较小但速度较慢) |
IPHONE_MCP_MAX_PX_SINGLE_DIMENSION |
1568 |
最长屏幕截图尺寸的最大像素数。防止LLM的图像过大 |
IPHONE_MCP_MOTION_STEP_INTERVAL_MS |
50 |
滚动和滑动/拖动动画的步长间隔(ms)(最小1,最大10000) |
IPHONE_MCP_LAUNCH_TIMEOUT_MS |
10000 |
等待iPhone镜像启动的时间(毫秒) |
故障排除
yarn doctor 失败
- 从这里开始。它检查macOS版本、权限、USB连接等。
“未连接任何设备”
- 检查iPhone是否已通过USB插入:
system_profiler SPUSBDataType | grep -A5 iPhone - 确保在提示时点击iPhone上的“信任”
“iPhone镜像窗口未出现”
- 请参阅Apple指南 设置iPhone镜像
- 首先手动打开iPhone镜像(
open -a "iPhone Mirroring")以确保其正常工作 - 两台设备必须使用相同的Apple ID登录
- 蓝牙和WiFi必须打开
- iPhone必须锁定(如果手机解锁并正在使用中,iPhone镜像将无法连接)
屏幕截图为空白或错误
- 服务器在启动时检查屏幕录制权限。如果缺少,请手动授予:
- 系统设置>隐私和安全>屏幕录制-启用托管MCP服务器的应用程序(例如终端、VS代码、克劳德桌面)
- 在授予屏幕录制权限后,您可能需要重新启动服务器
轻敲/滑动不起作用
- 服务器在启动时提示输入辅助功能权限。如果您拒绝了它,请手动授予它:
- 系统设置>隐私和安全>可访问性-启用托管MCP服务器的应用程序(例如终端、VS代码、克劳德桌面)
备注
- 测试模型:此MCP服务器主要通过以下方式进行测试 克劳德·十四行诗4.5 和 克劳德作品4.6。它应该适用于支持MCP的其他多式联运模式,但您的里程可能会有所不同。
- 滚动和滑动:基于手势的交互(滚动和滑动)可能很挑剔——它们需要经过macOS事件注入,但并不总是1:1映射到真实手指在玻璃上的行为。我们正在积极努力提高可靠性。如果滚动或滑动没有正确着陆,AI通常会自行重试或调整。
免责声明
该软件支持人工智能驱动的物理iPhone控制。通过使用它,您承认并同意:
- 您全权负责 对于通过此工具执行的所有操作,无论是手动启动还是由AI代理自主启动。
- 可能会发生意外行为 人工智能模型可能会误解屏幕内容,点击错误的目标,发送意外的消息,删除数据,进行购买,或在您的设备上执行其他不可逆的操作。作者不对任何此类结果负责。
- 你承担所有风险 与授予对您的设备的自动化系统控制相关,包括但不限于数据丢失、意外通信、金融交易、隐私泄露和帐户修改。
- 该软件不是为无监督使用而设计的 您应该监控所有AI启动的操作,并随时准备断开设备连接。
- 请勿将此软件用于恶意目的,包括未经授权访问设备、监视、骚扰、欺诈或任何违反适用法律的活动。
对于因使用或误用本软件而导致的任何损害、损失或后果,作者不承担任何责任。使用风险自负。
许可证
麻省理工学院