MCP server integrating Gemini AI with Neovim for code editing, diff viewing, and IDE capabilities
This MCP server provides 15 tools for code editing and navigation in Neovim, all with descriptions and input schemas present. However, the implementation has significant quality gaps that prevent a higher score. Tool descriptions are present but generic (averaging ~80 chars, below the 194-char production baseline). Parameter descriptions exist but lack specificity about constraints, ranges, or allowed values. No output schemas are documented, the MCP protocol requires clients to know what fields to expect in responses, but this server provides no guidance. Error handling is absent from tool definitions; no guidance on what to do if a file doesn't exist, if a query fails, or if Neovim is unreachable. Security considerations are not addressed (e.g., file paths could be vulnerable to traversal attacks, but no sanitization is mentioned). The tool names are verb-first and clear (openDiff, readFile, editFile), which is positive. However, composition is weak: related tools like openDiff/closeDiff could be better integrated, and the lack of pagination/limit parameters on tools like searchWorkspaceSymbol and getWorkspaceStructure risks returning overwhelming results without agent guidance on how to handle them. The server is STDIO-only, which severely limits its utility, it cannot be used by hosted MCP clients or remote agents, only by local Neovim instances.
Closes the diff view for a specific file.
Edit a file with proposed changes.
Go to definition for the symbol at the given position (Line: 1-indexed, Character: 0-indexed).
Retrieves diagnostics (errors, warnings) for a file or the entire workspace if no file is specified.
Get the outline (symbols) of a file.
Get hover information for the symbol at the given position.
Find all references to the symbol at the given position.
No output schemas documented. The MCP spec (pattern:tool) requires documented return types so clients can plan downstream actions. None of the 15 tools declare what fields they return, their types, or their structure. This forces agents to guess and invites deserialization failures.
Missing error handling guidance. Tool descriptions do not explain what happens on failure (file not found, malformed query, Neovim unreachable). Pattern:recovery-guide requires error responses tell the agent what to do next. No guidance is provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Get the syntax tree node at the specified position using Treesitter.
Get the directory structure of the workspace starting from a root directory.
Opens a diff view in Neovim to show proposed changes.
Read the entire content of a file.
Read the content of a specific symbol from a file.
Resolve the definition of a symbol at a given position.
Run a Treesitter query on a file and return matching nodes.
Search for symbols in the workspace by name or pattern.
Unbounded pagination on list/search tools. getWorkspaceStructure accepts maxDepth with no limits documented; searchWorkspaceSymbol has no limit parameter. Agents could request thousands of results and exhaust context windows. Pattern:paginated-result requires limit, offset, and total count.
Parameter descriptions lack constraint details. 'Line number (1-indexed)' does not specify min/max, allowed range, or what happens if out of bounds. Pattern:constrained-input requires enums or format constraints for safety. Descriptions should state 'Line: 1 to N (where N is file line count)' with guidance on out-of-bounds behavior.
File path parameters accept raw strings with no sanitization guidance. LLMs can be prompted to pass paths like '../../etc/passwd' or symlinks to unintended locations. Pattern:tool-gateway requires input sanitization. Descriptions should state 'Paths are resolved relative to workspace root and must not contain .. or symlinks' with server-side validation.
Tool descriptions average ~65-80 characters, below the 194-character production baseline. Descriptions like 'Opens a diff view in Neovim to show proposed changes' lack context: When would an agent call this? What are prerequisites (file must exist?)? What is returned? Pattern:tool-description requires WHEN/WHAT/WHY clarity. Examples: 'Opens a side-by-side diff in Neovim comparing original file to proposed new content. Call after LLM generates code changes to let user review before accept/reject. Returns empty string on success; errors if filePath not found or Neovim unreachable.'
No idempotence guarantees. editFile and openDiff modify state (write files, open windows). If an agent retries due to timeout, will the edit be applied twice? Descriptions must state whether tools are idempotent (safe to retry) or not. Pattern:idempotent-operation requires this for all state-modifying tools.
No permission or capability documentation. Tools interact with Neovim and the file system but do not declare required permissions (read:files, write:files, execute:lsp). Pattern:scope-declaration requires this for audit and least-privilege configuration.
Weak tool composition. openDiff and closeDiff are separate, but agents almost always pair them (open diff → user reviews → close). This wastes two round-trips. Consider a unified review_changes(filePath, newContent, action='accept'|'reject') tool or document the expected sequence.
No batch operations. Agents calling readFile in a loop (one file per call) for 20 files waste 20 round-trips and 20x token overhead. Pattern:composition recommends batch variants like readFiles(filePathArray) or at minimum, offer multi-file support.