Skip to main content
Glama
santanusinha

neovim-use-mcp

by santanusinha

neovim-use-mcp

npm version CI License: MIT

An MCP server that edits files through a real Neovim instance. Your agent gets your language servers, your formatters and your plugins, not a plain text writer.

  • Real LSP — diagnostics after every edit, rename, code actions, hover, references, document and workspace symbols.

  • Minimal diffs — edit tools save the buffer with noautocmd write by default, so BufWritePre (format-on-save) does not run. Only the edited lines change. Use nvim_format to format explicitly.

  • Plugin accessnvim_command and nvim_exec_lua reach anything else.

  • stdio transport — the server starts with the agent and stops with it. It also stops the Neovim child process.


Requirements

Item

Version

Note

Node.js

18 or later

The server runs on Node.

Neovim

0.10 or later

The server calls vim.lsp.get_clients.

A Neovim config

optional

Without one, you get edits but no LSP.

Check your Neovim first:

nvim --version
nvim --headless --embed   # must start and stay quiet; press Ctrl-C to stop

If that command prints errors, a plugin breaks headless start. Use --config-mode minimal until you fix the plugin.


Related MCP server: @aetherall/mcp-nvim-tmux

Install

npm install -g neovim-use-mcp

Or use npx without a global install:

npx neovim-use-mcp

From source

git clone https://github.com/santanusinha/neovim-use-mcp.git
cd neovim-use-mcp
npm install
npm run build

The build writes dist/index.js. That file is the server.


Connect an agent

Add the server to your MCP client config.

With npx (no install needed):

{
  "mcpServers": {
    "neovim": {
      "command": "npx",
      "args": ["neovim-use-mcp"],
      "env": {
        "NVIM_MCP_CWD": "/absolute/path/to/your/project"
      }
    }
  }
}

With a global install:

{
  "mcpServers": {
    "neovim": {
      "command": "neovim-use-mcp",
      "env": {
        "NVIM_MCP_CWD": "/absolute/path/to/your/project"
      }
    }
  }
}

From a local build:

{
  "mcpServers": {
    "neovim": {
      "command": "node",
      "args": ["/absolute/path/to/neovim-use-mcp/dist/index.js"],
      "env": {
        "NVIM_MCP_CWD": "/absolute/path/to/your/project"
      }
    }
  }
}
TIP

NVIM_MCP_CWD sets the project root. The language server uses that root to find tsconfig.json, go.mod, Cargo.toml and so on. If you leave it out, the server uses the directory that the agent starts it in.

The server needs no start or stop command. The agent starts it over stdio and stops it on exit. The server then stops its Neovim child process.


First run

Ask your agent to open a file:

Open src/util/format.ts with the Neovim tools.

A correct answer looks like this:

Opened src/util/format.ts (buffer 1, 59 lines, filetype typescript).
LSP clients: null-ls, quick_lint_js, ts_ls

If you see No LSP client attached, read When no LSP attaches.


How an agent should work

The tools follow one simple order.

  1. Open the file(s) with nvim_open_file. Pass an array of paths to open several files at once. This starts the language server. Every LSP tool needs an open buffer.

  2. Read with nvim_read_file to get numbered lines.

  3. Edit with nvim_edit_text, nvim_edit_lines or nvim_insert_lines. Each edit saves the file and returns fresh diagnostics.

  4. Fix any new diagnostic with nvim_code_actions.

Three rules make the results much better:

  • Use nvim_rename_symbol for a rename. Do not use a text replace. The LSP changes every file, and a text replace does not.

  • Use nvim_edit_text when you know the exact text. It fails if the text is not unique, which stops a wrong edit.

  • Stage a multi-file change with save: false, then call nvim_save_buffer once per file.


Tools

Buffer and file

Tool

Arguments

Purpose

nvim_open_file

path (string or array), wait_ms?

Open files and start their LSP clients

nvim_read_file

path, start_line?, end_line?

Read numbered lines

nvim_edit_lines

path, start_line, end_line, text, save?

Replace a line range

nvim_edit_text

path, old_text, new_text, replace_all?, save?

Replace exact text

nvim_insert_lines

path, line, text, save?

Insert text before a line

nvim_save_buffer

path

Write a buffer (no format-on-save autocmds)

nvim_list_buffers

List open buffers

LSP

Tool

Arguments

Purpose

nvim_diagnostics

path?, severity?, wait_ms?

Errors and warnings

nvim_goto_definition

path, line, column, wait_ms?

Find a definition

nvim_references

path, line, column, wait_ms?

Find every reference

nvim_hover

path, line, column, wait_ms?

Type and documentation

nvim_rename_symbol

path, line, column, new_name

Rename across the workspace

nvim_code_actions

path, line, column, apply_index?

List or apply a quick fix

nvim_format

path, start_line?, end_line?

Format a file or a range

nvim_document_symbols

path, wait_ms?

Outline a file

nvim_workspace_symbols

query, wait_ms?

Search symbols in the project

