Skip to main content
Glama

android_install_apk

Destructive

Install an app on the Android device from an APK or split bundle (XAPK/APKS — how most large modern apps ship). Provide apk_url (an https link the device downloads itself — preferred, and the only workable option for real apps) or, for tiny payloads, as apk_base64. Max 300MB. Large apps can take several minutes; if this call times out the install keeps running on the device — verify with the app-list tool instead of re-installing. Use reinstall=true to uninstall then install (for signature changes).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
apk_urlNohttps URL of the APK — the server downloads it (preferred; the only practical option for real-sized apps).
packageNoExpected package name (for verification)
reinstallNoUninstall first if package exists (for different signature). OMIT for a normal install (default false).
apk_base64NoAPK as base64-encoded bytes. Only usable for tiny payloads (the whole blob is an LLM tool argument); prefer apk_url.
in_workspaceNoRun this one call in this workspace id instead of the session's. Nothing is stored; other sessions are not affected.
channel_account_idNoAndroid device channel_account ID. Omit when the workspace has a single Android device; REQUIRED when it has more than one (e.g. WhatsApp + LINE), else the call is rejected as ambiguous.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / in_workspace
      Added value: +{
      +  "description": "Run this one call in this workspace id instead of the session's. Nothing is stored; other sessions are not affected.",
      +  "type": "integer"
      +}
  2. Added
  3. Removed
  4. Changed1 schema field changed
    • changedInput schema / properties / reinstall / description
      Previous value: -"Uninstall first if package exists (for different signature). Default: false"New value: +"Uninstall first if package exists (for different signature). OMIT for a normal install (default false)."
  5. Changed1 schema field changed
    • addedInput schema / properties / channel_account_id
      Added value: +{
      +  "description": "Android device channel_account ID. Omit when the workspace has a single Android device; REQUIRED when it has more than one (e.g. WhatsApp + LINE), else the call is rejected as ambiguous.",
      +  "type": "integer"
      +}
  6. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive/not-idempotent, but the description adds non-obvious behavior beyond them: the 300MB cap, that large installs take minutes, and critically that a timeout does NOT cancel the install (it keeps running on the device). That async semantics disclosure is exactly the kind of context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action, then the input options, then the timeout caveat. Dense with parenthetical asides but each sentence carries actionable content; slightly long for the amount of core instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 6 optional params, the description covers what an agent needs: inputs, size limits, reinstall semantics, and the failure/verification path. The device-disambiguation requirement lives in the channel_account_id schema description, so nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema carries the parameter burden (baseline 3). The description still adds value beyond it: the 300MB size ceiling and the APK/XAPK/APKS split-bundle framing, plus reinforcing the apk_url-over-base64 preference. Modest but real addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (install) and resource (app/APK on the Android device), and even clarifies the artifact types supported (APK/XAPK/APKS). An agent can distinguish it from android_launch_app (launch installed app) and android_list_apps (verify install) without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes between apk_url (preferred, only workable option for real apps) and apk_base64 (tiny payloads only), tells when to set reinstall=true (signature changes), and gives the alternative path on timeout: verify with the app-list tool rather than re-installing. No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.