io.github.Clousd-Android/clousd-mcp
PYPI · CLOUSD-MCP · 2 COMPONENTS
Real Android phones in the cloud for AI agents: give phones a task in plain words and get the answer
Available components
Last scanned (2 hours ago)
Scores higher than 80% of PyPI servers
Category Browser Automation
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 34 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Clousd-Android/clousd-sdk). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability60
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 2775 tokens (~252/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management13
- Stability check failed: the tool surface changed between 0.3.2 and 1.6.0: 6 tool removals, 0 breaking changes, 7 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (91% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 4 Nov 26 +1
- Schema quality: 2503 → 2775 ▼ functional
- Package version: 1.5.0 → 1.6.0 functional
- 3 Nov 26 0
- Package version: 1.4.0 → 1.5.0 functional
- 2 Nov 26 −14
- Malware scan: pass → unverified ▼ security
- 1 Nov 26 +15
- Tool safety: pass → unverified ▼ security
- Stability: fail → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Tool coverage: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- Package version: 1.3.0 → 1.4.0 functional
- 31 Oct 26 0
- Malware scan: unverified → pass ▲ security
- Schema quality: 1963 → 2316 ▼ functional
- Package version: 1.2.0 → 1.3.0 functional
- 30 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Security disclosure: unverified → fail ▼ functional
- 29 Oct 26 0
- Security disclosure: fail → unverified ▼ functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed pypi/clousd-mcp@1.6.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Clousd-Android/clousd-sdk |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Clousd-Android/clousd-sdk/.github/workflows/publish-mcp.yml@refs/tags/v1.6.0 |
| Rekor log index | 3688191199 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:de34cbd9b647dfb5c4b9b8f4c0a58e5556be230b5b4ad2ae2c381bac8adc3553 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 34 packages
| Packages resolved | 34 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
account ~51
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
act ~428
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | one of: tap long_press swipe scroll tap_text wait_text type key open_app close_app open_url intent settings clipboard_set notifications_open notifications_close notifications_clear | read: installed… |
| device | string | yes | Device from devices: its name, its label from the dashboard (e.g. "Pixel 7 #3") or its number |
| element | – | – | element number from the last observe (tap, long_press) |
| ms | integer | – | swipe / long_press duration in ms |
| text | string | – | type: the text; key: home|back|recents|enter|tab|del|menu; scroll: down|up; open_app/close_app/app_info/crashes: package; open_url: https://...; tap_text/wait_text: text on screen; settings: wifi|blu… |
| timeout | integer | – | wait_text: seconds to wait, up to 120 |
| x | – | – | x in screenshot pixels (tap, long_press, swipe start) |
| x2 | – | – | swipe end x |
| y | – | – | y in screenshot pixels |
| y2 | – | – | swipe end y |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
answer ~109
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.
| Name | Type | Req | Description |
|---|---|---|---|
| allow | – | – | a permission: true to allow the step, false to decline it |
| run | string | yes | run id that waits (status paused, waiting_for) |
| text | string | – | a question: your answer (or one of its options) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
apps ~215
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=...).
| Name | Type | Req | Description |
|---|---|---|---|
| app | integer | – | install / delete: the app id from op=list or op=upload |
| devices | string | – | install: phones to install on (names, labels or numbers); they must be running |
| op | string | – | list (default) | upload | install | delete |
| path | string | – | upload: a local .apk file, up to 300 MB |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
credentials ~103
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.
| Name | Type | Req | Description |
|---|---|---|---|
| package | string | – | only logins of this app package (empty = all) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
devices ~370
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).
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | – | device (name, label or number) - for everything except list and trash |
| forever | boolean | – | delete: true wipes the phone with all its data at once instead of moving it to Trash (cannot be undone) |
| label | string | – | rename: the new name, up to 40 characters |
| op | string | – | list (default) | start | stop | restart | reset | rename | delete | trash | restore |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
library ~264
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.
| Name | Type | Req | Description |
|---|---|---|---|
| devices | string | – | send: devices to copy the files to (names, labels or numbers) |
| ids | string | – | send: library ids, comma-separated |
| kind | string | – | list: only this kind - image | video | doc | apk (empty = all) |
| op | string | – | list (default) | upload | send |
| path | string | – | upload: a local file to add - photo (.jpg .png .webp .heic), video (.mp4 .mov), document (.pdf .txt .csv .md .json .docx .xlsx .zip) or .apk; photo 25 MB, video 200 MB, document 50 MB, apk 300 MB |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
observe ~128
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.
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | yes | Device from devices: its name, its label from the dashboard (e.g. "Pixel 7 #3") or its number |
| numbers | boolean | – | draw the element numbers on the screenshot |
| with_text | boolean | – | also list the elements (numbered, centres in image pixels) |
No output schema declared.
No examples provided.
run ~405
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.
| Name | Type | Req | Description |
|---|---|---|---|
| credentials | string | – | saved logins to use: "package/name" items, comma-separated, from the credentials tool |
| devices | string | yes | one device or several: names, labels or numbers, comma-separated or a JSON list (up to 32) |
| files | string | – | Library files to put on the phone before the task: ids from the library tool, comma-separated (up to 8). Photos and videos land in the gallery, documents in Downloads, apks are installed; the agent i… |
| max_steps | integer | – | step limit, default 100 |
| mode | string | – | auto (default): works without stopping; ask: asks before risky steps (answer them) |
| output_schema | string | – | optional JSON Schema: the answer also comes back as structured_output in this shape |
| task | string | yes | the goal in plain words, e.g. "Open Settings and tell me the Android version" or "Sign in to the app with the saved login and open the profile" |
| wait_seconds | integer | – | wait up to this long for the result, 0..50 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
run_status ~193
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).
| Name | Type | Req | Description |
|---|---|---|---|
| op | string | – | status (default) | list | cancel | message |
| run | string | – | run id from run (or runs listed with op=list) |
| steps | integer | – | status: how many last steps to show, 0..20 |
| text | string | – | message: what to tell the running agent |
| wait_seconds | integer | – | status: wait up to this long for it to finish or ask, 0..50 |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
schedules ~328
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.
| Name | Type | Req | Description |
|---|---|---|---|
| at | string | – | add: time HH:MM (every=hour: only the minutes count) |
| credentials | string | – | add: saved logins "package/name", comma-separated |
| days | string | – | add: days 1-7 (1 = Monday), comma-separated; empty = every day |
| devices | string | – | add: devices, comma-separated or a JSON list |
| every | string | – | add: day (default) | hour |
| name | string | – | add: a short name |
| op | string | – | list (default) | add | run | toggle | delete |
| schedule | string | – | run / toggle / delete: schedule id from op=list |
| task | string | – | add: the task in plain words, like for run |
| trigger | string | – | add: empty = by time | api = only when started with op=run |
| tz | string | – | add: IANA time zone of `at`, e.g. Europe/Berlin (ask the user; default UTC) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
How do I install the io.github.Clousd-Android/clousd-mcp server?
io.github.Clousd-Android/clousd-mcp runs locally as a PyPI package, launched with uvx clousd-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · clousd-mcp
claude mcp add clousd-android-clousd-mcp -- uvx clousd-mcp
What is the io.github.Clousd-Android/clousd-mcp server?
io.github.Clousd-Android/clousd-mcp is listed in the public MCP registry as io.github.Clousd-Android/clousd-mcp. Real Android phones in the cloud for AI agents: give phones a task in plain words and get the answer. This page covers its PyPI package (clousd-mcp).
Is the io.github.Clousd-Android/clousd-mcp server safe to use?
io.github.Clousd-Android/clousd-mcp scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.Clousd-Android/clousd-mcp server expose?
io.github.Clousd-Android/clousd-mcp exposes 11 tools: account, devices, run, library, apps, and 6 more. Their descriptions and schemas cost roughly 2,594 tokens of context every time the server is loaded.
Is the io.github.Clousd-Android/clousd-mcp server still maintained?
io.github.Clousd-Android/clousd-mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.Clousd-Android/clousd-mcp server under?
io.github.Clousd-Android/clousd-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.