Lines and columns start at 1.

Escape hatches

Tool

Arguments

Purpose

nvim_exec_lua

code, args?

Run Lua inside Neovim

nvim_command

command

Run an Ex command, for example a plugin command

These two tools run any code. Turn them off with --no-exec if the agent is not trusted.


Recipes

Fix every error in a file

nvim_open_file    path=src/app.ts
nvim_diagnostics  path=src/app.ts severity=error
nvim_code_actions path=src/app.ts line=42 column=9        # list
nvim_code_actions path=src/app.ts line=42 column=9 apply_index=1

Rename a symbol everywhere

nvim_open_file      path=src/util/format.ts
nvim_document_symbols path=src/util/format.ts             # find the line
nvim_rename_symbol  path=src/util/format.ts line=28 column=17 new_name=renderIssues

The tool returns the list of files that it changed and saved.

Change several places, then save once

nvim_edit_text path=src/a.ts old_text="foo(" new_text="bar(" save=false
nvim_edit_text path=src/a.ts old_text="= foo" new_text="= bar" save=false
nvim_save_buffer path=src/a.ts

Run a plugin command

nvim_command command="Telescope find_files"
nvim_exec_lua code="return vim.fn.getcwd()"

Options

Command line flags win over environment variables.

Flag

Environment

Default

Meaning

--mode

NVIM_MCP_MODE

embedded

embedded spawns its own nvim; attach connects to a socket

--socket

NVIM_MCP_SOCKET

Socket for attach mode

--nvim

NVIM_MCP_BIN

nvim

Path to the nvim binary

--config-mode

NVIM_MCP_CONFIG_MODE

user

user loads your config; minimal runs nvim --clean

--no-exec

NVIM_MCP_ALLOW_EXEC=0

exec on

Turn off nvim_exec_lua and nvim_command

--cwd

NVIM_MCP_CWD

process cwd

Project root for the LSP

--lsp-wait-ms

NVIM_MCP_LSP_WAIT_MS

3000

Default LSP wait

--max-lines

NVIM_MCP_MAX_LINES

2000

Line cap for a read

--debug

NVIM_MCP_DEBUG

off

Debug lines on stderr

Watch the agent work

Attach mode shows you every edit in your own window, live.

# terminal 1
nvim --listen /tmp/nvim.sock

# agent config
node dist/index.js --socket /tmp/nvim.sock

In attach mode the server does not stop your Neovim on exit.

The default is embedded, always. The server spawns its own headless Neovim and owns it. A socket in the environment does not change the mode, so the server does not take over your editor when the agent runs in a Neovim terminal. Ask for attach mode with --socket or --mode attach.


How lazy plugins load

Headless Neovim never fires UIEnter or VeryLazy, so a lazy.nvim setup keeps nvim-lspconfig and mason asleep, and no language server attaches. On start the server fires the VeryLazy event and forces those plugins to load. It then waits for the client count to stay stable, so a slow real language server is not missed behind a fast linter bridge.


Troubleshooting

When no LSP attaches

nvim_open_file reports No LSP client attached. Try these steps in order.

  1. Confirm the file type is correct. The tool prints it. An empty file type means Neovim did not detect the language.

  2. Raise the wait: nvim_open_file path=... wait_ms=10000. A cold TypeScript or Rust server needs more than 3 seconds.

  3. Check that NVIM_MCP_CWD points at the project root. A server that cannot find tsconfig.json does not start.

  4. Start the server with --debug and read stderr. It prints which plugins the warm-up loaded.

  5. Confirm the server starts in your own Neovim for the same file.

The server does not start

Run it by hand and read stderr:

NVIM_MCP_DEBUG=1 node dist/index.js

A healthy start prints:

[nvim-mcp] ready (mode=embedded, exec=true, cwd=/your/project)

A plugin breaks headless Neovim

Use --config-mode minimal. The server then runs nvim --clean. You keep the edit tools, but you lose your plugins and your LSP setup.

Diagnostics look wrong or stale

A linter bridge, for example null-ls with eslint_d, reports an error when the project has no lint config. Add the config, or make the null-ls source conditional on a config file. This is an editor setup problem, not a server problem.

A tool says the text is not unique

nvim_edit_text refuses an ambiguous match on purpose. Add more context lines to old_text, or set replace_all: true if you truly want every match.


Development

npm run dev              # tsc --watch
npm test                 # vitest, uses a real headless nvim
npm run typecheck        # tsc --noEmit
npm run inspect          # MCP Inspector UI

Docker

A Dockerfile is included for isolated or CI usage. The image bundles Node and Neovim, but has no user Neovim config. Mount your config if you need LSP:

docker build -t neovim-use-mcp .
docker run --rm neovim-use-mcp

Releasing

Releases publish to npm through GitHub Actions with OIDC trusted publishing. No npm token is stored.

  1. Bump the version in package.json.

  2. Tag and push: git tag v0.x.0 && git push origin v0.x.0.

  3. Create a GitHub Release from the tag.

  4. The Publish to npm workflow builds, tests, and publishes automatically.


