AI agent tool for observing and controlling desktop applications via native OS accessibility trees
This MCP server has foundational weaknesses that prevent it from being production-ready. Both tools have descriptions and basic parameter structure, but lack critical rigor: (1) no parameter type information visible in the schema definitions, the input specs show only description and required fields, missing 'type' declarations; (2) output schemas are not documented, responses are inferred from return values (json!({ "app": ..., "closed": true })) but no formal schema is provided to the LLM; (3) error handling is minimal, close_app checks for protected processes but provides no recovery guidance; (4) the schema for list_apps parameter 'app' has no type field visible, violating JSON Schema basics; (5) no tool annotations (readOnlyHint, destructiveHint) despite close_app being IRREVERSIBLE. The codebase is well-structured (Rust, modular, good linting), but the MCP tool definitions themselves lack the rigor expected of production tools.
Close an application, with optional forced termination
List applications running on the system, optionally filtered by name
Input schemas lack 'type' field declarations. The schema for 'app' parameter shows only description and required flag, not 'type': 'string'. JSON Schema is incomplete and LLMs cannot fully validate inputs.
Output schemas are undocumented. list_apps returns json!({ "apps": apps }) and close_app returns json!({ "app": ..., "closed": true }), but no formal return type schema is declared for the LLM. The agent cannot plan downstream calls or validate response structure.
Tool descriptions are too brief (50 and 45 chars respectively). 'List applications running on the system, optionally filtered by name' and 'Close an application, with optional forced termination' lack context on WHEN to use these tools or what they return. Descriptions should be 10 - 1024 chars with clear intent signaling.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | 2026-07-28+ | v2 |
close_app is marked IRREVERSIBLE but has no destructiveHint annotation. The MCP spec (2026-07-28) recommends tool annotations to signal irreversible operations. LLMs need to know this tool has side effects and should not retry casually.
list_apps is marked READ_ONLY but has no readOnlyHint annotation. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are part of current MCP spec and help LLMs reason about tool safety.
Error handling provides no recovery guidance. close_app::execute() rejects protected processes with Err(AppError::invalid_input(...)), but the response does not guide the LLM on what to try next or suggest alternatives. Errors should follow the recovery-guide pattern.
No pagination or result limits documented for list_apps. If hundreds of applications are running, the response could be huge. The tool description should state a result cap (e.g., 'Returns up to 100 applications') and pagination support if available.
close_app does not require confirmation or support dry-run. For an IRREVERSIBLE operation (closing an app, possibly losing unsaved work), the agent should have a confirmation step. This prevents accidental destruction.