macos-mcp · open source · signed & notarized · MIT

Give your AI agent a Mac.

The macOS MCP server for Claude Code, Claude Desktop, Cursor, VS Code and Codex. Accessibility-first UI automation that reads back every action, screenshots and OCR, native apps, files and Apple's own Safari MCP — plus a real iPhone through iPhone Mirroring, and disposable Macs for agents on your own host. One signed Swift binary. No telemetry.

$curl -fsSL https://macos-mcp.sh | sh

Signed and notarized by Apple. The installer verifies the checksum and the signature before installing — it fails closed. Apple Silicon, macOS 15 or later. Then macos-mcp install --client claude-code (or claude-desktop, cursor, vscode, codex).

44 tools24 on by defaultSwift 6.1, one binary0 telemetryMIT licensemacOS 15+ · Apple Silicon
Why this one

Automation you can trust, because it checks its own work.

01

No false successes

macOS accessibility writes and synthetic events both report success while doing nothing. macos-mcp reads every effect back — the field value, the window frame, the pasteboard, the running process — and a write that changed nothing is a typed action_unverified error, never a green check.

02

Safety is the product

Permission profiles (readonly · standard · full), one-shot confirmation tokens for destructive tools, an audit log with digested arguments, and hard lines: secure fields, Keychain, system auth dialogs and TCC are never touched. The safety model →

03

Apple's official MCPs, mounted

Apple ships MCP servers for Safari and Xcode. macos-mcp mounts them at boot and re-exports Safari's verbatim as web_*, gated behind the same profiles. The Xcode mount is built but not shipped as working: Xcode's consent dialog never appears for third-party agent processes. macOS 27 and Apple's MCPs →

The surface

Everything an agent needs on a Mac, as typed tools.

Namespaced toolsets, gated so the default surface stays lean: 24 tools on by default, the rest one enable_toolset call away. Every result is structured JSON; every failure carries a stable code and what the agent needs to recover. Full tool reference →

ui · 10 tools

UI automation from the accessibility tree

ui_snapshot maps any app into stable element ids; ui_click, ui_type, ui_scroll, ui_drag and ui_shortcut act on them without stealing focus or moving your pointer. window_manage, app_launch, app_quit, wait.

screen · 3 tools

See the screen, find the text

screenshot of a display, window or rect, downscaled for vision models. ocr with confidence and coordinates. screen_find: fuzzy text search that returns clickable points — the bridge for apps with no accessibility support.

system · 8 tools

Shell, AppleScript, clipboard, Spotlight

shell with caps and timeouts, a catalog of vetted, injection-safe AppleScript recipes, raw applescript_eval gated to full, a type-aware clipboard, open, spotlight_search.

files · 2 tools

Trash and tags, never a hard delete

trash moves to the Trash and returns the path for undo. tags reads and replaces Finder tags, verified by reading them back.

apps · 5 tools

Calendar, Reminders, Contacts

EventKit and Contacts through the system's own permission prompts. Tool names apple-mcp users already know. Migrating from apple-mcp →

intents · 2 tools

Shortcuts and App Intents

intents_list and intents_run discover and run any app's Shortcuts — the growth surface Apple is steering developers toward after SiriKit.

web · 5 or 17 tools

Safari, Apple's way or the fallback

Apple's Safari MCP server re-exported verbatim where it is available; otherwise an AppleScript fallback serving the same slot, with method: "fallback" on every result so the agent always knows which engine answered.

ios · 8 tools

A real iPhone, in device points

Drive the handset through the iPhone Mirroring window. The mirror is an opaque video surface with no accessibility tree, so iphone_find (OCR) is the primary locator, not a fallback; then iphone_tap, iphone_swipe, iphone_type and five keys measured on real glass. Every mutating call captures the phone before and after and answers action_unverified rather than a false success. Off by default. Needs iPhone Mirroring, which Apple does not offer in the EU. The iPhone toolset →

vm · CLI, single host

Disposable Macs for agents

macos-mcp vm — a CLI subcommand group, not new MCP tools — clones a golden macOS image into a throwaway guest on Virtualization.framework, runs it in a window on this Mac, and deletes it: clone, start, stop, destroy, plus status, screenshot, ip, input, grant and verify. TCC is solved once per image and inherited by clones. Two VMs per host, measured. Disposable Macs → · the multi-host hub is in development.

In practice

Two things an agent actually does.

Tap something on a real iPhone