Licence

MIT

CAUTION

This is completely vibe coded. I guarantee absolutely nothing!!

Available Tools

18 tools
nvim_code_actionsList or apply a code actionA
Destructive

List LSP code actions at a position. Pass apply_index to apply one and save the file. Use this to apply quick fixes for diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineYesLine number, 1-based
pathYesFile path
columnYesColumn number, 1-based
wait_msNoLSP timeout
apply_indexNoIndex from a previous list call; omit to only list

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses that applying an action saves the file, adding a concrete behavioral detail beyond the destructiveHint annotation. It also clarifies the list vs. apply distinction, which is helpful.

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 concise sentences front-load the main purpose (list or apply code actions) and immediately follow with the optional apply_index behavior and the common use case. No wasted words.

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?

The description covers the core functionality, the file-saving side effect, and the intended use case. It does not detail return values, but with no output schema and a straightforward list operation, the provided info is adequate.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents apply_index semantics ('Index from a previous list call; omit to only list'). The description reinforces this but adds little new meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the tool lists LSP code actions at a position and can apply one by passing apply_index. It uses specific verbs (list/apply) and names the resource (LSP code actions), distinguishing it from sibling tools like nvim_diagnostics.

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 description gives clear context: 'Use this to apply quick fixes for diagnostics.' It does not explicitly name alternatives or exclusions, but this guidance is sufficient for an agent to know when to use it.

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

nvim_commandRun an Ex commandA
Destructive

Run a Neovim Ex command, for example 'Telescope find_files' or 'Git blame', and return its output. Use this to drive installed plugins.

ParametersJSON Schema
NameRequiredDescriptionDefault
commandYesEx command without the leading colon

TDQS

A4.3/5.0
Behavior3/5

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

Annotations declare readOnlyHint=false and destructiveHint=true, so the agent already knows this can mutate state. The description adds that it returns output, which is useful, but does not elaborate on side effects or risks beyond what annotations imply. It neither contradicts annotations nor adds deep behavioral context.

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?

The description is exactly two sentences, no wasted words. The first sentence states purpose with examples, the second provides usage context. Every sentence earns its place.

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

Completeness5/5

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

With a single parameter, full schema coverage, no output schema required, and annotations covering safety, the description is sufficient. It explains what it does, gives examples, mentions output return, and states the intended use case for plugins.

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?

The schema already provides a clear description of the 'command' parameter (Ex command without leading colon). The description adds value through concrete examples ('Telescope find_files', 'Git blame') that illustrate expected input, enhancing understanding beyond the schema alone.

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

Purpose5/5

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

The description clearly states the tool runs a Neovim Ex command, with concrete examples like 'Telescope find_files' and 'Git blame', and explicitly distinguishes this from other sibling tools by focusing on Ex commands and plugin driving.

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 description gives clear usage context: 'Use this to drive installed plugins.' This implies when to use it (invoking plugin commands) but does not explicitly name alternatives or exclusions, such as using nvim_exec_lua for Lua code, leaving a small gap.

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

nvim_diagnosticsGet LSP diagnosticsA
Read-onlyIdempotent

Get LSP errors and warnings for one file, or for every open buffer when path is omitted. Use this to check work after an edit.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoFile path; omit for all open buffers
wait_msNoSettle time
severityNoLowest severity to report, default hint

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds a behavioral trait: omitting the path returns diagnostics for all open buffers, which goes beyond the schema. However, it does not disclose other potential behaviors like rate limits or detailed response formatting, so it earns a mid-range score.

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?

The description is concise (two sentences) and front-loaded with the core action. Every word earns its place, and it avoids redundancy with the schema.

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?

For a read-only diagnostics tool with three optional parameters and no output schema, the description is sufficient. It states what the tool does, when to use it, and the key behavior of path omission. It lacks return value details, but without an output schema and given the simple nature, this is acceptable.

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

Parameters3/5

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

Schema description coverage is 100%, with every parameter (path, wait_ms, severity) already described. The description adds no parameter-specific details beyond what the schema provides, so the baseline score of 3 applies.

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

Purpose5/5

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

The description clearly states the tool's purpose with a specific verb and resource: 'Get LSP errors and warnings'. It also distinguishes the tool from siblings by describing scope variations (one file or all open buffers).

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 description provides clear context for when to use ('Use this to check work after an edit'), which is more than implied but does not explicitly mention alternatives or when not to use it. Since no sibling tool directly competes, this is adequate.

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

nvim_document_symbolsOutline a fileA
Read-onlyIdempotent

List the symbol outline of a file: classes, functions and fields with their line numbers. Cheaper than reading the whole file.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path
wait_msNoLSP timeout

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful context about performance ('Cheaper than reading the whole file') and the line-number output, but it omits behavioral details such as LSP dependency and timeout semantics. This is moderate additional transparency beyond annotations.

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?

