# io.github.Clousd-Android/clousd-mcp (pypi · clousd-mcp)

Real Android phones in the cloud for AI agents: give phones a task in plain words and get the answer

- Trust score: 80/100 (high trust)
- Change this week: +2
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `api.clousd.com`: 36/100, [markdown](https://verifymcp.io/servers/clousd-android-clousd-mcp/api.md), [page](https://verifymcp.io/servers/clousd-android-clousd-mcp/api)
- pypi · `clousd-mcp`: 80/100 (this document), [markdown](https://verifymcp.io/servers/clousd-android-clousd-mcp/clousd-mcp.md), [page](https://verifymcp.io/servers/clousd-android-clousd-mcp/clousd-mcp)

## Channel facts

- Registry: `pypi`
- Package: `clousd-mcp`
- Version: `1.6.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it.
  - 1 of 34 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to Clousd-Android/clousd-sdk).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 13/100
  - Stability check failed: the tool surface changed between 0.3.2 and 1.6.0: 6 tool removals, 0 breaking changes, 7 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (91% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 12 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

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

### Claude

```bash
claude mcp add clousd-android-clousd-mcp -- uvx clousd-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "clousd-android-clousd-mcp": {
      "command": "uvx",
      "args": [
        "clousd-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "clousd-android-clousd-mcp": {
      "command": "uvx",
      "args": [
        "clousd-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add clousd-android-clousd-mcp -- uvx clousd-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "clousd-android-clousd-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "clousd-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add clousd-android-clousd-mcp --command uvx --arg clousd-mcp
```

### Hermes

```yaml
mcp_servers:
  clousd-android-clousd-mcp:
    command: "uvx"
    args: ["clousd-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "clousd-android-clousd-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "clousd-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add clousd-android-clousd-mcp -t stdio -c uvx -a clousd-mcp
```

### Other

```json
{
  "mcpServers": {
    "clousd-android-clousd-mcp": {
      "command": "uvx",
      "args": [
        "clousd-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-04 (score 65, +1)

- [functional regression] Schema quality: 2503 → 2775
- [functional] Package version: 1.5.0 → 1.6.0

### 2026-11-03 (score 64, 0)

- [functional] Package version: 1.4.0 → 1.5.0

### 2026-11-02 (score 64, −14)

- [security regression] Malware scan: pass → unverified

### 2026-11-01 (score 78, +15)

- [security regression] Tool safety: pass → unverified
- [security regression] Stability: fail → unverified
- [security improvement] Malware scan: unverified → pass
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional] Package version: 1.3.0 → 1.4.0

### 2026-10-31 (score 63, 0)

- [security improvement] Malware scan: unverified → pass
- [functional regression] Schema quality: 1963 → 2316
- [functional] Package version: 1.2.0 → 1.3.0

### 2026-10-30 (score 63, −15)

- [security regression] Malware scan: pass → unverified
- [functional regression] Security disclosure: unverified → fail

### 2026-10-29 (score 78, 0)

- [functional regression] Security disclosure: fail → unverified

## MCP tools (11)

### `account` (~51 tokens)

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.

Output parameters:

- `result` (object)

### `devices` (~370 tokens)

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

Input parameters:

- `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

Output parameters:

- `result` (object)

### `run` (~405 tokens)

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.

Input parameters:

- `credentials` (string): saved logins to use: "package/name" items, comma-separated, from the credentials tool
- `devices` (string, required): 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, required): 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

Output parameters:

- `result` (object)

### `library` (~264 tokens)

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.

Input parameters:

- `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

Output parameters:

- `result` (object)

### `apps` (~215 tokens)

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

Input parameters:

- `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

Output parameters:

- `result` (object)

### `run_status` (~193 tokens)

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

Input parameters:

- `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

Output parameters:

- `result` (object)

### `answer` (~109 tokens)

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.

Input parameters:

- `allow`: a permission: true to allow the step, false to decline it
- `run` (string, required): run id that waits (status paused, waiting_for)
- `text` (string): a question: your answer (or one of its options)

Output parameters:

- `result` (object)

### `observe` (~128 tokens)

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.

Input parameters:

- `device` (string, required): 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)

### `act` (~428 tokens)

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.

Input parameters:

- `action` (string, required): 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, required): 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

Output parameters:

- `result` (string)

### `credentials` (~103 tokens)

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.

Input parameters:

- `package` (string): only logins of this app package (empty = all)

Output parameters:

- `result` (object)

### `schedules` (~328 tokens)

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.

Input parameters:

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

Output parameters:

- `result` (object)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/clousd-android-clousd-mcp/clousd-mcp#diagnostics

## Score history

- 2026-11-05: 80
- 2026-11-04: 65
- 2026-11-03: 64
- 2026-11-02: 64
- 2026-11-01: 78
- 2026-10-31: 63
- 2026-10-30: 63
- 2026-10-29: 78
- 2026-10-28: 78
- 2026-10-27: 78
- 2026-10-26: 78
- 2026-10-25: 78
- 2026-10-24: 78
- 2026-10-23: 78
- 2026-10-22: 49
- 2026-10-21: 78
- 2026-10-20: 77
- 2026-10-19: 77
- 2026-10-18: 77
- 2026-10-17: 77
- 2026-10-16: 77
- 2026-10-15: 77
- 2026-10-14: 77
- 2026-10-13: 49
- 2026-10-12: 49

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

## Links

- PyPI project: https://pypi.org/project/clousd-mcp/
- Socket report: https://socket.dev/pypi/package/clousd-mcp
- Repository: https://github.com/Clousd-Android/clousd-sdk
- Website: https://clousd.com/agents/
- Changelog RSS feed: https://verifymcp.io/servers/clousd-android-clousd-mcp/clousd-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/clousd-android-clousd-mcp/clousd-mcp.json
- HTML version of this page: https://verifymcp.io/servers/clousd-android-clousd-mcp/clousd-mcp
