Skip to main content

cua-driver Python SDK

Rust-backed Python SDK and bundled executable for Cua Driver.

Product boundary

This package is for client applications importing Cua Driver as an SDK:

from cua_driver import CuaDriver

It does not contain a Python MCP protocol implementation. The optional cua_driver.fleet module forwards service bytes to the shared Rust typed-MCP client. See the candidate Fleet connection guide for prerequisites, ownership, and release limits. Agents already have runtime-neutral MCP clients and should configure the bundled server directly:

cua-driver mcp

The removed pre-release MCP facade used CuaDriver.stdio(), AsyncCuaDriver, *Args, and transport classes. Application code imports the typed Rust-backed SDK shown below; agent code supplies cua-driver mcp to its agent SDK.

Installation

Install and usage docs live at https://cua.ai/docs/how-to-guides/driver/install and https://cua.ai/docs/reference/cua-driver/mcp-tools.

The wheel contains generated UniFFI bindings, a platform-specific Rust SDK library, and the cua-driver executable. CuaDriver.create() loads the runtime in the importing process and does not require the executable or daemon.

SDK example

import asyncio

from cua_driver import (
    CuaDriver,
    CursorReducedMotion,
    EndSessionInput,
    GetDesktopStateInput,
    SetAgentCursorThemeInput,
    StartSessionInput,
)

async def main() -> None:
    driver = CuaDriver.create()
    await driver.start_session(
        StartSessionInput(session="demo", capture_scope=None, cursor_theme=None)
    )
    try:
        await driver.set_agent_cursor_theme(
            SetAgentCursorThemeInput(
                session="demo",
                theme_id="cua.default",
                reduced_motion=CursorReducedMotion.AUTO,
            )
        )
        desktop = await driver.get_desktop_state(
            GetDesktopStateInput(session="demo", screenshot_out_file=None)
        )
        print(desktop.images[0].mime_type)
    finally:
        await driver.end_session(EndSessionInput(session="demo"))
        await driver.shutdown()


asyncio.run(main())

SDK operations are asynchronous. Desktop observations return a typed ToolResult with text, images, verification/error metadata, and structured_json / raw_json for platform-extensible results. Session lifecycle calls return dedicated generated records.

start_session is optional for ordinary calls. The runtime creates one implicit session for this SDK transport and reuses it until shutdown, explicit end, or five minutes of inactivity. Use a named session when application code needs to configure or inspect that run explicitly.

The agent cursor is session-owned and initializes on the first cursor-bearing action, including move_cursor. Its default theme and custom dotLottie authoring workflow are documented in docs/cursor-themes.md. Custom source is compiled and installed with the local CLI; SDK and MCP tools select only an installed theme ID. The built-in cursor shows the sanitized public session name in a badge below the pointer.

Typed native-window migration

The next breaking release adds typed app and window discovery, window snapshots, and token-based clicks. Version 0.25 supports native-window operations through the generic tool surface; it does not expose this typed window API. Upgrade the bindings and native library together.

list_apps returns ListAppsOutput, list_windows returns ListWindowsOutput, and get_window_state returns WindowStateOutput. click takes a required exact target, a coordinate or element-token position, and an explicit delivery mode. It returns ActionResult directly and raises DriverError.Tool on refusal. Other action methods retain ToolResult.

Select a unique app and window, resolve an element from a fresh snapshot, request background delivery explicitly, then capture again to verify the intended UI change. An unsupported background route must not trigger an automatic foreground retry. Refresh stale tokens from the same exact window.

See the migration guide for input and return-type changes, and the complete Python and TypeScript examples for discovery, token selection, verification, and shutdown.

Authorization integrations

standard is promptless for normal automation. An application that needs to authorize attachment to an existing logged-in Chromium profile can construct a configured runtime with CuaDriver.create_configured_with_authorization_host(options, host). Implement DriverAuthorizationHost.authorize() in trusted application code and return the request's exact digest with ALLOW, DENY, or CANCEL.

CuaDriver.create_configured_with_activity_observer(options, observer) emits content-free action, refusal, grant, and session events. The observer cannot change authorization or tool results. Use create_configured_with_host_integrations when the application needs both.

See the SDK reference for complete examples and the callback trust rules.

CuaDriver.connect(socket_path) remains available while existing applications migrate. It exposes the same methods over the installed daemon, but it does not provide a second SDK contract.

shutdown() closes admission, waits for already admitted operations to finish, and is idempotent. Calls started after shutdown fail with DriverError.Shutdown. Destroying a binding handle releases native resources, but orderly applications should still await shutdown().

Daemon-backed MCP host

Applications that must also expose MCP to an external agent can own a private daemon child. The child provides a stable permission identity and session lifetime for short-lived or external clients:

import asyncio

from cua_driver import CuaDriver, EmbeddedCuaDriverHost, get_binary_path


async def main() -> None:
    host = EmbeddedCuaDriverHost(
        binary_path=str(get_binary_path()),
        host_bundle_id="com.example.your-app",
    )
    connection = await host.start()
    driver = CuaDriver.connect(connection.socket_path)
    try:
        # Application calls use driver. An agent runtime can launch
        # connection.mcp.command with connection.mcp.args and environment.
        print(await driver.metadata())
    finally:
        del driver
        await host.stop()


asyncio.run(main())

