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.
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
cuaSDK and CLI andcua-sandbox. Its README lists the oldercua-agent,cua-computerandcua-computer-serverpackages 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 doctorchecks the host andcua runtime setupinstalls 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.
| Profile | Tools | Money tools | Use it for |
|---|---|---|---|
| directory | 21 | None | An agent that checks, tests and rotates lines you already rent. The hosted server runs this profile. |
| read-only | 31 | None | Reporting: balances, lines, usage, payments and tickets, with nothing that changes state. |
| buyer | 12, or 13 with CORONIUM_ENABLE_SPENDING=1 | Buy only, and only with spending on | An agent that quotes, buys and runs a few lines after you approve each total. |
| full | 59, plus 6 money tools with spending on | 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. |
- 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.
Install the SDK and check the host
Install with
pip install cua-sandbox, then runcua runtime doctorand, if it reports gaps,cua runtime setup.Terminal pip install cua-sandbox cua runtime doctor cua runtime setupChecked against Cua SDK: Quickstart
Give your coding agent the cua MCP server
cua connect setupinstalls the Cua skills and adds thecuaMCP 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 -yChecked against Cua SDK: Control the desktop and the browser
Add the Coronium server next to it
The cua server drives the sandbox; the Coronium server manages the line. Use the
directoryprofile, 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.0Keep 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
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 anexportdoes not carry into the next call, andshlex.quote()keeps the password intact.Checked against Cua SDK: Run services, sidecars and secrets
Point the sandbox browser at the line
cua sb create --browserstarts Chromium with a throwaway profile, and Cua's docs show no proxy option for it. Open a shell withcua sb shell, start a second Chromium with--proxy-server=http://CONNECTION_IP:HTTP_PORTand its own--user-data-dir, and enter the line's username and password when it asks.cua sb viewshows 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.
โWhich countries have Coronium lines in stock right now, and what does 24 hours cost in each?โ
Calls
coronium_list_free_modemsthencoronium_list_tariffs. Reads live stock and plans. Nothing is bought.โ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.โRotate my line called <name> and tell me the new IP once the rotation has finished.โ
Calls
coronium_rotate_modemthencoronium_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=1is set in the host environment and the profile isbuyer(buy only) orfull. A.envfile 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 withprice_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_proxiescontains proxy passwords. Treat it, the Reset Link and any OpenVPN profile as secrets. coronium_replace_modemis 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:
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.orgWhen it does not connect
| What you see | Likely cause | What to do |
|---|---|---|
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. |
cua runtime doctorreports 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
--browserwas started without a proxy. - Start a second Chromium with
--proxy-serverfromcua 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-sandboxand thecuaCLI, following Cua's current quickstart. - The agent cannot see Coronium tools
cua connect setupadds 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.
- Cua on GitHubCurrent packages, the deprecated packages, install commands and the Sandbox.ephemeral example.
- Cua SDK: Quickstartpip install cua-sandbox, Python 3.11, container engines, cua runtime doctor and setup.
- 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.
- 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.
- Chromium: Network settingsThe --proxy-server flag and its scheme, host and port syntax.
- coronium-proxy-mcp on npmPackage and version; tool names read with tools/list on the current release on 30 October 2026.