The description is two sentences long, front-loads the core action, and contains no filler. Every word contributes to understanding the tool's purpose or benefit.

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?

For a simple read-only outline tool, the description adequately conveys the output (symbols and line numbers) and a practical use case. It could mention the LSP dependency or contrast with nvim_workspace_symbols, but the absence of an output schema is partially compensated by the explicit symbol list. Slightly more detail would make it complete, but it is already quite informative.

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

Parameters3/5

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

Schema description coverage is 100%, with both 'path' and 'wait_ms' already documented in the input schema. The description adds no extra parameter-level meaning, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description uses the specific verb 'List' with a well-defined resource ('symbol outline of a file') and enumerates symbol types (classes, functions, fields) plus line numbers. This clearly distinguishes it from nvim_workspace_symbols by confining scope to a single file.

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 phrase 'Cheaper than reading the whole file' provides clear context for when to use this tool as a lightweight alternative to full-file reads. However, it does not explicitly name alternatives like nvim_workspace_symbols or state when not to use it, so it stops short of a 5.

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

nvim_edit_linesReplace a line rangeA
Destructive

This is the default way to edit files. Use the provided line numbers to directly replace lines start_line..end_line (1-based, inclusive) with new text. Saves the buffer by default without running format-on-save autocmds, so the diff is minimal. Returns fresh LSP diagnostics for the file.Use nvim_format to format after editing once editing and fixes on that are done.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path
saveNoWrite the buffer, default true
textYesReplacement text; use \n for several lines
end_lineYesLast line to replace, inclusive
start_lineYesFirst line to replace, 1-based

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the destructiveHint annotation, the description discloses key behaviors: the buffer is saved by default, format-on-save autocmds are skipped to keep the diff minimal, and fresh LSP diagnostics are returned. This is valuable operational context an agent needs before invoking a destructive edit.

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

Conciseness4/5

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

The description is compact and front-loaded with the core behavior, then covers side effects and follow-up. The final sentence is slightly awkward ('once editing and fixes on that are done') and the missing space after 'file.Use' is a minor flaw, but no sentence is wasted.

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?

Given the simple schema, no output schema, and the presence of annotations, the description covers the essential action, default save behavior, formatting caveat, and return value. It could mention behavior when save=false or how invalid line ranges are handled, but those are minor given the rich schema coverage.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description reinforces the inclusive, 1-based line range semantics, but the schema already documents each parameter clearly. The description does not need to add much beyond what the schema provides.

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

Purpose5/5

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

The description uses a specific verb and resource: 'directly replace lines start_line..end_line' with new text. It also positions itself as 'the default way to edit files,' which helps an agent distinguish it from the other editing-related sibling tools.

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 description clearly establishes this as the default editing tool and gives follow-up guidance to use nvim_format afterward. It does not explicitly describe when to choose nvim_insert_lines or nvim_edit_text instead, but the 'default way to edit' framing provides sufficient context.

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

nvim_edit_textReplace exact textA
Destructive

Replace an exact string in a file. Fails if the string is missing, or if it appears more than once and replace_all is false. Saves without running format-on-save autocmds by default. It is recommended to avoid using this tool for multi-line edits.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path
saveNoWrite the buffer, default true
new_textYesReplacement text
old_textYesExact text to find, including indentation
replace_allNoReplace every match, default false

TDQS

A4.4/5.0
Behavior5/5

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

Adds substantial behavior beyond the destructiveHint annotation: failure when the string is missing, failure on multiple matches unless replace_all is true, default save behavior, and format-on-save autocmd suppression. These details are not present in the annotations and do not contradict them.

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 sentences with the core action front-loaded; every sentence earns its place by covering failure conditions, save/autocmd behavior, and a usage caution. Zero filler.

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?

Covers core action, failure modes, save behavior, and a usage caution; combined with the destructiveHint annotation this is nearly complete for a mutation tool. Gaps: return-value behavior is unspecified and no output schema exists, and the multi-line alternative tool is unnamed.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description only lightly enriches parameters by tying replace_all semantics to the multiple-match failure condition; it adds no syntax or format details for old_text/new_text beyond the schema descriptions.

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

Purpose5/5

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

States a specific verb ('Replace') and resource ('an exact string in a file'), and 'exact string' scope clearly distinguishes it from line-based siblings like nvim_edit_lines and nvim_insert_lines. The title 'Replace exact text' aligns cleanly with the description.

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?

Gives an explicit when-not-to-use: 'It is recommended to avoid using this tool for multi-line edits,' which steers agents toward the line-based siblings. However, it never names the specific alternative tool, so the agent must infer which sibling to pick.

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

nvim_exec_luaRun Lua in NeovimA
Destructive

Run a Lua chunk inside Neovim and return its value. The chunk receives its arguments through ... and must use return to send a value back. Use this to reach plugins that have no dedicated tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoValues passed to the chunk as ...
codeYesLua source; use return to send a value back

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, covering the safety profile. The description adds valuable protocol details about how arguments are passed ('through `...`') and the requirement to use `return` to send a value back, which is not explicitly stated in annotations but is essential for correct invocation.

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?

