Skip to main content
Glama

act

Destructive

Runs ordered gestures on an Android phone—tap, type, swipe, scroll, wait—and returns the updated screen. Stops at the first failure and can save or replay routines.

Instructions

Gestures on the phone, in order (stops at the first error), then the updated screen. Steps: tap, long_press, double_tap, type (any text, accents and emoji included; target = field to tap first; non-ASCII is pasted through the clipboard, which is then given back to the user unchanged), clear, key (back, home, recent, delete, ctrl+a, arrows, tab, volume; enter and other KEYCODE_*: confirm=true + accord, alone in their step), scroll (direction = reading direction: down to see what follows), swipe (target → to), drag (held, moved, dropped: target → to), zoom (direction in|out, target = center, amount 1-3), wait (text appeared, or gone=true), open_url (text = address or app link). Target: "[N]" (brackets; a bare number is text), visible text or "x,y" image pixels; judged on the screen read again just before the gesture. Report: ✓ effect read back, ~ sent not verified, ✗ failed/refused, ? link lost (unknown effect). then: auto (default: elements, plus the image if a step is ✗ ?, or ~ on an unchanged screen, or nothing is readable), both, image, elements, changes (text only: elements added "+", changed "~" and removed "-" since the last list, unchanged ones counted; [N] numbers stay valid for the next act; full list when there is no previous list, the foreground app changed or most of the screen did), none. Example: steps=[{"do":"tap","target":"Search"},{"do":"type","text":"wifi"}]. Stable targets: "id:" or "desc:" (shown as #id and (description) by look). Routines, shared by every agent: remember="name" saves the batch when every step went through, targets kept by stable names (id:, text, desc:; never [N] or coordinates); a typed text made only of {{x}} becomes a parameter. routine="name" (without steps) replays it, params={"x": "..."} (with remember: the values used while recording); remember="name" with steps=[] forgets it. Guardrails apply on replay as on any gesture (confirm and accord are never saved).

Input Schema

NameRequiredDescriptionDefault
thenNoauto
stepsNo
paramsNo
routineNo
rememberNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv0.9.10
    • changedInput schema / properties / then / default
      Previous value: -"both"New value: +"auto"
    • changedInput schema / properties / then / enum
      Previous value: -[
      -  "both",
      -  "image",
      -  "elements",
      -  "changes",
      -  "none"
      -]New value: +[
      +  "auto",
      +  "both",
      +  "image",
      +  "elements",
      +  "changes",
      +  "none"
      +]
  2. Changed22 schema fields changedv0.9.3
    • changedInput schema / $defs / Step / description
      Previous value: -"Un geste. `do` + les champs utiles."New value: +"One gesture: `do` plus the fields it uses."
    • addedInput schema / $defs / Step / properties / accord
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Outward gesture (send, call, pay, publish): the token the tool returned for THIS exact action, after the user's yes to its summary",
      +  "title": "Accord"
      +}
    • changedInput schema / $defs / Step / properties / amount / description
      Previous value: -"scroll : crans (1 par défaut)"New value: +"scroll: notches (default 1); zoom: strength 1-3 (default 1)"
    • changedInput schema / $defs / Step / properties / confirm / description
      Previous value: -"Seulement sur l'ordre explicite de l'utilisateur pour CE geste, ou après son « oui » à la question posée"New value: +"Only on the user's explicit order for THIS gesture, or after their \"yes\" to the question asked"
    • changedInput schema / $defs / Step / properties / direction / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "up",
      -      "down",
      -      "left",
      -      "right"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "up",
      +      "down",
      +      "left",
      +      "right",
      +      "in",
      +      "out"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / $defs / Step / properties / direction / description
      Previous value: -"scroll/swipe : sens du contenu"New value: +"scroll/swipe: content direction; zoom: in (enlarge) or out"
    • changedInput schema / $defs / Step / properties / do / enum
      Previous value: -[
      -  "tap",
      -  "long_press",
      -  "double_tap",
      -  "type",
      -  "clear",
      -  "key",
      -  "swipe",
      -  "scroll",
      -  "wait",
      -  "open_url"
      -]New value: +[
      +  "tap",
      +  "long_press",
      +  "double_tap",
      +  "type",
      +  "clear",
      +  "key",
      +  "swipe",
      +  "scroll",
      +  "wait",
      +  "open_url",
      +  "zoom",
      +  "drag"
      +]
    • changedInput schema / $defs / Step / properties / gone / description
      Previous value: -"wait : attendre la disparition"New value: +"wait: wait for the text to disappear"
    • changedInput schema / $defs / Step / properties / keys / description
      Previous value: -"key : back, home, recent, enter, delete, ctrl+a… ou KEYCODE_*"New value: +"key: back, home, recent, enter, delete, ctrl+a… or KEYCODE_*"
    • changedInput schema / $defs / Step / properties / target / description
      Previous value: -"\"[N]\" du dernier look, texte visible ou \"x,y\" image"New value: +"\"[N]\" from the last look, visible text, or \"x,y\" in image pixels"
    • changedInput schema / $defs / Step / properties / text / description
      Previous value: -"type : texte (accents et emoji permis) ; wait : texte attendu ; open_url : adresse"New value: +"type: text (accents and emoji allowed); wait: expected text; open_url: address"
    • changedInput schema / $defs / Step / properties / timeout / description
      Previous value: -"wait : secondes (5 par défaut, 30 max)"New value: +"wait: seconds (default 5, max 30)"
    • changedInput schema / $defs / Step / properties / to / description
      Previous value: -"swipe : arrivée, \"x,y\" image, \"[N]\" ou texte visible"New value: +"swipe/drag: end point, \"x,y\" image pixels, \"[N]\" or visible text"
    • addedInput schema / properties / params
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Params"
      +}
    • addedInput schema / properties / remember
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Remember"
      +}
    • addedInput schema / properties / routine
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Routine"
      +}
    • addedInput schema / properties / steps / anyOf
      Added value: +[
      +  {
      +    "items": {
      +      "$ref": "#/$defs/Step"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / steps / default
      Added value: +null
    • removedInput schema / properties / steps / items
      Removed value: -{
      -  "$ref": "#/$defs/Step"
      -}
    • removedInput schema / properties / steps / type
      Removed value: -"array"
    • changedInput schema / properties / then / enum
      Previous value: -[
      -  "both",
      -  "image",
      -  "elements",
      -  "none"
      -]New value: +[
      +  "both",
      +  "image",
      +  "elements",
      +  "changes",
      +  "none"
      +]
    • removedInput schema / required
      Removed value: -[
      -  "steps"
      -]
  3. Changed1 schema field changedv0.4.1
    • changedInput schema / $defs / Step / properties / confirm / description
      Previous value: -"Uniquement après un « oui » explicite de l'utilisateur pour cette action"New value: +"Seulement sur l'ordre explicite de l'utilisateur pour CE geste, ou après son « oui » à la question posée"
  4. First observedv0.3.1

TDQS

A3.9/5.0
Behavior5/5

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

Annotations already flag destructive, non-idempotent, open-world behavior, and the description adds substantial context beyond them: execution stops at the first error, the clipboard is restored after non-ASCII typing, result symbols ✓ ~ ✗ ? define what 'success' means, and routines persist across agents with guardrails reapplied on replay (confirm/accord never saved). This is unusually rich disclosure of side effects, failure modes and persistence semantics.

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

Conciseness3/5

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

Content is dense and earns much of its length, but it is delivered as one run-on block with heavy parenthetical nesting and symbols, so key points like the error-stops-batch rule are buried. Front-loading is partial: the first clause is good, then the text degrades into an unstructured enumeration.

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

Completeness4/5

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

For a complex multi-step mutating tool with no output schema, this covers most of what an agent needs: step vocabulary, result reporting, screen-output modes, and routine persistence. It assumes familiarity with `look` ('shown as #id and (description) by look') and omits permission/prerequisite details, but nothing essential to a correct call is absent.

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?

With 0% schema description coverage on the top-level parameters, the description carries the load and mostly succeeds: it explains every `then` mode including the subtle `changes` semantics and [N] validity, the remember/routine/params lifecycle, target formats ('[N]', bare text, 'x,y', id:/desc:), and direction/amount meaning. Only minor gaps remain (e.g. interaction between `routine` and `steps`, timeout behavior).

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

Purpose4/5

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

States a specific verb and resource ('Gestures on the phone, in order') and enumerates every gesture type, so an agent knows exactly what class of action this performs. It does not explicitly name the sibling `look` as the observe-only counterpart, so differentiation is inferred from the enumerated steps rather than stated.

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

Usage Guidelines3/5

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

Usage context is implied by the step list and by the confirm/accord guardrail notes ('Only on the user's explicit order for THIS gesture'), which is real guidance. However, the description never says when to call `act` versus `look` or how to sequence observation before interaction, leaving the main routing decision to inference.

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