Skip to main content
Glama
senseisven

MCP Remote macOS Control Server

by senseisven

remote_macos_mouse_move

Move mouse cursor to specific coordinates on a remote macOS machine with automatic screen scaling. Control macOS systems remotely via VNC connection.

Instructions

Move the mouse cursor to specified coordinates on a remote MacOs machine, with automatic coordinate scaling. Uses environment variables for connection details.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate for mouse position (in source dimensions)
yYesY coordinate for mouse position (in source dimensions)
source_widthNoWidth of the reference screen for coordinate scaling
source_heightNoHeight of the reference screen for coordinate scaling

Implementation Reference

  • The core handler function that implements the remote_macos_mouse_move tool logic: connects via VNC, scales input coordinates to target screen resolution, moves the mouse pointer using send_pointer_event, and returns success status with scaling details.
    def handle_remote_macos_mouse_move(arguments: dict[str, Any]) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
        """Move the mouse cursor on a remote MacOs machine."""
        # Use environment variables
        host = MACOS_HOST
        port = MACOS_PORT
        password = MACOS_PASSWORD
        username = MACOS_USERNAME
        encryption = VNC_ENCRYPTION
    
        # Get required parameters from arguments
        x = arguments.get("x")
        y = arguments.get("y")
        source_width = int(arguments.get("source_width", 1366))
        source_height = int(arguments.get("source_height", 768))
    
        if x is None or y is None:
            raise ValueError("x and y coordinates are required")
    
        # Ensure source dimensions are positive
        if source_width <= 0 or source_height <= 0:
            raise ValueError("Source dimensions must be positive values")
    
        # Initialize VNC client
        vnc = VNCClient(host=host, port=port, password=password, username=username, encryption=encryption)
    
        # Connect to remote MacOs machine
        success, error_message = vnc.connect()
        if not success:
            error_msg = f"Failed to connect to remote MacOs machine at {host}:{port}. {error_message}"
            return [types.TextContent(type="text", text=error_msg)]
    
        try:
            # Get target screen dimensions
            target_width = vnc.width
            target_height = vnc.height
    
            # Scale coordinates
            scaled_x = int((x / source_width) * target_width)
            scaled_y = int((y / source_height) * target_height)
    
            # Ensure coordinates are within the screen bounds
            scaled_x = max(0, min(scaled_x, target_width - 1))
            scaled_y = max(0, min(scaled_y, target_height - 1))
    
            # Move mouse pointer (button_mask=0 means no buttons are pressed)
            result = vnc.send_pointer_event(scaled_x, scaled_y, 0)
    
            # Prepare the response with useful details
            scale_factors = {
                "x": target_width / source_width,
                "y": target_height / source_height
            }
    
            return [types.TextContent(
                type="text",
                text=f"""Mouse move from source ({x}, {y}) to target ({scaled_x}, {scaled_y}) {'succeeded' if result else 'failed'}
    Source dimensions: {source_width}x{source_height}
    Target dimensions: {target_width}x{target_height}
    Scale factors: {scale_factors['x']:.4f}x, {scale_factors['y']:.4f}y"""
            )]
        finally:
            # Close VNC connection
            vnc.close()
  • Tool registration in the MCP server's list_tools() method, defining the tool name, description, and input schema for coordinate scaling.
        name="remote_macos_mouse_move",
        description="Move the mouse cursor to specified coordinates on a remote MacOs machine, with automatic coordinate scaling. Uses environment variables for connection details.",
        inputSchema={
            "type": "object",
            "properties": {
                "x": {"type": "integer", "description": "X coordinate for mouse position (in source dimensions)"},
                "y": {"type": "integer", "description": "Y coordinate for mouse position (in source dimensions)"},
                "source_width": {"type": "integer", "description": "Width of the reference screen for coordinate scaling", "default": 1366},
                "source_height": {"type": "integer", "description": "Height of the reference screen for coordinate scaling", "default": 768}
            },
            "required": ["x", "y"]
        },
    ),
  • Input schema definition validating x, y coordinates (required) and optional source_width, source_height for scaling.
        inputSchema={
            "type": "object",
            "properties": {
                "x": {"type": "integer", "description": "X coordinate for mouse position (in source dimensions)"},
                "y": {"type": "integer", "description": "Y coordinate for mouse position (in source dimensions)"},
                "source_width": {"type": "integer", "description": "Width of the reference screen for coordinate scaling", "default": 1366},
                "source_height": {"type": "integer", "description": "Height of the reference screen for coordinate scaling", "default": 768}
            },
            "required": ["x", "y"]
        },
    ),
  • Dispatch logic in the server's call_tool handler that routes requests for remote_macos_mouse_move to the imported handler function.
    elif name == "remote_macos_mouse_move":
        return handle_remote_macos_mouse_move(arguments)
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions 'automatic coordinate scaling' and environment variable usage, but fails to address critical aspects like required permissions, potential side effects (e.g., interrupting user sessions), error conditions, or what happens if coordinates are out of bounds. This leaves significant gaps for a remote control tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured in two sentences: the first states core functionality, the second adds implementation detail. Every element earns its place, though it could be slightly more front-loaded by mentioning environment variables earlier for immediate context awareness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a remote control tool with no annotations and no output schema, the description is insufficient. It lacks information about return values, error handling, security implications, performance characteristics, and how it integrates with sibling tools. The mention of environment variables hints at setup requirements but doesn't provide operational completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, providing complete documentation for all parameters. The description adds minimal value beyond the schema by mentioning 'automatic coordinate scaling' which relates to source_width/source_height parameters, but doesn't explain the scaling algorithm or practical implications. Baseline 3 is appropriate given the comprehensive schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific action ('Move the mouse cursor'), target resource ('on a remote MacOs machine'), and key functionality ('with automatic coordinate scaling'). It distinguishes itself from siblings like remote_macos_mouse_click or remote_macos_mouse_drag_n_drop by focusing solely on cursor positioning without additional actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context through 'Uses environment variables for connection details,' suggesting this tool requires pre-configured remote access. However, it doesn't explicitly state when to use this versus alternatives like remote_macos_mouse_drag_n_drop for dragging operations or provide clear exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

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/senseisven/mcp_macos'

If you have feedback or need assistance with the MCP directory API, please join our Discord server