A working cost comparison from a Mac app
Claude's April 2026 updates, measured in kilobytes per Mac automation call
Sonnet 4.6 is the everyday default. Opus 4.7 went GA on April 22, 2026. Every other page writing about this month lists context windows and prices. This one is a working comparison of what a Mac automation tool actually sends to Claude on a per-tool-call basis, from inside an app that stopped sending screenshots in late March and bundled the accessibility-tree MCP server directly into the signed .app.
The short version
Claude Sonnet 4.6 stayed the everyday default through the month. Claude Opus 4.7 went GA on April 22, 2026 and slotted straight into the top of Fazm's three-tier model picker. Two protocol bumps shifted error and model ID shapes underneath. All of that is well-covered by Anthropic's release notes and by the roundup-style pages already indexed for this topic.
What no roundup covers is what those updates feel like inside an app that decided, three weeks earlier, to stop sending pixel screenshots and start sending structured accessibility trees instead. The economics of a Mac automation call changed by roughly forty times when Fazm v1.5.0 shipped on March 27, 2026 with two adjacent changelog lines: “Bundled mcp-server-macos-use binary inside the app for built-in macOS automation support” and “Screen capture and macOS automation now uses native accessibility APIs instead of browser screenshot.” April 2026's Claude updates are the test of whether that trade held up.
“A Gmail reply walkthrough used to ship roughly 240 kilobytes of base64 PNG to Anthropic across three turns. On the accessibility-tree path it is about 6 kilobytes of structured text for the same five clicks.”
Measured across Fazm's Mail tool chain, April 22, 2026
The anchor fact, by file and line
The reason any of this works is a single Swift-native binary that Fazm builds, signs, and bundles inside its own .app. It runs as a local MCP server and exposes the macOS Accessibility API as a set of tool calls Claude can invoke. Here is where it is wired, exactly.
That is line 63, lines 1056 through 1064, and line 1266 of acp-bridge/src/index.ts. The binary itself is built from github.com/mediar-ai/mcp-server-macos-use in the Fazm CI pipeline as a universal arm64 + x86_64 Swift binary, signed with the same Developer ID that signs the .app, and dropped into Contents/MacOS alongside the Electron helpers. When Fazm boots, the ACP bridge checks for the binary, and if it is there, registers a tool surface named macos-use that Claude can call by tool name in any conversation.
Why this is the piece that matters in April 2026
Sonnet 4.6 and Opus 4.7 both bill for input tokens by count. A screenshot-based pipeline pays for pixels encoded as an image payload, which on Retina displays can trip the per-call dimension ceiling entirely. The accessibility-tree path pays for maybe 700 text tokens per UI read. Same model, same task, different bill. This is why April's faster, cheaper Sonnet default matters at all for consumer apps: without a text-first context pipeline, the price per workflow still lands where it was a year ago.
How a single Mac UI call flows on the accessibility-tree path
User types a prompt, Claude clicks through Mail
The bridge at acp-bridge/src/index.ts is a Node process spawned by the Swift app on launch. Its job is to talk ACP to Claude on one side and JSON RPC to each local MCP server on the other. When Claude issues a tool call named mcp__macos-use__get_ui_elements, the bridge routes it to the Swift binary, which in turn calls the macOS Accessibility C API and serializes the result as text. There is no PNG anywhere in this chain.
The April 2026 update landscape, mapped to this architecture
Each card is a real Anthropic change from the last four weeks and what it touched inside the Fazm codebase. Nothing is a restated press release.
Sonnet 4.6 stays the everyday default
Fazm runs main, floating, and observer sessions on claude-sonnet-4-6. The DEFAULT_MODEL constant is literal in acp-bridge/src/index.ts at line 1245. The accessibility-tree byte budget is what lets this be economically tenable for a consumer subscription.
Opus 4.7 GA on April 22
Arrived in availableModels without a Fazm release. Picked up by the Smart slot in ShortcutSettings.swift substring map. First available to Fazm users the same morning Anthropic flipped the switch.
ACP SDK 0.29.2 on April 20
Renamed the canonical Opus alias from 'opus' to 'default'. Fazm 2.4.0 shipped the same day; the stored-preference migration landed in an unreleased hotfix tracked in CHANGELOG.json line 3.
ACP SDK 0.25.0 on April 7
Tightened error shapes for credit exhaustion and rate limits. Fazm 2.1.2 bumped the bridge on the same day, which is when the two-substring rate-limit guard first stayed stable across SDK versions.
Dynamic model list in 2.4.0
emitModelsIfChanged in acp-bridge/src/index.ts at line 1271 forwards availableModels to the Swift app. New Claude models appear in the picker with no app update.
Screenshot pipeline vs accessibility-tree pipeline
Same Claude model, same user task, different wire format. These numbers are measured on a three-turn Mail reply chain against Claude Sonnet 4.6 on April 22, 2026.
| Feature | Screenshot-based pipeline | Fazm accessibility-tree path |
|---|---|---|
| Per-step input payload | ~80 KB of base64 PNG on Retina | ~2 KB of structured text |
| What Claude receives to click on | Pixel coordinates or bounding box | Stable AX element ID |
| Behavior under Claude Sonnet 4.6 input pricing | Cents per step, often multiples more | Fractions of a cent per step |
| Behavior when display DPI changes | PNG re-encoded at new size, may hit API limits | No change, tree is DPI-independent |
| What Opus 4.7 GA on April 22 meant | Quality bump, billed at 4x token cost | Quality bump, same byte budget |
| Sign-off on macOS 26 App Management | Needs Screen Recording permission | Reads only what Accessibility grants |
The byte count, as concretely as it gets
Measured on one pass of “reply to the top email in Gmail with yes” against Sonnet 4.6 on April 22, 2026. Five element reads and two element clicks.
The per-call delta is what shifts the whole unit-economic picture. A consumer subscription price can cover a Sonnet 4.6 session at roughly 0 text tokens per UI read. The same price covering 0 image-equivalent tokens per UI read is a different business entirely.
One tool call, end to end
A narrated walkthrough of what happens when a Fazm user asks for a Mail reply, turn by turn, with the accessibility tree doing the work Claude would otherwise do from pixels.
1. User types 'reply to the top email in Gmail with yes'
Message hits the floating bar, goes through ACP to Claude Sonnet 4.6. Claude decides it needs to inspect Mail first, picks the macos-use MCP server over playwright because Mail is a native Catalyst app, not a web page.
2. Claude calls mcp__macos-use__get_ui_elements
The bundled mcp-server-macos-use binary at Contents/MacOS/mcp-server-macos-use reads Mail's accessibility tree via AXUIElementCopyAttributeValue and returns a structured text payload roughly two kilobytes long, naming each message row with a stable AX identifier.
3. Claude parses the tree, picks the top AXRow
No vision model needed. The text payload names subject, sender, and preview. Claude returns a follow-up tool call with the exact element ID it wants to click on, not a bounding box or a pixel coordinate.
4. macos-use clicks by AX identifier
AXUIElementPerformAction on the targeted row, Mail opens the message in the reading pane, accessibility tree re-reads, and Claude now has the Reply button's AX identifier in the next turn.
5. Claude types the reply and sends
Two more accessibility-tree round trips, roughly four kilobytes of input total across the chain. A screenshot-based pipeline doing the same task would have shipped around 240 kilobytes of base64 PNG to Anthropic across the same turns.
What the tool output looks like from Claude's side
This is a redacted sample of what Sonnet 4.6 actually sees when macos-use returns the Gmail inbox view. Compare roughly two kilobytes of structured text to the alternative of an 80-kilobyte base64 PNG of the same screen.
One number, for scale
The bundled mcp-server-macos-use binary is one of 0 built-in MCP servers Fazm registers at boot (fazm_tools, playwright, macos-use, whatsapp, google-workspace), per the hardcoded set at line 1266 of acp-bridge/src/index.ts. It is the one that carries the April 2026 Claude updates across the line from native Mac apps to structured context, and it is the only reason the Sonnet-4.6-default economics work for a consumer subscription.
Want to watch the accessibility-tree pipeline run live?
Book 20 minutes and we will screenshare a Fazm session driving Mail on Claude Sonnet 4.6, with the tool call payloads tailing in a terminal next to it so you can see the byte count per step.
Questions
What were the Anthropic Claude updates in April 2026, at a glance?
Two model headlines plus a handful of protocol changes. Claude Sonnet 4.6 stayed the everyday default for speed-sensitive workloads. Claude Opus 4.7 went GA on April 22, 2026, slotting into the top of the quality tier. The Agent Client Protocol (ACP) SDK pushed 0.25.0 on April 7 and 0.29.2 on April 20, shifting rate-limit error strings and tightening credit-exhaustion payloads. Inside Fazm, a consumer Mac app, every one of those changes flows through a bridge that was already feeding Claude a native accessibility tree instead of a pixel screenshot, which is why the April surface changes cost us exactly one ACP bump and zero context-pipeline rewrites.
Why does Fazm send an accessibility tree to Claude instead of a screenshot?
Because a screenshot of a Gmail inbox is roughly 80 kilobytes of base64-encoded PNG, while the same inbox rendered as a native macOS accessibility tree is about two kilobytes of structured text. Sonnet 4.6 charges for input tokens by count, not by pixel, so the accessibility-tree path is roughly forty times cheaper per tool call while giving the model stable element IDs to click on instead of brittle bounding boxes. The switch shipped in Fazm v1.5.0 on March 27, 2026 with the changelog entry 'Screen capture and macOS automation now uses native accessibility APIs instead of browser screenshot.' When Opus 4.7 went GA three and a half weeks later, every chained UI step ran on a four-times more expensive model without blowing our economics.
Where is the actual binary that reads the accessibility tree, and how is it bundled?
It is a Swift-native MCP server called mcp-server-macos-use, built from github.com/mediar-ai/mcp-server-macos-use and bundled as a universal arm64 plus x86_64 binary inside the signed Fazm.app at Contents/MacOS/mcp-server-macos-use. The path is resolved at /Users/matthewdi/fazm/acp-bridge/src/index.ts line 63 with the expression `join(contentsDir, "MacOS", "mcp-server-macos-use")`. It is registered as a built-in MCP server between lines 1056 and 1064, only added to the server list if existsSync returns true for the binary. The name 'macos-use' is in a hardcoded set at line 1266: BUILTIN_MCP_NAMES = new Set(["fazm_tools", "playwright", "macos-use", "whatsapp", "google-workspace"]).
Which April 2026 Claude update made the biggest difference to a desktop agent?
For Fazm specifically, Sonnet 4.6 staying the default over the whole month, because the inner loop of almost every workflow runs on it. Opus 4.7 matters when the user selects Smart in the picker, which is the slot reserved for the latest Opus in Fazm's ShortcutSettings.swift. The ACP 0.29.2 bump on April 20 mattered because it rewrote the model ID surface: what was 'claude-opus' in stored preferences had to be migrated to a new pseudo-ID called 'default' for new sessions. The unreleased changelog note 'Fixed Smart (Opus) model preference not persisting after app update' is the tracking of that migration.
How does Fazm absorb a new Claude model ID without a new app release?
The ACP SDK reports the full set of available models on every session/new via a message named models_available. The bridge at acp-bridge/src/index.ts has a function called emitModelsIfChanged that normalizes the list, drops the 'default' pseudo-entry, and forwards a serialized JSON payload to the Swift app over the Unix socket only when the JSON changed. On the Swift side, ShortcutSettings.swift maps each ID against a three-row substring table (haiku, sonnet, opus) at lines 160 to 163 and relabels them Scary, Fast, and Smart respectively. When Anthropic added Opus 4.7 to availableModels on April 22, the picker label updated without an app ship. The 2.4.0 changelog for April 20 documents this path: 'Available AI models now populate dynamically from the agent, so newly released Claude models appear without an app update.'
Does the accessibility-tree approach mean Claude never sees a screenshot at all?
Not never. Fazm keeps a Playwright MCP server alongside macos-use for cases where a web app is genuinely visual and the accessibility tree has been stripped down to a sea of generic div roles. Examples: Canva, Figma, anything built on a WebGL canvas. The bridge at acp-bridge/src/index.ts line 2317 tags error patterns in tool output differently for 'mcp__playwright' vs 'mcp__macos-use' because the failure modes differ. The default, though, is to start with the accessibility tree, fall back to a targeted screenshot only when the tree does not resolve. Once inside a real native Mac app like Mail, Calendar, or Messages, the tree almost always carries the full intent.
How much cheaper is this in Claude API dollars?
The honest answer is 'order of magnitude,' with big workload variance. A single Mail reply walkthrough that used to round-trip three screenshots at about 80 KB each now sends three accessibility-tree dumps at about 2 KB each. That moves the per-step input from roughly 28,000 image-like tokens down to roughly 700 text tokens. At Sonnet 4.6 input pricing, the three-step workflow drops from the mid-tens of cents per run to fractions of a cent. Multiply across a session of forty to fifty turns, which is where chained desktop workflows end up, and it is the difference between a consumer app having unit economics and not.
Did anything about Claude's April 2026 updates break this architecture?
One thing, briefly. ACP 0.29.2 on April 20 renamed the canonical Opus alias from 'opus' to 'default' in its preferences shape. Users who had previously selected Smart on the picker saw the app revert to Sonnet after updating because the stored 'opus' string no longer matched anything in the new model list. The unreleased changelog entry in fazm/CHANGELOG.json line 3 tracks the fix: 'Fixed Smart (Opus) model preference not persisting after app update, now correctly maps stored opus to the new ACP model ID.' The migration happens in ShortcutSettings.swift inside normalizeModelId at lines 170 to 177, which contains the three-line substring mapping that covers every current Claude family.
Is this a developer framework or a consumer app?
A consumer app. Fazm ships on the Mac App Store. The user downloads a signed .dmg, grants Accessibility and Screen Recording permissions, signs in with Google or Apple, and starts chatting. Everything in this post is what runs under the hood when they hit the floating bar with Cmd+Shift+Space. They never see the ACP bridge, the MCP server list, or the model picker's substring match. They see a text box that answers, a model pill labeled Smart, and a response that clicks through their Mail or Calendar for them. The entire architecture decision to feed Claude text instead of pixels exists so the bill the user racks up for a month of heavy use stays within a consumer subscription price, not an API developer's budget.
Where can I verify the specific file paths and line numbers in this article?
The bundled mcp-server-macos-use binary is resolved at /Users/matthewdi/fazm/acp-bridge/src/index.ts line 63. Its registration with the ACP bridge is between lines 1056 and 1064. The hardcoded BUILTIN_MCP_NAMES set is at line 1266. The March 27, 2026 changelog entries that record the switch are on lines 191 and 192 of /Users/matthewdi/fazm/CHANGELOG.json. The Scary / Fast / Smart substring map is at lines 160 to 163 of /Users/matthewdi/fazm/Desktop/Sources/FloatingControlBar/ShortcutSettings.swift, and the model ID normalizer lives at lines 170 to 177 of the same file. The build system that produces the universal macos-use binary is in codemagic.yaml around line 200 with the step name 'Build mcp-server-macos-use (arm64 + x86_64).'
More field notes on April 2026 Claude updates, written from inside a shipping consumer Mac app
Adjacent guides
Anthropic Claude updates April 2026
The six silent failure modes a shipping Mac agent guards for, with the exact file names and line numbers where each guard lives.
Anthropic new model April 2026
The three-row substring map that relabels Claude model IDs as Scary, Fast, and Smart, so Opus 4.7 lands without an app release.
Claude AI for macOS
A Mac-native surface for Claude that lives in a floating bar, reads accessibility trees, and ships with its own bundled MCP servers.