Two sentences, front-loaded with the core function, then the argument/return contract, then usage guidance. No filler or redundancy.

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?

Given the tool is a generic execution hook, the description adequately covers the execution contract (args, return), the use case (plugins without dedicated tool), and the safety profile through annotations. It lacks an explicit mention of error behavior or supported Lua value types for args/returns, but for a code-execution tool this is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100% and already documents `code` as 'Lua source; use return to send a value back' and `args` as 'Values passed to the chunk as ...'. The description repeats these details without adding new meaning, so baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb+resource: 'Run a Lua chunk inside Neovim and return its value.' It clearly distinguishes from higher-level sibling tools by positioning this as a generic escape hatch for 'plugins that have no dedicated tool'.

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

Usage Guidelines5/5

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

Explicitly says 'Use this to reach plugins that have no dedicated tool,' which implies using dedicated sibling tools when available and only falling back to this generic executor. This provides clear when-to-use and when-not-to-use guidance.

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

nvim_formatFormat a fileA
Idempotent

Format a whole file or a line range with the formatter Neovim is configured to use, then save it.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path
wait_msNoFormat timeout
end_lineNoRange end, inclusive
start_lineNoRange start, 1-based

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already indicate a non-read-only, idempotent, and non-destructive tool. The description adds meaningful behavioral context by explicitly stating that the file is saved after formatting, which is not derivable from the annotations alone. No contradiction with annotations.

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?

The description is a single, well-structured sentence that front-loads the action and resource. It contains no filler or redundant information and earns its place entirely.

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?

Given the tool's moderate complexity, the description covers the essential aspects: scope (whole file or range), the action (format and save), and the formatter context. The schema and annotations cover the remaining details, and an output schema is absent so return values do not need explanation. It is sufficiently complete.

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

Parameters3/5

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

The input schema provides descriptions for all parameters (100% coverage), so the description does not need to explain parameters in detail. It does add a slight contextual hint about whole file vs. range, but this adds minimal value over the schema.

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

Purpose5/5

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

The description clearly states a specific action ('Format') on a specific resource ('a whole file or a line range') and additionally notes that it saves afterwards. It distinguishes itself from sibling tools by focusing solely on formatting, which is unambiguous.

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 description provides clear context for when to use the tool: formatting either an entire file or a specific line range. It does not, however, explicitly exclude alternatives or name sibling tools like nvim_code_actions that might also be able to format, so it falls short of a 5.

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

nvim_goto_definitionFind a definitionA
Read-onlyIdempotent

Find where the symbol at a position is defined, through the LSP.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineYesLine number, 1-based
pathYesFile path
columnYesColumn number, 1-based
wait_msNoLSP timeout

TDQS

A3.9/5.0
Behavior3/5

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

Annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is already disclosed. The description adds that it works through LSP, which is useful dependency context. However, it doesn't clarify whether the tool returns a location, navigates the buffer, or what happens when no definition is found. With annotations covering the read-only aspect, this is adequate but not rich.

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?

The description is a single, front-loaded sentence with no filler or redundancy. It efficiently communicates the tool's core function in just 10 words, exactly what's needed for a simple LSP query tool.

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

Completeness3/5

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

The tool is simple with 4 parameters and no output schema. The description covers the basic operation but leaves ambiguous the return value or any cursor/buffer side effects. For a tool without an output schema, a bit more detail about the expected result or failure behavior would improve completeness, but it remains minimally viable.

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

Parameters3/5

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

The schema already provides clear descriptions for all 4 parameters, including line/column being 1-based and wait_ms being an LSP timeout (100% coverage). The description's phrase 'at a position' adds little beyond the schema. Baseline of 3 is appropriate because the schema handles parameter meaning.

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

Purpose5/5

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

The description clearly states the action ('Find where the symbol at a position is defined') and the mechanism ('through the LSP'). It distinguishes itself from siblings like nvim_references and nvim_hover by focusing specifically on definitions.

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 description provides clear context for when to use the tool: when you need to locate a definition. It does not explicitly mention alternatives or exclusions, but the focused purpose makes the intended usage obvious. Sibling tool names like nvim_references and nvim_hover further clarify the distinction.

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

nvim_hoverGet hover informationA
Read-onlyIdempotent

Get type and documentation information for the symbol at a position, the same text the editor shows on hover.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineYesLine number, 1-based
pathYesFile path
columnYesColumn number, 1-based
wait_msNoLSP timeout

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context by stating it returns the same text the editor shows on hover, which helps the agent understand the output without contradiction.

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?

The description is a single, focused sentence that starts with the action verb and includes the essential scope and output equivalence. There is no wasted wording or unnecessary detail.

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?

Given that there is no output schema, the description does a good job of indicating the return content ('same text the editor shows on hover'). It lacks details about exact formatting (e.g., plain text vs. markdown), but it is sufficient for a simple read-only tool with strong annotations.

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

