AXTerminator¶
Up to 30 MCP tools (19 core + optional audio, camera, spaces). Background interaction via the macOS Accessibility API. 379us per element access. Audio capture with native 48kHz speech recognition, camera input with gesture detection (88.8% thumbs_up verified), virtual desktop isolation. Your AI agent connects and your Mac becomes an extension of it.
Current version: 0.6.1 --- Rust binary is the primary interface; Python bindings available via PyPI.
Deploy¶
Rust Binary (Primary)¶
git clone https://github.com/MikkoParkkola/axterminator
cd axterminator
cargo build --release --features cli
Or install from crates.io:
Or via Homebrew:
Grant accessibility permissions: System Settings > Privacy & Security > Accessibility (add your terminal app).
Connect Your AI Agent¶
Add to MCP config (Claude Code, OpenCode, Cursor):
{
"mcpServers": {
"axterminator": {
"command": "/path/to/axterminator",
"args": ["mcp", "serve"]
}
}
}
Done. Your agent has 19 core tools (up to 30 with all feature flags) to control any macOS app.
Python Package (Secondary)¶
MCP Tools¶
| Category | Tools | What the agent can do |
|---|---|---|
| GUI | ax_connect, ax_find, ax_click, ax_click_at, ax_type, ax_set_value, ax_get_value, ax_scroll, ax_drag, ax_key_press |
Connect to apps, find elements, interact |
| Observe | ax_is_accessible, ax_screenshot, ax_get_tree, ax_get_attributes, ax_list_windows, ax_list_apps, ax_wait_idle |
Check permissions, see UI state, screenshots |
| Verify | ax_assert, ax_find_visual |
Assert element state, AI vision fallback |
| Audio | ax_listen, ax_speak, ax_audio_devices |
Capture mic/system audio (48kHz native), text-to-speech |
| Camera | ax_camera_capture, ax_gesture_detect, ax_gesture_listen |
Camera frames, gesture recognition |
| Spaces | ax_list_spaces, ax_create_space, ax_move_to_space, ax_switch_space, ax_destroy_space |
Virtual desktop isolation |
Resources¶
Agents can browse app state without tool calls:
| Resource | What |
|---|---|
axterminator://apps |
Running applications |
axterminator://app/{name}/tree |
Live element hierarchy |
axterminator://app/{name}/screenshot |
Current screenshot |
axterminator://app/{name}/state |
Focused element, window title |
axterminator://system/displays |
Monitor layout |
Security¶
Destructive actions require confirmation via elicitation. HTTP transport requires bearer token auth. The AI has hands, not root.
Feature Flags¶
Build with optional capabilities:
| Flag | What |
|---|---|
cli |
CLI + MCP server (default) |
audio |
Microphone/system audio, speech recognition (48kHz native capture) |
camera |
Camera capture, gesture detection (88.8% thumbs_up verified) |
watch |
Continuous background monitoring (implies audio + camera) |
spaces |
Virtual desktop management (CGSSpace private API) |
http-transport |
Streamable HTTP MCP transport with bearer token auth |
CLI¶
axterminator apps # List accessible apps
axterminator find "Save" --app Safari # Find element
axterminator click "Save" --app Safari # Click it
axterminator screenshot --app Safari # Capture screenshot
axterminator tree --app Finder # Element hierarchy
axterminator mcp serve --http 8080 --token secret # HTTP transport
Python API¶
import axterminator as ax
# Check accessibility permissions
if not ax.is_accessibility_enabled():
print("Enable accessibility in System Settings > Privacy & Security > Accessibility")
exit(1)
# Connect to app and interact (background mode by default)
app = ax.app(name="Calculator")
app.find("5").click()
app.find("+").click()
app.find("3").click()
app.find("=").click()
See API Reference for full Python docs.
How It Works¶
AXTerminator uses an undocumented behavior of Apple's Accessibility API: AXUIElementPerformAction() works on unfocused windows. Your agent clicks buttons in one app while you work in another. Neither notices.
379us per element access (Criterion, M1 MacBook Pro). Appium needs 500ms for the same thing.
7-strategy self-healing locators survive UI changes: data_testid, aria_label, identifier, title, xpath, position, visual_vlm.
Performance¶
Measured on Apple M1 MacBook Pro, macOS 14.2:
| Operation | Time |
|---|---|
| Single attribute read | ~54 us |
| Element access | ~379 us |
| Perform action | ~20 us |
| Find element (Python) | ~0.5-1 ms |
Known Limitations¶
| Operation | Background? | Notes |
|---|---|---|
| Click, press, read values, screenshots | Yes | Core operations work without focus |
| Text input | Partial | Some apps need focused text field |
| Drag, system dialogs | No | Require cursor control / always grab focus |
| Gesture recognition | Yes | Verified: thumbs_up at 88.8% confidence |
| Speech transcription | Yes | On-device, 48kHz native capture, requires Dictation enabled |
Release Channels¶
| Channel | Package |
|---|---|
| crates.io | axterminator |
| PyPI | axterminator |
| Homebrew | brew install MikkoParkkola/tap/axterminator |
| GitHub Releases | Binary assets |
License¶
MIT OR Apache-2.0