Loop A
Agent 展示给你看
你的 Agent 截下一个窗口,用方框、箭头和编号标出问题,交回一张标注好的 PNG。每条截图命令都以 JSON 输出图片路径,能打开图片的 Agent 都能直接看到。
- capture-window
- annotate
- 给人看
没有 DOM · 没有无障碍树 · 没有浏览器界面
Plumshot 自带命令行工具,让编程 Agent 截取并标注浏览器工具看不见的原生窗口、菜单和 Sheet。完全在本地运行,无需账号,也无需 API token。
macOS 14 Sonoma 或更高版本 · 屏幕录制权限 · 任何能跑 shell 的 Agent · 100% 本地处理
你的 Agent 交回来的东西 —— 一张画好标注的 PNG,而不是一段像素坐标。
Loop A
你的 Agent 截下一个窗口,用方框、箭头和编号标出问题,交回一张标注好的 PNG。每条截图命令都以 JSON 输出图片路径,能打开图片的 Agent 都能直接看到。
Loop B
你自己在截图上做标记 —— 用 Plumshot、预览都行 —— Agent 直接读懂这些标记,照着去做。不用截屏,也不需要权限。
编程 Agent 本来就会执行 shell 命令,可以直接驱动 CLI,不用配置 MCP。
plumshot …
每次截取都以 JSON 输出 { path, width, height, bbox }。CLI 就是签过名的应用二进制本身,不用另装。
stdio MCP · Claude Code 技能
把同一套命令做成原生 MCP 工具,再配一个 Claude Code 技能。上线之前,CLI 能做同样的事。
想在上线时收到通知?写信到 support@plumshot.app
装好应用,在 PATH 里放一个两行的包装脚本,再告诉 Agent 它在哪儿。
macOS 检查的是运行 plumshot 的应用(终端、iTerm、Cursor 等),不是 Plumshot 本身。在「系统设置 ▸ 隐私与安全性 ▸ 录屏与系统录音」(macOS 14 上叫「屏幕录制」)中启用那个应用(列表里没有就点 + 按钮添加),然后退出并重新打开它。第 4 步的 plumshot doctor 会写出是哪个应用。capture-scrolling 的自动滚动还需要给同一个应用开「辅助功能」权限;annotate 不需要任何权限。
mkdir -p ~/.local/bin printf '#!/bin/sh\nexec /Applications/Plumshot.app/Contents/MacOS/Plumshot "$@"\n' > ~/.local/bin/plumshot chmod +x ~/.local/bin/plumshot
这几行会写入一个两行的包装脚本,由它调用应用里的二进制。如果 ~/.local/bin 还不在 PATH 里,把 export PATH="$HOME/.local/bin:$PATH" 加进 ~/.zshrc,再新开一个终端窗口。
plumshot doctor screen recording (TCC): granted ✓ accessibility (AX): not granted (optional) bundle id: com.plumshot.app binary: /Applications/Plumshot.app/Contents/MacOS/Plumshot signing: Developer ID Application: … ✓ host app (likely): Terminal (com.apple.Terminal) license: trial not started; the first capture starts it
再做一次冒烟测试:截一个窗口,并列出屏幕上的目标。
plumshot capture-window --app Finder --out /tmp/cap.png plumshot list-targets
把下面这段贴进 CLAUDE.md(Claude Code)或 AGENTS.md(Codex、Cursor 等),Agent 就知道有这个 CLI,也知道什么时候该用它。
## Native macOS screenshots (Plumshot)
- `plumshot` captures and annotates native macOS UI (windows, menus, sheets,
the menu bar) that browser tools can't see. `plumshot --help` lists every
command and flag; https://plumshot.app/agents.md has the full guide.
- See a window: `plumshot capture-window --app "MyApp" --out /tmp/shot.png`,
then open the PNG. Captures print JSON: {"path", "width", "height", "bbox"}.
- Point at something: pipe {"shapes": [...]} (box, arrow, text, number,
highlight, blur; top-left image pixels) into
`plumshot annotate --in /tmp/shot.png --out /tmp/marked.png --shapes -`.
- Read words, not pixels: `plumshot capture-text --app "MyApp"` returns
{"text", "chars"} via on-device OCR.
- Errors print {"error": "..."} on stderr with a non-zero exit. If a capture
fails or comes back black, run `plumshot doctor`.
- Use a browser tool for web pages; use plumshot for native macOS UI.关于许可证:doctor、list-targets、version 和 help 免费。annotate 和所有 capture-* 命令包含在 3 天全功能试用里(从第一次截图开始计时),试用结束后需要 $9.90 的一次性许可证。
只有截取命令需要权限:屏幕录制,授予你的终端或 Agent 应用。不需要完全磁盘访问,「辅助功能」也只在滚动截图自动滚动时才用到。
所有坐标以左上角为原点、图片像素为单位。截取命令在 stdout 输出 JSON 信封 { path, width, height, bbox };失败时在 stderr 输出 { "error": … } 并以非零状态退出。plumshot --help 列出全部参数。
| 命令 | 参数 | 输出 |
|---|---|---|
capture-window | --app <名称>(子串匹配,不分大小写)--out <png> [--window <标题>] | JSON 信封 · 取匹配的最大窗口 |
capture-region | --rect x,y,w,h --out <png> [--display-id ID | --display N] | JSON 信封 |
capture-previous-region | --out <png> | JSON 信封 · 重复上次区域(CLI 或应用里的) |
capture-full | --out <png> [--display-id ID | --display N] | JSON 信封 · 默认光标所在的屏幕 |
capture-scrolling | --rect x,y,w,h --out <png> [--max-seconds N(默认 30)] [--idle-seconds N(默认 3)] [--no-auto-scroll] | JSON 信封 · 自动滚动需要辅助功能权限 |
capture-text | --in <png> | --rect x,y,w,h | --app <名称> [--window <标题>];[--no-linebreaks] [--out <png>] | JSON { text, chars } · 端侧 OCR |
annotate | --in <png> --out <png> [--shapes <文件> | -](默认读 stdin) | JSON 信封 · 无需权限 |
list-targets | — | JSON { displays, windows } · 免费 |
doctor | — | 权限、宿主应用、签名与许可证 · 免费 |
不用鼠标、不开 GUI —— 你的 Agent 用 JSON 写出箭头、方框、文字与遮盖。
shapes(左上角原点,图片像素)
{ "shapes": [
{ "type": "box", "x": 980, "y": 60, "w": 260, "h": 96,
"color": "#FF3B30", "lineWidth": 3, "filled": false },
{ "type": "arrow", "from": [880, 200], "to": [1000, 110] },
{ "type": "text", "x": 700, "y": 210, "text": "label is clipped", "fontSize": 30 },
{ "type": "number", "x": 1110, "y": 108, "n": 1 },
{ "type": "highlight", "x": 120, "y": 320, "w": 400, "h": 28 },
{ "type": "blur", "x": 60, "y": 60, "w": 300, "h": 40,
"style": "pixelate|secureBlur|smoothBlur|blackOut" }
] }默认值:颜色 #FF3B30(红),lineWidth 3,文字 fontSize 28,数字标记 36,模糊 pixelate。形状描述默认从 stdin 读取(--shapes -),也可以用 --shapes file.json 传文件。Retina 屏上直接用 Plumshot 输出的像素数值 —— 它们已经是设备像素。
照着说就行,和上面两个循环一一对应。
拿不准就先跑一次 plumshot doctor。
先按第 3 步建好包装脚本,并确认 ~/.local/bin 在 PATH 里(改完 ~/.zshrc 要新开终端窗口)。也可以直接调用二进制:/Applications/Plumshot.app/Contents/MacOS/Plumshot doctor。
在「系统设置 ▸ 隐私与安全性 ▸ 录屏与系统录音」(macOS 14 上叫「屏幕录制」)中启用 doctor 的 host app (likely) 一行写的应用 —— 你的终端或 Agent 应用,不是 Plumshot —— 然后退出并重新打开它。如果写的是辅助进程(比如 Cursor Helper),就启用它所属的主应用。
调用「成功」但图是黑的或空的,就是屏幕录制权限缺失的经典症状。用 plumshot doctor 确认;并确保目标在已登录的图形会话里。
--app 会在当前屏幕上的窗口里按应用名做子串匹配(不分大小写)。运行 plumshot list-targets 查看准确的应用名和窗口标题。
3 天试用结束后,annotate 和 capture-* 命令需要许可证。购买 $9.90 许可证后,在 Plumshot 的「设置 → 许可证」里激活。doctor、list-targets 和 help 照常可用。
自动滚动需要运行 plumshot 的应用有「辅助功能」权限。授予它,或者传 --no-auto-scroll 自己滚动目标。
机器可读的孪生文档,Agent 可以直接抓取。
不想贴片段?让你的 Agent 在第一次截图前先读一遍 https://plumshot.app/agents.md。
完全本地 · 无需账号 · 3 天免费试用 · $9.90 一次性买断