MCP server to allow LLMs to interact with OS window systems
This MCP server has critical definition quality gaps. While tool names are clear and action-oriented (move_mouse, click_at, drag, type_text, list_windows, take_window_screenshot, take_fullscreen_screenshot, find_windows_by_title), the descriptions vary widely in quality. Most descriptions are present but lack actionable guidance for LLM selection. Parameter descriptions are inconsistent, some tools have well-described params (e.g., click_at with button enum), while others are sparse. Schemas are visible for most tools but incomplete in places. No error handling guidance is provided to LLMs. Output schemas are not documented. The server is macOS-only, which limits portability but is acknowledged in code comments. Overall, the server falls into the 'fair to poor' category with noticeable gaps in description quality, output schema documentation, and error recovery patterns.
Perform a mouse click at (x, y). *button* may be "left", "right", or "middle". Coordinates are relative to *window_id* if provided, else absolute.
Drag the mouse from (from_x, from_y) to (to_x, to_y). Coordinates are interpreted relative to *window_id* if supplied.
Find windows by searching in their titles. Args: title_search: Text to search for in window titles and application names. Returns: JSON string (array) of matching window objects with keys: pid, window_id, title, subtitle, bounds. bounds is an object with: x, y, width, height.
List all windows in the system with their details. Args: exclude_zero_area: If True, windows with zero area will be excluded. only_on_screen: If True, only windows currently on screen will be listed. Returns: JSON string (array) of window objects with keys: pid, window_id, title, subtitle, bounds. bounds is an object with: x, y, width, height.
Move the mouse cursor to (x, y). If *window_id* is supplied, (x, y) are relative to that window's top-left corner; otherwise they are absolute screen coordinates.
Output schemas not documented. Tools like list_windows, take_window_screenshot, find_windows_by_title return structured data (JSON arrays, images) but there is no documentation of the response format for LLMs to understand what fields to expect or how to extract data for downstream tool calls.
Incomplete parameter descriptions. Parameters like window_id in move_mouse, click_at, drag, and type_text lack detail on what happens if window_id is invalid or not found. The type includes null but behavior on null is not explicit. No guidance for LLM on error recovery.
No error handling guidance. Tools like click_at and drag indicate they can fail (e.g., invalid window_id, coordinates out of bounds) but provide no error message format or recovery hints. LLMs cannot understand what to do if a call fails.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 56 | - | v1 |
Take a screenshot of the entire screen. Returns: An image of the entire screen.
Take a screenshot of a specific window, even if it's hidden behind other windows. Args: window_id: The ID of the window to capture. Returns: An image of the specified window.
Type *text* with realistic keystrokes and human-like delay. A combined-session `CGEventSource` is used to make the events appear as if they originate from a real keyboard. Processes at most 200 characters per call. If the input exceeds this limit, an error is returned and no text is typed.
Brief descriptions for screenshot tools. take_window_screenshot and take_fullscreen_screenshot have minimal descriptions (under 100 chars) that lack context for LLM selection. No mention of what format images are returned in, when to use window vs fullscreen, or what the agent should do with the result.
No idempotency or confirmation patterns. Destructive/risky tools like click_at, drag, type_text can modify application state. No dry-run, confirmation request, or undo mechanism documented. Agents may accidentally trigger unintended actions.
Undocumented coordinate system edge cases. Descriptions state that coordinates can be absolute or relative to window_id, but there is no explanation of what happens if the window is moved, resized, or goes off-screen between tool calls. No guidance on coordinate validation.