protogrid

Search / dev.phonebox/phonebox

Phonebox

R1· needs a key

Cloud Android phones for AI agents: create a phone, read the screen, tap, type, install APKs, park.

v0.1.0 · active · repository · website · descriptor JSON · versions

An agent can connect on its own if it already holds PHONEBOX_TOKEN.Remote endpoint behind a static API key or header. The registry never sees the value; the agent fills the placeholder.
Quality100strong
Trust96of 100
Uptime, 30 days100%
Latency p50393 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "phonebox": {
      "type": "http",
      "url": "https://phonebox.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${PHONEBOX_TOKEN}"
      }
    }
  }
}
claude mcp add --transport http phonebox https://phonebox.dev/mcp --header "Authorization: Bearer ${PHONEBOX_TOKEN}"
[mcp_servers.phonebox]
url = "https://phonebox.dev/mcp"
bearer_token_env_var = "PHONEBOX_TOKEN"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "phonebox": {
      "type": "remote",
      "url": "https://phonebox.dev/mcp",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer {env:PHONEBOX_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "phonebox": {
      "type": "http",
      "url": "https://phonebox.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${PHONEBOX_TOKEN}"
      }
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=phonebox&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vcGhvbmVib3guZGV2L21jcCIsImhlYWRlcnMiOnsiQXV0aG9yaXphdGlvbiI6IkJlYXJlciAke1BIT05FQk9YX1RPS0VOfSJ9fQ%3D%3D"
}
{
  "servers": {
    "phonebox": {
      "type": "http",
      "url": "https://phonebox.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${PHONEBOX_TOKEN}"
      }
    }
  }
}
{
  "mcpServers": {
    "phonebox": {
      "httpUrl": "https://phonebox.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${PHONEBOX_TOKEN}"
      }
    }
  }
}
extensions:
  "phonebox":
    enabled: true
    name: "phonebox"
    type: streamable_http
    uri: "https://phonebox.dev/mcp"
    headers:
      "Authorization": "Bearer ${PHONEBOX_TOKEN}"
    timeout: 300

Placeholders to fill from your own secret store: ${PHONEBOX_TOKEN}. The registry never accepts secret values.

Quality 100 / 100strong

protocoln/a · weight 25
  • n/a
    protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations13 of 13 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 5,037 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability100 · weight 15
  • pass
    stability.changesno tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

13 tools, about 5,037 tokens to load them all · tool set 9af64a7ec11a · checked 2026-10-19 14:42 UTC

Tool changes

No tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 96 / 100

provenance85
liveness100
freshness100
hygiene100

+repository +dns-namespace +website +reachable +uptime-100% +updated-12d-ago

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://phonebox.dev/mcp streamable-httpapi_key ${PHONEBOX_TOKEN}yes100%393 ms–2026-10-19

Tools (13)

actdestructiveRun up to 20 actions in order (tap, type, key, swipe, scroll, back, home, open_app, open_url, wait_for, …). The batch stops at the first failure, and the result shows the screen where it stopped, unless the screen couldn't be read, or not in time. Never repeat an action whose outcome is unknown; observe first.
complete_app_uploadFinish an upload once its file has arrived, and wait while Phonebox reads and stores the APK. It answers with the upload: ready to install with install_app, or ended with an error saying why. If it is still processing when this returns, call it again with the same arguments: a repeat only waits.
create_app_uploadStart an upload of your own APK, such as the debug build you just made, to install it on a phone. MCP can't carry a file, so this returns a one-off upload_url and the exact curl command to send the APK there from your shell; then call complete_app_upload with the storageId it answers. Send the URL one file of up to 500 MiB, within an hour.
create_phoneCreate a cloud Android phone and wait until it is ready (usually under two minutes). It costs $0.06 a minute while running. Always park it when you're done. If it is still creating or starting when this returns, call get_phone with its ID and wait "ready" to keep waiting: it only reads, while start_phone would renew the session.
get_phoneread-onlyRead one phone: its status, session and when it parks. With wait, wait until it is ready or parked. It never starts, renews or bills anything, so it is the way to wait for a phone that is still creating or starting.
install_appInstall an app from Phonebox's app library by package name, in the background. It doesn't reach Google Play: to get a Play Store app, open the Play Store app on the phone with act and install it there. To check on an install later, open the app with act: open_app answers app_not_found until the install has finished. With upload instead of package, it installs your own APK (see create_app_upload) and waits until the phone lists the app, or says why it failed. While that upload is still installing on the phone, and for 10 minutes after that install succeeds, calling install_app again with it starts nothing: a repeat only waits for it, or reports it.
list_appsread-onlyList the apps installed on a phone: package, label, version and whether it came with the phone. Open one with act and open_app.
list_phonesread-onlyList this project's phones, newest first, with their status and when each parks: up to 50 a page, and next_cursor for the next page. Parked phones keep their apps and sign-ins and cost nothing.
live_view_urlCreate a link a human can open to watch and control the phone, for example to sign in or solve a check. The link expires (default one hour). Anyone with the link controls the phone until it expires; share it only with your user and never paste it into logs or shared chats.
observeread-onlyRead the screen: every visible element with a ref number, text and center, plus a screenshot when asked. Tap elements by ref with the act tool.
park_phonePark a phone to stop billing. Do this whenever you're done.
reboot_phoneRestart a phone that is stuck, keeping everything on it, and wait until it is ready again. A phone can reboot once every 10 minutes; a reboot the phone service didn't confirm is never sent twice: wait for ready with get_phone instead. If it is still creating or starting when this returns, call get_phone with its ID and wait "ready" to keep waiting: it only reads, while start_phone would renew the session.
start_phoneStart a parked phone and wait until it is ready. Its apps, files and sign-ins are kept. On a phone that is already running, it renews the session: a new deadline, with credit reserved for it. If it is still creating or starting when this returns, call get_phone with its ID and wait "ready" to keep waiting: it only reads, while start_phone would renew the session.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "dev.phonebox/phonebox",
  "title": "Phonebox",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
  "remotes": [
    {
      "url": "https://phonebox.dev/mcp",
      "type": "streamable-http",
      "headers": [
        {
          "name": "Authorization",
          "isSecret": true,
          "isRequired": true,
          "description": "Bearer followed by your Phonebox API key (pbx_…)"
        }
      ]
    }
  ],
  "version": "0.1.0",
  "repository": {
    "url": "https://github.com/combined-ai/phonebox-android-mcp",
    "source": "github"
  },
  "websiteUrl": "https://phonebox.dev",
  "description": "Cloud Android phones for AI agents: create a phone, read the screen, tap, type, install APKs, park."
}