Skip to main content
Glama

Robot Actions — Remote Device Control

Server Details

Drive real Android & iOS devices and web browsers from natural language for mobile + web QA. 290+ tools across device control, app management, automation sessions, browser automation, and flow recording / replay. Bearer-auth — get a token at robotactions.com → Profile → API Tokens.

Ownership verified
Status
Unhealthy
Last Tested
Transport
Streamable HTTP
URL

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updates
    • Changedautomation_report4 fields changed
      • changedInput schema / properties / endDate / description
        Previous value: -"ISO date (YYYY-MM-DD) — end of the window, inclusive."New value: +"ISO date (YYYY-MM-DD, zero-padded) — end of the window, inclusive."
      • addedInput schema / properties / endDate / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
      • changedInput schema / properties / startDate / description
        Previous value: -"ISO date (YYYY-MM-DD) — start of the window, inclusive."New value: +"ISO date (YYYY-MM-DD, zero-padded) — start of the window, inclusive."
      • addedInput schema / properties / startDate / pattern
        Added value: +"^\\d{4}-\\d{2}-\\d{2}$"
    • Changedautomation_session_commands1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max steps to return (default 200, which is also the ceiling)."New value: +"Max steps to return (default 200, which is also the ceiling). Returns the LAST n steps, not the first — a run that fell over did so at the end. On a long run that means the window can exclude the very failure `firstFailureIndex` points at, so use failuresOnly=true to land on it instead of raising this."
    • Addedautomation_session_step
    • Changedautomation_sessions_list8 fields changed
      • addedInput schema / properties / deviceUdid
        Added value: +{
        +  "description": "Only runs on this device (exact udid match).",
        +  "type": "string"
        +}
      • addedInput schema / properties / endDate
        Added value: +{
        +  "description": "ISO date (YYYY-MM-DD, zero-padded) — latest run to include.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • changedInput schema / properties / failedOnly / description
        Previous value: -"Only runs that failed — reported failures and inferred ones alike."New value: +"Only runs that failed — reported failures AND inferred ones, matching the verdict this tool reports."
      • changedInput schema / properties / limit / description
        Previous value: -"Max runs to return (default 50, which is also the ceiling)."New value: +"Max runs per page (default 50, which is also the ceiling)."
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Skip this many matching runs — page through with `total` to know when to stop.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / platform
        Added value: +{
        +  "description": "Only runs on this platform, e.g. \"android\", \"ios\", \"linux\".",
        +  "type": "string"
        +}
      • addedInput schema / properties / search
        Added value: +{
        +  "description": "Free text matched against session id, test name and suite. Use this for a pasted session id; the truncated form shown in the UI matches too.",
        +  "type": "string"
        +}
      • addedInput schema / properties / startDate
        Added value: +{
        +  "description": "ISO date (YYYY-MM-DD, zero-padded) — earliest run to include.",
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
  2. 5 tool updates
    • Addedautomation_build_link
    • Addedautomation_report
    • Addedautomation_session_commands
    • Addedautomation_session_get
    • Addedautomation_sessions_list
  3. 32 tool updates
    • Changeddevice_list_apps2 fields changed
      • addedInput schema / properties / includeNonLaunchable
        Added value: +{
        +  "description": "Include installed packages with no launcher activity — providers, services, OEM stubs. Default false.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / userOnly / description
        Previous value: -"Only list user-installed apps, excludes system apps (default: true)"New value: +"Only user-installed apps, excluding preinstalled ones (default: false)"
    • Changedios_list_apps1 field changed
      • addedInput schema / properties / includeInternal
        Added value: +{
        +  "description": "Include hidden system bundles — view services, XPC helpers, SpringBoard — and return the raw Info.plist dicts. Default false. Very large output.",
        +  "type": "boolean"
        +}
    • Addedplaywright_back
    • Addedplaywright_console_messages
    • Addedplaywright_drag
    • Addedplaywright_fill_form
    • Addedplaywright_forward
    • Addedplaywright_get_attribute
    • Addedplaywright_get_text
    • Addedplaywright_hover
    • Addedplaywright_network_requests
    • Addedplaywright_press_key
    • Addedplaywright_reload
    • Addedplaywright_resize
    • Addedplaywright_select_option
    • Addedplaywright_upload_file
    • Addedplaywright_wait_for
    • Addedweb_back
    • Addedweb_console_messages
    • Addedweb_drag
    • Addedweb_fill_form
    • Addedweb_forward
    • Addedweb_get_attribute
    • Addedweb_get_text
    • Addedweb_hover
    • Addedweb_network_requests
    • Addedweb_press_key
    • Addedweb_reload
    • Addedweb_resize
    • Addedweb_select_option
    • Addedweb_upload_file
    • Addedweb_wait_for
  4. 1 tool update
    • Addedios_supported_languages
  5. 6 tool updates
    • Changedios_find_element1 field changed
      • addedInput schema / properties / match
        Added value: +{
        +  "description": "How to match `label`. Default \"contains\" — strict, and the only modes that act without interpretation. \"fuzzy\" tolerates typos and word-order drift, and is tried ONLY after strict finds nothing; it REFUSES when two candidates are too close rather than guessing between them (e.g. \"Sign\" vs Sign In / Sign Out), and reports which attribute it matched.",
        +  "enum": [
        +    "exact",
        +    "contains",
        +    "fuzzy"
        +  ],
        +  "type": "string"
        +}
    • Changedios_send_keys1 field changed
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "Send even when no focused field is reported (default: false)",
        +  "type": "boolean"
        +}
    • Changedios_tap_by_label1 field changed
      • addedInput schema / properties / match
        Added value: +{
        +  "description": "How to match `label`. Default \"contains\" — strict, and the only modes that act without interpretation. \"fuzzy\" tolerates typos and word-order drift, and is tried ONLY after strict finds nothing; it REFUSES when two candidates are too close rather than guessing between them (e.g. \"Sign\" vs Sign In / Sign Out), and reports which attribute it matched.",
        +  "enum": [
        +    "exact",
        +    "contains",
        +    "fuzzy"
        +  ],
        +  "type": "string"
        +}
    • Addedwebpage_clear_browsing_data
    • Changedwebpage_reload1 field changed
      • addedInput schema / properties / hard
        Added value: +{
        +  "description": "Bypass the HTTP cache (CDP ignoreCache) — a from-network reload (default: false)",
        +  "type": "boolean"
        +}
    • Changedwebpage_type1 field changed
      • addedInput schema / properties / require
        Added value: +{
        +  "description": "Set to \"native\" to fail loudly when the device keyboard is unavailable, instead of silently falling back to setting .value (isTrusted:false). Use for fields that gate on real keystrokes. iOS only — Android has no native-keyboard path here.",
        +  "enum": [
        +    "native"
        +  ],
        +  "type": "string"
        +}
  6. 7 tool updates
    • Changedandroid_devtools_mock_add1 field changed
      • changedInput schema / properties / headers / description
        Previous value: -"Response headers for mode \"mock\", as {headerName: value} — e.g. {\"content-type\": \"application/json\"}"New value: +"Response headers for mode \"mock\", as {headerName: value} — e.g. {\"content-type\": \"application/json\"}. On iOS a `charset` in content-type is NOT applied to the response: an HTML body with non-ASCII characters must declare it in the document (e.g. <meta charset=\"utf-8\">) or it will be decoded with the default encoding and render as mojibake."
    • Addedfirebase_install_release
    • Addedfirebase_list_apps
    • Addedfirebase_list_releases
    • Changedios_safari_mock_add1 field changed
      • changedInput schema / properties / headers / description
        Previous value: -"Response headers for mode \"mock\", as {headerName: value} — e.g. {\"content-type\": \"application/json\"}"New value: +"Response headers for mode \"mock\", as {headerName: value} — e.g. {\"content-type\": \"application/json\"}. On iOS a `charset` in content-type is NOT applied to the response: an HTML body with non-ASCII characters must declare it in the document (e.g. <meta charset=\"utf-8\">) or it will be decoded with the default encoding and render as mojibake."
    • Addedios_syslog_capture
    • Changedwebpage_mock_add1 field changed
      • changedInput schema / properties / headers / description
        Previous value: -"Response headers for mode \"mock\", as {headerName: value} — e.g. {\"content-type\": \"application/json\"}"New value: +"Response headers for mode \"mock\", as {headerName: value} — e.g. {\"content-type\": \"application/json\"}. On iOS a `charset` in content-type is NOT applied to the response: an HTML body with non-ASCII characters must declare it in the document (e.g. <meta charset=\"utf-8\">) or it will be decoded with the default encoding and render as mojibake."
  7. 2 tool updates
    • Changedios_safari_evaluate3 fields changed
      • addedInput schema / properties / waitForSelector
        Added value: +{
        +  "description": "CSS selector to wait for BEFORE evaluating. Polls until it matches, then runs the expression. Errors if it never appears within waitTimeoutMs — it will not evaluate anyway and hand back a null that reads like a real answer",
        +  "type": "string"
        +}
      • addedInput schema / properties / waitMs
        Added value: +{
        +  "description": "Settle delay applied just before evaluating (and AFTER waitForSelector matches, when both are given). Use for animations that have started but not finished. Maximum 10000 ms",
        +  "maximum": 10000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / waitTimeoutMs
        Added value: +{
        +  "description": "How long waitForSelector may poll. Default 5000 ms, maximum 15000 ms",
        +  "maximum": 15000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Addedios_safari_set_input_files
  8. 6 tool updates
    • Changedandroid_accessibility_audit2 fields changed
      • changedInput schema / properties / checks / description
        Previous value: -"Checks to run; omit for all. \"TouchTargetSize\" = tap targets below the recommended minimum; \"DuplicateClickableBounds\" = several tappable elements on identical bounds; \"MissingClickAction\" = a button-class element exposing no click action; \"RedundantDescription\" = description restates type/state/action; \"ClassName\" = control reports an uninterpretable class."New value: +"Checks to run; omit for all. \"TouchTargetSize\" = tap targets below the recommended minimum; \"DuplicateClickableBounds\" = several tappable elements on identical bounds; \"MissingClickAction\" = a button-class element exposing no click action; \"SpeakableTextPresent\" = an actionable control with no text, content description or labelled descendant; \"RedundantDescription\" = description restates type/state/action; \"ClassName\" = control reports an uninterpretable class."
      • changedInput schema / properties / checks / items / enum
        Previous value: -[
        -  "TouchTargetSize",
        -  "DuplicateClickableBounds",
        -  "MissingClickAction",
        -  "RedundantDescription",
        -  "ClassName"
        -]New value: +[
        +  "TouchTargetSize",
        +  "DuplicateClickableBounds",
        +  "MissingClickAction",
        +  "SpeakableTextPresent",
        +  "RedundantDescription",
        +  "ClassName"
        +]
    • Addedios_file_copy
    • Addedios_file_find
    • Addedios_file_mkdir
    • Addedios_file_move
    • Addedios_upload_targets
  9. 32 tool updates
    • Removedandroid_mitm_flows
    • Removedandroid_mitm_mock_add
    • Removedandroid_mitm_mock_list
    • Removedandroid_mitm_mock_remove
    • Removedandroid_mitm_start
    • Removedandroid_mitm_status
    • Removedandroid_mitm_stop
    • Addedandroid_traffic_flows
    • Addedandroid_traffic_mock_add
    • Addedandroid_traffic_mock_list
    • Addedandroid_traffic_mock_remove
    • Addedandroid_traffic_start
    • Addedandroid_traffic_status
    • Addedandroid_traffic_stop
    • Removedios_mitm_flows
    • Removedios_mitm_mock_add
    • Removedios_mitm_mock_list
    • Removedios_mitm_mock_remove
    • Removedios_mitm_start
    • Removedios_mitm_status
    • Removedios_mitm_stop
    • Addedios_traffic_flows
    • Addedios_traffic_mock_add
    • Addedios_traffic_mock_list
    • Addedios_traffic_mock_remove
    • Addedios_traffic_start
    • Addedios_traffic_status
    • Addedios_traffic_stop
    • Addedtestrail_find_cases
    • Addedtestrail_list_all_cases
    • Addedtestrail_list_cases
    • Changedtestrail_list_runs2 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max runs to return (TestRail default 250)"New value: +"Max runs to return in this page (TestRail default 250)"
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Row offset for paging past the first page",
        +  "minimum": 0,
        +  "type": "integer"
        +}
  10. 7 tool updates
    • Changedios_safari_capture_network1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
    • Changedios_safari_console_logs1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
    • Changedios_safari_cookies1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
    • Changedios_safari_elements1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
    • Changedios_safari_evaluate1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
    • Changedios_safari_get_dom1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
    • Changedios_safari_navigate1 field changed
      • changedInput schema / properties / pageId / description
        Previous value: -"CDP target id from ios_safari_list_pages — auto-picked when omitted"New value: +"CDP target id from ios_safari_list_pages. Omit it to use the page ios_safari_navigate last landed on (or, failing that, the first loaded page) — only pass it to target a DIFFERENT tab"
  11. 1 tool update
    • Changedandroid_accessibility_audit4 fields changed
      • changedInput schema / properties / checks / description
        Previous value: -"Checks to run; omit for all. \"TouchTargetSize\" = tap targets below the recommended minimum; \"DuplicateClickableBounds\" = several tappable elements on identical bounds; \"RedundantDescription\" = description restates type/state/action; \"ClassName\" = control reports an uninterpretable class."New value: +"Checks to run; omit for all. \"TouchTargetSize\" = tap targets below the recommended minimum; \"DuplicateClickableBounds\" = several tappable elements on identical bounds; \"MissingClickAction\" = a button-class element exposing no click action; \"RedundantDescription\" = description restates type/state/action; \"ClassName\" = control reports an uninterpretable class."
      • changedInput schema / properties / checks / items / enum
        Previous value: -[
        -  "TouchTargetSize",
        -  "DuplicateClickableBounds",
        -  "RedundantDescription",
        -  "ClassName"
        -]New value: +[
        +  "TouchTargetSize",
        +  "DuplicateClickableBounds",
        +  "MissingClickAction",
        +  "RedundantDescription",
        +  "ClassName"
        +]
      • addedInput schema / properties / maxScrollSteps
        Added value: +{
        +  "description": "Only with scroll:true. Maximum scrolls before stopping regardless (default 6, max 20).",
        +  "maximum": 20,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / scroll
        Added value: +{
        +  "description": "Defaults false. When true, audit the screen, scroll down, and audit again — repeating until a pass reveals no new elements or maxScrollSteps is reached — then report the deduplicated union. This CHANGES THE SCREEN: it scrolls the app and does not scroll back, and on a lazily-loaded list it will trigger loading. Leave it off when the app must not be disturbed.",
        +  "type": "boolean"
        +}
  12. 1 tool update
    • Addedandroid_accessibility_audit
  13. 1 tool update
    • Addedios_voiceover_preview
  14. 1 tool update
    • Removedios_voiceover_preview
  15. 1 tool update
    • Addedios_voiceover_preview
  16. 35 tool updates
    • Addedandroid_devtools_mock_add
    • Addedandroid_devtools_mock_clear
    • Addedandroid_devtools_mock_list
    • Addedandroid_devtools_mock_remove
    • Addedandroid_devtools_mock_status
    • Addedios_accessibility_audit
    • Addedios_file_delete
    • Addedios_file_list
    • Addedios_file_pull
    • Addedios_file_push
    • Addedios_file_stat
    • Changedios_key_hid2 fields changed
      • changedInput schema / properties / usages / description
        Previous value: -"Ordered USB HID Keyboard/Keypad usage codes to send (numbers, e.g. [0x04] for \"a\")"New value: +"Ordered USB HID Keyboard/Keypad usage codes to press together (numbers, e.g. [0x04] for \"a\"). Empty list = release any keys left held."
      • removedInput schema / properties / usages / minItems
        Removed value: -1
    • Addedios_safari_mock_add
    • Addedios_safari_mock_clear
    • Addedios_safari_mock_list
    • Addedios_safari_mock_remove
    • Addedios_safari_mock_status
    • Removedweb_get_dom
    • Addedwebpage_cdp_command
    • Changedwebpage_click7 fields changed
      • addedInput schema / properties / force
        Added value: +{
        +  "description": "Skip the clickability checks and dispatch at the element center regardless (default: false). Use only when the checks are wrong about a target you know is clickable — it restores the old behaviour, where a click on a hidden or covered element reports success without doing anything. Needs a center to aim at, so it still fails on a display:none or zero-size element; it does apply to visibility:hidden, opacity:0, pointer-events:none, disabled, off-viewport, and covered targets.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / pointerType
        Added value: +{
        +  "description": "How the tap is delivered. You rarely need this — the default is the best path each platform has (a real device tap on iOS, a browser touch on Android). \"touch\" is what a finger produces and drives elements that listen for pointer events, which many component libraries bind. On Android a touch also produces mousedown/mouseup unless a handler cancels pointerdown or touchstart — and when one does, click is suppressed too, which is when \"mouse\" is the way through. \"mouse\" sends mouse events only, and on iOS it opts OUT of the device tap in favour of the browser-level path, which delivers only mouseup+click and is not trusted. The response reports which was used via `via`.",
        +  "enum": [
        +    "touch",
        +    "mouse"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the element to click"New value: +"CSS selector for the target element. Provide this or `ref`."
      • addedInput schema / properties / snapshot
        Added value: +{
        +  "description": "Append a webpage_snapshot of the resulting page (actionable elements only) so you can see what the click changed without a second call (default: false)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / timeoutMs
        Added value: +{
        +  "description": "How long to keep retrying while the element is not yet clickable (default: 5000, max: 30000)",
        +  "maximum": 30000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector"
        -]New value: +[
        +  "udid"
        +]
    • Changedwebpage_get_attribute3 fields changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the element"New value: +"CSS selector for the target element. Provide this or `ref`."
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector",
        -  "name"
        -]New value: +[
        +  "udid",
        +  "name"
        +]
    • Addedwebpage_get_dom
    • Changedwebpage_get_text3 fields changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the element to read"New value: +"CSS selector for the target element. Provide this or `ref`."
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector"
        -]New value: +[
        +  "udid"
        +]
    • Changedwebpage_hover3 fields changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the element to hover"New value: +"CSS selector for the target element. Provide this or `ref`."
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector"
        -]New value: +[
        +  "udid"
        +]
    • Addedwebpage_mock_add
    • Addedwebpage_mock_clear
    • Addedwebpage_mock_list
    • Addedwebpage_mock_remove
    • Addedwebpage_mock_status
    • Changedwebpage_screenshot1 field changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Android only: capture just this element, named by a ref from a page-elements listing",
        +  "type": "string"
        +}
    • Changedwebpage_scroll_into_view3 fields changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the element to scroll into view"New value: +"CSS selector for the target element. Provide this or `ref`."
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector"
        -]New value: +[
        +  "udid"
        +]
    • Changedwebpage_select_option3 fields changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the <select> element"New value: +"CSS selector for the target element. Provide this or `ref`."
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector"
        -]New value: +[
        +  "udid"
        +]
    • Addedwebpage_snapshot
    • Addedwebpage_tabs
    • Changedwebpage_type3 fields changed
      • addedInput schema / properties / ref
        Added value: +{
        +  "description": "Element ref from a page-elements listing, e.g. \"e12\". Provide this or `selector`. A ref points straight at the element it was issued for, so it survives markup that shifted position, and it can address elements no CSS selector can reach from the top of the page.",
        +  "type": "string"
        +}
      • changedInput schema / properties / selector / description
        Previous value: -"CSS selector for the input/textarea element"New value: +"CSS selector for the target element. Provide this or `ref`."
      • changedInput schema / required
        Previous value: -[
        -  "udid",
        -  "selector",
        -  "text"
        -]New value: +[
        +  "udid",
        +  "text"
        +]
  17. 1 tool update
    • Addeddevice_release

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables AI assistants to automate mobile app testing and development for iOS and Android through natural language interactions. Supports intelligent element identification, session management, automated test generation, and comprehensive device interactions including clicks, swipes, screenshots, and app management.
    31
    12,466
    467
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to control mobile and desktop devices with natural language, including running automation tasks, taking screenshots, and managing devices.
    6
    5
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables Claude Desktop to automate web browsers and mobile applications (iOS/Android) using WebDriverIO. Supports browser automation, mobile app testing, touch gestures, app lifecycle management, and hybrid app context switching through natural language.
    31
    4,349
    37
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

B3.1/5.0
Disambiguation2/5

The set contains near-identical duplicate families: web_* and playwright_* expose ~15 pairs of the same desktop-grid-browser operations (web_get_text/playwright_get_text, web_reload/playwright_reload), and screenshot/log/network/mock capabilities each have 5-8 entry points (device_screenshot vs android_mjpeg_screenshot vs ios_screenshot vs ios_fast_screenshot vs web_screenshot vs webpage_screenshot vs session_screenshot). Many individual descriptions carefully draw boundaries (devtools vs traffic, HID vs session), but an agent cannot reliably distinguish web_* from playwright_*, and ios_screenshot/ios_fast_screenshot/ios_mjpeg_screenshot blur together.

Naming Consistency2/5

The prefix scheme is broken: Android functionality is split arbitrarily between android_* and device_* (device_screenshot vs android_mjpeg_screenshot), the desktop browser gets two parallel prefixes (web_* and playwright_*), and verbs vary across equivalents (device_navigate_url vs web_navigate vs ios_safari_navigate). session_* uses bare verbs (session_url, session_back), and the same concept gets different names (ios_clipboard_get_hid vs ios_get_pasteboard; device_screen vs ios_orientation).

Tool Count1/5

333 tools is an extreme count by any measure — far beyond the 50+ threshold — and much of the bulk is duplicative (the web_*/playwright_* pairs alone double ~15 slots) or out-of-scope for a device-control server (TestRail, Jira, AzDO, agent memory, secret variables, feedback). Even granting that remote device control + test automation is a broad domain, this surface will devastate agent context budgets and is impossible to navigate coherently.

Completeness4/5

The core device-control and test-automation domain is remarkably thorough: Android and iOS each have full interaction, app-lifecycle, file, network/proxy, performance, crash, accessibility, recording, and replay coverage, with CRUD lifecycles for flows, suites, app uploads, TestRail cases, and visual-review baselines. Minor gaps exist at the margins — Jira/AzDO lack update/transition/comment operations, and iOS cannot open/close tabs — but the central workflows have no dead ends.

Resources