start() coalesces concurrent callers, stop() cancels startup and is idempotent, and restart() returns a new generation/PID/endpoint. Destroy SDK clients and MCP proxies before stopping or restarting, then reconnect from the new connection. wait_for_exit(connection.generation) observes unexpected termination. Dropping the host closes its parent-liveness pipe and kills the child as a fallback, but orderly applications should still await stop().

Binary wrapper

The package also exposes the bundled executable:

from cua_driver import get_binary_path, run_cua_driver

print(get_binary_path())
exit_code = run_cua_driver(["mcp"])

Platform support

Platform Architecture Status
macOS 13+ Universal (ARM64 + x86_64) Supported
Linux x86_64 Supported
Windows x86_64 Supported
Windows ARM64 Supported

License

MIT License — see LICENSE.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

cua_driver-0.27.0-py3-none-win_arm64.whl (24.5 MB view details)

Uploaded Python 3Windows ARM64

cua_driver-0.27.0-py3-none-win_amd64.whl (26.2 MB view details)

Uploaded Python 3Windows x86-64

cua_driver-0.27.0-py3-none-manylinux_2_31_x86_64.whl (28.6 MB view details)

Uploaded Python 3manylinux: glibc 2.31+ x86-64

cua_driver-0.27.0-py3-none-manylinux_2_31_aarch64.whl (28.8 MB view details)

Uploaded Python 3manylinux: glibc 2.31+ ARM64

cua_driver-0.27.0-py3-none-macosx_13_0_universal2.whl (40.2 MB view details)

Uploaded Python 3macOS 13.0+ universal2 (ARM64, x86-64)

File details

Details for the file cua_driver-0.27.0-py3-none-win_arm64.whl.

File metadata

  • Download URL: cua_driver-0.27.0-py3-none-win_arm64.whl
  • Upload date:
  • Size: 24.5 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for cua_driver-0.27.0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 aea1a51e9dbd293912009ba0e32ea27231690c84ad5dbaadc6f061b944b20630
MD5 43a913cbd749a9b5285af264c59bf11e
BLAKE2b-256 25406188588e951a489f061886a4132f7c8fe772557ed7268f8d4cca29b4e556

See more details on using hashes here.

File details

Details for the file cua_driver-0.27.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: cua_driver-0.27.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 26.2 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for cua_driver-0.27.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 d4c34098f23eb3bc50592b0d6f1b449d3e884f4ecc07fa7095d006b8a801e646
MD5 5e2fe6e941fb4925225a742bd9410e81
BLAKE2b-256 ea355ef6ea10b18b07c552d487962bbc5c42ccc3609741299e83be08a9c779d4

See more details on using hashes here.

File details

Details for the file cua_driver-0.27.0-py3-none-manylinux_2_31_x86_64.whl.

File metadata

File hashes

Hashes for cua_driver-0.27.0-py3-none-manylinux_2_31_x86_64.whl
Algorithm Hash digest
SHA256 d716791555881544aa71ba7062bd79883b06cbc6a862db9ee3748964385afc3a
MD5 42bdd750f42504b1e20f5587d0b586ef
BLAKE2b-256 41e258667850662489ad3225c44145c229a8b0a6b4c832c25b71eccfdb8a7568

See more details on using hashes here.

File details

Details for the file cua_driver-0.27.0-py3-none-manylinux_2_31_aarch64.whl.

File metadata

File hashes

Hashes for cua_driver-0.27.0-py3-none-manylinux_2_31_aarch64.whl
Algorithm Hash digest
SHA256 eadc58d6865baee512f3e516fe6f94c516946b1ced8a7e6275552748a74d30b0
MD5 711267b7ceb1f65a3d31d12baa77b3ef
BLAKE2b-256 64a2bba9e02dc5c95758c2f01b072f46dbb3e7e521f60a421d65464810236a4c

See more details on using hashes here.

File details

Details for the file cua_driver-0.27.0-py3-none-macosx_13_0_universal2.whl.

File metadata

File hashes

Hashes for cua_driver-0.27.0-py3-none-macosx_13_0_universal2.whl
Algorithm Hash digest
SHA256 7f1e2ee3c399283e2a9547ca24905fbcba45cb8d8be796f3c443e7766529aedd
MD5 85f1ad02e29e7a59e53fecf79907c32e
BLAKE2b-256 0377649d5df6d4d18cd1d38f48f7f3a9dc2d57c15b5fcec95bbf0cf04c29473f

See more details on using hashes here.

Release history Release notifications | RSS feed

0.28.1

5 files

0.28.0

5 files

This release

0.27.0 This release

5 files

0.26.1

5 files

0.26.0

5 files

0.25.0

5 files

0.24.0

5 files

0.23.2

5 files

0.22.2

5 files

0.22.1

5 files

0.22.0

5 files

0.21.0

5 files

0.20.0

5 files

0.19.3

5 files

0.19.2

5 files

0.19.1

5 files

0.19.0

5 files

0.18.0

5 files

0.17.0

5 files

0.16.0

5 files

0.14.2

5 files

0.14.1

5 files

0.14.0

5 files

0.13.1

5 files

0.13.0

5 files

0.12.5

5 files

0.12.4

5 files

0.12.3

5 files

0.12.2

5 files

0.11.0

5 files

0.10.0

5 files

0.9.1

5 files

0.9.0

5 files

0.8.3

5 files

0.8.2

5 files

0.8.1

5 files

0.8.0

5 files

0.7.1

5 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page