Skip to main content
Glama
nvda-mcp server

nvda-mcp server

by InfiArtt

Wait for NVDA to say something

nvda_wait_for_speech
Read-onlyIdempotent

Waits for NVDA to speak a matching utterance, such as a chat reply, download completion, or dialog opening, then returns all speech captured meanwhile so you can react to screen-reader output.

Instructions

Wait until NVDA says something, such as a chat reply, a download finishing or a dialog opening.

Returns as soon as a matching utterance arrives, with everything said meanwhile. Pass after_id (lastId from an earlier result) to also catch speech that arrived before this call.

Input Schema

NameRequiredDescriptionDefault
after_idNoAlso consider speech newer than this id, so nothing said before the call is missed. Defaults to now.
containsNoWait for an utterance containing this text, ignoring case. Leave out to wait for any speech.
timeout_msNoGive up after this long.

Output Schema

NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.1.0

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover the read-only, idempotent, non-destructive profile, and the description adds genuinely new behavior: it is blocking, it returns a batch of everything said in the meantime, and after_id back-fills speech that predates the call. The one notable omission is what the result looks like when the wait times out with no match, which matters for a blocking polling tool.

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

Conciseness5/5

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

Three short sentences: purpose first, return semantics second, the tricky race-condition parameter last. No filler and no repetition of the title.

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

Completeness4/5

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

An output schema exists, so return shape need not be described, and the description covers the blocking semantics and the batching behavior. The only real gap is timeout-expiry behavior for a tool whose core failure mode is 'nothing was said'.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds meaning the schema lacks: it identifies after_id as the 'lastId from an earlier result', which tells the agent where the value comes from and why to pass it. It does not add anything about contains or timeout_ms beyond the schema.

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

Purpose4/5

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

The description states a specific blocking verb ('Wait until NVDA says something') and concrete triggering events (chat reply, download finishing, dialog opening), and the 'returns as soon as a matching utterance arrives' clause separates it from a passive history read. It never names the obvious sibling alternatives like nvda_get_speech_history or nvda_preview_speech, so the differentiation is inferable rather than explicit.

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

Usage Guidelines4/5

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

The examples give clear situational context for when to call this (waiting on async events), and the after_id note explains the race-condition use case. It stops short of stating when NOT to use it — e.g. that past speech should come from nvda_get_speech_history instead — so an agent must infer the boundary with that sibling.

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