Claude AI for macOS, past the chat app and the CLI
Search "claude ai for macos" in April 2026 and page one is the chat app (Claude Desktop) and the terminal (Claude Code). Both are great for their jobs. Neither can click a button inside Calendar, rename a Finder file, or send a WhatsApp message without you writing the glue. This guide covers all three shapes of Claude on macOS, with the third one (a consumer app that uses Claude Sonnet 4.6 to actually drive other Mac apps through the real accessibility tree) explained from the Swift and TypeScript files that make it work.
What page one of the SERP actually covers
In April 2026, the top ten results for "claude ai for macos" are Anthropic's own distribution channels: claude.com/download, the Claude Desktop install guide, the App Store listing "Claude by Anthropic", the Claude Code GitHub repo and its brew install instructions, a MacRumors piece on the March 2026 research preview that lets Claude remote-control a Mac for Pro and Max subscribers, and a handful of third-party download mirrors.
Every one of those pages answers the question "how do I talk to Claude on my Mac." None of them answer the question "how do I get Claude to do a thing inside another Mac app on my behalf." That is a different shape of product, and it lives one layer lower than the chat UI.
The rest of this page walks the three options in order, then zooms into the third one with the file paths, function names, and model IDs you would otherwise have to read the Fazm source to find.
The three shapes of Claude AI on macOS
Option 1. Claude Desktop, the native chat app
Anthropic's Claude Desktop is a native macOS chat app. You install it from claude.com/download or the App Store (bundle id id6473753684). It needs macOS 11 Big Sur or later, sits in the dock, and supports artifacts, projects, and the full Claude conversation feature set. It can connect to MCP servers through desktop extensions, so with effort you can wire in local tools, but the default install is a chat client.
Use Claude Desktop when what you want is a conversation. It is the right answer for writing, brainstorming, long-form reasoning, or pasting screenshots. It is not the right answer when what you want is to hand Claude a sentence like "rename every file in this Finder window to follow kebab-case" and walk away.
Option 2. Claude Code, the agent in your terminal
Claude Code is Anthropic's open source terminal agent (github.com/anthropics/claude-code). You install it withbrew install --cask claude-codeorcurl -fsSL https://claude.ai/install.sh | bashand get an agent that edits files, runs tests, manages git, and speaks MCP over stdio. In March 2026 Anthropic added a "Desktop" mode (code.claude.com/docs/en/desktop) that lets Claude Pro and Max subscribers drive a Mac remotely; as of this writing it is still in research preview.
Claude Code is the right answer for software work inside a repo. Wire it to an MCP server that wraps macOS accessibility and you can extend it out to other Mac apps, but you are then on the hook for the permission prompt loop, the retry logic around AXError.cannotComplete, the model routing, and the UI. That is what the third option solves.
“ACPBridge.swift is how the macOS app spawns a Node.js subprocess, translates JSON-RPC to and from Claude, and surfaces the model list back to the UI. The consumer app hides all of that.”
Desktop/Sources/Chat/ACPBridge.swift
Option 3. A consumer app where Claude drives other Mac apps
This is the option the SERP skips. The shape is: a signed, notarized Mac app you install the same way you installed Claude Desktop. Under the hood it does three things Anthropic's own apps do not: it asks for the macOS accessibility permission, it bundles MCP servers (browser, native Mac apps, Google Workspace, WhatsApp) so Claude can reach other surfaces out of the box, and it wires Claude Sonnet 4.6 into a named session model so the conversation can resume and the agent can observe itself.
Fazm is the open reference. The rest of this page uses its source as the worked example; you could build something with the same shape against the same Anthropic API and the same open source MCP servers.
Why that probe is 34 lines instead of one AXIsProcessTrusted() call
- AXIsProcessTrusted() is cached per process; after a permission reset on macOS 26 Tahoe it can keep returning true even when AX is dead.
- AXError.cannotComplete can mean 'permission broken' or 'frontmost app does not implement AX' (Qt, PyMOL, some Electron builds).
- Retrying the same call against Finder disambiguates: Finder is known to implement AX correctly.
- If Finder is not running, CGEvent.tapCreate(.cgSessionEventTap, ...) hits the live TCC database and bypasses the stale cache entirely.
- The probe runs every time the user clicks a 'ready' affordance, not just at launch.
How Claude actually reads a Mac window
On macOS, the accessibility tree is the same structured data VoiceOver narrates. Each element has a role, a title, a value, a frame, and children. AXUIElementCreateApplication(pid) returns the root; AXUIElementCopyAttributeValue walks it. A typical Calendar or Mail window is a few hundred tokens of structured JSON after one pass. Handing that to Claude is cheap, low latency, and survives dark mode and high-DPI because the app is reporting its own semantics.
Screenshots are the fallback. Fazm uses CGWindowListCreateImage inside ScreenCaptureManager.captureAppWindow(pid:) when the user actually asks for a visual, but the default read path is AX. That is the inversion the SERP results miss: "Claude AI for macOS" typically means a chat window you paste screenshots into; the third option inverts it and lets Claude read the structured tree first.
Accessibility tree versus screenshot, same Mac window
The numbers shift with window size and model, but the shape is stable.
| Feature | Screenshot + vision | AX tree |
|---|---|---|
| Input shape | Bitmap, downscaled to model's image budget | Structured JSON of role, title, value, frame |
| Typical cost per window read | An image token budget plus OCR errors | A few hundred tokens |
| Survives dark mode, high-DPI, theme changes | Depends on OCR and vision model | Yes, the app reports its own semantics |
| Works when a dialog is partially off-screen | Pixels are clipped | Yes, frame is reported |
| Good for PDFs, figures, hand-drawn diagrams | Yes, this is where screenshots win | No, you need pixels |
| Required permission | Screen Recording (kTCCServiceScreenCapture) | Accessibility (kTCCServiceAccessibility) |
What model does the consumer app call
claude-sonnet-4-6 is the pinned default. It is referenced in more than a dozen places across the Fazm Swift source, including three named sessions in ChatProvider.swift that boot on every launch.
What tools ship with the consumer app
Five MCP servers are hardcoded in acp-bridge/src/index.ts around line 1266. They are handed to Claude at session start so the first prompt can already reach Finder, a real browser, WhatsApp, and your Google Workspace without you installing anything else.
fazm_tools
Internal tools dispatched by ChatToolExecutor.swift. Database reads, skill management, attachments. The surface Claude uses to talk to the app itself.
playwright
Browser control via the Playwright MCP Bridge extension. The same tree-driven approach for web as AX is for native apps.
macos-use
Native Mach-O at Contents/MacOS/mcp-server-macos-use. Open source at github.com/mediar-ai/mcp-server-macos-use. The server that turns AXUIElement into MCP tool calls.
WhatsApp Catalyst app driven through accessibility APIs. Searching, reading, replying.
google-workspace
Gmail, Calendar, Drive via a bundled Python MCP server with OAuth already wired.
The first-run sequence, end to end
From dmg to a Claude prompt that can click a button inside Calendar, the sequence takes five steps. Each one is wired so the defaults work without you editing config.
1. Install
Mount Fazm.dmg, drag to /Applications. Signed, notarized; Codemagic handles the build pipeline. First launch triggers macOS's usual 'app downloaded from the internet' prompt once.
2. Grant accessibility
Fazm calls AXIsProcessTrustedWithOptions with the prompt option. If macOS's per-process cache lies, AppState.swift retries with AXUIElementCopyAttributeValue against Finder, then CGEvent.tapCreate as a tiebreaker.
3. Claude sign-in or bundled key
ACPBridge.BridgeMode resolves to .personalOAuth (Anthropic sign-in) or .bundledKey(apiKey:) from KeyService.swift's /v1/keys fetch. Key is held in memory only.
4. ACP bridge boot
Node.js subprocess starts from acp-bridge/. Five MCP servers registered. ChatProvider.swift opens three sessions (main, floating, observer) pinned to claude-sonnet-4-6.
5. First prompt
Type a sentence like 'find every Finder file modified today in ~/Desktop and move them to ~/Archive/2026-04-21'. Claude reads Finder's AX tree, generates tool calls, and shows you the plan before executing.
The probe you would not write on your first try
The reason AppState.swift has a 0-line permission check instead of a one-liner is that AXIsProcessTrusted() lies after a permission reset on macOS 26 Tahoe. The Fazm probe confirms accessibility by actually calling AXUIElementCopyAttributeValue with kAXFocusedWindowAttribute, disambiguates AXError.cannotComplete by retrying against Finder, and falls back to CGEvent.tapCreate(.cgSessionEventTap, ...) at line 0 when Finder is not running. That is the kind of plumbing the SERP results do not mention because the SERP results are about a chat window, not about touching other Mac apps.
You can read the original in Desktop/Sources/AppState.swift lines 431 to 504 in the Fazm repo.
Picking the right shape for what you want to do
These three apps are not competitors in the usual sense. They occupy different slots. Most Mac users who care about Claude end up with at least two of them installed.
Claude Desktop vs Claude Code vs Fazm on macOS
| Feature | Claude Desktop / Claude Code | Fazm |
|---|---|---|
| Primary surface | Chat window / terminal | Other Mac apps via accessibility tree |
| Default model | Claude Sonnet, user-selectable | claude-sonnet-4-6, pinned |
| MCP servers out of the box | 0 for Desktop, user-configured for Code | 5 bundled (incl. macos-use, playwright, whatsapp) |
| Accessibility permission plumbing | Not required (Desktop) / your problem (Code + MCP) | AX probe with Finder fallback and event tap tiebreaker |
| Best for | Talking to Claude (Desktop) / editing code (Code) | Doing a thing inside another Mac app |
| Install | claude.com/download or brew install | Fazm.dmg from fazm.ai |
Fazm's AX tree plumbing is specific to macOS; the comparison is about behavior on Mac, not about which chat UI is better.
What this actually feels like in practice
You open the floating control bar with a global shortcut and type "pull every invoice PDF in ~/Downloads from the last two weeks, rename by date and vendor, drop into Drive/Finance/2026". Fazm routes that to the main session on claude-sonnet-4-6, which reads Finder's AX tree (titles, dates, file sizes), calls the google-workspace MCP server for the Drive folder, and proposes the full list of renames as a tool call you can accept or reject.
You do not install anything else. You do not write Python. You do not configure an MCP client. The same sentence, handed to Claude Desktop, gets you a paragraph back describing how to do it; handed to Claude Code, gets you a shell script draft; handed to Fazm, runs.
Want Claude to actually do things on your Mac?
Book a 15-minute walkthrough. I'll show the AX probe, the MCP setup, and how the first prompt resolves inside your own Finder or Calendar.
Book a call →Claude AI for macOS, frequently asked
What are the three ways to run Claude AI on macOS in 2026?
First, Claude Desktop from Anthropic: a native chat app you install from claude.com/download or the App Store. It runs prompts against Claude and handles artifacts and projects; it does not drive other Mac apps on your behalf. Second, Claude Code: the terminal agent you install with 'brew install --cask claude-code' or 'curl -fsSL https://claude.ai/install.sh | bash'. It edits files, runs tests, and speaks MCP, but its surface is your shell, not Finder or Calendar or WhatsApp. Third, consumer apps that embed Claude and add the real macOS accessibility plumbing on top, so the agent can actually click a button inside any native Mac app. Fazm is the one built around claude-sonnet-4-6 as the default model, with the accessibility permission loop and five bundled MCP servers wired up out of the box.
What does 'accessibility APIs instead of screenshots' mean, and why does it matter?
The macOS accessibility API is the same tree that VoiceOver reads. Every on-screen element has a role (kAXButtonRole, kAXTextAreaRole), a title, a value, a frame, and a list of children. AXUIElementCreateApplication plus AXUIElementCopyAttributeValue pulls that tree as structured data: a few hundred tokens per window, no vision model needed. A screenshot is a bitmap: you send it to a multimodal LLM, pay an image budget, rely on OCR for text, and fight dark mode and high-DPI. Fazm reads the AX tree first and only captures screenshots when visual reasoning is required. The test lives in Desktop/Sources/AppState.swift at line 433, function testAccessibilityPermission(); see the section above for the exact Swift call.
Which Claude model does Fazm actually call on macOS?
claude-sonnet-4-6 is the hardcoded default across Fazm's Swift source: ChatProvider.swift lines 1048 to 1050 set up three named sessions (main, floating, observer) all on claude-sonnet-4-6, OnboardingChatView.swift pins the same model for the setup flow, BrowserProfileMigrationManager.swift uses it for the browser profile build, and DetachedChatWindow.swift reads it from UserDefaults 'shortcut_selectedModel' with claude-sonnet-4-6 as the fallback. Users can select other supported models through the UI; the model list is received from the ACP bridge via the onModelsAvailable handler at ACPBridge.swift line 221.
Does Fazm need my Anthropic API key to run Claude on macOS?
Not for the default setup. Fazm's KeyService.swift fetches an anthropic_api_key from the backend at FAZM_BACKEND_URL/v1/keys using Bearer auth (KeyService.swift _doFetch at line 78), stores it only in memory, and hands it to the ACP bridge. The bridge supports two modes, defined in ACPBridge.swift at enum BridgeMode around line 194: .personalOAuth (you sign in through your Anthropic account) or .bundledKey(apiKey:) (the app-managed key). If you want full control you can bring your own key; most users never touch that setting.
What is ACP and why does it sit between macOS and Claude?
ACP is the Agent Client Protocol, the same JSON-RPC protocol Zed's agent panel speaks. Fazm spawns a Node.js subprocess from acp-bridge/ that runs claude-code-acp under the hood, communicates with the Swift app via JSON-lines over stdin/stdout, and exposes the bundled MCP servers to Claude. Tool timeouts are defined in acp-bridge/dist/index.js as TOOL_TIMEOUT_INTERNAL_MS = 10_000, TOOL_TIMEOUT_MCP_MS = 120_000, TOOL_TIMEOUT_DEFAULT_MS = 300_000. The 2.4.0 release notes on 2026-04-20 list the ACP protocol version as v0.29.2.
Which MCP servers ship inside Fazm, and where is that list?
Five servers are hardcoded in acp-bridge/src/index.ts around line 1266: fazm_tools (internal tools dispatched by ChatToolExecutor.swift), playwright (browser control via the Playwright MCP Bridge extension), macos-use (a native Mach-O shipped at Contents/MacOS/mcp-server-macos-use inside the signed .app), whatsapp (the WhatsApp Catalyst app driven through accessibility APIs), and google-workspace (Gmail, Calendar, Drive via a bundled Python MCP server). The macos-use binary is resolved earlier in the same file around line 63 with 'const macosUseBinary = join(contentsDir, "MacOS", "mcp-server-macos-use")'. Everything is bundled; nothing is pip-installed at runtime.
Why does Fazm ping Finder when it checks accessibility permission?
Because AXError.cannotComplete on macOS 26 (Tahoe) is ambiguous. It can mean Fazm's accessibility permission is genuinely broken, or that the frontmost app (Qt, OpenGL, PyMOL, some Electron builds) just does not implement the AX API well. AppState.swift confirmAccessibilityBrokenViaFinder at line 468 retries the same call against Finder (which is a known AX-compliant app). If Finder also fails, the permission is truly stuck. If Finder succeeds, the failure was app-specific and Fazm continues. If Finder is not running, probeAccessibilityViaEventTap() at line 490 falls back to CGEvent.tapCreate(.cgSessionEventTap, ...) as a tiebreaker, because event tap creation checks the live TCC database and bypasses the per-process cache that goes stale after a permission reset on Tahoe.
Can Claude Desktop or Claude Code do what Fazm does on macOS?
Partially, and not without work. Claude Desktop has no tool-use loop against your local apps out of the box. Claude Code can speak MCP, so you could wire in an open source MCP server like macos-use yourself (github.com/mediar-ai/mcp-server-macos-use) or AutoMac MCP and get parallel capability, but you own the permission flow, the retry logic, the model routing, and the UI. The Claude Code 'desktop' feature released in research preview in March 2026 lets Pro and Max subscribers drive a Mac remotely while they are away; it is still on Anthropic's infrastructure and requires a paid tier. Fazm packages the local desktop path: one signed .app, five MCP servers, the AX probe already hardened for Tahoe, and claude-sonnet-4-6 wired in.
What does Fazm actually cost on macOS, and what runs on-device?
The app is free to download from fazm.ai with a free tier that includes bundled Claude calls through the managed key. The Swift frontend, the ACP bridge (Node.js, bundled), the accessibility calls (AXUIElement, CGWindowList), and the MCP servers run on-device. Claude inference is remote (Anthropic API, claude-sonnet-4-6). Screenshot captures, when needed, use CGWindowListCreateImage through ScreenCaptureManager.swift captureAppWindow(pid:), which queries CGWindowListCopyWindowInfo for window metadata before capturing.
What do I install first if I want Claude to actually do things on my Mac?
Install Claude Desktop from claude.com/download if you mostly want a chat UI and artifact support. Install Claude Code via 'brew install --cask claude-code' if you want an agent in your terminal that edits files and runs git. Install Fazm from fazm.ai if you want Claude Sonnet 4.6 to act on other Mac apps for you, with the accessibility permission plumbing, the ACP bridge, and five bundled MCP servers already solved. They coexist cleanly; many users keep the chat app open for conversation and use Fazm when a task needs to touch Finder, Calendar, Messages, Notes, Xcode, or WhatsApp.