MCP Appium - Mobile Development and Automation Server
NPM · APPIUM-MCP · SCANNED SEP 22
MCP server for Appium mobile automation on iOS and Android devices with test creation tools.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security85
- No malware found by supply-chain analysis.Pass
- CVE check failed: a known high-severity CVE affects js-yaml 4.1.0, reached via applesign > mocha > js-yaml. A fixed version is available. View diagnostics → Fail
- No install/post-install scripts declared.Pass
- Dependency health was assessed across the 400 of 672 dependencies we could resolve, so this covers what we could see, not the whole tree. View diagnostics → Partial
Provenance & Transparency71
- Repository check failed: no source repository is declared. See how to fix → View diagnostics → Fail
- Cryptographically verified build provenance (signed, bound to appium/appium-mcp). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability78
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6834 tokens (~195/item across 35 items; 31 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
- Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "appium_drag_and_drop" implies "drop" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 33 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
How do I install the MCP Appium - Mobile Development and Automation Server server?
MCP Appium - Mobile Development and Automation Server runs locally as an npm package, launched with npx -y appium-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · appium-mcp
claude mcp add appium-appium-mcp -- npx -y appium-mcp
{
"mcpServers": {
"appium-appium-mcp": {
"command": "npx",
"args": [
"-y",
"appium-mcp"
]
}
}
} {
"servers": {
"appium-appium-mcp": {
"command": "npx",
"args": [
"-y",
"appium-mcp"
]
}
}
} codex mcp add appium-appium-mcp -- npx -y appium-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"appium-appium-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"appium-mcp"
],
"enabled": true
}
}
} openclaw mcp add appium-appium-mcp --command npx --arg -y --arg appium-mcp
mcp_servers:
appium-appium-mcp:
command: "npx"
args: ["-y", "appium-mcp"] {
"McpServers": {
"appium-appium-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"appium-mcp"
]
}
}
} assistant mcp add appium-appium-mcp -t stdio -c npx -a -y appium-mcp
{
"mcpServers": {
"appium-appium-mcp": {
"command": "npx",
"args": [
"-y",
"appium-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 −1
- Stability: pass → 0.90 functional
- 20 Sept 26 0
- Stability: 0.97 → pass security
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 −2
- Stability: pass → 0.87 functional
- 14 Sept 26 0
- Stability: 0.97 → pass security
- 13 Sept 26 0
- Stability: pass → 0.97 functional
- 11 Sept 26 0
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 22 Sept 2026 · Analysed npm/appium-mcp@1.94.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | appium/appium-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/appium/appium-mcp/.github/workflows/publish.yml@refs/heads/main |
| Rekor log index | 2778008978 |
| Predicate type | https://slsa.dev/provenance/v1 |
| Subject digest | sha512:a918466234d3121e5dfd8a7d706211d3f9a729241e1e6afa353ba281eb6b51883fa693fff8e074c91602d771cb73f1ae6da21ef8c9600aea7ca95bc16 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 18 findings
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-73rr-hh4g-fpgx | CVE-2026-24001 | low | yes | |
| GHSA-2883-xcg3-v3hh | CVE-2026-84375 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-52cp-r559-cp3m | CVE-2026-59869 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-5p4m-2wfm-xmqj | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes | |
| GHSA-h67p-54hq-rp68 | CVE-2026-53550 | medium | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L | yes |
| GHSA-mh29-5h37-fv8m | CVE-2025-64718 | medium | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N | yes |
| GHSA-23c5-xmqv-rm74 | CVE-2026-27904 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-3ppc-4f35-3m26 | CVE-2026-26996 | high | yes | |
| GHSA-7r86-cg39-jmmj | CVE-2026-27903 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-jxfw-x594-9x9m | CVE-2026-15603 | medium | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N | yes |
| GHSA-28wg-ghj8-5hjv | CVE-2026-67214 | medium | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-2v37-7h3g-55p8 | CVE-2026-67213 | medium | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-mwcw-c2x4-8c55 | CVE-2024-55565 | medium | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N | yes |
| GHSA-xwg4-73v4-xw9w | CVE-2026-73086 | high | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N | yes |
| GHSA-5c6j-r48x-rmvq | high | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H | yes | |
| GHSA-76p7-773f-r4q5 | CVE-2024-11831 | medium | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N | yes |
| GHSA-qj8w-gfj5-8c6v | CVE-2026-34043 | medium | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-w5hq-g745-h8pq | CVE-2026-41907 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N | yes |
Background: What a vulnerability scan can and cannot prove →
Dependencies 400 packages
| Packages resolved | 400 |
|---|---|
| Deprecated | 5 |
| Stale | 118 |
| Tree resolution | Partial |
The dependency tree was only partially resolved, so these counts may be incomplete.
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
appium_alert ~83
Handle system alerts with action=accept|dismiss, or read alert text with action=get_text.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Action to perform on alert: accept, dismiss, or get_text |
| buttonLabel | string | – | Optional label of the button to click for accept/dismiss. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_app_lifecycle ~318
Manage app lifecycle, installation, state, data, and deep links.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | activate: foreground app; terminate: stop app; is_installed: check installation; clear: clear app data without uninstalling (all require id or name). install: requires path. uninstall: requires id/na… |
| applicationType | string | – | iOS list filter: User (default) or System. |
| id | string | – | Android package or iOS bundle ID; takes precedence over name. |
| keepData | boolean | – | Android uninstall: preserve app data and cache. |
| name | string | – | Human-readable app name resolved to an ID; alternative to id. |
| path | string | – | App file path; required for install. |
| seconds | number | – | Background duration; default 5. Use -1 to remain in background. |
| sessionId | string | – | Session ID; defaults to the active session. |
| url | string | – | URL for deep_link (e.g. https://example.com or myapp://path). |
| waitForLaunch | boolean | – | Android deep_link: wait for the activity to return; default true. |
No output schema declared.
No examples provided.
appium_context ~97
Manage Appium contexts with one tool. action=list returns all contexts and current context. action=switch changes to a target context.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Use list to fetch contexts or switch to change context. |
| context | string | – | Required when action is switch. Common values: NATIVE_APP or WEBVIEW_<id>/WEBVIEW_<package>. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_drag_and_drop ~278
Perform a drag-and-drop gesture from a source location to a target location. The gesture: long press the source (default 600ms), drag to the target (default 1200ms), then release. Source and target can each be specified as either an element UUID or coordinates. Useful for reordering lists, moving items, drag-to-delete.
| Name | Type | Req | Description |
|---|---|---|---|
| duration | integer | – | Duration of the drag movement in milliseconds. Default 1200. |
| longPressDuration | integer | – | Duration of the long press before dragging in milliseconds. Default 600. |
| sessionId | string | – | Session ID; defaults to the active session. |
| sourceElementUUID | string | – | UUID of source element to drag from. Either sourceElementUUID or sourceX+sourceY must be provided. |
| sourceX | integer | – | Source X coordinate. Required if sourceElementUUID is not provided. |
| sourceY | integer | – | Source Y coordinate. Required if sourceElementUUID is not provided. |
| targetElementUUID | string | – | UUID of target element to drop on. Either targetElementUUID or targetX+targetY must be provided. |
| targetX | integer | – | Target X coordinate. Required if targetElementUUID is not provided. |
| targetY | integer | – | Target Y coordinate. Required if targetElementUUID is not provided. |
No output schema declared.
No examples provided.
appium_driver_settings ~180
Read or update Appium driver session settings (e.g. idle timeouts, selector waits). Use action=get to return JSON settings; action=update merges a map into the session. Works for embedded UiAutomator2/XCUITest sessions and remote WebDriver clients that support Appium settings.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | get: read current Appium driver session settings (timeouts, selector waits, flags). update: merge a settings map into the session (requires settings). |
| sessionId | string | – | Session ID; defaults to the active session. |
| settings | object | – | Required when action is update. Driver-specific keys (e.g. Android UiAutomator2: waitForIdleTimeout, waitForSelectorTimeout, ignoreUnimportantViews; iOS XCUITest has its own set). Use action=get firs… |
No output schema declared.
No examples provided.
appium_find_element ~369
Find an element by strategy and selector; the primary tool for locating a specific target. Returns its ID for interactions. Pass that ID as elementUUID to interaction tools. Prefer accessibility id > id > platform-native > xpath (last resort: slow/brittle). See strategy for platform-specific guidance. To scroll until a target is found, use appium_gesture action=scroll_to_element with the same strategy and selector, rather than repeatedly calling this tool. For natural-language/vision finding, use appium_ai action=find_element if enabled and stable locators do not work.
| Name | Type | Req | Description |
|---|---|---|---|
| selector | string | yes | Selector string for the chosen strategy. Do not pass natural-language descriptions of the target here; use appium_ai action=find_element if enabled for vision-based finding. |
| sessionId | string | – | Session ID; defaults to the active session. |
| strategy | string | yes | Locator strategy. Prefer stable identifiers, then platform-native queries; xpath is the last resort. - accessibility id: cross-platform, fast and stable when available. - id: Android resource-id; an… |
No output schema declared.
No examples provided.
appium_generate_tests ~55
Return a workflow to execute the scenario with MCP tools, then generate test code from observed interactions. Prefer appium_find_element; generate_locators is for broad inspection.
| Name | Type | Req | Description |
|---|---|---|---|
| steps | array | yes | The steps of the test |
No output schema declared.
No examples provided.
appium_geolocation ~292
Get, set, or reset the device geolocation (GPS coordinates). Works on both iOS (simulators and real devices) and Android (emulators and real devices with mock location enabled). Use action=get to read current coordinates, action=set with latitude/longitude (and optional altitude for Android) to simulate a location, or action=reset to restore the system default. Note: On Android emulators, reset is not supported — use action=set to manually restore coordinates instead. On Android real devices, the mocked location may persist until the GPS cache refreshes.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Action to perform. get: read the current device geolocation. set: set the device geolocation (requires latitude and longitude; optional altitude for Android). reset: reset the geolocation to the defa… |
| altitude | number | – | Altitude value in meters. Android only, defaults to 0. Ignored on iOS. Used with: set. |
| latitude | number | – | Latitude value (-90 to 90). Measurement of distance north or south of the Equator. Required for: set. |
| longitude | number | – | Longitude value (-180 to 180). Measurement of distance east or west of the prime meridian. Required for: set. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_gesture ~1,085
Perform a touch gesture. Use 'action' to choose: tap, double_tap, long_press, scroll, swipe, pinch_zoom, scroll_to_element, back. Choose scroll vs swipe by intent: scroll to browse content in a list or feed; swipe to dismiss, switch screens, navigate carousels, or pull-to-refresh (speed=fast). For drag-and-drop use appium_drag_and_drop. For custom multi-touch use appium_perform_actions.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Gesture to perform: - tap: tap an element or a coordinate. - double_tap: double-tap, for example to zoom an image or favorite a post. - long_press: press and hold to open a context menu or initiate a… |
| direction | string | – | Direction for scroll/swipe. Coordinates are calculated from the screen or element bounds. Provide either direction or custom coordinates (x, y, endX, endY); direction takes precedence if both are giv… |
| duration | integer | – | Duration in milliseconds. long_press defaults to 2000 (range 500–10000); scroll defaults to 800. For swipe, prefer speed unless a custom movement duration is needed. For W3C swipe, overrides movement… |
| elementUUID | string | – | Element UUID for tap, double_tap, long_press, or pinch_zoom; overrides x/y for these actions. For scroll/swipe with direction, coordinates are calculated relative to this element instead of the whole… |
| endX | integer | – | Ending X coordinate in pixels for scroll/swipe; requires x, y, endY. |
| endY | integer | – | Ending Y coordinate in pixels for scroll/swipe; requires x, y, endX. |
| maxScrollAttempts | integer | – | scroll_to_element only: maximum scroll attempts after the initial lookup fails. Default 10. |
| scale | number | – | Required for pinch_zoom. Scale < 1 zooms out (fingers close); scale > 1 zooms in (fingers spread). Examples: 0.5 zooms out; 2.0 zooms in 2x. |
| scrollDistance | number | – | scroll_to_element only: vertical swipe distance fraction (0.05–1). Ignored when scrollDistancePreset is set. Default 0.45 when neither option is supplied. |
| scrollDistancePreset | string | – | scroll_to_element only: small is a light nudge (0.25), medium is 0.45, large is the full default swipe (1). Overrides scrollDistance when set. |
| selector | string | – | Locator selector value. Required for: scroll_to_element. |
| sessionId | string | – | Session ID; defaults to the active session. |
| speed | string | – | Swipe only. slow: deliberate drag; normal: default navigation speed; fast: flick without an initial hold. Use fast for pull-to-refresh and other velocity-sensitive interfaces. |
| strategy | string | – | Required for scroll_to_element. Prefer accessibility id > id > platform-native (iOS: -ios predicate string / -ios class chain; Android: -android uiautomator) > xpath (last resort: slow/brittle). name… |
| velocity | number | – | Pinch velocity in scale factor per second. Default 2.2. Used by pinch_zoom. |
| x | integer | – | X coordinate in pixels. For tap/double_tap/long_press: tap location, paired with y. For scroll/swipe: starting X in custom-coordinate mode; requires y, endX, endY. For pinch_zoom: center X, paired wi… |
| y | integer | – | Y coordinate in pixels, paired with x. For tap/double_tap/long_press: tap location. For scroll/swipe: starting Y in custom-coordinate mode. For pinch_zoom: center Y. The same elementUUID precedence a… |
No output schema declared.
No examples provided.
appium_get_active_element ~64
Get the currently active/focused element and return its UUID for follow-up interactions. [PRIORITY 1: Use this first when you need to find what element currently has focus]
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_get_element_attribute ~156
Get the value of an element attribute. Use this to check element state (enabled, selected, checked, focused, displayed, clickable) or read properties (name, value, label, content-desc, resource-id, class).
| Name | Type | Req | Description |
|---|---|---|---|
| attribute | string | yes | The attribute name to retrieve. Common attributes: "enabled", "selected", "displayed", "checked", "focused", "clickable", "scrollable", "focusable", "name", "value", "label", "text", "content-desc",… |
| elementUUID | string | yes | Element ID from appium_find_element. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_get_page_source ~39
Get the page source (XML) from the current screen
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_get_text ~47
Get text from an element
| Name | Type | Req | Description |
|---|---|---|---|
| elementUUID | string | yes | Element ID from appium_find_element. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_get_window_size ~53
Get the width and height of the device screen in pixels. Useful for calculating coordinates for swipes, taps, and scrolls.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_mobile_clipboard ~104
Read or set the device clipboard as plain text (Android UiAutomator2 / iOS XCUITest). action=get returns current text; action=set requires content.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | get: read device clipboard as plain text. set: write plain text to the clipboard. |
| content | string | – | Required when action is set. Plain text to put on the clipboard. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_mobile_device_control ~134
Control device behavior: lock/unlock the screen, shake the device, or open the notifications panel. Use the action parameter to choose what to do.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Action to perform. lock: lock the device (optional seconds for timed lock). unlock: unlock the device. shake: perform shake gesture (iOS only). open_notifications: open notifications panel (Android o… |
| seconds | integer | – | Only for action=lock: lock duration in seconds before auto-unlock. Omit to remain locked until unlock. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_mobile_device_info ~144
Get device information, battery status, or current device time in a single call. Use the "action" parameter to select which data to retrieve. Works on both iOS and Android.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Action to perform: "info" returns device model/OS/locale/etc., "battery" returns battery level and charging state, "time" returns the current device time. |
| format | string | – | Only used when action is "time". moment.js format string for the returned time. Defaults to ISO 8601 (YYYY-MM-DDTHH:mm:ssZ). |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_mobile_file ~175
Push or pull a file using Appium mobile extensions. action=push uses payloadBase64, action=pull returns contentBase64.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | push uploads a file to device; pull downloads from device. |
| payloadBase64 | string | – | Required when action=push. Ignored when action=pull. |
| remotePath | string | yes | Path to the file on the device. Android (UiAutomator2): use an absolute path (e.g. /data/local/tmp/foo.txt or /sdcard/Download/foo.txt). iOS (XCUITest): use the formats described in the Appium XCUITe… |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_mobile_keyboard ~144
Hide the software keyboard or check if it is visible (Android UiAutomator2 / iOS XCUITest). action=hide uses mobile: hideKeyboard; action=is_shown uses mobile: isKeyboardShown.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | hide: dismiss the software keyboard (mobile: hideKeyboard). is_shown: whether the keyboard is visible (mobile: isKeyboardShown). |
| keys | array | – | hide only: optional key names to dismiss the keyboard (e.g. "done"). Forwarded to mobile: hideKeyboard when non-empty. Ignored for is_shown. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_mobile_permissions ~340
Get/update Android app permissions or iOS Simulator privacy services; reset iOS privacy prompts. See action-specific parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| access | object | – | iOS update only: map of access rule → yes|no|unset|limited (Simulator + AppleSimulatorUtils). Required for iOS update. |
| action | string | yes | get: list (Android) or read one privacy state (iOS Simulator). update: grant/revoke (Android) or set privacy map (iOS Simulator). reset: restore a privacy prompt for the app under test (iOS only). |
| id | string | – | App ID; overrides name. Android defaults to the app under test; required for iOS get/update. |
| name | string | – | App name resolved to an ID. Android defaults to the app under test; alternative to id for iOS get/update. |
| permissionChangeAction | string | – | Android update: for pm target grant (default) or revoke; for appops allow, deny, ignore, default. |
| permissionFilter | string | – | Android get only: which bucket to return. Defaults to requested per UiAutomator2. |
| permissions | – | – | Android update only: permission name(s), `all` (with pm target), or appops names. Required for Android update. |
| service | string|number | – | iOS get: privacy service name (e.g. camera, microphone, photos). iOS reset: service name or numeric XCUIProtectedResource id. |
| sessionId | string | – | Session ID; defaults to the active session. |
| target | string | – | Android update: pm (default) or appops. |
No output schema declared.
No examples provided.
appium_mobile_press_key ~157
Press navigation keys (BACK, HOME, APP_SWITCH) on Android or physical buttons (HOME, volume, etc.) on iOS/tvOS.
| Name | Type | Req | Description |
|---|---|---|---|
| isLongPress | boolean | – | Android only. Whether to perform a long press. Defaults to false. |
| key | string | – | Logical key/button to press. On Android: BACK, HOME, APP_SWITCH. On iOS/tvOS: HOME, VOLUME_UP, VOLUME_DOWN, UP, DOWN, LEFT, RIGHT, MENU, PLAY_PAUSE, SELECT. |
| keyCode | integer | – | Android keycode to press. If provided, takes precedence over key for Android. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_orientation ~79
Get or set the device/screen orientation. Supports action=get and action=set (LANDSCAPE or PORTRAIT).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Use get to read current orientation, set to change orientation. |
| orientation | string | – | Required when action is set. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_perform_actions ~172
Execute raw W3C Actions API sequences for advanced multi-touch gestures not covered by appium_gesture. Use this for custom multi-finger gestures (rotate, three-finger swipe, edge swipes), complex timing sequences, or any gesture requiring precise control over individual touch points. Prefer appium_gesture for standard gestures (tap, scroll, swipe, pinch) — it handles platform differences automatically.
| Name | Type | Req | Description |
|---|---|---|---|
| actions | array | yes | W3C Actions API input source array. Each entry is one input source (pointer/key/none) with its action sequence. Multiple pointer sources enable multi-touch gestures (e.g. two-finger rotate, three-fin… |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_prepare_ios_real_device ~220
Prepare signed WDA for a real iOS device. Omit provisioningProfileUuid to list profiles; ask the user to choose, highlighting recommendedForWda. Pass the chosen UUID to download, package, and sign WDA; wildcard profiles use a concrete WDA bundle ID. Downloads/unsigned IPA are cached per version; signing always reruns. Pass capabilitiesHint to appium_session_management action=create to install/launch the signed WDA. Requires macOS, Xcode 16+, and a paired developer-mode device.
| Name | Type | Req | Description |
|---|---|---|---|
| forceRebuild | boolean | – | If true, ignore the cached WDA download and unsigned IPA and start clean. The signed IPA is always rebuilt regardless. Default: false. |
| provisioningProfileUuid | string | – | UUID of the .mobileprovision profile to sign WDA with. If omitted, the tool returns the list of available profiles so you can ask the user to pick one. |
| udid | string | yes | UDID of the connected iOS real device. Use select_device to discover it. |
No output schema declared.
No examples provided.
appium_screen_recording ~342
Start or stop screen recording. action=start begins recording; action=stop stops and saves to MP4.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | start begins recording; stop ends, retrieves, and saves it. |
| bitRate | integer | – | Android only. Video bit rate in bits per second. |
| bugReport | boolean | – | Android only. Display timestamp overlay. Requires API level 27+. |
| forceRestart | boolean | – | Restart and discard any active recording; default false. |
| hardwareAcceleration | string | – | iOS only. FFMPEG hardware acceleration backend. |
| pixelFormat | string | – | iOS only. Output pixel format (e.g. yuv420p). |
| sessionId | string | – | Session ID; defaults to the active session. |
| timeLimit | integer | – | Recorder limit in seconds; it does not retrieve/save automatically, so call stop. iOS default 180/max 4200; Android default 180/max 1800. |
| videoFilters | string | – | iOS only. FFMPEG video filters. Takes precedence over videoScale. |
| videoFps | integer | – | iOS only. Frames per second. Default: 10. |
| videoQuality | string | – | iOS only. Video quality preset. Default: medium. |
| videoScale | string | – | iOS only. Scaling value (e.g. 1280:720). |
| videoSize | string | – | Android only. Frame size in WIDTHxHEIGHT format (e.g. 1280x720). |
| videoType | string | – | iOS only. Video codec to use (e.g. libx264). |
No output schema declared.
No examples provided.
appium_screenshot ~121
Take a screenshot and save as PNG. Optionally provide elementUUID to capture only that element.
| Name | Type | Req | Description |
|---|---|---|---|
| elementUUID | string | – | Capture this element; omit for the full screen. |
| maxWidth | number | – | Resize to at most this width in pixels, preserving aspect ratio. |
| returnRawBase64 | boolean | – | Return inline PNG instead of saving, for explicit manual use when the server file is inaccessible. LLMs must keep false and use the saved path. |
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
appium_session_management ~694
Manage Appium sessions. Use action=create to start a session, attach to connect to an existing one, detach to forget an attached session, delete to stop one, list to see all active sessions, or select to switch the active session.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | create: Create a new Appium session. DEFAULT MODE (no remoteServerUrl): use unless the user explicitly provides a server URL. - Drivers run embedded inside this MCP server; no separate Appium process… |
| capabilities | string | – | Optional W3C capabilities as a JSON string, e.g. '{"appium:app":"/path/to/app","appium:platformVersion":"17.0"}'. Create: overrides defaults for ios/android; passed through as-is for general. Common… |
| platform | string | – | Required for create. For local sessions, match the platform selected via select_device. For remote sessions, infer from the request; general supports non-Android/iOS drivers (Windows, macOS, custom)… |
| remoteServerUrl | string | – | Remote Appium server URL for create or attach (e.g. http://localhost:4723). Omit to use local server for create. |
| sessionId | string | – | Required for attach and select: the existing session to connect to or activate. For delete: session to delete. For detach: attached session to forget without stopping it. Delete/detach default to the… |
No output schema declared.
No examples provided.
appium_set_value ~115
Enter text into an element
| Name | Type | Req | Description |
|---|---|---|---|
| elementUUID | string | – | Element ID from appium_find_element. |
| sessionId | string | – | Session ID; defaults to the active session. |
| text | string | yes | The text to enter |
| w3cActions | boolean | – | When true, type text via the W3C Actions API (performActions) instead of the driver-specific setValue. No elementUUID needed — key events are sent to whatever element currently has focus. Works on bo… |
No output schema declared.
No examples provided.
generate_locators ~62
Generate locators for all interactable elements on the current page. [PRIORITY 3: Use this for debugging/inspection or when you need comprehensive element info with locator suggestions]
| Name | Type | Req | Description |
|---|---|---|---|
| sessionId | string | – | Session ID; defaults to the active session. |
No output schema declared.
No examples provided.
prepare_ios_simulator ~201
Boot an iOS/tvOS simulator, download/cache WDA, and launch it on a free per-simulator port. Pass capabilitiesHint (appium:webDriverAgentUrl) to appium_session_management action=create to reuse WDA. skipWda=true only boots. APPIUM_MCP_WDA_APP_PATH can point to an extracted WebDriverAgentRunner-Runner.app (absolute path) to skip download.
| Name | Type | Req | Description |
|---|---|---|---|
| forceRefreshWda | boolean | – | If true, re-download WDA even if already cached. Default: false. |
| platform | string | – | The simulator platform to download WDA for. Default is "ios". Use "tvos" for Apple TV simulators. |
| skipWda | boolean | – | If true, only boot the simulator without downloading or installing WDA. Default: false. |
| udid | string | yes | The UDID of the iOS simulator to prepare. Use select_device to get this. |
No output schema declared.
No examples provided.
select_device ~143
Discover/select a LOCAL device. Ask for platform if unknown; one device is auto-selected. For multiple devices, ask the user to choose, then pass deviceUdid. Next: prepare_ios_simulator for iOS simulators, then appium_session_management action=create. Skip for REMOTE servers: pass device capabilities (appium:deviceName/appium:udid) and the user-provided remoteServerUrl to session creation.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceUdid | string | – | User-selected UDID. Omit to discover devices. |
| iosDeviceType | string | – | Required for ios: simulator or real device. |
| platform | string | yes | Platform chosen by the user. |
No output schema declared.
No examples provided.
What is the MCP Appium - Mobile Development and Automation Server server?
MCP Appium - Mobile Development and Automation Server is listed in the public MCP registry as io.github.appium/appium-mcp. MCP server for Appium mobile automation on iOS and Android devices with test creation tools. This page covers its npm package (appium-mcp).
Is the MCP Appium - Mobile Development and Automation Server server safe to use?
MCP Appium - Mobile Development and Automation Server scores 83 out of 100 on VerifyMCP. We recorded 18 known advisories against it as of 22 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the MCP Appium - Mobile Development and Automation Server server expose?
MCP Appium - Mobile Development and Automation Server exposes 31 tools: select_device, appium_session_management, appium_mobile_device_control, appium_geolocation, appium_mobile_device_info, and 26 more. Their descriptions and schemas cost roughly 6,463 tokens of context every time the server is loaded.
Is the MCP Appium - Mobile Development and Automation Server server still maintained?
MCP Appium - Mobile Development and Automation Server is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the MCP Appium - Mobile Development and Automation Server server under?
MCP Appium - Mobile Development and Automation Server declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.