windows2-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| APPIUM_HOST | No | Host of the running Appium server | 127.0.0.1 |
| APPIUM_PORT | No | Port of the running Appium server | 4723 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| create_sessionA | Launch a Windows application and start a new Appium session. Ask the user before calling — confirm they want a new app instance launched. |
| attach_sessionA | Attach to an existing Appium session by session ID. Ask the user to provide the session ID — it is visible in Appium Inspector or in the Appium server logs next to the session creation event. |
| delete_sessionA | End the current Appium session and close the app. Only call this when the user explicitly asks to stop or end the session. Never call autonomously — always confirm with the user before terminating. |
| get_session_statusA | Check whether a session is currently active in this MCP server instance. |
| find_elementA | Find a single UI element in the current app window. Returns an element ID string. Returns an error if not found. Preferred strategy order for reliable automation: 1) "accessibility id" (AutomationId) — most stable, use whenever available 2) "name" — good for static labels not subject to localization 3) "xpath" — flexible fallback, e.g. //Button[@Name="OK"] 4) other strategies — use only when the above are unavailable. After interacting with an element you plan to use in generated test code, call get_element_info to capture the best locator. |
| find_elementsA | Find all UI elements matching the selector. Returns a JSON array of element ID strings. Preferred strategy order for reliable automation: 1) "accessibility id" (AutomationId) — most stable, use whenever available 2) "name" — good for static labels not subject to localization 3) "xpath" — flexible fallback, e.g. //Button[@Name="OK"] 4) other strategies — use only when the above are unavailable. After interacting with an element you plan to use in generated test code, call get_element_info to capture the best locator. |
| find_child_elementA | Find a child element scoped to a known parent element's subtree. Use when the same selector exists in multiple parts of the UI and you need to narrow the search. Preferred strategy order for reliable automation: 1) "accessibility id" (AutomationId) — most stable, use whenever available 2) "name" — good for static labels not subject to localization 3) "xpath" — flexible fallback, e.g. //Button[@Name="OK"] 4) other strategies — use only when the above are unavailable. After interacting with an element you plan to use in generated test code, call get_element_info to capture the best locator. |
| wait_for_elementA | Wait for a UI element to appear within a configurable timeout, then return its element ID. Useful after dialog opens, page transitions, or loading spinners disappear. Preferred strategy order for reliable automation: 1) "accessibility id" (AutomationId) — most stable, use whenever available 2) "name" — good for static labels not subject to localization 3) "xpath" — flexible fallback, e.g. //Button[@Name="OK"] 4) other strategies — use only when the above are unavailable. After interacting with an element you plan to use in generated test code, call get_element_info to capture the best locator. |
| click_elementA | Click a UI element by its element ID. Targets the element directly — does not require the window to be focused or in the foreground. |
| set_valueA | Set the text value of an input element (clears first then types). Sets the value directly on the element — does not require the window to be focused or in the foreground. |
| clear_elementB | Clear the text content of an input element. |
| get_textA | Get the visible text content of a UI element. |
| get_attributeA | Get an attribute or property of a UI element. Common attributes: Name, AutomationId, ClassName, IsEnabled, IsOffscreen, ControlType, Value.Value. Returns an empty string when the attribute is absent. |
| is_element_displayedA | Check whether a UI element is visible on screen (not off-screen). |
| is_element_enabledA | Check whether a UI element is enabled and interactable. |
| is_element_selectedA | Check whether a checkbox, radio button, or toggle is checked/selected. Works for both UIA and Java Swing elements. Returns "true" or "false". Note: tri-state (indeterminate) checkboxes return "false" — indeterminate cannot be distinguished from unchecked via this tool. |
| get_element_infoA | Retrieve all key UIA properties of an element and get ranked selector suggestions for test automation. Returns: Name, AutomationId, ClassName, ControlType, IsEnabled, and a prioritized list of selectors. ALWAYS call this after find_element when generating automated test code — it gives you the best locator to use. Selector reliability order: accessibility id (AutomationId) = highest → name → xpath → class name = lowest. For .NET/C# Appium: use MobileBy.AccessibilityId(automationId) when AutomationId is non-empty. |
| get_active_elementA | Get the element ID of the element that currently has keyboard focus. |
| get_element_tag_nameA | Get an element's tag name (its UIA ControlType in native context, or HTML tag name in IE/webview context). |
| get_element_rectB | Get the position (relative to the app window) and size of an element. |
| get_element_screenshotA | Take a screenshot cropped to a single element, returned as base64 PNG. Not supported in IE context. |
| get_page_sourceA | Get the XML representation of the current UIA element tree. Use as the source of truth for current UI state — call whenever you are unsure what is on screen or after a UI change (navigation, dialog, window switch). Inspect the result to discover element Names and AutomationIds. |
| get_window_rectA | Get the position and size of the current app window. |
| get_window_handlesA | Get all available window handles for the current session. Use when the app has multiple windows. |
| get_windowsA | Get all visible windows including untitled ones. Returns an array of { handle, title, className } objects. Use handle to switch to any window (including those with no title) via switch_to_window. Use className to identify untitled windows such as popups and dialogs. |
| switch_to_windowA | Switch focus to a different window by its handle (from get_window_handles). |
| switch_to_window_by_titleA | Switch focus to a window by its title. By default uses case-insensitive substring matching so partial titles work (e.g. "Notepad" matches "Untitled - Notepad"). Set exact=true to require a full case-insensitive match. |
| maximize_windowB | Maximize a window element via the UIA Window pattern. |
| minimize_windowB | Minimize a window element via the UIA Window pattern. |
| restore_windowA | Restore a minimized or maximized window to its normal state via the UIA Window pattern. |
| close_windowA | Close a window element via the UIA Window pattern. |
| get_monitorsA | List all connected monitors with their bounds, working area, device name, and whether each is the primary display. |
| switch_to_frameA | Switch context into an iframe or frame inside an IE window. After switching, element finds are scoped to that frame's document. Provide exactly one of: index (0-based integer), name (frame name/id attribute), or elementId (element ID of the iframe element). Only supported in IE context (after switch_to_window targeting an IE window). |
| switch_to_parent_frameA | Switch context to the parent frame of the current frame. Only supported in IE context; behaves the same as switch_to_default_content there. |
| navigate_backA | Navigate back (Alt+Left) in the current window's history. |
| navigate_forwardA | Navigate forward (Alt+Right) in the current window's history. |
| get_window_titleA | Get the title (Name property of the root window element) of the current window. |
| get_current_window_handleA | Get the handle of the current window (as a hex HWND string, e.g. "0x00abc123"). |
| maximize_current_windowA | Maximize the current session's root window (whole-window operation — does not require an elementId, unlike maximize_window). |
| minimize_current_windowA | Minimize the current session's root window (whole-window operation — does not require an elementId, unlike minimize_window). |
| set_window_rectA | Move and/or resize the current session's root window. Restores the window to normal state first (move/resize fail while maximized or minimized). Pass null for any of x/y/width/height to leave that dimension unchanged. |
| switch_to_default_contentA | Switch back to the top-level document after a switch_to_frame call. Required before interacting with elements outside the frame. Only supported in IE context. |
| advanced_clickA | Perform a click at an element or absolute screen coordinates, with optional modifier keys, multiple clicks, or custom duration. Use for right-click, double-click, Ctrl+click, or coordinate-based clicks. Simulates a real mouse event at screen coordinates, so the target window must be visible and in the foreground. |
| send_keysA | Send keyboard input. Each action can be a pause (ms delay), text to type, or a virtual key code press/release. Simulates real OS-level key events sent to whatever window currently has keyboard focus — the target window must be focused, and this cannot target a specific element. Use for key combos (Ctrl+C, Alt+Tab), navigation keys, or typing into controls that have no addressable element. |
| hoverA | Move the mouse pointer from one position to another, optionally with modifier keys held. Useful for hover effects and drag-without-click. |
| scrollB | Scroll the mouse wheel at an element or screen coordinate. |
| perform_actionsA | Perform a raw W3C WebDriver Actions sequence (pointer/key/wheel input sources). Lower-level than advanced_click/hover/scroll/send_keys — use only when you need multi-source synchronized input (e.g. a key held down during a pointer drag) that those higher-level tools cannot express. |
| release_actionsA | Release all keys and pointer buttons currently held down by a prior perform_actions call. Call this to reset input state if a perform_actions sequence left keys/buttons stuck down (e.g. after an error mid-sequence). |
| click_and_dragC | Click and drag from one position to another. Useful for resizing, reordering, or moving elements. |
| invoke_elementA | Invoke the default action of an element via the UIA Invoke pattern without simulating mouse input. Use for elements that do not respond to mouse clicks. |
| expand_elementA | Expand a collapsible element (tree node, combo box, menu) via the UIA ExpandCollapse pattern. |
| collapse_elementB | Collapse an expanded element via the UIA ExpandCollapse pattern. |
| toggle_elementA | Toggle a checkbox or toggle button via the UIA Toggle pattern. To confirm the resulting state, call is_element_selected after this. |
| set_element_valueA | Set the value of an element via the UIA Value or RangeValue pattern (e.g. sliders, spin boxes). |
| get_element_valueB | Get the value of an element via the UIA Value pattern. |
| focus_elementA | Set focus to an element via the UIA Focus pattern (windows: setFocus). Required before keyboard-driven interactions such as send_keys on a specific control. |
| select_itemA | Select an item in a list box, tab control, or combo box via the UIA SelectionItem pattern (windows: select). Use when click does not trigger selection. |
| is_multi_selectA | Check whether a container (e.g. ListBox) allows multiple items to be selected via the UIA Selection pattern. |
| scroll_element_into_viewA | Scroll a container so the given element becomes visible, via the UIA ScrollItem pattern. Use before clicking an element that may be outside the visible scroll area. |
| get_selected_itemA | Get the first selected item in a container (e.g. ListBox, TreeView) via the UIA Selection pattern. Returns an element ID. |
| get_all_selected_itemsA | Get all currently selected items in a multi-select container via the UIA Selection pattern. Returns a JSON array of element IDs. |
| add_to_selectionA | Add an item to the current selection in a multi-select container via the UIA SelectionItem pattern (does not deselect existing items). |
| remove_from_selectionB | Remove an item from the current selection in a multi-select container via the UIA SelectionItem pattern. |
| get_window_elementA | Get the element ID of the current session's root window element. |
| launch_appA | Launch the application configured for this session (re-launch if it was closed). |
| close_appA | Close the application under test without ending the Appium session. Only call when explicitly asked. |
| attach_java_swingA | Inject the Java accessibility agent into the JVM owning the current session window. Use this after creating a session (with app or appTopLevelWindow) when javaSwing was NOT set at session creation time. Once called, element finding will use Java class names and accessible names instead of UIA. |
| attach_dotnet_bridgeA | Inject the .NET bridge into the CLR process owning the current session window. Use this after creating a session (with appTopLevelWindow) when dotnetBridge was NOT set at session creation time. Needed for WinForms/WPF apps built with custom-drawn control libraries (e.g. DevExpress) whose controls expose little or nothing via plain UIA. Only works on an already-running process — there is no launch-time injection path. Both .NET Framework (clr.dll) and CoreCLR (.NET 5+, coreclr.dll) targets are supported automatically. |
| get_device_timeA | Get the current date/time on the Windows device. |
| get_clipboardA | Read the current clipboard contents as a base64-encoded string. |
| set_clipboardB | Set the clipboard contents from a base64-encoded string. |
| analyze_screenA | Take a screenshot and return it to the calling agent for visual analysis. No external API key required. Includes a DPI-aware coordinate mapping so any coordinates identified are ready for click interactions. |
| find_by_visionA | Take a screenshot and delegate visual analysis to an external vision model, returning the result. Use when visual analysis should be performed by a separate model rather than by the calling agent. Requires an external API key: ANTHROPIC_API_KEY (claude-), OPENAI_API_KEY (gpt-/o-series), GEMINI_API_KEY (gemini-), or AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY (amazon.nova-). |
| get_current_contextA | Get the current active context. Returns "NATIVE_APP" (UIA element tree, find_element works here) or "WEBVIEW_" (web DOM, standard web selectors apply). Call this if unsure which context is active before interacting. |
| get_contextsA | List all available contexts. Returns "NATIVE_APP" for the UIA element tree, and any embedded webview contexts as "WEBVIEW_". |
| set_contextA | Switch the active context. Pass "NATIVE_APP" to return to the UIA element tree, or a "WEBVIEW_" from get_contexts to switch into an embedded webview. |
| get_native_childrenA | Fallback for legacy WinForms/ActiveX controls that expose zero UIA children (verify with get_page_source / Inspect.exe first). Bypasses UI Automation and walks the control's raw IAccessible (MSAA) tree instead — many of these controls were built with hand-written MSAA support for screen readers, exposing rows/cells as "simple children" (plain integer childIds with no HWND) that UIA and Win32 child-window enumeration can never see. Returns a tree of {name, role, value, description, state, defaultAction, rect, childCount, children}. If |
| get_urlA | Get the current page URL. Only supported when the active window is an IE window (IE mode is enabled automatically by switch_to_window / switch_to_window_by_title when the target is an Internet Explorer window). |
| set_urlA | Navigate the current IE window to a URL. No keyboard shortcuts (Ctrl+L) needed and the window does not need to be in the foreground — this calls IHTMLWindow2.navigate directly through the IE COM bridge. Only supported when the active window is an IE window. |
| push_fileA | Write a file to the filesystem of the machine running the driver. Requires the "modify_fs" insecure feature to be enabled on the Appium server. |
| pull_fileA | Read a file from the filesystem of the machine running the driver, returned as base64. Requires the "modify_fs" insecure feature to be enabled on the Appium server. |
| delete_fileA | Delete a file on the machine running the driver. Requires the "modify_fs" insecure feature to be enabled on the Appium server. |
| delete_folderA | Delete a folder (recursively by default) on the machine running the driver. Requires the "modify_fs" insecure feature to be enabled on the Appium server. |
| start_recording_screenA | Start an FFmpeg-based screen recording. If a recording is already running it is stopped and restarted by default. Call stop_recording_screen to end it and retrieve the video. |
| stop_recording_screenB | Stop the current screen recording and return the video. Returns the video as base64 by default, or uploads it to a remote destination first if remotePath is provided. |
| get_orientationA | Get the current display orientation ("LANDSCAPE" or "PORTRAIT"). |
| execute_powershellA | Run a raw PowerShell script or command on the machine running the driver, inside the session's persistent PowerShell process. Use for arbitrary automation not covered by another tool (registry edits, service control, file inspection, etc). Runs with the same privileges as the driver process — treat as unrestricted code execution. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/verisoft-ai/windows2-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server