# No accessibility tree behind the mirror, so OCR is
# the primary locator here, not a fallback.
iphone_find { "text": "Settings" }
  → matches, best first, each with a device_center
    in the phone's own device points

iphone_tap  { "x": device_center.x, "y": device_center.y }
  → verified — the phone's screen actually changed
  → action_unverified — it did not, and the tool says so

Device points, not screen pixels: the same coordinates survive a window resize, a different Mac, and a transcript replayed tomorrow. The iPhone toolset →

Give it a Mac it may destroy

macos-mcp vm clone golden-27 scratch   # APFS clonefile: instant,
                                      # fresh machine identifier
macos-mcp vm start scratch            # a window in the console session
macos-mcp vm verify scratch           # ax_read · keystroke · screencapture
                                      # · non-black frame, nobody inside

#     … the agent does the risky thing in there …

macos-mcp vm destroy scratch          # gone

Single host today. Two macOS VMs per Apple Silicon host is a measured kernel quota, not a limit we chose. Disposable Macs →

Proof, not claims

Every build prints its own report card.

macos-mcp eval run executes a bundled suite of agent tasks — fill a form, find text on screen without accessibility, verify a secure field is refused, save a document in TextEdit — against the real server on a real Mac, and prints a score. Skips are never counted as passes.

The published score is a real model solving those tasks through this server, reproducible with macos-mcp eval run --driver claude. A run whose agent CLI never started, or that skipped tasks the machine could not do, is refused at the endpoint rather than rendered as a number. Read the latest report · history.

100%5/5 tasks · real agent · mean of three runs · measured 2026-09-06
100%9/9 scripted tasks on a TCC-granted Mac · 2026-09-06
522unit + component tests, every build
Safety

Built for the question “should I let an agent do this?”

Hard lines

Secure text fields are never read or typed into — a typed refused with an alternative, not a best-effort attempt. No Keychain, no system auth dialogs, no TCC circumvention, ever.

Profiles and confirmation

readonly refuses anything that isn't observation. Under standard, a destructive call first returns confirmation_required with a one-shot token bound to that exact call. Enforced centrally, so mounted Apple tools obey it too.

Audited, inspectable

Every call lands in ~/.macos-mcp/audit.jsonl with arguments SHA-256 digested (typed text can be a secret). macos-mcp audit tail and audit summary read it back without a JSON tool.

Machine-readable failures

Every error carries a stable code plus what an agent needs to self-heal: the missing grant and its Settings deep-link, the element ids visible right now, what the element actually offers.

Signed, notarized, open

A Developer ID-signed, Apple-notarized binary from an MIT repository — audit the source, verify the signature, constrain it with a profile. No telemetry, by construction.

Stable API

Tool names and argument shapes are frozen and diffed against the last release on every build. A removal or a narrowed enum fails the build unless a deprecation entry gave a minor version of notice.

Works with your client

One command per client.

curl -fsSL https://macos-mcp.sh | sh     # installs, verifies, runs doctor

macos-mcp install --client claude-code     # or:
macos-mcp install --client claude-desktop
macos-mcp install --client cursor
macos-mcp install --client vscode
macos-mcp install --client codex

macos-mcp doctor                           # what to grant, with deep-links

install merges a stdio entry into the client's config and backs up what was there. Any other MCP client gets the same one-liner: macos-mcp serve.

Then ask: “Snapshot the frontmost app and click Save.” — and watch it work off the accessibility tree instead of pixel-guessing.

Getting started →

FAQ

Questions people ask before installing.

What is a macOS MCP server?

An MCP (Model Context Protocol) server exposes tools that an AI client such as Claude Code, Claude Desktop, Cursor, VS Code or Codex can call. macos-mcp is an MCP server that exposes the Mac itself: the accessibility tree of every app, clicks, typing, scrolling, keyboard shortcuts, windows, screenshots, OCR, the clipboard, AppleScript recipes, Spotlight, files, Calendar, Reminders, Contacts, Shortcuts, Safari, and a mirrored iPhone. Your agent gets 44 typed tools and every result is structured JSON.

Which AI clients work with macos-mcp?

Any MCP client that speaks stdio. macos-mcp install --client registers it with Claude Code, Claude Desktop, Cursor, VS Code and Codex in one command, merging into the client's config and backing up what was there. Other clients get the same one-line stdio entry: macos-mcp serve.

What permissions does it need?