Parameters3/5

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

The input schema already has 100% parameter coverage with descriptions for path, line, column, and wait_ms. The description does not add any additional parameter-level semantics, so it meets the baseline but doesn't exceed it.

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

Purpose5/5

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

The description uses a specific verb 'Get' and clearly defines the resource as 'type and documentation information for the symbol at a position'. It further clarifies by noting this is 'the same text the editor shows on hover', which distinguishes it from sibling tools like nvim_goto_definition or nvim_references.

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 description clearly implies the tool is for retrieving hover-style information, which is contextually distinct from other tools. However, it does not explicitly mention when not to use it or point to alternatives, so it stops short of full explicit guidance.

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

nvim_insert_linesInsert linesA

Insert text before the given line, 1-based. Use a line beyond the end to append. Saves without running format-on-save autocmds by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineYesInsert before this line, 1-based
pathYesFile path
saveNoWrite the buffer, default true
textYesText to insert; use \n for several lines

TDQS

A4.1/5.0
Behavior4/5

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

Beyond the annotations, the description discloses save behavior and that format-on-save autocmds are skipped by default. This adds meaningful context about side effects not inferable from readOnlyHint/idempotentHint/destructiveHint.

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?

The description is two concise sentences with no fluff. The primary operation is front-loaded, followed by a key usage edge case and an important behavioral detail. Every sentence earns its place.

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?

For a simple insertion tool with no output schema, the description covers the operation, line indexing, append behavior, and save/default formatting behavior. It is sufficiently complete, though it does not mention potential errors or the effect of save=false explicitly.

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 schema already documents all parameters. The description adds value by explaining that a line beyond the end appends, and by clarifying the default save behavior, which goes beyond the schema's bare descriptions.

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 clearly states the operation: insert text before a given 1-based line. It is specific enough to identify the tool's main function, though it does not explicitly contrast it with sibling tools like nvim_edit_lines or nvim_edit_text.

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?

Provides clear usage context: lines are 1-based, and using a line beyond the end appends. It does not explicitly mention alternatives or when not to use this tool, but the append guidance gives actionable usage directions.

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

nvim_list_buffersList open buffersA
Read-onlyIdempotent

List every loaded buffer with its path, filetype and modified state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, non-destructive operation. The description adds value beyond annotations by specifying the scope ('every loaded buffer') and the exact return fields (path, filetype, modified state), providing useful behavioral context without contradiction.

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?

The description is a single, well-structured sentence that front-loads the verb, includes the resource, and lists the return details. Every word provides value; there is no redundancy or unnecessary elaboration.

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

Completeness5/5

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

This is a simple tool with no parameters, no output schema, and strong annotations. The description fully communicates what the tool does and what it returns (path, filetype, modified state). Given the low complexity and the presence of safety annotations, the description is complete for an AI agent to select and invoke this tool correctly.

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?

There are zero parameters, so the description does not need to explain parameter semantics. The baseline score of 4 applies, and the description correctly focuses on what the tool does rather than repeating schema information.

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

Purpose5/5

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

The description clearly states the specific verb 'List' and the resource 'loaded buffer', and details exactly what is returned (path, filetype, modified state). This distinguishes it from sibling tools like nvim_open_file or nvim_read_file, which perform different actions.

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 context is clear: this tool lists every loaded buffer, implying it is used to inventory open buffers. While it does not explicitly mention exclusions or alternatives, the role is self-evident from the description and the sibling tool set. No prerequisite or when-not-to-use guidance is needed for such a simple read-only listing tool.

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

nvim_open_fileOpen files in NeovimA
Idempotent

Open one or more files in Neovim buffers and start their LSP clients. Pass a single path or an array of paths. Returns the buffer id, filetype, line count and attached LSP clients for each file. Call this before LSP tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path, or an array of file paths, absolute or relative to the server cwd
wait_msNoMilliseconds to wait for the LSP client to attach

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already convey idempotency and non-destructiveness. The description adds useful behavioral context: it opens buffers, starts LSP clients, and reports buffer id, filetype, line count, and attached LSP clients. No contradiction with the annotations.

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 tight sentences cover action, input format, return value, and usage timing. Every sentence earns its place and the primary purpose is front-loaded.

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

Completeness5/5

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

For a simple two-parameter tool, the description is complete: it explains input flexibility, what the call does, what it returns, and when to call it. No output schema exists, so the explicit return-value summary is valuable and sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both path and wait_ms. The description restates that a single path or array is accepted, but adds no meaningful parameter semantics beyond the schema.

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

Purpose5/5

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

The description uses a specific verb-resource pair ('Open one or more files in Neovim buffers') and adds the distinctive behavior of starting LSP clients. This clearly differentiates it from sibling tools like nvim_read_file or nvim_edit_lines.

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 description explicitly says 'Call this before LSP tools,' which gives clear timing context. It does not name alternatives or state when not to use it, so it falls slightly short of fully explicit routing.

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

