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.
- 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.
4 tool updates
- Changed
automation_report4 fields changed- changed
Input schema / properties / endDate / descriptionPrevious 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." - added
Input schema / properties / endDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$" - changed
Input schema / properties / startDate / descriptionPrevious 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." - added
Input schema / properties / startDate / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2}$"
- Changed
automation_session_commands1 field changed- changed
Input schema / properties / limit / descriptionPrevious 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."
- Added
automation_session_step - Changed
automation_sessions_list8 fields changed- added
Input schema / properties / deviceUdidAdded value: +{ + "description": "Only runs on this device (exact udid match).", + "type": "string" +} - added
Input schema / properties / endDateAdded value: +{ + "description": "ISO date (YYYY-MM-DD, zero-padded) — latest run to include.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - changed
Input schema / properties / failedOnly / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious 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)." - added
Input schema / properties / offsetAdded value: +{ + "description": "Skip this many matching runs — page through with `total` to know when to stop.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / platformAdded value: +{ + "description": "Only runs on this platform, e.g. \"android\", \"ios\", \"linux\".", + "type": "string" +} - added
Input schema / properties / searchAdded 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" +} - added
Input schema / properties / startDateAdded value: +{ + "description": "ISO date (YYYY-MM-DD, zero-padded) — earliest run to include.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +}
5 tool updates
- Added
automation_build_link - Added
automation_report - Added
automation_session_commands - Added
automation_session_get - Added
automation_sessions_list
32 tool updates
- Changed
device_list_apps2 fields changed- added
Input schema / properties / includeNonLaunchableAdded value: +{ + "description": "Include installed packages with no launcher activity — providers, services, OEM stubs. Default false.", + "type": "boolean" +} - changed
Input schema / properties / userOnly / descriptionPrevious value: -"Only list user-installed apps, excludes system apps (default: true)"New value: +"Only user-installed apps, excluding preinstalled ones (default: false)"
- Changed
ios_list_apps1 field changed- added
Input schema / properties / includeInternalAdded 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" +}
- Added
playwright_back - Added
playwright_console_messages - Added
playwright_drag - Added
playwright_fill_form - Added
playwright_forward - Added
playwright_get_attribute - Added
playwright_get_text - Added
playwright_hover - Added
playwright_network_requests - Added
playwright_press_key - Added
playwright_reload - Added
playwright_resize - Added
playwright_select_option - Added
playwright_upload_file - Added
playwright_wait_for - Added
web_back - Added
web_console_messages - Added
web_drag - Added
web_fill_form - Added
web_forward - Added
web_get_attribute - Added
web_get_text - Added
web_hover - Added
web_network_requests - Added
web_press_key - Added
web_reload - Added
web_resize - Added
web_select_option - Added
web_upload_file - Added
web_wait_for
1 tool update
- Added
ios_supported_languages
6 tool updates
- Changed
ios_find_element1 field changed- added
Input schema / properties / matchAdded 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" +}
- Changed
ios_send_keys1 field changed- added
Input schema / properties / forceAdded value: +{ + "description": "Send even when no focused field is reported (default: false)", + "type": "boolean" +}
- Changed
ios_tap_by_label1 field changed- added
Input schema / properties / matchAdded 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" +}
- Added
webpage_clear_browsing_data - Changed
webpage_reload1 field changed- added
Input schema / properties / hardAdded value: +{ + "description": "Bypass the HTTP cache (CDP ignoreCache) — a from-network reload (default: false)", + "type": "boolean" +}
- Changed
webpage_type1 field changed- added
Input schema / properties / requireAdded 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" +}
7 tool updates
- Changed
android_devtools_mock_add1 field changed- changed
Input schema / properties / headers / descriptionPrevious 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."
- Added
firebase_install_release - Added
firebase_list_apps - Added
firebase_list_releases - Changed
ios_safari_mock_add1 field changed- changed
Input schema / properties / headers / descriptionPrevious 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."
- Added
ios_syslog_capture - Changed
webpage_mock_add1 field changed- changed
Input schema / properties / headers / descriptionPrevious 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."
2 tool updates
- Changed
ios_safari_evaluate3 fields changed- added
Input schema / properties / waitForSelectorAdded 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" +} - added
Input schema / properties / waitMsAdded 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" +} - added
Input schema / properties / waitTimeoutMsAdded value: +{ + "description": "How long waitForSelector may poll. Default 5000 ms, maximum 15000 ms", + "maximum": 15000, + "minimum": 0, + "type": "integer" +}
- Added
ios_safari_set_input_files
6 tool updates
- Changed
android_accessibility_audit2 fields changed- changed
Input schema / properties / checks / descriptionPrevious 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." - changed
Input schema / properties / checks / items / enumPrevious value: -[ - "TouchTargetSize", - "DuplicateClickableBounds", - "MissingClickAction", - "RedundantDescription", - "ClassName" -]New value: +[ + "TouchTargetSize", + "DuplicateClickableBounds", + "MissingClickAction", + "SpeakableTextPresent", + "RedundantDescription", + "ClassName" +]
- Added
ios_file_copy - Added
ios_file_find - Added
ios_file_mkdir - Added
ios_file_move - Added
ios_upload_targets
32 tool updates
- Removed
android_mitm_flows - Removed
android_mitm_mock_add - Removed
android_mitm_mock_list - Removed
android_mitm_mock_remove - Removed
android_mitm_start - Removed
android_mitm_status - Removed
android_mitm_stop - Added
android_traffic_flows - Added
android_traffic_mock_add - Added
android_traffic_mock_list - Added
android_traffic_mock_remove - Added
android_traffic_start - Added
android_traffic_status - Added
android_traffic_stop - Removed
ios_mitm_flows - Removed
ios_mitm_mock_add - Removed
ios_mitm_mock_list - Removed
ios_mitm_mock_remove - Removed
ios_mitm_start - Removed
ios_mitm_status - Removed
ios_mitm_stop - Added
ios_traffic_flows - Added
ios_traffic_mock_add - Added
ios_traffic_mock_list - Added
ios_traffic_mock_remove - Added
ios_traffic_start - Added
ios_traffic_status - Added
ios_traffic_stop - Added
testrail_find_cases - Added
testrail_list_all_cases - Added
testrail_list_cases - Changed
testrail_list_runs2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max runs to return (TestRail default 250)"New value: +"Max runs to return in this page (TestRail default 250)" - added
Input schema / properties / offsetAdded value: +{ + "description": "Row offset for paging past the first page", + "minimum": 0, + "type": "integer" +}
7 tool updates
- Changed
ios_safari_capture_network1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
- Changed
ios_safari_console_logs1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
- Changed
ios_safari_cookies1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
- Changed
ios_safari_elements1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
- Changed
ios_safari_evaluate1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
- Changed
ios_safari_get_dom1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
- Changed
ios_safari_navigate1 field changed- changed
Input schema / properties / pageId / descriptionPrevious 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"
1 tool update
- Changed
android_accessibility_audit4 fields changed- changed
Input schema / properties / checks / descriptionPrevious 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." - changed
Input schema / properties / checks / items / enumPrevious value: -[ - "TouchTargetSize", - "DuplicateClickableBounds", - "RedundantDescription", - "ClassName" -]New value: +[ + "TouchTargetSize", + "DuplicateClickableBounds", + "MissingClickAction", + "RedundantDescription", + "ClassName" +] - added
Input schema / properties / maxScrollStepsAdded value: +{ + "description": "Only with scroll:true. Maximum scrolls before stopping regardless (default 6, max 20).", + "maximum": 20, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / scrollAdded 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" +}
1 tool update
- Added
android_accessibility_audit
1 tool update
- Added
ios_voiceover_preview
1 tool update
- Removed
ios_voiceover_preview
1 tool update
- Added
ios_voiceover_preview
35 tool updates
- Added
android_devtools_mock_add - Added
android_devtools_mock_clear - Added
android_devtools_mock_list - Added
android_devtools_mock_remove - Added
android_devtools_mock_status - Added
ios_accessibility_audit - Added
ios_file_delete - Added
ios_file_list - Added
ios_file_pull - Added
ios_file_push - Added
ios_file_stat - Changed
ios_key_hid2 fields changed- changed
Input schema / properties / usages / descriptionPrevious 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." - removed
Input schema / properties / usages / minItemsRemoved value: -1
- Added
ios_safari_mock_add - Added
ios_safari_mock_clear - Added
ios_safari_mock_list - Added
ios_safari_mock_remove - Added
ios_safari_mock_status - Removed
web_get_dom - Added
webpage_cdp_command - Changed
webpage_click7 fields changed- added
Input schema / properties / forceAdded 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" +} - added
Input schema / properties / pointerTypeAdded 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" +} - added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the element to click"New value: +"CSS selector for the target element. Provide this or `ref`." - added
Input schema / properties / snapshotAdded 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" +} - added
Input schema / properties / timeoutMsAdded value: +{ + "description": "How long to keep retrying while the element is not yet clickable (default: 5000, max: 30000)", + "maximum": 30000, + "minimum": 0, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector" -]New value: +[ + "udid" +]
- Changed
webpage_get_attribute3 fields changed- added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the element"New value: +"CSS selector for the target element. Provide this or `ref`." - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector", - "name" -]New value: +[ + "udid", + "name" +]
- Added
webpage_get_dom - Changed
webpage_get_text3 fields changed- added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the element to read"New value: +"CSS selector for the target element. Provide this or `ref`." - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector" -]New value: +[ + "udid" +]
- Changed
webpage_hover3 fields changed- added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the element to hover"New value: +"CSS selector for the target element. Provide this or `ref`." - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector" -]New value: +[ + "udid" +]
- Added
webpage_mock_add - Added
webpage_mock_clear - Added
webpage_mock_list - Added
webpage_mock_remove - Added
webpage_mock_status - Changed
webpage_screenshot1 field changed- added
Input schema / properties / refAdded value: +{ + "description": "Android only: capture just this element, named by a ref from a page-elements listing", + "type": "string" +}
- Changed
webpage_scroll_into_view3 fields changed- added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the element to scroll into view"New value: +"CSS selector for the target element. Provide this or `ref`." - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector" -]New value: +[ + "udid" +]
- Changed
webpage_select_option3 fields changed- added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the <select> element"New value: +"CSS selector for the target element. Provide this or `ref`." - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector" -]New value: +[ + "udid" +]
- Added
webpage_snapshot - Added
webpage_tabs - Changed
webpage_type3 fields changed- added
Input schema / properties / refAdded 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" +} - changed
Input schema / properties / selector / descriptionPrevious value: -"CSS selector for the input/textarea element"New value: +"CSS selector for the target element. Provide this or `ref`." - changed
Input schema / requiredPrevious value: -[ - "udid", - "selector", - "text" -]New value: +[ + "udid", + "text" +]
1 tool update
- Added
device_release
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Control real Android and iOS devices with LLM agents — tap, swipe, type, automate flows.
Automate cloud Chrome—navigate, click, type, screenshot, run code, record screen video
AI-powered browser automation — navigate, click, fill forms, and extract data from any website.
Cloud iOS simulators and Android emulators your agent can create, drive, and throw away.
Related MCP Servers
AlicenseBqualityAmaintenanceEnables 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.3112,466467Apache 2.0- AlicenseAqualityBmaintenanceEnables AI assistants to control mobile and desktop devices with natural language, including running automation tasks, taking screenshots, and managing devices.65MIT

MobAI MCP Serverofficial
AlicenseAqualityBmaintenanceEnables AI assistants to automate mobile devices (Android and iOS) through a single DSL interface, supporting actions like tap, type, swipe, and assertions.20176244Apache 2.0- AlicenseAqualityAmaintenanceEnables 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.314,34937MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
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.
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).
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.
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.