Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

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

+2 this week 80 Trust /100

Last scanned (2 hours ago)

Scores higher than 80% of PyPI servers

Category Browser Automation

Trust breakdown (7 categories)

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
Changelog

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
Diagnostics

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 →

MCP tools · 11 exposed · ~2,594 tokens

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 →

Tool Tokens
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.

NameTypeReqDescription
resultobjectyes–

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.

NameTypeReqDescription
actionstringyesone 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…
devicestringyesDevice 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)
msinteger–swipe / long_press duration in ms
textstring–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…
timeoutinteger–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
NameTypeReqDescription
resultstringyes–

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.

NameTypeReqDescription
allow––a permission: true to allow the step, false to decline it
runstringyesrun id that waits (status paused, waiting_for)
textstring–a question: your answer (or one of its options)
NameTypeReqDescription
resultobjectyes–

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=...).

NameTypeReqDescription
appinteger–install / delete: the app id from op=list or op=upload
devicesstring–install: phones to install on (names, labels or numbers); they must be running
opstring–list (default) | upload | install | delete
pathstring–upload: a local .apk file, up to 300 MB
NameTypeReqDescription
resultobjectyes–

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.

NameTypeReqDescription
packagestring–only logins of this app package (empty = all)
NameTypeReqDescription
resultobjectyes–

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).

NameTypeReqDescription
devicestring–device (name, label or number) - for everything except list and trash
foreverboolean–delete: true wipes the phone with all its data at once instead of moving it to Trash (cannot be undone)
labelstring–rename: the new name, up to 40 characters
opstring–list (default) | start | stop | restart | reset | rename | delete | trash | restore
NameTypeReqDescription
resultobjectyes–

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.

NameTypeReqDescription
devicesstring–send: devices to copy the files to (names, labels or numbers)
idsstring–send: library ids, comma-separated
kindstring–list: only this kind - image | video | doc | apk (empty = all)
opstring–list (default) | upload | send
pathstring–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
NameTypeReqDescription
resultobjectyes–

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.

NameTypeReqDescription
devicestringyesDevice from devices: its name, its label from the dashboard (e.g. "Pixel 7 #3") or its number
numbersboolean–draw the element numbers on the screenshot
with_textboolean–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.

NameTypeReqDescription
credentialsstring–saved logins to use: "package/name" items, comma-separated, from the credentials tool
devicesstringyesone device or several: names, labels or numbers, comma-separated or a JSON list (up to 32)
filesstring–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_stepsinteger–step limit, default 100
modestring–auto (default): works without stopping; ask: asks before risky steps (answer them)
output_schemastring–optional JSON Schema: the answer also comes back as structured_output in this shape
taskstringyesthe 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_secondsinteger–wait up to this long for the result, 0..50
NameTypeReqDescription
resultobjectyes–

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).

NameTypeReqDescription
opstring–status (default) | list | cancel | message
runstring–run id from run (or runs listed with op=list)
stepsinteger–status: how many last steps to show, 0..20
textstring–message: what to tell the running agent
wait_secondsinteger–status: wait up to this long for it to finish or ask, 0..50
NameTypeReqDescription
resultobjectyes–

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.

NameTypeReqDescription
atstring–add: time HH:MM (every=hour: only the minutes count)
credentialsstring–add: saved logins "package/name", comma-separated
daysstring–add: days 1-7 (1 = Monday), comma-separated; empty = every day
devicesstring–add: devices, comma-separated or a JSON list
everystring–add: day (default) | hour
namestring–add: a short name
opstring–list (default) | add | run | toggle | delete
schedulestring–run / toggle / delete: schedule id from op=list
taskstring–add: the task in plain words, like for run
triggerstring–add: empty = by time | api = only when started with op=run
tzstring–add: IANA time zone of `at`, e.g. Europe/Berlin (ask the user; default UTC)
NameTypeReqDescription
resultobjectyes–

No examples provided.

Install

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

# add to Claude Code
claude mcp add clousd-android-clousd-mcp -- uvx clousd-mcp
Common questions

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.