Coronium Mobile Proxies
Agent setup guide

Cua Agents with a Mobile Proxy

Send what a Cua sandbox fetches out through a dedicated Coronium line, and let the agent rotate that line between tasks.

Cua is an open-source platform for computer-use agents: models that work a real desktop by clicking, typing and reading the screen. Its sandboxes run on your own machine or cloud account, so by default every page they open sees that machine's address.

Checked against the Cua documentation on 30 October 2026. Sources are listed at the end.

sandbox_line.py
import asyncio, os, shlex
from cua_sandbox import Image, Sandbox

line = "http://{}:{}@{}:{}".format(
    os.environ["CORONIUM_PROXY_USER"], os.environ["CORONIUM_PROXY_PASS"],
    os.environ["CORONIUM_PROXY_HOST"], os.environ["CORONIUM_HTTP_PORT"],
)

async def main():
    async with Sandbox.ephemeral(Image.linux(), local=True) as sb:
        # The variable and the command go in one call: an export does not persist.
        result = await sb.shell.run(f"HTTPS_PROXY={shlex.quote(line)} curl -s https://api.ipify.org")
        print(result.stdout)

asyncio.run(main())

Before you start

  • The current Cua packages

    Cua now ships the cua SDK and CLI and cua-sandbox. Its README lists the older cua-agent, cua-computer and cua-computer-server packages as deprecated and no longer maintained, so skip guides built on them.

  • Python 3.11 and a container engine

    Cua's quickstart needs Python 3.11 or newer and Docker, Podman or Colima for local sandboxes. cua runtime doctor checks the host and cua runtime setup installs what is missing.

  • A line and an API token

    The line's Connection IP, HTTP Port, Username and Password for the traffic, and an API token from dashboard.coronium.io, Account, API Access for the MCP tools.

What the agent gets

The Coronium MCP server is coronium-proxy-mcp on npm. The environment variable CORONIUM_TOOL_PROFILE decides which tools exist inside Cua. Counts below were read with tools/list on the current release.

directory
Tools: 21
Money tools: None
An agent that checks, tests and rotates lines you already rent. The hosted server runs this profile.
read-only
Tools: 31
Money tools: None
Reporting: balances, lines, usage, payments and tickets, with nothing that changes state.
buyer
Tools: 12, or 13 with CORONIUM_ENABLE_SPENDING=1
Money tools: Buy only, and only with spending on
An agent that quotes, buys and runs a few lines after you approve each total.
full
Tools: 59, plus 6 money tools with spending on
Money tools: Buy, renew, top up and cancel, only with spending on
Everything else: settings, webhooks, rotation timers and Node tools. The server default when the profile is unset.

Start with directory. Its tools include coronium_list_free_modems, coronium_list_tariffs, coronium_get_proxies, coronium_test_modem, coronium_rotate_modem, coronium_get_rotation_status, coronium_replace_modem and coronium_get_renewal_quote. Names can change between releases, so let the agent read them from tools/list rather than from this page.

Wire Cua to a Coronium line

