需手动在系统设置中为终端、Python 和 UV 授予辅助功能与屏幕录制权限,否则工具无法操作 UI;Snapshot 截图工具依赖屏幕录制权限,缺失时会失败;Claude Desktop 配置仅支持 stdio,连 HTTP 服务需借助 mcp-remote 桥接
MacOS-MCP
CursorTouchMIT活跃维护把 macOS 桌面操作封装成 MCP 服务,让 AI Agent 能直接控制鼠标键盘、操作窗口,实现电脑使用自动化。
MCP server for computer use in MacOS
uvx macos-mcp serve需 macOS 12 Monterey 及以上系统,README 未提及显存或 GPU 要求;需在系统设置中授予辅助功能与屏幕录制权限
让任意 LLM 通过 MCP 直接操控 macOS 界面,实现文件、应用与浏览器自动化
把 macOS 桌面操作封装成 MCP 服务,让 AI Agent 能直接控制鼠标键盘、操作窗口,实现电脑使用自动化。
核心能力
- 基于 Accessibility API 原生操作 macOS UI 元素
- 提供键鼠模拟、窗口管理与 AppleScript 执行工具集
- 从无障碍树提取可交互元素,无需视觉模型
- 自动识别 Launchpad、控制中心、Spotlight 等系统状态
- 支持 stdio、SSE 与 streamable-http 三种传输方式
容易踩的坑
- v0.4.7最新正式版2026-11-02 · 2026-11-02 05:38 UTC
Release checklist: the
.mcpbbundle attached below must be manually resubmitted to the Anthropic extension directory the published extension does not update itself (#19, #57).What's Changed
- fix: align Snapshot images with macOS logical coordinates by @Hryshyn-P in https://github.com/CursorTouch/MacOS-MCP/pull/68
- fix: let Scroll's optional loc accept an explicit null by @vishalhabib99 in https://github.com/CursorTouch/MacOS-MCP/pull/69
New Contributors
- @Hryshyn-P made their first contribution in https://github.com/CursorTouch/MacOS-MCP/pull/68
- @vishalhabib99 made their first contribution in https://github.com/CursorTouch/MacOS-MCP/pull/69
Full Changelog: https://github.com/CursorTouch/MacOS-MCP/compare/v0.4.6...v0.4.7
- v0.4.62026-09-08 · 2026-09-08 05:27 UTC
查看更新说明
Release checklist: the
.mcpbbundle attached below must be manually resubmitted to the Anthropic extension directory — the published extension does not update itself (#19, #57).What's Changed
- fix: reject empty shortcut key segments by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/65
- fix: serialize launchd plist safely by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/64
- fix: handle screenshot tempfile exhaustion by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/62
- fix: allow bounded HTTP graceful shutdown by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/66
Full Changelog: https://github.com/CursorTouch/MacOS-MCP/compare/v0.4.0...v0.4.6
- v0.4.02026-08-18 · 2026-08-18 17:12 UTC
查看更新说明
Release checklist: the
.mcpbbundle attached below must be manually resubmitted to the Anthropic extension directory — the published extension does not update itself (#19, #57).What's Changed
- fix: async tool handlers to prevent event loop blocking on HTTP transport by @bob-codedaptive in https://github.com/CursorTouch/MacOS-MCP/pull/48
- feat: document mcp-remote bridge for Claude Desktop HTTP connections by @bob-codedaptive in https://github.com/CursorTouch/MacOS-MCP/pull/46
- Add MCP Toplist rank badge by @chrstphe in https://github.com/CursorTouch/MacOS-MCP/pull/49
- feat: auto-select free port when installing the HTTP server by @bob-codedaptive in https://github.com/CursorTouch/MacOS-MCP/pull/50
- feat: native stdio-to-HTTP bridge (Swift + Python), replacing mcp-remote by @bob-codedaptive in https://github.com/CursorTouch/MacOS-MCP/pull/51
- Bridge: always reply, and recover the session when the server restarts by @bob-codedaptive in https://github.com/CursorTouch/MacOS-MCP/pull/53
- Fix Shell calls returning less output than the command produced by @bob-codedaptive in https://github.com/CursorTouch/MacOS-MCP/pull/52
- fix: drain autorelease pools in async AX workers by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/54
- fix: address async worker review nits by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/55
- fix: bound Streamable HTTP session resources by @git-ksk in https://github.com/CursorTouch/MacOS-MCP/pull/56
New Contributors
- @chrstphe made their first contribution in https://github.com/CursorTouch/MacOS-MCP/pull/49
- @git-ksk made their first contribution in https://github.com/CursorTouch/MacOS-MCP/pull/54
Full Changelog: https://github.com/CursorTouch/MacOS-MCP/compare/v0.3.17...v0.4.0
- v0.3.172026-08-03 · 2026-08-03 04:38 UTC
查看更新说明
The first capture in a process is about 3.2× faster — roughly 1290 ms down to 420 ms. Captures after the first are unchanged, as is the output.
round 0.3.17 0.3.16 1 482 ms 1255 ms 2 372 ms 1300 ms 3 413 ms 1307 ms What was slow
The cost was first contact with each application. The first accessibility call to a process takes around 8 ms, because the connection has to be established; later calls to the same process take microseconds. Profiling a cold capture put 1.198 s in
GetAttributeacross 146 calls.Two functions asked every one of the ~50 running applications in turn:
menu bar extras discovery 0.80 s asks each app for its extras menu bar listing windows 0.46 s asks each app for name, status, main windowBoth now probe concurrently. Discovery measured on its own went from 1057–1312 ms to 209–231 ms.
Changed
- Applications are probed concurrently on a cold capture. Warm captures remain at around 75 ms, and the output is identical — the same windows and the same nodes, compared entry by entry in both directions.
Notes
Parallelism is not a general win in this codebase, and it is worth recording why this instance is different. An earlier experiment overlapped attribute fetches inside a single application and measured slower — 67.7 ms against 83.0 ms — because one accessibility server answers requests serially, so nothing overlapped while the machinery still cost real work.
These loops address separate processes, which do respond at the same time. It is the same reason scanning several applications for nodes has always been threaded. The distinction is whether the requests share a server, not whether there are many of them.
Most of what this recovers is cost introduced by the menu bar extras feature in 0.3.16, whose discovery step was the single largest contributor to the cold path.
Full Changelog: https://github.com/CursorTouch/MacOS-MCP/compare/v0.3.16...v0.3.17
- v0.3.162026-08-03 · 2026-08-03 04:21 UTC
查看更新说明
Three classes of on-screen element that snapshots could never see are now captured, and the accessibility layer got cheaper along the way.
Highlights
Menu bar extras from background apps. Status icons for tools like Docker, Ollama, LM Studio and Claude were invisible to every snapshot. They belong to their own process, which is neither frontmost nor system UI, so nothing ever asked them.
Notification Centre, including the banners. Owned by
com.apple.notificationcenterui, which was not scanned at all — soClear All,Edit Widgetsand the notifications themselves were all missing.Cheaper phase-2 fetches. Elements are no longer asked for attributes their role cannot carry. Control Centre's scan went from 25.5 ms to 19.4 ms.
Added
- Menu bar extras owned by background applications. Apps owning a non-empty
AXExtrasMenuBarare discovered and scanned — only their extras menu bar, since walking a full window tree would cost far more than the single node it contributes. Discovery is cached against the set of running process ids, so a repeat capture pays 0.15 ms rather than 7.36 ms. - Names for unnamed extras. These are pure icons with no title, description, value or identifier, so name-based filtering removed them despite their being plainly visible. An unnamed
AXMenuBarItemnow takes the owning application's name. Only unnamed items are affected, so an app's real menus keep their own titles. - Notification Centre contents, including notification banners. A banner is an
AXGroupcarrying the subroleAXNotificationCenterBanner— not an interactive role — so a newINTERACTIVE_SUBROLESset makes it interactive regardless of role, andSubrolemoved into the phase-1 attribute batch since interactivity now depends on it.
Changed
- Phase 2 asks only for what a role can carry. An attribute an element cannot have still costs work: the application has to receive the request, look, and answer "unsupported". Against Control Centre's status items, five of eleven were never answered, and dropping them halved that fetch (6.88 ms → 3.22 ms for 11 elements). Which attributes can be answered is a property of the role rather than of the application — a menu bar item structurally has no URL, a link has no text selection.
Notes
Control Centre's six disabled extras remain excluded. They sit at
(0, 900)with zero size and are filtered on geometry, so naming unnamed extras after their app does not resurrect them.One approach was measured and rejected. Treating "advertises an
AXPressaction" as an interactivity signal looked like the general fix for notification banners, andINTERACTIVE_ACTIONSalready existed in the configuration unused. It added 118 nodes to a 95-node capture — 66AXGroup, 40AXStaticText, several named with icon-font glyphs — because Electron applications attach press actions to wrapper elements liberally. Matching on the specific subrole is surgical by comparison.Capture cost rises by roughly 4 ms for Notification Centre and 6.5 ms for the menu bar extras, partly offset by the phase-2 change. Both buy elements that are on screen and were previously unreachable.
The screenshot path is unchanged in this release.
Full Changelog: https://github.com/CursorTouch/MacOS-MCP/compare/v0.3.15...v0.3.16
- Menu bar extras owned by background applications. Apps owning a non-empty
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
Overview
macOS-MCP is a lightweight, open-source Model Context Protocol server that bridges AI agents and the macOS operating system. It enables seamless automation of macOS through LLMs via tasks such as file navigation, application control, UI interaction, browser automation, and system operations.
Supported Operating Systems
- macOS 12 (Monterey)
- macOS 13 (Ventura)
- macOS 14 (Sonoma)
- macOS 15 (Sequoia)
- macOS 26 (Tahoe)
Key Features
-
Works with Any LLM (Vision Optional)
Unlike traditional automation tools, macOS-MCP doesn't require computer vision, fine-tuned models, or specialized setup. Works seamlessly with any LLM—Claude, GPT, Gemini, or others. -
Native macOS Integration
Interacts natively with macOS UI elements using the Accessibility API. Opens apps, controls windows, simulates user input, and captures desktop state without workarounds. -
Rich Toolset for Automation
Complete toolkit for keyboard/mouse operations, window management, UI state capture, interactive element extraction from the accessibility tree, and AppleScript execution. -
Lightweight and Open-Source
Minimal dependencies with full source code available under MIT license. Easy setup and deployment. -
Smart Context Awareness
Automatically detects application state (Launchpad, Control Center, Spotlight). Scans menu bar, dock, desktop, and system UI elements intelligently. -
Customizable and Extensible
Easily extend with custom tools or modify behavior to suit your specific automation needs.
Installation
Prerequisites
- Python: 3.11 or later
- UV Package Manager: Install with
pip install uvorcurl -LsSf https://astral.sh/uv/install.sh | sh - macOS: 12 (Monterey) or later
- Accessibility Permissions: Required for UI element interaction
Quick Start
Run the server directly:
uvx macos-mcp serve
# Or with SSE/Streamable HTTP for network access
uvx macos-mcp serve --transport sse --host localhost --port 8000
uvx macos-mcp serve --transport streamable-http --host localhost --port 8000
Run it as a background service that starts now and at every login:
macos-mcp install
# Or choose the HTTP transport and bind address explicitly
macos-mcp install --transport sse --host 127.0.0.1 --port 8000
This installs a launchd Launch Agent at ~/Library/LaunchAgents/com.macos-mcp.server.plist.
Use macos-mcp uninstall to remove it. Logs are written to ~/.macos-mcp/server.log
and ~/.macos-mcp/server.error.log.
Transport Options
| Transport | Flag | Use Case |
|---|---|---|
stdio (default) | --transport stdio | Direct connection from MCP clients like Claude Desktop, Cursor, etc. |
sse | --transport sse --host HOST --port PORT | Network-accessible via Server-Sent Events |
streamable-http | --transport streamable-http --host HOST --port PORT | Network-accessible via HTTP streaming (recommended for production) |
Grant Required Permissions
macOS-MCP requires Accessibility and Screen Recording permissions to function properly.
Accessibility Permissions
- Open System Settings → Privacy & Security → Accessibility
- Click the lock icon and authenticate
- Add the following applications:
- Your terminal application (Terminal, iTerm2, VS Code, etc.)
- Python (typically
/usr/bin/python3or the Python version managed by UV) - UV (
~/.local/bin/uvif installed locally, or the Python environment UV manages)
- Restart the terminal after granting permissions
For uvx users: Grant permissions to your terminal application and Python, as uvx runs Python packages from UV's cache.
If the interpreter binary is greyed out / unselectable in the "+" picker (a known issue with UV-managed Python symlinks, e.g. .venv/bin/python3.12 → ~/.local/share/uv/python/...): don't try to add it manually. Instead, just start the server — since v0.3.10 it calls AXIsProcessTrustedWithOptions with the prompt option on startup, which asks macOS to show its native consent dialog and auto-register the running process for you. Approve that dialog and restart the server.
If you're launched as a subprocess by a parent that already holds Accessibility access (e.g. certain Claude Desktop configurations), and permission checks still fail spuriously, set MACOS_MCP_SKIP_PERMISSION_CHECK=1 to downgrade the check to a warning instead of exiting.
Screen Recording Permissions
The Snapshot tool requires Screen Recording permissions to capture screenshots:
- Open System Settings → Privacy & Security → Screen Recording
- Click the lock icon and authenticate
- Add the same applications as above (terminal, Python, UV)
- Restart the terminal after granting permissions
Note: If the Snapshot tool fails, verify both permissions are granted in System Settings.
Integration Options
-
Install Claude Desktop
-
Edit
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"macos-mcp": {
"command": "uvx",
"args": ["macos-mcp", "serve"]
}
}
}
- Restart Claude Desktop
Claude Desktop's claude_desktop_config.json only supports stdio-based server
entries. To connect to a running macOS-MCP HTTP server (e.g. one started with
macos-mcp install --transport streamable-http), use
mcp-remote as a stdio-to-HTTP
bridge.
This is especially useful when running multiple Claude Desktop instances
(e.g. via Parall) — a single persistent HTTP server
handles all of them, avoiding the overhead of spawning a separate macos-mcp
process per session.
1. Start the HTTP server (one-time setup):
macos-mcp install --transport streamable-http --host 127.0.0.1 --port 8000
2. Configure Claude Desktop to connect via mcp-remote:
{
"mcpServers": {
"macos-mcp": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://127.0.0.1:8000/mcp",
"--transport",
"http-only"
]
}
}
}
3. Restart Claude Desktop.
If you have multiple Claude Desktop instances (e.g. Parall clones), add the
same mcpServers entry to each instance's claude_desktop_config.json. All
instances will share the single background server.
A migration script is included for bulk reconfiguration — see
scripts/stdio-to-http-reconfig.sh.
With authentication (recommended when binding to 0.0.0.0):
# Start server with an auth key
macos-mcp install --transport streamable-http --host 0.0.0.0 --port 8000 \
--auth-key "your-secret-token"
{
"mcpServers": {
"macos-mcp": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://127.0.0.1:8000/mcp",
"--transport",
"http-only",
"--header",
"Authorization: Bearer your-secret-token"
]
}
}
}
- Install Gemini CLI:
npm install -g @google/gemini-cli
-
Navigate to
~/.geminiand opensettings.json -
Add the server config:
{
"theme": "Default",
"mcpServers": {
"macos-mcp": {
"command": "uvx",
"args": ["macos-mcp", "serve"]
}
}
}
- Restart Gemini CLI
-
Install Claude Code
-
Add to your project configuration or use the MCP marketplace integration
Pi does not ship with built-in MCP support, but macOS-MCP can be installed as a Pi package. The package starts this MCP server over stdio and exposes convenient Pi tools that wrap the existing macOS-MCP tools.
One-line global setup:
pi install git:github.com/CursorTouch/MacOS-MCP
After install, restart Pi or run:
/reload
Try without installing:
pi -e git:github.com/CursorTouch/MacOS-MCP
Local checkout setup:
git clone https://github.com/CursorTouch/MacOS-MCP.git
cd MacOS-MCP
uv sync
npm install
pi
If you copied only the extension into another Pi project, run Pi from the macOS-MCP checkout or set:
export MACOS_MCP_ROOT=/path/to/MacOS-MCP
The extension exposes these Pi tools:
| Pi Tool | Purpose |
|---|---|
mac_snapshot | Read current macOS UI state through the existing Snapshot tool. |
mac_app | Launch, switch, move, or resize macOS applications/windows. |
mac_click | Click coordinates returned by mac_snapshot. |
mac_type | Type text at coordinates returned by mac_snapshot. |
mac_shortcut | Run keyboard shortcuts such as command+c or command+space. |
mac_scroll | Scroll at the current pointer or coordinates. |
mac_wait | Wait for UI changes/loading. |
Recommended agent workflow:
- Call
mac_snapshotfirst. - Use the coordinates returned by Snapshot with
mac_click,mac_type, andmac_scroll. - Use screenshots/vision only when Accessibility data is missing or ambiguous.
The extension auto-detects the macOS-MCP checkout when installed as a Pi package. If you use a manually copied extension, set MACOS_MCP_ROOT=/path/to/MacOS-MCP.
Tau does not ship with built-in MCP support. This repo includes a project-local Tau extension at .tau/extensions/macos-mcp/ that starts the macOS-MCP server over stdio and exposes Tau-native tools that wrap the existing macOS-MCP tools.
Local checkout setup:
git clone https://github.com/CursorTouch/MacOS-MCP.git
cd MacOS-MCP
uv sync
tau
Tau auto-discovers project extensions under .tau/extensions/*/ when run from the checkout, and installs the extension's own dependencies (declared in manifest.json) automatically on first load. If Tau is already running, use /reload.
If you copied only the extension into another Tau project, run Tau from the macOS-MCP checkout or set:
export MACOS_MCP_ROOT=/path/to/MacOS-MCP
The extension exposes these Tau tools:
| Tau Tool | Purpose |
|---|---|
mac_snapshot | Read current macOS UI state through the existing Snapshot tool. |
mac_app | Launch, switch, or resize macOS applications/windows. |
mac_click | Click coordinates returned by mac_snapshot. |
mac_type | Type text at coordinates returned by mac_snapshot. |
mac_shortcut | Run keyboard shortcuts such as command+c or command+space. |
mac_scroll | Scroll at the current pointer or coordinates. |
mac_wait | Wait for UI changes/loading. |
Recommended agent workflow:
- Call
mac_snapshotfirst. - Use the coordinates returned by Snapshot with
mac_click,mac_type, andmac_scroll. - Use screenshots/vision only when Accessibility data is missing or ambiguous.
The extension auto-detects the macOS-MCP checkout. If you use a manually copied extension, set MACOS_MCP_ROOT=/path/to/MacOS-MCP.
Any client supporting the Model Context Protocol can integrate macOS-MCP by configuring the uvx macos-mcp serve command in their MCP server settings.
MCP Tools
macOS-MCP provides a comprehensive toolset for desktop automation:
| Tool | Purpose |
|---|---|
| Click | Click at coordinates with support for left, right, and double-click |
| Type | Type text at cursor position, optionally clearing existing text |
| Scroll | Scroll vertically or horizontally in focused window or regions |
| Move | Move mouse pointer or drag to coordinates |
| Shortcut | Press keyboard shortcuts (Cmd+C, Cmd+Tab, etc.) |
| App | Launch applications, manage windows (resize/move), switch between apps. Supports app names and bundle IDs |
| Desktop | Create a new Mission Control Space (virtual desktop) via Accessibility, verifying the space count increased |
| Shell | Execute commands or AppleScript. Use mode='osascript' for AppleScript |
| Scrape | Extract and convert webpage content to Markdown format |
| Wait | Pause execution for a defined duration |
Limitations
- Accessibility Requirements: Manual permission grant required in System Preferences
- App Compatibility: Some applications have limited or no Accessibility API support
- Performance Variance: Complex UIs with many elements may have slower traversal
- Text Input: Some specialized input fields may not properly receive keystrokes
- Authentication: Cannot interact with system authentication dialogs
Security & Access Control
Authentication
macos-mcp serve --transport sse --host 0.0.0.0 --auth-key "your_token"
Requires Authorization: Bearer your_token header on all requests.
IP Allowlist
macos-mcp serve --auth-key "token" --ip-allowlist "203.0.113.0/24,198.51.100.5"
Restricts connections to specified CIDR ranges.
TLS/HTTPS
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
macos-mcp serve --ssl-certfile cert.pem --ssl-keyfile key.pem
OAuth 2.0 + PKCE
For MCP clients that use OAuth (e.g. Claude Desktop) instead of a static API key:
macos-mcp serve --transport streamable-http --host 0.0.0.0 \
--ssl-certfile ~/.macos-mcp/cert.pem \
--ssl-keyfile ~/.macos-mcp/key.pem \
--oauth-client-id my-client \
--oauth-client-secret my-secret
Claude Desktop config (via mcp-remote bridge — see Integration Options):
{
"mcpServers": {
"macos-mcp": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://<host>:8000/mcp",
"--transport",
"http-only"
]
}
}
}
Note: Claude Desktop's
claude_desktop_config.jsondoes not support"type": "http"or"url"entries directly. Usemcp-remoteas shown above, or add the server via Settings → Connectors → Add custom connector in the Claude Desktop UI.
The OAuth server exposes:
GET /.well-known/oauth-authorization-server— server metadata (RFC 8414)GET /oauth/authorize— Authorization Code + PKCE (S256required)POST /oauth/token— token exchange (client secret required)POST /oauth/register— disabled; clients must be pre-provisioned
Dynamic client registration is disabled. Redirect URIs must be loopback http(s) only.
Auth key and OAuth can coexist — both are accepted as valid Bearer tokens.
SSRF Protection
The Scrape tool blocks: private IPs, loopback, link-local, credentials-in-URLs, non-HTTP schemes.
Config File (~/.macos-mcp/config.toml)
Instead of passing flags every time, store your configuration in ~/.macos-mcp/config.toml. CLI flags always override config file values.
Search order:
--config /path/to/config.toml~/.macos-mcp/config.toml
stdio — local only, no security needed:
[server]
transport = "stdio"
SSE — network access with auth and IP restriction:
[server]
transport = "sse"
host = "0.0.0.0"
port = 8000
auth_key = "your-secret-key"
[security]
ip_allowlist = ["192.168.1.0/24"]
Streamable HTTP — network access with auth and TLS (recommended for production):
[server]
transport = "streamable-http"
host = "0.0.0.0"
port = 8000
auth_key = "your-secret-key"
ssl_certfile = "cert.pem" # resolved relative to ~/.macos-mcp/
ssl_keyfile = "key.pem"
[security]
ip_allowlist = ["192.168.1.0/24"]
oauth_client_id = "my-client" # optional — enables OAuth 2.0 + PKCE
oauth_client_secret = "my-secret"
[tools]
exclude = ["Shell", "Scrape"] # disable specific tools
Available tool names: App, Shell, Snapshot, Click, Type, Scroll, Move, Shortcut, Wait, Scrape, Notification
Place your cert and key files in the same directory:
~/.macos-mcp/
├── config.toml
├── cert.pem
└── key.pem
Generate a self-signed cert directly into that directory:
mkdir -p ~/.macos-mcp
openssl req -x509 -newkey rsa:4096 \
-keyout ~/.macos-mcp/key.pem \
-out ~/.macos-mcp/cert.pem \
-days 365 -nodes
Environment Variables
All variables are optional. Set them via the env key in claude_desktop_config.json.
| Variable | Default | Description |
|---|---|---|
ANONYMIZED_TELEMETRY | true | Set to false to disable anonymous usage telemetry. No personal data, tool arguments, or outputs are ever collected. |
MACOS_MCP_AUTH_KEY | (none) | Bearer token required on all HTTP requests. Alternative to --auth-key CLI flag. |
MACOS_MCP_IP_ALLOWLIST | (none) | Comma-separated list of allowed client IPs or CIDR ranges. Alternative to --ip-allowlist CLI flag. |
MACOS_MCP_SSL_CERTFILE | (none) | Path to TLS certificate file (.pem). Must be provided with MACOS_MCP_SSL_KEYFILE. |
MACOS_MCP_SSL_KEYFILE | (none) | Path to TLS private key file (.pem). Must be provided with MACOS_MCP_SSL_CERTFILE. |
Example claude_desktop_config.json (remote with auth + TLS):
{
"mcpServers": {
"macos-mcp": {
"command": "uvx",
"args": ["macos-mcp", "serve", "--transport", "sse", "--host", "0.0.0.0"],
"env": {
"MACOS_MCP_AUTH_KEY": "your_token",
"MACOS_MCP_IP_ALLOWLIST": "203.0.113.0/24",
"MACOS_MCP_SSL_CERTFILE": "/path/to/cert.pem",
"MACOS_MCP_SSL_KEYFILE": "/path/to/key.pem"
}
}
}
}
Telemetry
macOS-MCP collects anonymous usage data to help improve the server. No personal information, tool arguments, or outputs are tracked.
To disable telemetry, set ANONYMIZED_TELEMETRY to false:
{
"mcpServers": {
"macos-mcp": {
"command": "uvx",
"args": ["macos-mcp", "serve"],
"env": { "ANONYMIZED_TELEMETRY": "false" }
}
}
}
Security
⚠️ Important Security Notice: macOS-MCP operates with full Accessibility API permissions and executes real system operations without sandboxing. It can perform permanent, irreversible actions.
Before using macOS-MCP:
- ✅ Grant Accessibility permissions only to trusted applications
- ✅ Understand that Shell commands execute with full user privileges
- ✅ Review AI-generated action plans before execution
- ✅ Use only in virtual machines or isolated environments with valueless data
- ✅ Create backups before testing in production-like scenarios
⛔ Do NOT use on:
- Systems with irreplaceable data
- Production machines or shared systems
- Compliance-regulated environments (HIPAA, PCI, etc.)
For detailed security guidance, see SECURITY.md.
Contributing
We welcome contributions! Please see CONTRIBUTING.md for:
- Development setup and code standards
- Testing requirements
- Pull request process
- Coding conventions (Ruff formatting, 100 char line length)
License
macOS-MCP is licensed under the MIT License - see LICENSE for details.
Acknowledgements
macOS-MCP is built with excellent open-source projects:
- PyObjC - Python to Objective-C bridge
- Pillow - Python Imaging Library
- FastMCP - MCP framework
- macOS Accessibility API (ApplicationServices)
Citation
If you use macOS-MCP in your research or project, please cite:
@software{macos-mcp,
author = {Jeomon George},
title = {macOS-MCP: Lightweight MCP Server for macOS Automation},
year = {2025},
publisher = {GitHub},
url = {https://github.com/Jeomon/macos-mcp}
}
Questions or Issues? Open an issue or check SECURITY.md for security concerns.