account
Account
The account: plan and phones, money left, what is about to renew, and warnings. Check it before starting phones or long work, and tell the user every warning in plain words with the top_up link.
无需输入参数。

io.github.Clousd-Android由 GitHub 账号 Clousd-Android 发布v1.6.0更新于 Nov 4, 2026
Real Android phones in the cloud for AI agents: give phones a task in plain words and get the answer
Clousd 为助手提供云端真实 Android 手机:用自然语言给手机下任务,或逐步操作屏幕。
Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。
把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。
阅读 https://sourceweft.com/mcp/io.github.Clousd-Android%2Fclousd-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。
{
"mcpServers": {
"clousd": {
"type": "http",
"url": "https://api.clousd.com/mcp"
}
}
}[tests] [PyPI clousd] [PyPI clousd-mcp] [MCP registry] [license]
Every agent framework can tap a phone. Almost none has a phone worth tapping.
Clousd is the phone. Each device is a full Android system on the Android version you pick (12 to 17), with Google Play inside and its own network exit. Give it a task in plain words and Clousd's phone agent does the steps and answers; or drive the screen yourself, step by step. Apps see a phone, not an emulator, so your agent sees the screens a person sees.
This repository is the public side of it: the OpenAPI description, the Python client, the MCP server and the skill for coding agents.
Give it the goal. POST /v1/runs {"task": "...", "device": "..."}, c.run(...) in Python, the run tool over MCP.
Clousd's agent looks at the screen, taps and types until the goal is reached, and finishes with an answer - plus a
replay of every step, and JSON in your schema when you ask for it. One call gives the same task to up to 32 phones.
Saved logins are typed on the phone without your agent or the model seeing them.
Drive it yourself. observe returns a fresh screenshot with a number on every element; act taps an element, types,
swipes, opens apps and links, and waits until the screen settles. Snapshots reset a phone to a saved state in seconds.
Hosted, nothing to install: https://api.clousd.com/mcp. Apps with connectors (Claude.ai, ChatGPT…) sign in with
OAuth - just add the URL. Other clients send the key in the header:
Local: pip install clousd-mcp, then {"command": "clousd-mcp", "env": {"CLOUSD_API_KEY": "cl_live_..."}}.
Tools: account, devices, run, run_status, answer, observe, act, credentials, schedules (mcp/).
Coding agents learn the workflow from the skill:
More in python/.
Keys have a scope (read or read & write) and an explicit list of phones; keys travel only in the Authorization
header. Limits: 120 requests a minute per key and device, 600 a minute per key across devices, 60 a minute for
everything else; 429 comes with Retry-After. Errors are JSON: {"error": "short_code", "message": "what happened"}.
Full description: openapi.yaml; reference: clousd.com/docs/reference.
1.6 adds your apps. An app is an APK you upload once and install by id on any of your phones; there is no catalog of
other people's apps (Google Play apps are installed in the Play Store on the phone). GET /v1/apps lists your APKs
(id, name, size, package, version), POST /v1/apps uploads one as a file up to 300 MB, POST /v1/apps/{id}/install {devices} installs it, DELETE /v1/apps/{id} removes it from storage. POST /v1/media also takes a multipart file now
(photo 25 MB, video 200 MB, document 50 MB, apk 300 MB). Every APK is checked on upload and before each install - a real
Android app, 64-bit ARM native code when it has any, not a root or system-modification tool - and refused with
422 apk_rejected and the reason otherwise. SDK: c.apps(), c.upload_app(path), c.install_app(id, devices),
c.delete_app(id); c.upload_media(path) sends the file as a file. MCP: the apps tool.
1.5 creates phones by Android version only. POST /v1/devices {android: "14"} (versions: GET /v1/android); the phone
model is picked by the service. GET /v1/models answers 410, and devices no longer carry a model field. A phone
not renamed is called Phone #N. An old body with profile still works and keeps only that model's Android version.
Python: c.create_device(android="14"), c.android_versions(); c.models() is deprecated.
1.3 adds the Library: GET /v1/media lists the account's files (photos, videos, documents, apks) with ids and folders,
POST /v1/media uploads one, POST /v1/media/send copies files to phones. Pass ids to POST /v1/runs as files and they are
placed on the phone before the first step (photos and videos in the gallery, documents in Downloads, apks installed). SDK:
c.run(task, files=[...]), c.media(), c.upload_media(), c.send_media(); MCP: the library tool and files on run.
Creating a device no longer takes plan: phones run pay as you go, a plan's minutes are used first.
1.2 removes saved device states. /v1/devices/{name}/snapshots, /profiles and /worlds answer 410; to start from a
clean phone call POST /v1/devices/{name}/reset (apps and data are wiped, the Android version stays the same). Python:
device.reset() replaces snapshots(), save_snapshot(), restore() and clone().
1.0 gives phones goals instead of scripts. /v1/recipes, /v1/groups, /v1/accounts, /v1/texts and the
device recipe / record routes answer 410 with where to go instead: tasks are POST /v1/runs, logins are
/v1/credentials. MCP: run / run_status / answer / credentials / schedules replace fleet, recipe,
resources, network, snapshots and inspect. Keys in the URL are no longer accepted.
io.github.Clousd-Android/clousd-mcp · hosted endpoint: https://api.clousd.com/mcpMIT. See LICENSE.
来源:README.md,提交 35ef0b4
Account
The account: plan and phones, money left, what is about to renew, and warnings. Check it before starting phones or long work, and tell the user every warning in plain words with the top_up link.
无需输入参数。
Devices
Phones this key can use. op=list: name, label (the name people see in the dashboard, e.g. "Phone #3"), number, state (running / stopped / starting), Android version and network exit. Every tool takes the name, the label or the number. op=start / op=stop / op=restart with device: start a stopped phone (one to three minutes until it has booted), stop one (it keeps its apps and data) or restart it. op=reset with device: back to a fresh state - apps and data wiped, same Android version; works whether the phone runs or is stopped. Ask the user before reset. op=rename with device and label: give a phone a name (empty = back to "Phone #N"). op=delete with device: the phone moves to Trash for 14 days - stopped, not billed, apps and data kept - and op=restore brings it back (stopped). forever=true deletes it with all its data at once and cannot be undone: only when the user says so. op=trash: what is in Trash (name, label, android, deleted_at, purge_at, reason). op=restore with device: back from Trash (the name or label as shown by op=trash).
oplabeldeviceforeverRun a task
Give phones a task. Clousd's agent looks at the screen, taps and types until the goal is reached, and finishes with an answer. Several devices = the same task on each, all at once (one run per phone under one parent). Returns the run with its status; if it is still going, follow it with run_status. A run in mode=ask may stop with waiting_for: reply with answer. Logins: never ask the user for passwords - pass credentials; their values are typed on the phone without you or the model seeing them. A task that needs a file (post this photo, fill this form from this PDF, install this app): upload it once with the library tool and pass its id in files - do not push files by hand each time.
modetask必填filesdevices必填max_stepscredentialswait_secondsoutput_schemaLibrary
The user's Library on Clousd: every file they want on their phones lives here once (photos, videos, documents, apps) and is used by id. op=list shows it; op=upload adds a local file and returns its id; op=send copies files to phones right away (photos and videos into the gallery as if taken there, documents into Downloads, apks installed). For a task that needs a file, prefer run(files=...) - the file is placed on the phone before the first step.
opidskindpathdevicesApps
The user's own apps on Clousd: APKs they uploaded, kept in their private storage. Upload an APK once (op=upload), then install it by id on any of their phones (op=install), as often as needed. Clousd has no catalog of other people's apps - for apps from Google Play, open the Play Store on the phone. Every APK is checked on upload (a real Android app, 64-bit ARM code, no root or system tools) and refused with the reason otherwise. To have an app on the phone before a task, pass its id in run(files=...).
opapppathdevicesRun status
Follow a run. op=status: status (queued, running, paused = waits for an answer, completed, failed, cancelled), the answer or error, the last steps, per-device results for a run on several phones, and a replay link for the user. op=list: recent runs of this key. op=cancel: stop it. op=message: tell the running agent something (it reads it before its next step).
opruntextstepswait_secondsAnswer a run
Reply to a run that waits for you: answer its question with text, or allow / decline the step it asks permission for. If the question is something only the user knows, ask the user first. The run goes on at once.
run必填textallowObserve the screen
Look at the phone yourself: a fresh screenshot, the app on screen and (with_text) every labelled or tappable element with a number. Act on an element by its number (act element=N); coordinates, when needed, are in this image's pixels.
device必填numberswith_textAct on the phone
Do one thing on the phone yourself, then wait until the screen settles. Prefer element numbers from observe over coordinates; tap_text taps the element whose text contains `text`. Typing goes into the focused field (tap it first) and works in any language. "the screen did not change" means the action probably missed - observe again. Read without touching the screen: installed (apps), notifications (the shade), clipboard, app_info (version, installer, running), crashes (recent app crashes and ANRs), health (running, booted, network exit, last check). For a whole goal, prefer run: it does all the steps for you.
xymsx2y2textaction必填device必填elementtimeoutSaved logins
Saved logins of the account: package, name and which fields are set (username, email, password, phone, totp...). Values are never shown. Pass one to run as "package/name"; the agent types it on the phone without seeing it. The user adds logins in the dashboard (Tasks → Sign-in) - do not ask them for passwords in the chat.
packageSchedules
Tasks that run by themselves. op=list: id, name, task, phones, at, days, tz, enabled and the runs it started last time. op=add: run `task` on `devices` at `at` on `days`, or every hour (every=hour), or only on demand (trigger=api); each firing starts runs like the run tool. op=run: start it now. op=toggle: pause or resume. op=delete: remove it.
atoptzdaysnametaskeverydevicestriggerschedulecredentials已满足适用检查项的 100%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
{ "mcpServers": { "clousd": { "url": "https://api.clousd.com/mcp", "headers": { "Authorization": "Bearer cl_live_..." } } }}npx skills add https://github.com/Clousd-Android/clousd-sdk --skill clousdpip install clousdexport CLOUSD_API_KEY=cl_live_...from clousd import Clousd
c = Clousd()run = c.run("Open Settings and tell me the Android version", device="dev_04f2", wait=True)print(run.status, run.answer) # completed Android 15
phone = c.device("dev_04f2") # or step by stepphone.open_app("com.android.chrome")phone.tap_text("Search")phone.type("weather in Berlin")phone.key("enter")phone.wait_text("Berlin", timeout=30)curl -H "Authorization: Bearer cl_live_..." https://api.clousd.com/v1/devicescurl -H "Authorization: Bearer cl_live_..." -H "Content-Type: application/json" \ -d '{"task":"Open Settings and tell me the Android version","device":"dev_04f2"}' https://api.clousd.com/v1/runscurl -N -H "Authorization: Bearer cl_live_..." https://api.clousd.com/v1/runs/r_8f2c/events # live steps (SSE)curl -H "Authorization: Bearer cl_live_..." "https://api.clousd.com/v1/devices/dev_04f2/observe?w=540"pip install -e pythonpip install -e mcppython -m unittest discover -s python/tests # offline: a fake server and a scripted model, no key needed