Two halves: the agent gets MCP tools for Cua and for Coronium, and the sandbox gets the line's details at run time.

  1. Install the SDK and check the host

    Install with pip install cua-sandbox, then run cua runtime doctor and, if it reports gaps, cua runtime setup.

    Terminal
    pip install cua-sandbox
    cua runtime doctor
    cua runtime setup

    Checked against Cua SDK: Quickstart

  2. Give your coding agent the cua MCP server

    cua connect setup installs the Cua skills and adds the cua MCP server to every agent it finds, for example Claude Code, Codex and Cursor. Restart the agent afterwards.

    Terminal
    cua connect setup --agents claude,codex,cursor -y

    Checked against Cua SDK: Control the desktop and the browser

  3. Add the Coronium server next to it

    The cua server drives the sandbox; the Coronium server manages the line. Use the directory profile, which cannot spend. Clients that support remote MCP with OAuth can use https://api.coronium.io/mcp instead.

    Claude Code
    claude mcp add coronium -e CORONIUM_API_TOKEN=YOUR_CORONIUM_API_TOKEN -e CORONIUM_TOOL_PROFILE=directory -- npx -y coronium-proxy-mcp@2.3.0
  4. Keep the line's details on the host

    Cua's guidance for secrets is to read them on the host and hand them to one process in the sandbox at run time, never in an image spec. Export the line once in the shell that runs your script.

    Terminal, on the host
    export CORONIUM_PROXY_HOST="CONNECTION_IP"
    export CORONIUM_HTTP_PORT="HTTP_PORT"
    export CORONIUM_SOCKS_PORT="SOCKS5_PORT"
    export CORONIUM_PROXY_USER="USERNAME"
    export CORONIUM_PROXY_PASS="PASSWORD"

    Checked against Cua SDK: Run services, sidecars and secrets

  5. Run sandbox commands through the line

    Put the proxy variable and the command in the same shell.run() call, as in the script at the top of this page. Cua notes that an export does not carry into the next call, and shlex.quote() keeps the password intact.

    Checked against Cua SDK: Run services, sidecars and secrets

  6. Point the sandbox browser at the line

    cua sb create --browser starts Chromium with a throwaway profile, and Cua's docs show no proxy option for it. Open a shell with cua sb shell, start a second Chromium with --proxy-server=http://CONNECTION_IP:HTTP_PORT and its own --user-data-dir, and enter the line's username and password when it asks. cua sb view shows the desktop so you can do that step.

    Checked against Cua SDK: Control the desktop and the browser

First tasks to try

Ask in plain words. The agent picks the tools; the names below are what it should call, so you can tell from its log whether it did.

  1. โ€œWhich countries have Coronium lines in stock right now, and what does 24 hours cost in each?โ€

    Calls coronium_list_free_modems then coronium_list_tariffs. Reads live stock and plans. Nothing is bought.

  2. โ€œShow my Coronium lines with their country, carrier, expiry and SOCKS5 URL.โ€

    Calls coronium_get_proxies. Returns credentials. Treat the answer as a secret and keep it out of shared chats.

  3. โ€œRotate my line called <name> and tell me the new IP once the rotation has finished.โ€

    Calls coronium_rotate_modem then coronium_get_rotation_status. A rotation answers done, rotating (poll the status, do not resubmit) or unchanged (the carrier kept the IP; wait about 60 seconds).

One task, one address

Cua sandboxes are cheap to throw away, and that pairs well with rotation. Finish a task, let the agent rotate the line with coronium_rotate_modem, wait for coronium_get_rotation_status, and start the next task in a new sandbox. Nothing from the last session follows it to the new address.

Do not rotate in the middle of a desktop session that is signed in somewhere. Leave at least 60 seconds between rotations, and give parallel sandboxes their own lines rather than one line they all rotate.

Money tools stay off

Cua has no access to your Coronium balance. The Coronium server could reach it only after you switch its profile and turn spending on.

  • Money tools appear only when CORONIUM_ENABLE_SPENDING=1 is set in the host environment and the profile is buyer (buy only) or full. A .env file in the working directory cannot turn it on.
  • Every money call needs confirm: true, a new idempotency key for each approved order, an explicit funding source and the exact approved total; any other live total is refused with price_changed.
  • The server spends money already on the account. It has no way to add funds; a person does that in the dashboard.

Secrets in sandboxes

Cua warns that commands which carry secret values can end up in logs, and that quoting does not redact them. Keep the proxy password out of anything you log or share, and prefer a line per sandbox so one leaked log exposes one line.

Another route keeps the password out of the sandbox entirely: drive a browser on the host with Playwright MCP, which reads the line from its config file, and use Cua for the desktop work.

  • Create the API token in dashboard.coronium.io, Account, API Access and keep it in the host's config, never in a chat or a repository. Regenerating it in the dashboard revokes the old one.
  • Give each agent its own line. Two agents on one line rotate each other's IP in the middle of a task.
  • The answer to coronium_get_proxies contains proxy passwords. Treat it, the Reset Link and any OpenVPN profile as secrets.
  • coronium_replace_modem is irreversible: the line gets a new device, new credentials and possibly a new carrier. Filter it out if the agent should never do that on its own.

Check it worked

Run the script above first: it prints the address the sandbox leaves from. Then open these pages in the sandbox browser you started with the proxy flag.

