Playwright MCP for macOS
Enables Claude to see and interact with any macOS application using natural language commands. Perfect for testing Mac applications, UI automation, and app development with AI assistance.
README
Playwright MCP for macOS 🎭
Like Playwright, but for native macOS applications. Control any Mac app with natural language through Claude - perfect for developing and testing Mac applications with AI assistance.
🎯 What is this?
This is an MCP (Model Context Protocol) server that gives Claude the ability to see and interact with any macOS application - just like Playwright does for web browsers, but for native Mac apps.
Perfect for:
- 🧪 Testing Mac applications - "Test the login flow in my app"
- 🔍 App development - "Check if all buttons are properly labeled"
- 🤖 UI automation - "Fill out this form and submit it"
- 📱 App exploration - "Show me all the interactive elements in Finder"
🚀 Quick Start
1. Install
git clone https://github.com/mb-dev/macos-ui-automation-mcp.git
cd macos-ui-automation-mcp
uv sync
2. Set Up Accessibility Permissions
⚠️ Critical: Enable accessibility for your parent application:
- If using Terminal: Add Terminal to
System Settings → Privacy & Security → Accessibility - If using VS Code: Add VS Code to
System Settings → Privacy & Security → Accessibility - If using Claude Code: Add Claude Code to
System Settings → Privacy & Security → Accessibility
The parent app needs permission because it's the one actually executing the MCP server.
3. Configure Claude Code
Add to your Claude Code MCP settings:
{
"mcpServers": {
"macos-ui-automation": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/macos-ui-automation-mcp",
"run",
"macos-ui-automation-mcp"
]
}
}
}
4. Start Automating!
Now you can ask Claude things like:
- "Find all buttons in the Calculator app"
- "Click the submit button in my app"
- "Click the screenshot button to capture the current window"
- "Test the login flow by filling in credentials and clicking submit"
🛠 Available Tools
| Tool | Description | Use Case |
|---|---|---|
find_elements |
Find UI elements using JSONPath | "Show me all text fields" |
find_elements_in_app |
Search within a specific app | "Find buttons in Safari" |
click_by_accessibility_id |
Click using accessibility actions | "Click the submit button" |
click_at_position |
Click at screen coordinates | "Click at position (100, 200)" |
type_text_to_element_by_selector |
Type text into elements | "Type 'hello' into the search field" |
get_app_overview |
Overview of running applications | "What apps are currently running?" |
list_running_applications |
List all running apps | "Show me all open applications" |
check_accessibility_permissions |
Verify setup is correct | "Is accessibility properly configured?" |
🔍 JSONPath Examples
Find elements using powerful JSONPath queries:
# All buttons in any app
$..[?(@.role=='AXButton')]
# Buttons with specific text
$..[?(@.title=='Submit')]
# All text fields that are enabled
$..[?(@.role=='AXTextField' && @.enabled==true)]
# Elements with accessibility identifiers
$..[?(@.ax_identifier=='loginButton')]
# Elements in a specific app
$.processes[?(@.name=='Calculator')]..[?(@.role=='AXButton')]
🧪 Perfect for App Testing
This tool shines when developing and testing Mac applications:
Test Automation
"Test my login flow:
1. Find the username field and type 'testuser'
2. Find the password field and type 'password123'
3. Click the login button
4. Verify a success message appears"
UI Validation
"Check my settings window:
- Are all buttons properly labeled?
- Are there any text fields without accessibility identifiers?
- Click the screenshot button to capture the current state"
Accessibility Auditing
"Audit my app for accessibility:
- Find all interactive elements without accessibility labels
- Check if keyboard navigation works properly
- Identify any elements that might be hard to use"
📸 Adding Screenshots to Your App
We don't provide built-in screenshot functionality, but you can easily add it to your Mac app! Check out our complete Swift implementation example based on a real-world app.
Key points:
- Uses
ScreenCaptureKit(macOS 14+) for high-quality captures - Automatically finds your app window
- Saves timestamped screenshots to Documents/Screenshots
- Integrates perfectly with this MCP - just add an accessibility identifier!
Usage with Playwright MCP:
"Click the screenshot button to capture the current window"
The MCP will find your button by accessibility ID and trigger the screenshot!
📦 Development Setup
For contributors and advanced users:
# Clone and install
git clone https://github.com/mb-dev/macos-ui-automation-mcp.git
cd macos-ui-automation-mcp
uv sync --dev
# Run tests
uv run python -m pytest tests/ -v
# Check code quality
uv run ruff check src/ tests/ mcp_server_wrapper.py
uv run ruff format
# Test the MCP server
uv run macos-ui-automation-mcp
🤝 Contributing & Bug Reports
I have limited time to fix issues, so here's the deal:
-
🐛 Found a bug? File an issue, but please include:
- Your macOS version
- Steps to reproduce
- What you expected vs what happened
-
🛠 Want it fixed faster? The best way is to:
- Fork the repo
- Write a failing test that reproduces the bug
- Fix the bug
- Submit a PR
-
✨ Want a feature? Same deal - code it up and submit a PR!
I'm happy to review PRs and provide guidance, but I can't promise quick fixes for reported issues. The codebase is well-tested and documented, so dive in! 🚀
🔧 Architecture
Built with:
- FastMCP - MCP server framework
- PyObjC - macOS accessibility API bindings
- Pydantic - Type-safe data models
- JSONPath - Powerful element querying
- Comprehensive test suite - Fake system for testing without real UI
⚠️ Important Notes
Accessibility Permissions
- Must be granted to the parent application (Terminal, VS Code, etc.)
- Not to Python or the MCP server itself
- Required for any UI automation on macOS
Screenshot Permissions
- If your app has screenshot functionality, it needs Screen Recording permission
- Add your app to
System Settings → Privacy & Security → Screen Recording - This is separate from accessibility permissions
Performance Tips
- Use app-specific searches when possible (
find_elements_in_app) - Shallow searches are faster for overviews
- Deep searches are thorough but slower
Limitations
- Requires accessibility API access (some apps restrict this)
- Works best with native macOS applications
- Some system-level elements may not be accessible
📄 License
MIT License - feel free to use this in your projects!
🎭 Why "Playwright for Mac"?
Just like Playwright revolutionized web testing by providing a simple API to control browsers, this tool does the same for native macOS applications. Instead of writing complex GUI automation scripts, just tell Claude what you want to test or automate in natural language.
Perfect for the age of AI-assisted development! 🤖
Need help? Check the examples/ folder or open an issue. Better yet, submit a PR! 😄
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。