nvim_read_fileRead lines from a Neovim bufferA
Read-onlyIdempotent

Read a file through Neovim with line numbers. Opens the file if needed. Use start_line and end_line to read a slice of a large file.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path
end_lineNoLast line, inclusive
start_lineNoFirst line, 1-based

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context beyond annotations: 'Opens the file if needed' discloses a potential side effect, and 'with line numbers' hints at the return format. This goes beyond what annotations provide, though it does not detail error handling or exact output structure.

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?

The description is three short sentences, front-loaded with the core purpose. Every sentence earns its place: the first states what it does, the second explains a key behavior (opening the file), and the third gives parameter guidance. There is no redundant or filler content.

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?

For a simple read tool with strong annotations and complete schema, the description is largely sufficient. It covers the tool's core behavior, optional parameters, and a key side effect. While it could mention error cases or return format in more detail, the absence of an output schema and the simplicity of the operation make this a minor gap. The description is complete enough for an agent to select and invoke the tool correctly.

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% with each parameter described. The description adds practical context by explaining that start_line and end_line are for 'read a slice of a large file,' which clarifies their purpose beyond the schema's individual descriptions. This reinforces the 1-based inclusive semantics and provides a use-case scenario, adding value over the schema alone.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Read a file through Neovim with line numbers.' It uses a specific verb (read) and resource (file/buffer), and distinguishes itself from sibling edit tools like nvim_edit_lines and nvim_insert_lines by emphasizing read-only behavior and line-numbered output. The title 'Read lines from a Neovim buffer' reinforces this.

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

Usage Guidelines3/5

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

The description implies usage by mentioning 'Use start_line and end_line to read a slice of a large file,' which gives context for when parameters are relevant. However, it does not explicitly contrast with alternatives such as nvim_open_file or nvim_edit_lines, nor does it state when not to use this tool. The usage guidance is present but implied rather than explicit.

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

nvim_referencesFind referencesA
Read-onlyIdempotent

Find every reference to the symbol at a position, through the LSP. Use this before a rename or a signature change.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineYesLine number, 1-based
pathYesFile path
columnYesColumn number, 1-based
wait_msNoLSP timeout

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that it uses LSP and finds 'every' reference, but does not disclose return format, error behavior, or how it handles the wait_ms timeout. It provides some context beyond annotations but not rich detail, so a 3 is appropriate.

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?

Two sentences, zero waste. The first sentence states the purpose, and the second gives usage context. Perfectly concise and front-loaded.

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?

The tool is simple, the schema covers parameters, and annotations cover safety. The description explains the purpose and use case. It doesn't describe return value or edge cases, but for a read-only LSP references tool with no output schema, this is adequately complete for an agent to invoke correctly. A 4 fits.

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

Parameters3/5

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

Schema description coverage is 100%, meaning all four parameters (path, line, column, wait_ms) have descriptions in the schema. The tool description does not add extra semantic meaning beyond that, so the baseline 3 is correct.

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

Purpose5/5

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

The description clearly states the action ('Find every reference'), the target ('symbol at a position'), and the method ('through the LSP'). This distinguishes it from siblings like nvim_goto_definition (jump to definition) and nvim_hover (show info), making the purpose unambiguous.

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 description explicitly says 'Use this before a rename or a signature change,' giving a clear when-to-use context. However, it does not explicitly name alternatives or say when not to use it, which would move it to a 5.

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

nvim_rename_symbolRename a symbolA
Destructive

Rename a symbol across the whole workspace with the LSP, then save every changed file. Safer than a text search and replace.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineYesLine number, 1-based
pathYesFile path
columnYesColumn number, 1-based
wait_msNoLSP timeout
new_nameYesNew symbol name

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the destructiveHint annotation, the description discloses that it 'save[s] every changed file' and operates 'across the whole workspace,' which is important behavioral context. It doesn't cover undoability or permission requirements, but it adds meaningful detail about side effects.

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?

The description is two concise sentences with no fluff. The first sentence front-loads the action and scope, and the second provides a comparative benefit. Every word earns its place.

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?

Given that there is no output schema, the description covers key aspects: what it does (LSP rename), scope (workspace), and side effects (saves changed files). It is sufficiently complete for this straightforward mutation tool, though it could mention potential reliability dependencies on the LSP.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter already having a clear description. The tool description does not add extra meaning to the parameters, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's function: 'Rename a symbol across the whole workspace with the LSP, then save every changed file.' It uses a specific verb and resource (rename symbol) and distinguishes itself from sibling editing tools by emphasizing workspace-wide LSP-based renaming.

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 description provides context by stating 'Safer than a text search and replace,' which implies when this tool should be preferred over naive text editing. It does not explicitly name alternatives or exclusions, but the rationale gives a clear usage signal.

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

nvim_save_bufferSave a bufferA
Idempotent

Write a buffer to disk without running format-on-save autocmds. Use this after edits made with save set to false.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFile path

TDQS

