现在的 新软件,个个 MCP 挂满,生怕 agent 够不着自己。但老软件呢?Things、Surge、系统里各种陈年老 App——它们没有 MCP,往后也不会有。难道等开发者发善心?
不用。等,是最差的策略。
1. 四十年前的接口,刚好够用
macOS 上有两条上古通道,一条比一条老。
AppleScript,1993 年生的,今天用 osascript 一行就能调:
osascript -e 'tell application "Spotify" to playpause'URL Scheme,每个 App 注册自己的 xxx:// 协议。比如往 Things 的今天加一条待办:
open "things:///add?title=review%20PR&when=today"这两条通道的共同点:文本进、文本出、不碰 GUI。你品品,这不就是 agent 的母语吗。
2. Agent 缺的不是能力,是说明书
我一开始以为 agent「不会用」Things,后来发现它不是不会,是不知道有。我把 Things 能听的命令、先查再改的规矩写成一页说明塞进 skill,它立刻用得有模有样:先 query 列表,再 add,改完再查一遍核对——比我自己还讲究。
所以给前 AI 时代的工具接入 agent,完整配方就三样:
老接口(AppleScript / URL Scheme)
+ 一页说明书(告诉 agent 有哪些动词)
+ 一点礼貌(先读状态,再动手,改完核对)不需要 SDK,不需要 MCP 服务器,不需要任何开发者配合。
3. 坑
当然有坑,提前知道能省不少命:
- 权限:第一次
osascript控制某个 App,系统会弹自动化授权。agent 会卡在那,人得来点一次,这是 TCC 的规矩。 - 覆盖率:不是每个 App 都有 scripting dictionary。没有的可以用 System Events 走 Accessibility 硬点菜单——能用,但那是盲人摸象,能免则免。
- 单向性:URL Scheme 大多只管发、不管回。要拿返回值,找支持 x-callback-url 的 App,或者干脆换 AppleScript。
4. 更进一步
如果 App 是自己的,还有大招:给正在运行的实例配一个本地 Unix socket,再加一个薄薄的 CLI 负责发命令。Surge 就是这么干的——surge-cli 把命令发给正在跑的主程序,收回 JSON,GUI 还是那个 GUI。
我自己的剪贴板工具正在照这个方向搞,等落地了再写一篇。
5. 结尾
AI 时代最讽刺的一件事:最容易被 agent 接管的,反而是那些比你年龄都大的接口。
不用等谁发善心。老接口,加一页说明书,agent 就能开你的冰箱。