MCP

用已登录的 Safari 做本机自动化(仅 macOS)

适合在 macOS 上驱动你已经登录的 Safari 做页面读取和按引用点击填写,前提是 Node.js 20+ 并打开 Safari 的开发者功能与 Apple Events。

官方来源 · safari-mcp

安装

npx safari-mcp

适合谁

如果你要在自己已经打开、已经登录的 Safari 里让助手先看清页面、再按引用去点或填,这条路径才对得上。它驱动的是 macOS 自带的稳定版 Safari,而不是另起一个干净的隔离浏览器。硬前提是:机器必须是 macOS,并且本机已安装 Node.js 20+。Windows 或 Linux 在现有说明里没有可用步骤。

仓库把自己放在「继续用你已登录的 Gmail、GitHub、Ahrefs、Slack、网银会话」这条线上,并提到原生 WebKit 与后台运行。这意味着助手会碰到真实登录态,而不是演示用的空会话。谁来调用,谁就等于获准看见这些标签页上已经出现的内容。

不适合只想在隔离环境点一下页面、或不想让助手看见真实账户的人。非苹果系统也没有第二条安装路可走。若你的目标是「全新、未登录、用完即弃的会话」,现有说明写的不是这条路径。

3 分钟完成第一次尝试

官方主路径只有一条:在已满足前提的 Mac 上运行

npx safari-mcp

仓库写明不必先做全局安装。可选的永久安装是 npm install -g safari-mcp,第一次尝试不要走它。

启动前先核对这四件事:系统是任意带 Safari 的 macOS;Node.js 是 20 或更新;Safari 打开 Settings → Advanced → Show features for web developers;再打开 Develop → Allow JavaScript from Apple Events。缺一项,后面的调用都没有依据。

配置位置就是这条启动命令本身。把它交给你的 MCP 宿主去拉起服务。现有说明没有给出某个具体客户端的 JSON 字段名,因此这里不补配置模板,也不编造额外的启动参数。

第一次只做观察:调用 safari_snapshot,读取当前页的无障碍树(accessibility tree)。成功信号是返回了页面状态,而不是报错或空树。这次读取会看到你正在看的真实页面结构,包含已登录站点上的可见控件,不能当成零风险,更不能理解成不读本地、不碰网络。

若同一台机器上会有多个助手同时用 Safari,说明里给出的共享方式是:

SAFARI_MCP_HTTP=1 SAFARI_MCP_HTTP_PORT=9225 npx safari-mcp

单人第一次试用不必开这项。

使用案例

案例一:看清当前标签再决定下一步。对已经打开的 Safari 页面调用 safari_snapshot,拿到无障碍树和页面状态。说明把它列为推荐工作流的第一步,目的就是 Get page state。适合确认你停在哪一页、有哪些可引用的控件。返回字段的完整结构没有展开,能确认的只有能拿到页面状态和无障碍树。不要把这一步理解成导航或改页,现有说明没有给导航类命令。

案例二:按引用做一次交互并回读。第二步是 safari_click/fill/...,按 ref 点击或填写;第三步再跑一次 safari_snapshot 核对结果。这要求你先有案例一里的 ref,不要凭空点坐标。点击和填写会改页面,属于有副作用的动作;动手前先定确认点——第二次 snapshot 里对应控件或文案是否按预期变化。工具名写成 safari_click/fill/...,其余交互名没有逐条给出,因此不要自行补未出现的命令。

使用边界

只覆盖 macOS。必须是 Node.js 20+,并且打开 Safari 的开发者功能和 Apple Events 的 JavaScript。服务开的是你已经登录的稳定版 Safari,邮件、代码托管、分析后台、即时通讯和网银会话都可能进入助手视野。不要假设存在网络隔离或本地只读沙箱。

并发时要用 SAFARI_MCP_HTTP=1 共享守护进程;说明还写到标签追踪失败时会闭合,而不是去打你正在用的活动标签。失败码、撤销步骤,以及 safari_snapshot 与 safari_click/fill 之外的工具参数,现有说明都没有给出。后台运行和更低 CPU 是仓库自己的对比说法,不能当成对你这台机器的保证。第一次如果只做 snapshot,仍然是在读真实页面,请先避开网银或任何你不打算暴露的标签。