The IP and the carrier
Open What Is My IP through the line. The country should be the line's country and the network should be the mobile carrier, not a hosting company.
WebRTC
Run the WebRTC leak test. The only public address it should report is the line's. Your own address showing up means the browser is leaking around the proxy.
Timezone against the IP
The IP and timezone check compares the clock the browser reports with the timezone of the IP. A mismatch is one of the first things anti-fraud systems look at.

From a terminal the agent can use, the same check is one request. Export the line's details once, then ask an IP echo service which address it sees:

Terminal
export CORONIUM_PROXY_HOST="CONNECTION_IP"
export CORONIUM_HTTP_PORT="HTTP_PORT"
export CORONIUM_SOCKS_PORT="SOCKS5_PORT"
export CORONIUM_PROXY_USER="USERNAME"
export CORONIUM_PROXY_PASS="PASSWORD"

curl -x "http://$CORONIUM_PROXY_USER:$CORONIUM_PROXY_PASS@$CORONIUM_PROXY_HOST:$CORONIUM_HTTP_PORT" https://api.ipify.org

When it does not connect

cua runtime doctor reports no container engine
Local sandboxes need Docker, Podman or Colima.
Install one, then run cua runtime setup.
The proxy works in one command and not the next
Each shell.run() call starts clean; an exported variable does not persist.
Put HTTPS_PROXY=... in front of the command in every call that should use the line.
curl answers with a 407 error
Wrong username or password, or the SOCKS5 Port used in an http:// URL.
Copy the login again and use the HTTP Port in the URL.
The sandbox browser shows the host's IP
The browser from --browser was started without a proxy.
Start a second Chromium with --proxy-server from cua sb shell, or browse through Playwright MCP on the host.
An older example with ComputerAgent will not install
It uses packages Cua has deprecated.
Rebuild it on cua-sandbox and the cua CLI, following Cua's current quickstart.
The agent cannot see Coronium tools
cua connect setup adds only the cua server.
Add the Coronium server separately, then restart the agent.

Questions

Does Cua have a proxy setting for its sandboxes?

Its docs, read on 30 October 2026, show no proxy option for sandboxes or for the browser that --browser starts. Route traffic per command with HTTPS_PROXY in each shell.run() call, and start a browser with Chrome's --proxy-server flag when you need one.

Can the agent rotate the IP between tasks?

Yes, with the Coronium MCP server added next to the cua server. It calls coronium_rotate_modem, waits for coronium_get_rotation_status to report done, and can then start the next task in a fresh sandbox.

Where should the proxy password live?

On the host, in environment variables or a secret manager, handed to one sandbox process at run time. Cua advises against putting secrets in image specs and warns that commands carrying secrets can appear in logs.

Should I use cua-agent or cua-computer?

No. Cua lists cua-agent, cua-computer and cua-computer-server as deprecated and no longer maintained. Current setups use the cua SDK and CLI and cua-sandbox.

Do I need a separate line for each sandbox?

For sandboxes that run at the same time, yes. Sandboxes sharing one line share its IP, and a rotation for one task changes the address under all the others.

How we checked

Every Cua config key, command and flag on this page was read from the pages below on 30 October 2026. The Coronium side comes from the dashboard and the live API. There are no screenshots: we quote the names instead of showing an account we do not run. If a label in Cua has moved since, the tool's own page is the one to trust.

  1. Cua on GitHubCurrent packages, the deprecated packages, install commands and the Sandbox.ephemeral example.
  2. Cua SDK: Quickstartpip install cua-sandbox, Python 3.11, container engines, cua runtime doctor and setup.
  3. Cua SDK: Control the desktop and the browsercua connect setup, the cua MCP server, sandbox_create with a browser, cua sb create --browser, cua sb view and cua sb shell.
  4. Cua SDK: Run services, sidecars and secretsSecrets at run time, not in image specs; one shell.run() call per command with its variables; the logging warning.
  5. Chromium: Network settingsThe --proxy-server flag and its scheme, host and port syntax.
  6. coronium-proxy-mcp on npmPackage and version; tool names read with tools/list on the current release on 30 October 2026.