The two default grants are Accessibility (for the ui_* tools) and Screen Recording (for screenshot, ocr and screen_find). Calendar, Reminders and Contacts prompt on first use; scripting another app asks for Automation. Grants attach to the app hosting the agent, not the binary. macos-mcp doctor lists what is missing and prints the exact System Settings deep-link to fix it.

Is it safe to let an AI agent control my Mac?

macos-mcp is built around that question. Secure text fields are never read and never typed into. The readonly profile refuses anything that is not pure observation; under the default standard profile a destructive tool first returns a one-shot confirmation token bound to that exact call. Every call is appended to an audit log with its arguments digested, never stored raw. Keychain, system authentication dialogs and TCC are hard lines that are never crossed. Nothing phones home.

Does it run on macOS 27 Golden Gate?

Yes. macos-mcp targets macOS 15 and later on Apple Silicon, and its integration and agent-eval tiers ran on the macOS 27 betas. Safari 27 ships Apple's own Safari MCP server, which macos-mcp mounts and re-exports verbatim as web_* tools where it is available.

How is macos-mcp different from Peekaboo, XcodeBuildMCP or apple-mcp?

Those are specialists: Peekaboo is screen capture and input, XcodeBuildMCP is Xcode builds and simulators, apple-mcp (archived January 2026) was Apple's PIM apps. macos-mcp covers the whole Mac behind one signed binary, verifies every effect instead of trusting a return code, adds a permission and audit model none of them have, and includes a migration map for apple-mcp's tools.

Does macos-mcp send any data anywhere?

No. There is no telemetry, no analytics and no update check inside the binary. The only network activity is what a tool you call does, such as opening a URL in Safari.

Can it control Safari and Xcode?

Safari: yes. Where Apple's Safari MCP server is available (Safari 27 or Safari Technology Preview with remote automation on) its 17 tools are re-exported verbatim as web_*; everywhere else the same tool names are served by an AppleScript fallback that labels every result method: fallback. Xcode: the gateway is built, but Xcode's consent dialog currently never appears for third-party agent processes, so the Xcode mount is not shipped as working yet.

Can macos-mcp control an iPhone?

Yes — the ios toolset shipped in v0.2.0. Its eight tools drive a real iPhone through the iPhone Mirroring window: read the phone's screen, find text on it with OCR, then tap, swipe, type, and press home, app switcher, Spotlight, back and lock. The mirrored content is an opaque video surface with no accessibility tree, so iphone_find is the primary locator rather than a fallback, and coordinates are the phone's own device points instead of screen pixels — a target survives a window resize, a different Mac, and a transcript replayed tomorrow. Every mutating call captures the phone before and after and returns a typed action_unverified when the screen did not change, never a false success; iphone_type is the honest exception, reporting verification.method "none" because iOS hides the keyboard while mirroring and nothing on the Mac can read the field back. The toolset is off by default: enable_toolset turns it on. It needs iPhone Mirroring itself — iOS 18 or later, the same Apple Account on both devices, the iPhone locked and nearby — and Apple does not make iPhone Mirroring available in the EU.

Can my agent run inside a disposable macOS VM?

On a single host, yes, today. macos-mcp vm is a CLI subcommand group — not MCP tools, so the tool surface is unchanged — that clones a golden macOS image into a throwaway guest on Apple's Virtualization.framework, runs it in a window on this Mac's console session, captures it host-side, and deletes it: list, clone, start, stop, destroy, status, screenshot, ip, input, grant, verify. A clone is an APFS clonefile with a regenerated machine identifier and its own MAC and auxiliary storage, so it is instant and costs no disk until it diverges. The accessibility and screen-recording grants are solved once per golden image and inherited by every clone, and vm verify is the per-clone acceptance check that needs no human in the guest. Two macOS VMs per Apple Silicon host is a measured kernel quota rather than a limit we chose: the third is refused with VZErrorDomain code 6 while 39% of RAM is still free, so more RAM never helps. What is not shipped is the hub that routes a machine parameter across many hosts — designed, prototyped and measured, but not released.

How do I uninstall macos-mcp?

Delete the binary (/usr/local/bin/macos-mcp by default), remove ~/.macos-mcp (config and the audit log), and remove the macos-mcp entry from your client's MCP config — install backed the previous config up next to it. Revoke the Accessibility and Screen Recording grants for your terminal or client in System Settings if you no longer want them.

Give your agent a Mac.

$curl -fsSL https://macos-mcp.sh | sh

Open source under MIT. Signed and notarized. No telemetry. Read the code on GitHub, or the security policy.