The Midscene MCP server defines 12 browser automation tools with complete Zod schemas and descriptions. Tool naming follows the pattern midscene_<action> consistently, which is clear and descriptive. Descriptions range from 120 - 230 characters, generally within the 10 - 1024 baseline and specific enough to guide LLM selection. However, several critical gaps reduce the score: (1) Parameter descriptions lack explicit constraints (e.g., no min/max for scrollType distance, no explanation of deepThink's actual behavior vs benefit). (2) Return/output schemas are not formally documented, the code returns generic TextContent blocks with free-form text rather than structured JSON responses. The rubric requires documented output schemas so LLMs can plan downstream calls and extract typed data. (3) Error handling is minimal, tools call ensureAgent() or wrap() but do not return actionable error messages with recovery guidance (e.g., 'Already connected. Call midscene_disconnect first.' instead of bare exceptions). (4) Several parameter relationships are undocumented: e.g., distance only applies when scrollType='once', but the schema doesn't enforce or describe this dependency. (5) Some descriptions are vague: 'Faster and more reliable for single actions' (midscene_ai_tap) doesn't explain *why* or *when* to use it vs midscene_ai_action. Overall, the server demonstrates solid naming and basic completeness but lacks the structured output design, error guidance, and constraint documentation expected of production-grade tools.
Performs a series of UI actions described in natural language (Auto Planning). Midscene automatically plans the steps and executes them sequentially. Use for complex or multi-step interactions where planning is beneficial.
Performs an assertion based on a natural language condition. Throws an error if the assertion fails, including an AI-generated reason.
Moves the mouse cursor over a specified element (Instant Action).
Inputs text into a specified element (Instant Action). Use an empty string to clear the input.
Presses a specified keyboard key (Instant Action). Optionally targets an element.
Extracts structured data from the UI using multimodal AI reasoning. Describe the desired data format within the prompt.
Output schemas not formally documented. Tools return generic TextContent with free-form string text instead of structured JSON. LLMs cannot plan downstream calls or extract typed data when output structure is undefined.
Parameter constraints not fully documented. scrollType distance only applies when scrollType='once', but description and schema do not enforce or explain this conditional dependency.
Error handling lacks actionable recovery guidance. ensureAgent() and wrap() throw exceptions but do not return structured error messages (e.g., 'Already connected. Call midscene_disconnect first.'). Agents receive raw exceptions with no next-step guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
Scrolls the page or a specified element (Instant Action).
Performs a tap/click action on a specified element (Instant Action). Faster and more reliable for single actions. The AI model locates the element.
Waits until a specified condition, described in natural language, becomes true on the page. Polls the condition using AI.
Connects to the currently active tab in the user's Chrome browser.
Disconnects from the currently connected browser tab and releases resources.
Executes an automation script written in YAML format. Only the 'tasks' part of the script is executed.
Descriptions lack differentiation context. midscene_ai_tap vs midscene_ai_action both perform UI interactions. The description of midscene_ai_tap ('Faster and more reliable for single actions') is vague, 'faster' and 'more reliable' are not measurable, and 'single actions' is not clearly defined vs 'series of UI actions' in midscene_ai_action.
No validation bounds on numeric parameters. scrollType distance and timeoutMs have no documented min/max. Unbounded values let LLMs pass absurd values (e.g., distance: 999999999) that break the API or cause timeouts.
deepThink parameter behavior not fully explained. Description says it 'uses a two-step AI call' and is 'useful for ambiguous elements' but does not clarify the performance/accuracy trade-off, when to enable it, or what cost it incurs.