NVDA MCP
NVDA MCP connects AI assistants to the NVDA screen reader through the Model Context Protocol (MCP). The assistant can read what NVDA reads and hear what NVDA says. If you allow it, it can also press keys, and you hear every step through NVDA, as if you had pressed them yourself.
Why it exists
AI assistants can now do things on a computer, not just answer questions. Most of them work by looking at screenshots and clicking on what they see. For someone who uses a screen reader, that has two problems:
- You can't follow what the assistant does. It clicks things you never hear about, in places your screen reader may not even show you.
- A screenshot is not what you experience. What matters to a screen reader user is which control has focus, its name, role and state, and what NVDA says about it. A picture of the screen leaves most of that out.
NVDA already knows all of this, because it is how you use your computer. NVDA MCP gives the assistant the same view: the focused control, the accessibility tree, the text of a document or web page, and exactly what NVDA said. When the assistant acts, it uses the keyboard through NVDA, the way you would, and NVDA announces the result. You and the assistant work from the same information, and you stay in control.
What it is useful for
For people who use NVDA:
- "What did NVDA just say?" The assistant reads NVDA's speech history, so you can ask about something you missed, or ask for a summary of a long dialog.
- Getting through confusing or inaccessible applications. Ask what is in a window, where a control is, or why a button has no name, and get an answer based on what NVDA actually sees.
- Doing repetitive tasks. The assistant can move through an application with the keyboard, type text, switch windows, and wait for something to happen, such as a chat reply.
- Learning. Ask which NVDA commands work where you are, or what a key does here.
For developers and testers:
- See what NVDA announces for each control without moving focus, and find unlabeled or silent controls.
- Audit the tab order of a dialog or page: duplicate names, keyboard traps, controls NVDA says nothing about.
- Find out why NVDA is silent: trace the events NVDA handles and what it said for each one.
- Regression tests: record what NVDA says through a series of key presses, and compare later runs with it.
- Develop NVDA add-ons faster: read NVDA's log, see developer info like NVDA+F1, and reload add-on code.
Who it is for
- Blind and low-vision people who use NVDA and want an AI assistant that works with their screen reader instead of around it.
- NVDA add-on developers, who can test what their add-on makes NVDA say without doing every step by hand.
- Developers of Windows applications and websites, who want to check their work with a real screen reader.
- Accessibility testers, auditors and QA teams, who need repeatable checks of what a screen reader announces.
- Trainers and support staff who help screen reader users and want to understand what they hear.
What you need
- Windows with NVDA 2026.3 or later.
- An AI assistant that supports MCP, such as Claude Code, Claude Desktop, Codex CLI, Cursor or VS Code.
- uv, which downloads and runs the NVDA MCP server for you. If you already have Python 3.11 or later, you can use pip or pipx instead.
NVDA MCP has two parts: this add-on, and a small program called the nvda-mcp server, which your assistant starts. The add-on comes from NVDA's Add-on Store; the server comes from the Python Package Index (PyPI). Both are free and open source.
Setting it up
-
Install the add-on. In NVDA, open Tools, then Add-on Store. Find NVDA MCP, install it and restart NVDA.
-
Install uv, if you don't have it. Open a command prompt and run:
winget install --id=astral-sh.uv -eClose the command prompt and open a new one, so it finds uv.
-
Connect your assistant. In NVDA, open Settings (NVDA+N, Preferences, Settings), then the NVDA MCP category. Choose your assistant under Set up this MCP client and press Copy setup command.
- For Claude Code or Codex CLI, paste the command into a command prompt and press Enter.
- For Claude Desktop, Cursor and other assistants that use a settings file, paste the settings into
that file. For Claude Desktop, it is
claude_desktop_config.json(Settings, Developer, Edit Config).
The command is like
claude mcp add --scope user nvda -- uvx nvda-mcp==1.0.0: it tells your assistant to run the server version that matches your add-on.
Start your assistant and ask it something like "what has focus in NVDA?". It answers without pressing anything.
With pip or pipx instead of uv
pipx install nvda-mcp
claude mcp add --scope user nvda -- nvda-mcp
Use the same version as the add-on, and upgrade both together. With plain pip, run python -m nvda_mcp if the
nvda-mcp command is not found.
Safety
Reading is always allowed. Everything that acts on your computer is off until you turn it on: pressing keys, typing, switching windows, activating controls, moving through web pages, running NVDA commands and reloading add-ons.
In NVDA's Settings, NVDA MCP category:
- Let MCP clients, such as AI assistants, connect to NVDA (on by default).
- Allow MCP clients to press keys (off by default).
- Ask before the first key press after NVDA starts (on by default). NVDA asks you, with No focused, and names the program asking, as it calls itself.
- Only let MCP clients control these applications (empty by default, meaning all).
For example
notepad, winword. Anything else is refused. - Keep a log of every action MCP clients take (on by default), in
%APPDATA%\nvda\nvdaMcp\actions.log. - Number of spoken messages to remember (500 by default).
Commands in Input Gestures, NVDA MCP category (no keys assigned by default):
- Report whether NVDA MCP is running and whether it may press keys.
- Stop MCP clients from pressing keys until you approve again.
- Open the log of actions MCP clients have taken.
How the connection is protected:
- The add-on listens only on your own computer (127.0.0.1), on a random port.
- Every request needs a secret token, made new each time NVDA starts, stored where only your Windows account can read it.
- Requests from web pages are refused.
- Nothing works on secure screens (sign-in, UAC), and requests are refused while Windows is locked.
- The settings live in NVDA's base configuration, so a configuration profile cannot turn key presses on.
Privacy
The add-on itself sends nothing over the internet. But what your assistant reads goes to the assistant, and most assistants send it to their provider's servers. That can include the text on your screen, what NVDA says, the contents of documents and chat windows, and anything NVDA reads aloud while you type.
- Before you work with something private, such as banking, passwords or personal messages, close your assistant or turn off Let MCP clients connect in NVDA's settings.
- NVDA's speech history is kept in memory only, and cleared when NVDA restarts.
- The action log stays on your computer.
Tools
The assistant sees these tools:
| Tool | What it does |
|---|---|
nvda_get_status |
NVDA version, synthesizer, speech mode, foreground app, permissions |
nvda_get_focus |
The focused control: name, role, states, value, position, containers |
nvda_get_navigator_object |
The same, for NVDA's navigator object |
nvda_get_object_tree |
The accessibility tree of the foreground window, focus or navigator; long lists are shortened |
nvda_find_objects |
Find controls in the foreground window by name and/or role |
nvda_get_text |
Full text of a document, web page or edit field, plus the caret line; or only the lines containing some text |
nvda_get_speech_history |
What NVDA said, with ids for polling and a text filter |
nvda_wait_for_speech |
Wait until NVDA says something, such as a chat reply |
nvda_list_windows |
Open application windows, including ones on other virtual desktops if asked |
nvda_speak |
Say something through NVDA's speech and braille |
nvda_press_keys |
Press keys, optionally holding modifiers, then report what NVDA said and where focus went |
nvda_type_text |
Type a line of text in any language, emoji included, without using the clipboard |
nvda_activate_window |
Bring a window to the front by title or handle |
nvda_focus_object |
Move focus to a control found with nvda_find_objects |
nvda_activate_object |
Press, follow or toggle a control found with nvda_find_objects |
nvda_set_document_mode |
Switch between browse mode and focus mode in a web page, like NVDA+space |
nvda_find_in_page |
Move the browse mode cursor to a match on the page, like NVDA's find command |
nvda_list_elements |
Headings, links, landmarks, form fields and more, like the Elements List |
nvda_move_to_element |
Move to, or activate, an element from nvda_list_elements |
nvda_get_action_log |
The newest entries of the log of actions clients took |
nvda_audit_focus_order |
Tab through a window and report unlabeled controls, silent controls, duplicate names, keyboard traps |
For developers of add-ons and accessible applications:
| Tool | What it does |
|---|---|
nvda_preview_speech |
What NVDA would announce when a control gets focus, without moving focus; scan a whole window and flag unlabeled or silent controls |
nvda_trace_events |
Record the events NVDA handles (focus, name and value changes, live regions, UIA notifications) and what it said for each one |
nvda_get_log |
NVDA's log, filtered by level and text; IO entries (keys typed) only when asked |
nvda_get_output_history |
Beeps, sounds, braille output and speech being cut off, optionally merged with speech |
nvda_get_dev_info |
Developer info for a control, like NVDA+F1 |
nvda_list_scripts |
NVDA commands available where focus is, with their keys; or which command a key runs |
nvda_run_script |
Run an NVDA command by name, whatever key it is assigned to |
nvda_reload_plugins |
Reload add-ons and app modules from disk, like NVDA+control+F3 |
nvda_get_settings |
Read NVDA's settings as they apply now; values that look like secrets are hidden |
nvda_run_scenario |
Run keys and typing, record what NVDA said after each step, and compare with a baseline file |
Every action reports what NVDA said afterwards and where focus went, and can wait for an expected announcement, such as "sent" or a dialog's title.
Support NVDA MCP
NVDA MCP is free, and made in spare time. If it helps you, you can support its development with a donation through PayPal. There is also a Donate button in NVDA's Settings, NVDA MCP category.
More
- Using NVDA MCP: updating, restarting the server, and what to do when something does not work.
- What's new in each version.
- Contributing: building, testing and releasing.
- Questions and bug reports: GitHub issues.
License
Copyright (C) 2026 InfiArtt. NVDA MCP is free software under the GNU General Public License, version 2 or later. The software it uses and their licenses are listed in THIRD_PARTY_NOTICES.md.
Metadata
Release files for nvda-mcp 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| nvda_mcp-1.0.0.tar.gz | 36.8 kB | With provenance | Details for nvda_mcp-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| nvda_mcp-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for nvda_mcp-1.0.0-py3-none-any.whl |
Total release size: 74.8 kB
Release files / nvda_mcp-1.0.0.tar.gz
| Download URL | nvda_mcp-1.0.0.tar.gz |
|---|---|
| Size | 36.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
75b698bbf3680b5e8325e058421b07bc795d146e18188353f0c9bebb8b9918c9
|
|
BLAKE2b-256 checksum How to use checksums |
8750bd1be56d32d0b96d8d866481d5cc0d90aebb9cb323babaa289b5f9f3f705
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.
Transparency logRelease files / nvda_mcp-1.0.0-py3-none-any.whl
| Download URL | nvda_mcp-1.0.0-py3-none-any.whl |
|---|---|
| Size | 38.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6ddaf6399d052586b167342225f7e85e45b5479984a68bdf7e3401adc0b8c040
|
|
BLAKE2b-256 checksum How to use checksums |
435a5ca94d5e72c1b76421ddb6175bdd0934ce89990832a05b20ea98bfdc750a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.
Transparency logSecurity for nvda-mcp 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for nvda_mcp-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.