macOS keyboard, mouse, and screenshot automation exposed as an MCP server.
macinput has 12 well-named tools with clear action verbs (get_, move_, click_, press_, scroll_, type_, paste_, capture_, cleanup_). All tools have descriptions (avg ~80 chars, within baseline 34 - 392). Input schemas are present and typed for all tools. However, parameter descriptions are sparse or missing context; many lack guidance on valid ranges, formats, or when to use them. Output schemas are partially documented via dataclass definitions but not exposed in tool metadata. Error handling is minimal, no recovery guidance, no categorization of retryable vs fatal errors. Security considerations (macOS permissions) are documented in server instructions but not enforced at tool level.
Capture the full screen and return a temporary PNG path.
Remove a screenshot file created by `capture_screenshot`.
Click at the current cursor location or at explicit coordinates.
Return the current mouse position.
Return the active safety-related server settings.
Hold a key down. Pair with `keyboard_key_up` if you need manual control.
Release a key previously pressed down.
Parameter descriptions lack actionable constraints. E.g., 'key' in press_keyboard_key accepts string|int but no guidance on valid key names, ranges, or format. 'interval' in click_mouse has no min/max bounds. LLMs cannot infer valid inputs.
No error handling or recovery guidance. Tools return ActionResult with ok/message but no categorization of errors (retryable, user-fixable, fatal). No guidance on what to do if a click fails or permissions are missing.
Output schemas not formally documented in tool metadata. Return types (ActionResult, MousePosition, ScreenshotResult) are defined as dataclasses but not exposed as JSON Schema in tool definitions. LLMs cannot plan downstream calls without seeing expected fields.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Move the cursor to absolute screen coordinates.
Paste plain text into the focused target via clipboard and Cmd+V.
Press and release a key with optional modifiers.
Scroll the mouse wheel by line units.
Type unicode text into the currently focused macOS input target.
No input validation or bounds checking documented. Numeric parameters (x, y, vertical, horizontal, interval, hold, cleanup_after) lack min/max constraints in descriptions. LLMs may pass absurd values (negative coordinates, huge intervals).
Permission requirements mentioned in server instructions but not enforced or documented per-tool. Tools do not declare required scopes (Accessibility, Screen Recording). No guidance on what happens if permissions are missing.