A4.3/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations by disclosing that format-on-save autocmds are skipped. It also clarifies the intended workflow tie-in to edits made with save=false, which is not implied by the structured annotations.

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?

The description is two sentences with no filler. The core action is front-loaded, followed by the key behavioral caveat and then the usage context. Every sentence adds necessary information.

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

Completeness5/5

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

For a simple one-parameter tool with annotations already covering safety and idempotency, the description is complete. It conveys the purpose, the critical behavioral exception, and the specific scenario in which the tool should be used.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'path' parameter is already documented as 'File path'. The description does not add further parameter-level detail, so the baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the specific action: 'Write a buffer to disk', identifying both the verb and resource. It further distinguishes itself by noting it does so 'without running format-on-save autocmds', which separates it from formatting-related sibling tools.

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 description gives explicit guidance on when to use the tool: 'Use this after edits made with save set to false.' This provides clear context for invocation, though it does not explicitly name alternatives or state when not to use it.

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

nvim_workspace_symbolsSearch workspace symbolsA
Read-onlyIdempotent

Search symbols across the whole project through the LSP. Use this to find a definition by name without knowing the file.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSymbol name or prefix
wait_msNoLSP timeout

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds useful context that results come from the LSP and span the whole project, but it does not disclose timeout behavior, potential need for an active language server, or return format. This is comparable to the get_calls example.

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?

Two concise sentences immediately state the action, scope, method, and intended use. No wasted words; every clause adds value.

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?

Given the simple 2-parameter schema, rich annotations, and no output schema, the description sufficiently covers purpose, usage context, and implementation. It lacks an explicit alternative mention, but the 'whole project' scope strongly implies a contrast with document-local tools.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both query and wait_ms. The description reinforces that query is a symbol name or prefix, but adds no additional semantic detail beyond the schema.

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

Purpose5/5

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

The description clearly states the tool searches symbols across the whole project via LSP, with a specific use case: finding a definition by name without knowing the file. This distinguishes it from sibling tools like nvim_document_symbols and nvim_goto_definition.

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?

It explicitly advises when to use the tool: 'find a definition by name without knowing the file.' This provides clear context but does not name alternatives or state when not to use it, so a small gap remains.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.1.4
    • Changednvim_open_file3 fields changed
      • addedInput schema / properties / path / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / path / description
        Previous value: -"File path, absolute or relative to the server cwd"New value: +"File path, or an array of file paths, absolute or relative to the server cwd"
      • removedInput schema / properties / path / type
        Removed value: -"string"
  2. 18 tool updatesv0.1.0
    • First observednvim_code_actions
    • First observednvim_command
    • First observednvim_diagnostics
    • First observednvim_document_symbols
    • First observednvim_edit_lines
    • First observednvim_edit_text
    • First observednvim_exec_lua
    • First observednvim_format
    • First observednvim_goto_definition
    • First observednvim_hover
    • First observednvim_insert_lines
    • First observednvim_list_buffers
    • First observednvim_open_file
    • First observednvim_read_file
    • First observednvim_references
    • First observednvim_rename_symbol
    • First observednvim_save_buffer
    • First observednvim_workspace_symbols

TDQS

A4.1/5.0

Scored across 18 tools

Disambiguation4/5

Most tools target a distinct operation: reading, editing, LSP queries, diagnostics, formatting, and plugin dispatch are clearly separated. The only mild ambiguity is among nvim_edit_lines, nvim_edit_text, and nvim_insert_lines, though their descriptions explain when to use each.

Naming Consistency4/5

All tools share the nvim_ prefix and use snake_case, which makes the set feel cohesive. However, some names are verb_noun (nvim_read_file, nvim_edit_lines) while others are noun-oriented (nvim_diagnostics, nvim_command, nvim_document_symbols), creating a minor style inconsistency.

Tool Count4/5

18 tools is slightly above the typical 3-15 range, but the count is justified by the server's broad scope covering file editing, buffer management, LSP navigation, diagnostics, formatting, and plugin access. No tool feels like filler, so the set is reasonable despite being a bit large.

Completeness4/5

The tool surface covers core workflows well: reading and editing files, formatting, saving, diagnostics, symbols, references, hover, rename, and code actions are all present. Minor gaps exist, such as no explicit buffer-close or file-create tool and no LSP implementation/type-definition navigation, but agents can work around these via nvim_command or nvim_exec_lua.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    A Model Context Protocol server that utilizes a headless Neovim instance as an IDE kernel for advanced code editing and navigation. It provides tools for LSP-powered diagnostics, buffer management, and structural edits using Tree-sitter.
    -
  • A
    license
    A
    quality
    D
    maintenance
    Make Neovim feel like Cursor. This MCP server gives an agent full control over the Neovim session it is running inside, including buffers, windows, diagnostics, LSP language intelligence, and terminals.
    23
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server that exposes LSP-backed code navigation and editing tools to LLM agents using a single global config file to route file extensions to language servers.
    MIT