Exo Control
Realtime PC eyes and hands for any AI agent
Any model · MCP · CLI · Python
Compact. Leased. Honest.
Install · Harness · Safety · Exo Launcher
Exo Control is a Windows Python library that gives any AI eyes and hands on the desktop. Same ops over MCP, CLI, or Python. Not an app and not a Setup.exe — install with pip.
| How the AI talks | Entry |
|---|---|
| MCP | exo_exec · exo_screenshot · exo_help |
| CLI | exo-control exec · exo-control script · exo-control doctor |
| Python | from exo_control import ExoExecEngine |
Works with Exo Launcher when it is installed. Not required.
Install
pip install exo-control
exo-control doctor
Optional extras:
pip install "exo-control[browser]" # Playwright CDP
playwright install chromium
pip install "exo-control[web]" # Browser Use web expert (optional)
Pin: pip install "exo-control==2.4.0" or pip install "git+https://github.com/ImAvgErix/ExoControl.git@v2.4.0".
State lives under ~/.exo/. Legacy ~/.aether/ is migrated automatically.
MCP
{
"mcpServers": {
"exo-control": {
"command": "python",
"args": ["-m", "exo_control.slim_mcp_server"]
}
}
}
aether_* tools register only when EXO_MCP_ALIASES=1. Prefer exo_*.
Do not set PYTHONPATH at a second tree. exo-control doctor reports shadowing.
Quick script
exo-control script examples/notepad.json
from exo_control import ExoExecEngine
ExoExecEngine().execute({
"steps": [
{"op": "lease_acquire", "agent_id": "demo", "task": "notepad", "ttl_sec": 90},
{"op": "launch", "app": "notepad"},
{"op": "type", "text": "hello from Exo Control"},
{"op": "verify", "text": "hello from Exo Control"},
],
"finally": [
{"op": "window_close", "title": "Notepad", "discard_unsaved": True},
{"op": "lease_release"},
],
})
Failed steps do not attach screenshots unless screenshot_on_fail: true. Use {"op":"last_error"}. Harness install is in docs/HARNESS.md.
What it can do
| Surface | Ops |
|---|---|
| Desktop | UIA click/type/fill, aimed wheel + scroll_into_view + hover, live eyes, lease, multi-monitor |
| Browser | CDP snapshot refs, DOM click/type, page scrollBy / scrollIntoView |
| OS | Allowrooted files, HKCU registry, processes/services, fuzzy launch |
| Search | Lease-free search (provider=perplexity|tavily|exa|ddg|serper|brave) + search_content |
| Cloud browser | Browser Use browser_use / browser_use_start (BROWSER_USE_API_KEY) |
| Web extract | scrape (provider=firecrawl|jina); crawl / site_map; Stagehand browser_act; Skyvern; AgentQL |
| Docs / find | files_convert (engine=markitdown|docling), files_find (Everything or walk) |
| Memory / history | memory_add / memory_search (local or Mem0); recall (Screenpipe) |
| Mail / calendar | mail_list / cal_next / drive_get / todo / onenote / teams / mail_send (Graph or Composio) |
| Desk extras | xlsx, git, gh_pr, volume, winget, recycle, eventlog, window_move, browser_network / pdf / tabs |
| Wave 2 | rag / steel_start / slack / notion / linear / pwsh / docker / hash / whoami / disk |
| Waves 3–5 | Graph writes, CDP extras, wiki/weather/hn, Jira/Discord/Airtable, zip/sqlite/tree, which/dns/lock_pc |
| Pilot | Original layer: goal / checkpoint / proof / changed / undo / skill_save / skill_run / heal |
| Ready | Honest ready map — what works here vs Windows-native vs needs a key |
| Windows natives | Stock volume/lock/wifi/power/recycle/TTS/dialog/dark_mode/idle/ports/Defender (no extra pip) |
| Live seat | session_open holds the desk like remote access; pointer / mouse / keypress / drive are raw HID |
Key-gated rows fail closed; {"op":"ready"} is the map; stt is a stub.
| Desktop | UIA click/type/fill, right/double click, menu, copy/paste, aimed wheel + scroll_into_view + hover, live eyes, find, lease, multi-monitor, window move/resize/snap |
| Browser | CDP snapshot refs, DOM click/type, page scroll, tabs/back/extract; web_task for multi-step jobs |
| OS | Allowrooted files (+ hash/zip/watch/reveal), HKCU registry, processes/services, drives, os_info, audio/power/idle, wifi, recycle, winget, ms-settings: |
| Session | Persistent prefs, plan, checkpoint, recover |
{"op":"help"} lists the core ops. detail=true is the full catalog. find searches the last read. pc is the owner snapshot (volume, power, idle, wifi). exo-control pc from a shell.
Safety
-
One desktop lease;
lease_status/session_statusnever return the token -
Destructive OS ops need
confirm=true(agent assertion, not a human prompt) unless Full-Trust is on -
Files stay in
EXO_FILE_ROOTSunless the operator setsEXO_ALLOW_OUTSIDE_ROOTS=1(Full-Trust widens user-profile roots only) -
Hard denies in default/trusted: anti-cheat, unnamed PID kill, critical services, HKLM write, Windows/System32 writes, non-loopback CDP
-
Full-Trust owner mode lifts those denials and auto-elevates privileged ops through a broker (MCP stays medium IL). First admin op may UAC once.
-
Human kill-switch: create
~/.exo/KILLorexo-control trust kill— agents cannot disarm it
Full-Trust (“this is my PC”)
Default install stays safe. Full-Trust is explicit and reversible:
exo-control trust enable --ack "I own this PC"(one-time human ack + audit log)- Set
EXO_TRUST=full(orEXO_FULL_TRUST=1) on the MCP/CLI process and restart it exo-control trust statusshould show"level": "full"
While Full-Trust is on, confirms are optional, the disk is in play, and privileged OS ops (HKLM, Program Files, services, anti-cheat) go through an elevated broker. The desktop MCP stays unelevated so clicks still work. One UAC to install the broker; after that it starts with the logon task.
exo-control elevate status
exo-control elevate install
Create ~/.exo/KILL to freeze hands immediately. That file is the only remaining agent-proof stop.
Docs
| Doc | Role |
|---|---|
| docs/HARNESS.md | Host install matrix |
| docs/LIVE-MODEL.md | Lease / eyes / hands |
| docs/CAPABILITY.md | Capability bar |
| CHANGELOG.md | Version history |
License
MIT
Release files for exo-control 2.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| exo_control-2.5.0.tar.gz | 308.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| exo_control-2.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 611.4 kB
Release files / exo_control-2.5.0.tar.gz
| Download URL | exo_control-2.5.0.tar.gz |
|---|---|
| Size | 308.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ae2c199c911a0ba86d184033e336553de750a01f3af329b2cdd53a1f4c260869
|
|
BLAKE2b-256 checksum How to use checksums |
51ac90cb28d75cd158f88994e76e59b2233f35a43396ccfbb6382494028ae5f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency logRelease files / exo_control-2.5.0-py3-none-any.whl
| Download URL | exo_control-2.5.0-py3-none-any.whl |
|---|---|
| Size | 303.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
baa2189a13c8573758af8ccabb9e34075ac2bfdb4424a50287f13e2a10a5c634
|
|
BLAKE2b-256 checksum How to use checksums |
05e1b1e41de641125f8119468c2edd35abca6ee2f15f0d0465332d9a26548a10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency log