puppet-ai
Full computer control for AI agents on macOS — see, click, type, scroll via MCP. Works with any app, all processing on-device with PII protection.
README
puppet-ai
Full computer control for AI agents — see, click, type, scroll via MCP.
Give any AI agent eyes and hands. puppet-ai captures the screen, reads text via native OCR, detects UI elements, and controls mouse + keyboard. Works with any app on macOS — browsers, desktop apps, games, terminals.
Why puppet-ai?
- Fast — native macOS OCR in ~0.5s, 7x faster with caching
- Universal — works with ANY app, not just browsers
- Agent-agnostic — MCP standard, plug into any AI agent
- Secure — auto-masks API keys, passwords, credit cards, emails in OCR output
- Complete — 27 tools: vision + actions + system
- Private — all processing on-device, no data leaves your Mac
Quick Start
1. Install
pip install puppet-agent
2. Enable Accessibility
System Settings → Privacy & Security → Accessibility → enable your terminal/IDE app.
3. Connect to your AI agent
puppet-ai is an MCP server. Connect it to any MCP-compatible agent below, then ask the agent to interact with your computer.
Integrations
Claude Code
Add to ~/.claude/settings.json:
{
"mcpServers": {
"puppet-ai": {
"command": "puppet-ai",
"args": ["serve"]
}
}
}
OpenAI Codex CLI
Add to ~/.codex/config.toml:
[mcp_servers.puppet-ai]
command = "puppet-ai"
args = ["serve"]
Or via CLI:
codex mcp add puppet-ai -- puppet-ai serve
Google Gemini CLI
Add to ~/.gemini/settings.json:
{
"mcpServers": {
"puppet-ai": {
"command": "puppet-ai",
"args": ["serve"]
}
}
}
Verify: launch gemini and run /mcp to check connection.
Google Antigravity
Via MCP settings in Antigravity, or add to your project's .antigravity/settings.json:
{
"mcpServers": {
"puppet-ai": {
"command": "puppet-ai",
"args": ["serve"]
}
}
}
Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"puppet-ai": {
"command": "puppet-ai",
"args": ["serve"]
}
}
}
Or: Cursor Settings → Tools & MCP → Add Server.
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"puppet-ai": {
"command": "puppet-ai",
"args": ["serve"]
}
}
}
Cline (VS Code)
In VS Code, open Cline settings → MCP Servers → Add:
{
"puppet-ai": {
"command": "puppet-ai",
"args": ["serve"]
}
}
Zed
Add to Zed settings (~/.config/zed/settings.json):
{
"context_servers": {
"puppet-ai": {
"command": {
"path": "puppet-ai",
"args": ["serve"]
}
}
}
}
OpenClaw
Add to your agent's MCP config:
mcp_servers:
puppet-ai:
command: puppet-ai
args: [serve]
Any MCP Client
puppet-ai speaks MCP over stdio. Spawn it as a subprocess:
import subprocess
proc = subprocess.Popen(
["puppet-ai", "serve"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
# Communicate via MCP JSON-RPC over stdin/stdout
Works with any agent that supports the Model Context Protocol.
Detailed setup guides: integrations/
Tools
Vision (see the screen)
| Tool | Description |
|---|---|
vision_list_windows |
List all open windows (app, title, size) |
vision_read_window(app) |
Read text via OCR with bounding boxes for clicking |
vision_screenshot(app) |
Capture screenshot as base64 JPEG |
vision_get_state |
Full screen state: all windows + active window text |
vision_ui_elements(app) |
Get UI elements via Accessibility API (buttons, links, checkboxes) |
Actions (control the computer)
| Tool | Description |
|---|---|
action_click(x, y) |
Click at coordinates |
action_click_text(text, app) |
Find text on screen and click it — no coordinates needed |
action_click_and_wait(text, app) |
Click text, wait for screen to stabilize, return new state |
action_type_safe(text) |
Type text via clipboard paste (works with any keyboard layout) |
action_open_url(url) |
Open URL in browser (http/https only) |
action_scroll(amount, app) |
Scroll up/down in an app |
action_hotkey(keys) |
Keyboard shortcut (e.g. ["cmd", "c"]) |
action_press(key) |
Press a key (enter, tab, escape, etc.) |
action_drag(...) |
Drag and drop |
action_activate_window(app) |
Bring app to front |
action_clipboard_copy(text) |
Copy to clipboard |
action_clipboard_paste() |
Paste from clipboard |
System
| Tool | Description |
|---|---|
system_check_permissions |
Check accessibility access |
system_get_screen_size |
Screen dimensions |
system_get_mouse_position |
Current cursor position |
system_unmask(reason) |
Temporarily disable PII masking |
system_mask() |
Re-enable PII masking |
How It Works
AI Agent (Claude, Codex, Gemini, Cursor, Windsurf, ...)
↕ MCP protocol (stdio)
puppet-ai server
├── Vision: Apple Vision OCR + CGWindowList capture
├── Accessibility: AXUIElement tree (buttons, links, fields)
├── Actions: pyautogui (mouse, keyboard, scroll)
└── Security: PII regex filter (API keys, cards, passwords, emails)
The loop:
- Look —
vision_read_window("Safari")→ text + coordinates - Decide — agent plans next action
- Act —
action_click_text("Sign In")→ clicks center of text - Verify —
vision_read_windowagain → confirm it worked - Repeat
Features
Native macOS OCR
Uses Apple Vision Framework — no external API, no GPU needed, works offline. Supports Russian and English.
Per-Window Capture
Captures specific windows via CGWindowList without switching apps or stealing focus.
Smart Coordinates
OCR returns absolute screen coordinates with Retina scaling handled automatically.
OCR Cache
Repeated reads of unchanged windows are 7x faster. Cache auto-invalidates after any action.
PII Protection
Sensitive data is automatically masked in OCR output:
- API keys:
sk-1***ef - Credit cards:
4111***1111 - Emails:
user***com - Passwords in forms
- Crypto keys
Accessibility API
Detect interactive UI elements — buttons, checkboxes, links, text fields — with exact clickable coordinates.
Built-in Agent Instructions
The MCP server includes a system prompt that teaches agents how to use all 27 tools, macOS keyboard shortcuts, and the look-decide-act-verify loop.
Security
- All data stays on your Mac — no telemetry, no analytics, no external calls
- PII auto-masking — API keys, credit cards, emails, passwords masked before reaching the agent
- URL validation — only
http://andhttps://allowed,file://blocked - Input sanitization — app names validated to prevent injection
- Browser allowlist — only known browsers accepted (Chrome, Safari, Firefox, Arc, etc.)
- Failsafe — pyautogui failsafe enabled by default (move mouse to corner to abort)
Examples
import asyncio
from puppet_ai.core.capture import ScreenCapture
from puppet_ai.core.actions import DesktopActions
from puppet_ai.server.mcp import VisionPipeContext, create_all_tools
async def main():
ctx = VisionPipeContext(
capture=ScreenCapture(),
actions=DesktopActions(failsafe=True),
)
tools = create_all_tools(ctx)
# See what's on screen
windows = await tools["vision_list_windows"]()
for w in windows:
print(f"{w['app']:20s} — {w['title'][:50]}")
# Read a window
page = await tools["vision_read_window"](app="Safari")
print(page["text"][:500])
# Click text on screen
await tools["action_click_text"](text="Sign In", app="Safari")
# Open a URL
await tools["action_open_url"](url="https://example.com", browser="Safari")
asyncio.run(main())
More examples in examples/.
Configuration
# puppet-ai.yaml
ocr:
languages: ["en", "ru"]
mode: accurate # or "fast"
pii:
enabled: true
categories: [api_keys, credit_cards, crypto_keys, emails, passwords]
capture:
max_width: 800
format: jpeg
quality: 75
Presets:
puppet-ai serve --preset fast # speed over accuracy
puppet-ai serve --preset balanced # default
puppet-ai serve --preset quality # max accuracy
Known Limitations
- Safari —
type_textandCmd+Vdon't work reliably in web input fields. Safari restricts programmatic input and Accessibility API access for web content. Use Chrome for full browser automation. - Electron apps — some Electron apps (e.g. Dolphin Anty) block clipboard paste in input fields.
- Safari Accessibility — returns 0 UI elements for web page content. Native macOS apps and Chrome work fine.
For full browser automation, Chrome is recommended over Safari.
Requirements
- macOS 13+ (Ventura or later)
- Python 3.11+
- Accessibility permissions enabled
Author
Daniel Starkov
- Twitter: @retardTransoff
- LinkedIn: Daniel Starkov
License
MIT
推荐服务器
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 模型以安全和受控的方式获取实时的网络信息。