Thread-safe HTTP API for external access to NVDA screen reader functionality. Provides a localhost-only HTTP bridge (127.0.0.1:8765) designed for use with MCP servers. Uses a tool registry, frozen registration after startup, and structured error handling. All NVDA API calls are automatically queued to the main thread to prevent crashes.
This NVDA bridge exposes 11 tools with basic naming and descriptions, but lacks critical production-grade quality. Tool names follow verb_noun convention (get_*, move_*, speak_*, etc.), which is good. However, descriptions are minimal (10-50 chars), parameter descriptions are absent or trivial, and input schemas lack type information beyond basic strings/booleans. No output schemas are documented. Error handling is not visible in the provided code. The tool registry uses auto-discovery, which is architecturally sound, but the actual tool implementations and error paths are not shown. Critical security concerns: restart_nvda and reload_plugins are irreversible operations with no confirmation pattern or dry-run support. No audit logging visible. Parameter validation is declared but not implemented in the shown code.
Get information about the currently focused UI element
Get information about the desktop object
Retrieve recent log entries from NVDA log file with optional filtering
Get information about the current navigator object
Get the title and details of the current foreground window
Move focus to next or previous object
Descriptions are too short (10-50 chars) and lack context for LLM tool selection.
No parameter descriptions provided. LLMs cannot infer what 'direction' means in move_focus or 'filter_level' in get_logs without explicit guidance. All 6 parameters with descriptions are missing detail.
Irreversible operations (restart_nvda, reload_plugins) lack confirmation or dry-run patterns. Agents can trigger system restarts without safeguards, risking catastrophic errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
Read the current line from the focused object
Reload all global plugins and app modules from scratchpad
Restart NVDA with optional parameters (disable addons, debug logging)
Show a UI message to the user
Speak the given text using NVDA's speech system
No output schemas documented. LLMs cannot plan downstream calls or extract required fields. E.g., what does get_current_focus return? A string? An object with name/role/state?
Parameter 'direction' in move_focus lacks enum constraint. Should be constrained to ['next', 'previous'] to prevent LLM hallucination of invalid values.