macOS GUI testing framework with background testing, sub-millisecond element access, and self-healing locators
Reason this release was yanked:
Deprecated. Use: cargo install axterminator --features cli
Project description
AXTerminator
MCP server that gives AI agents the ability to see and control macOS applications.
Deploy · MCP Tools · CLI · Wiki · Known Limitations
Up to 30 MCP tools (19 core + optional audio, camera, spaces). Background interaction via the macOS Accessibility API. 379us per element access. Audio capture, camera input, virtual desktop isolation. Your AI agent connects and your Mac becomes an extension of it.
Deploy
git clone https://github.com/MikkoParkkola/axterminator
cd axterminator
cargo build --release --features cli
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.
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, 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.
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
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.
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 | Verified: on-device, requires Dictation enabled |
Feature Flags
Build with optional capabilities:
cargo build --release --features "cli,audio,camera,spaces"
| Flag | What |
|---|---|
cli |
CLI + MCP server (default) |
audio |
Microphone/system audio, speech |
camera |
Camera capture, gesture detection |
spaces |
Virtual desktop management |
http-transport |
HTTP MCP transport with auth |
Python API
Also available as a Python package for test scripts and pytest:
pip install axterminator
import axterminator as ax
app = ax.app(name="Calculator")
app.find("7").click()
app.find("+").click()
app.find("3").click()
app.find("=").click()
See API Reference for full Python docs.
Community
- Wiki -- Full documentation
- Discussions -- Questions, ideas, show-and-tell
- Issues -- Bugs
Acknowledgements
Inspired by Terminator by mediar-ai, which pioneered accessible desktop GUI automation on Windows.
License
MIT OR Apache-2.0
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file axterminator-0.6.1-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: axterminator-0.6.1-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 427.8 kB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80e2087c3b721cfef52550df8416d6fa3b3e8accf8a69433c897fdfada186bfa
|
|
| MD5 |
70c9fc43f224b2acff6fe3a3fda2afe8
|
|
| BLAKE2b-256 |
0dad7fa4c600563f5c077eabfad72382fc6f39a0d0f1f3a35a2795ae41971351
|
Provenance
The following attestation bundles were made for axterminator-0.6.1-cp39-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on MikkoParkkola/axterminator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
axterminator-0.6.1-cp39-abi3-macosx_11_0_arm64.whl -
Subject digest:
80e2087c3b721cfef52550df8416d6fa3b3e8accf8a69433c897fdfada186bfa - Sigstore transparency entry: 1148025868
- Sigstore integration time:
-
Permalink:
MikkoParkkola/axterminator@d59d7d3e3303c8b486705091f452ccc5d55d87a5 -
Branch / Tag:
refs/tags/v0.6.1 - Owner: https://github.com/MikkoParkkola
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d59d7d3e3303c8b486705091f452ccc5d55d87a5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file axterminator-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: axterminator-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 443.0 kB
- Tags: CPython 3.9+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d8c7f554130b260c0aff8c3a68679d88356ccc8aab9e7552d33f13e8785561d
|
|
| MD5 |
06d82975739b7c531fc391ca0cd4fcf0
|
|
| BLAKE2b-256 |
abeabc1df1fde4ccd0460cf94ecda65ecd03d2a02bf5a9ed861d4ca827722bad
|
Provenance
The following attestation bundles were made for axterminator-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl:
Publisher:
release.yml on MikkoParkkola/axterminator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
axterminator-0.6.1-cp39-abi3-macosx_10_12_x86_64.whl -
Subject digest:
1d8c7f554130b260c0aff8c3a68679d88356ccc8aab9e7552d33f13e8785561d - Sigstore transparency entry: 1148025773
- Sigstore integration time:
-
Permalink:
MikkoParkkola/axterminator@d59d7d3e3303c8b486705091f452ccc5d55d87a5 -
Branch / Tag:
refs/tags/v0.6.1 - Owner: https://github.com/MikkoParkkola
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d59d7d3e3303c8b486705091f452ccc5d55d87a5 -
Trigger Event:
push
-
Statement type: