io.github.Clousd-Android/clousd-mcp
REMOTE · API.CLOUSD.COM · 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 (21 minutes ago)
Scores higher than 19% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Browser Automation
Recent critical change
Authorization (16 Oct 2026). See the changelog before you install this server.
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security89
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- The endpoint enforces authorisation, advertised via RFC 9728 protected-resource metadata. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability0
- Transport blocked by authentication: the endpoint requires auth we don't have to verify streamable-http. See how to fix → View diagnostics → Unverified
Schema Quality & AI Usability0
- Schema blocked by authentication: the endpoint requires auth we don't have to read it. See how to fix → Unverified
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage0
- Tool coverage blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Tool Safety0
- Tool safety blocked by authentication: the endpoint requires auth we don't have to read its tools.Unverified
Capabilities0
- Capabilities blocked by authentication: the endpoint requires auth we don't have to read them. See how to fix → Unverified
Unverified: 6 categories
Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm. Claim this server and supply a read-only token to verify it and lift the score.
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.
- 21 Oct 26 −29
- Endpoint reachability: reachable → behind authorisation ▼ security
- Tool safety: pass → unverified ▼ security
- Stability: 0.30 → unverified ▼ security
- Transport: pass → unverified ▼ security
- Authorization: fail → pass ▲ security
- First check of Authorization: partial security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: Schema blocked by authentication: the endpoint requires auth we don't have to read it. functional
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Oct 26 +40
- Authorization: unverified → fail ▼ critical
- Injection markers: unverified → pass ▲ security
- Transport: fail → pass ▲ security
- The server rewrote its instructions, which are the text every model session reads security
- New tool “fleet”, which the server declares destructive security
- New tool “network”, which the server declares destructive security
- Tool “devices” rewrote its description, which is the text the model reads security
- Tool “recipe” rewrote its description, which is the text the model reads security
- Schema quality: 200 → 339 ▼ functional
- Endpoint reachability: not serving MCP → reachable ▲ functional
- Tool coverage: 83% → 90% ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- Stability: unverified → 0.17 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- New tool “account” functional
- New tool “resources” functional
- “devices” added an optional parameter “label” cosmetic
- “observe” reworded the description of “device” cosmetic
- “act” reworded the description of “device” cosmetic
- “devices” reworded the description of “device” cosmetic
- “devices” reworded the description of “op” cosmetic
- “inspect” reworded the description of “device” cosmetic
- “recipe” reworded the description of “device” cosmetic
- “snapshots” reworded the description of “device” cosmetic
- 13 Oct 26 −39
- Endpoint reachability: reachable → not serving MCP ▼ security
- Stability: 0.03 → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Authorization: fail → unverified ▼ security
- Transport: pass → fail ▼ security
- Tool coverage: 100 → unverified ▼ functional
- Capabilities: pass → unverified ▼ functional
- First check of Schema quality: unverified functional
- 12 Oct 26 0
- Stability: unverified → 0.03 ▲ functional
- 11 Oct 26 62
First indexed and scored.
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 · Probed https://api.clousd.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.clousd.com | CN=YE1,O=Let's Encrypt,C=US | 8 Sept 2026 | 7 Dec 2026 | ECDSA 256 | ECDSA-SHA384 | 5fee1801bf370d4309567096a4da423935d |
| SANs: api.clousd.com | ||||||
| CN=YE1,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 5ddd70dd31f801c85c186a7a04b80afe |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.clousd.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| clousd.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On connection |
| HTTP status | 401 |
WWW-Authenticate challenge Bearer resource_metadata="https://api.clousd.com/.well-known/oauth-protected-resource"
Bearer resource_metadata="https://api.clousd.com/.well-known/oauth-protected-resource" | Header | Value |
|---|---|
| www-authenticate | Bearer resource_metadata="https://api.clousd.com/.well-known/oauth-protected-resource" |
Protected resource metadata
| Document | https://api.clousd.com/.well-known/oauth-protected-resource |
|---|---|
| Retrieved | Yes |
| Resource | https://api.clousd.com |
| Authorisation server | https://clousd.com |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.clousd.com/mcp | Auth required | 401 | |
| http (plaintext) | http://api.clousd.com/mcp | HTTPS enforced | 308 | https://api.clousd.com/mcp |
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 ~181
The account's money - check it before starting phones, creating them or launching long runs, and tell the user what it says. op=balance: balance, spend_per_day (running per-minute phones + paid proxy traffic of the last 24 hours), runs_out_in_hours, phones running per minute with their price, monthly renewals within 7 days, prices per hour / day cap / month / GB by exit type, the top_up link, and warnings: show every warning to the user in plain words (e.g. "about 6 hours left; at zero the phones stop and go to storage", "proxy traffic cost $3.40 today") with the top_up link. When the balance is low, say so before spending more - do not silently start phones.
| Name | Type | Req | Description |
|---|---|---|---|
| op | string | – | balance |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
act ~367
Do one thing on the phone, 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. Returns what happened; "the screen did not change" means the action probably missed - observe again.
| 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 installed intent settings clipboard_set notifications_open notifications_close notifications_clear |
| device | string | yes | Device from devices (op=list): its name, its label from the dashboard (e.g. "Anna IG" or "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: package; open_url: https://...; tap_text/wait_text: text on screen; settings: wifi|bluetooth|display|so… |
| 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.
devices ~226
Phones this API key can use. op=list: name, label (the name people see in the dashboard, e.g. "Anna IG" or "Pixel 7 #3"), number, state (running / stopped / starting), model, Android version, network exit, the app accounts linked to it and its proxy_id. Every tool takes the name, the label or the number. op=rename with device and label: give a phone a name (empty = back to "Model #N"); name phones after their accounts to keep a fleet readable. op=start / op=stop with `device`: start a stopped phone (waits until it has booted, one to three minutes) or stop one (a stopped phone keeps its state and costs nothing).
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | – | device (name, label or number), for start / stop / rename |
| label | string | – | rename: the new name, up to 40 characters |
| op | string | – | list (default) | start | stop | rename |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
fleet ~637
Work with many phones in one call - the way to automate, instead of tapping each phone step by step. op=recipes lists the built-in app recipes (sign in, warm up an account, publish, delete the last post...) with their inputs; prefer a recipe over act whenever one fits the task. op=run starts a recipe (package + action) or your own steps on up to 32 phones at once (they may live on different servers) and returns a job id right away - the phones work in parallel, minutes to an hour for a warm-up. op=status with job shows per-phone progress: call it every 30-60 s until state is done or failed. Steps for op=run: recipe (package, action, vars), open_app / close_app (package), url (url), tap_text / wait_text (text, seconds), wait (seconds, seconds_max), scroll (text=down|up), browse (seconds 10-600: scroll like a person), install_app (package from the catalog), key (key), screenshot, rotate (new IP), if_text / unless_text (text, skip), login (package, account: an id from resources op=accounts or "linked" for the account linked to each phone - the server fills the password), publish (package, text: post|story|reel, media_id from resources op=media, caption). vars_by_device gives each phone its own account or media_id too, e.g. {"dev_1": {"account": "12"}, "dev_2": {"account": "13"}}.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | run: recipe action from op=recipes, e.g. warm, login, publish_post |
| app | string | – | recipes: filter by app name or package, e.g. instagram |
| devices | string | – | run: device names as JSON list or comma-separated, e.g. ["dev_1","dev_2"]; "all" = every running device of this key |
| job | string | – | status: job id returned by op=run |
| op | string | yes | recipes | run | status |
| package | string | – | run: app package of the recipe, e.g. com.instagram.android |
| stagger | string | – | run: spread the starts, min,max seconds, e.g. 20,90 (phones do not act in lockstep) |
| steps | string | – | run: instead of a recipe, your own steps as JSON list, e.g. [{"op":"open_app","package":"com.android.chrome"},{"op":"wait","seconds":5}] |
| vars | string | – | run: variables for every device as JSON, e.g. {"seconds": "900", "comment_chance": "0.1"} |
| vars_by_device | string | – | run: per-device variables as JSON, e.g. {"dev_1": {"login": "anna", "password": "..."}} (logins differ per phone) |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
inspect ~186
Read the phone without touching the screen. notifications: the shade as a list (app, title, text, time). clipboard: the clipboard text. app: installed version, install/update time, installer, whether it runs or is on screen. crashes: recent app crashes, native crashes and ANRs with the first lines of the stack. health: running, booted, network exit and the latest automatic check of the phone. installed: packages of apps that can be opened.
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | yes | Device from devices (op=list): its name, its label from the dashboard (e.g. "Anna IG" or "Pixel 7 #3") or its number |
| package | string | – | app: the package to describe; crashes: only this package |
| what | string | yes | notifications | clipboard | app | crashes | health | installed |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
network ~422
Where phones go online. Every phone uses one proxy of the account: your own proxy, or a Clousd exit (residential, mobile, ISP, datacenter in a country, paid per GB); time zone, locale and SIM follow it. op=options: exit types on sale and countries. op=status: the exit a device uses now (IP, country, carrier). op=proxies: the account's proxies and which devices use each. op=add: save your proxy (it is checked at once) or a Clousd exit. op=bind: put devices on a proxy. op=unbind: take them off (no internet until bound again). op=rotate: new IP for every running device on the proxy. op=check: test your proxy. op=delete: remove an unused proxy.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | add: two-letter country of a Clousd exit, e.g. US |
| device | string | – | status: the device to look at |
| devices | string | – | bind / unbind: device names, JSON list or comma-separated |
| ip_type | string | – | add (own proxy): static | residential | mobile |
| name | string | – | add: a name to find it by |
| op | string | yes | options | status | proxies | add | check | bind | unbind | rotate | delete |
| proxy | string | – | add: your own proxy - host:port:user:pass, user:pass@host:port or socks5://user:pass@host:port |
| proxy_id | integer | – | check / bind / rotate / delete: proxy id from op=proxies |
| rotate_url | string | – | add (own residential/mobile proxy): the provider's link that changes the IP |
| type | string | – | add: instead of your own proxy, a Clousd exit - residential | mobile | isp | datacenter (see op=options), paid per GB |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
observe ~136
Look at the phone: 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 (op=list): its name, its label from the dashboard (e.g. "Anna IG" or "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.
recipe ~282
App recipes on one phone: scripted flows that wait for the right screen at each step, deal with popups and report what they did. op=run runs a built-in recipe (package + action - the list with inputs is fleet op=recipes) or your own JSON and returns when it is finished; for several phones use fleet op=run instead. op=record_start begins recording what is done on the phone (through act, or by a person in the live view); record_status shows progress; record_stop returns the recorded draft recipe, ready for op=run.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | run: built-in recipe name (e.g. warm, login, publish_post) |
| device | string | yes | Device from devices (op=list): its name, its label from the dashboard (e.g. "Anna IG" or "Pixel 7 #3") or its number |
| op | string | yes | run | record_start | record_status | record_stop |
| package | string | – | run: app package of a built-in recipe (e.g. com.instagram.android) |
| steps | string | – | run: your own recipe as JSON {app, steps:[...]} (e.g. a recorded draft) |
| vars | string | – | run: variables as JSON, e.g. {"seconds": "300"} |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
resources ~546
The account's resources, the same as Resources in the dashboard. accounts: saved app accounts (login, status, the phone it is linked to; parent_id = it signs in through that Instagram) - passwords and 2FA secrets are never shown; add_via_instagram (account_id = an Instagram account, platform = com.facebook.katana or com.instagram.barcelona): a Facebook / Threads that signs in through that Instagram, on the same phone, no password. To sign a phone in, run fleet with the step {"op":"login","package":...,"account":<id> or "linked"} and the server fills the password itself. add_accounts / link_account: save accounts and link one to a phone. texts / add_texts: captions, comments, bios, names. media / upload_media: the photo and video library; publish one with fleet step {"op":"publish","package":...,"text":"post", "media_id":<id>,"caption":...}. send_media: copy files into phones' galleries as if taken by that phone.
| Name | Type | Req | Description |
|---|---|---|---|
| account_id | integer | – | link_account: account id from op=accounts; add_via_instagram: the Instagram account id |
| accounts | string | – | add_accounts: JSON list of {platform, login, password, email?, email_password?, totp?, note?, device?} |
| data_b64 | string | – | upload_media: the file as base64 when there is no path (up to 25 MB) |
| device | string | – | link_account: the phone to link it to (empty = unlink) |
| devices | string | – | send_media: device names, JSON list or comma-separated |
| kind | string | – | media: image | video (empty = both) |
| media_ids | string | – | send_media: library ids, JSON list or comma-separated |
| name | string | – | upload_media: file name with extension, e.g. beach.jpg |
| op | string | yes | accounts | add_accounts | link_account | add_via_instagram | texts | add_texts | media | upload_media | send_media |
| path | string | – | upload_media: a file path on the machine running this server (local MCP only) |
| platform | string | – | accounts: filter by app package, e.g. com.instagram.android; add_via_instagram: com.facebook.katana or com.instagram.barcelona |
| texts | string | – | add_texts: JSON list of strings |
| type | string | – | texts / add_texts: caption | comment | bio | name | username |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
snapshots ~183
Saved states of a phone, for starting every run from the same point. op=list: id, created, android, current, restorable. op=save: save the current state. op=restore with snapshot_id: reset the phone to that state (what happened since is lost). op=clone with snapshot_id and new_name: a new phone from that state.
| Name | Type | Req | Description |
|---|---|---|---|
| device | string | yes | Device from devices (op=list): its name, its label from the dashboard (e.g. "Anna IG" or "Pixel 7 #3") or its number |
| new_name | string | – | clone: name of the new phone (letters and digits, up to 16) |
| op | string | – | list (default) | save | restore | clone |
| snapshot_id | string | – | restore / clone: id from op=list |
| 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 is a hosted endpoint at https://api.clousd.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.clousd.com
claude mcp add --transport http clousd-android-clousd-mcp 'https://api.clousd.com/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 hosted endpoint (https://api.clousd.com/mcp).
Is the io.github.Clousd-Android/clousd-mcp server safe to use?
io.github.Clousd-Android/clousd-mcp scores 36 out of 100 on VerifyMCP. 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 10 tools: devices, observe, act, inspect, snapshots, and 5 more. Their descriptions and schemas cost roughly 3,166 tokens of context every time the server is loaded.
Does the io.github.Clousd-Android/clousd-mcp server require authentication?
Yes. io.github.Clousd-Android/clousd-mcp asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
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.