@aetherall/mcp-nvim-tmux
Supports recording Neovim sessions with asciinema for playback and AI-powered analysis.
Allows control of Neovim instances, including sending keystrokes, executing Vim commands and Lua code, capturing screen content, and editing files.
Provides AI analysis of recordings using configurable Ollama models, including summarization and pattern recognition.
Manages Neovim sessions inside tmux, enabling starting, stopping, and monitoring of detached sessions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@aetherall/mcp-nvim-tmuxstart a session named dev and create a Python script greeting.py"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@aetherall/mcp-nvim-tmux
An MCP (Model Context Protocol) server that enables AI agents to control Neovim instances running in tmux sessions. Features session recording, AI-powered analysis, and a standalone bash script for direct usage.
Features
Session Management: Start/stop Neovim in detached tmux sessions
Remote Control: Send keystrokes, execute Vim commands and Lua code
Screen Capture: Capture current screen content with optional ANSI colors
Pattern Matching: Wait for specific patterns to appear on screen
Session Recording: Record sessions with asciinema including user input
AI Analysis: Analyze recordings with configurable AI models to understand user actions
Flexible Configuration: Support for multiple AI backends through environment variables
Related MCP server: mcp-tmux
Installation
Using Nix Flakes
# Run directly
nix run github:aetherall/mcp-nvim-tmux#nvimrun -- start mysession
nix run github:aetherall/mcp-nvim-tmux#mcpnvimtmux
# Install to profile
nix profile install github:aetherall/mcp-nvim-tmux#nvimrun
nix profile install github:aetherall/mcp-nvim-tmux#mcpnvimtmux
# Development shell
nix develop github:aetherall/mcp-nvim-tmuxFor Direct Usage
chmod +x nvimrun.shBasic Usage
# Start a session
./nvimrun.sh start my_session 80 24
# Start with recording
./nvimrun.sh start my_session 80 24 --record
# Send keys (for navigation and special keys)
./nvimrun.sh keys my_session i # Enter insert mode
./nvimrun.sh keys my_session Escape # Exit to normal mode
./nvimrun.sh keys my_session dd # Delete line
./nvimrun.sh keys my_session C-w l # Move to right window
# Type literal text (no escaping needed!)
./nvimrun.sh type my_session "Hello World! Special chars: $HOME != $(pwd)"
# Execute vim command
./nvimrun.sh cmd my_session "w hello.txt"
# Capture screen
./nvimrun.sh screen my_session
# Stop session
./nvimrun.sh stop my_sessionRecording and Analysis
# List recordings
./nvimrun.sh recordings
# Play a recording
./nvimrun.sh play session_name
# Display recording in AI-readable format
./nvimrun.sh cat session_name
# Analyze recording with AI
./nvimrun.sh analyze session_name
# Get a summary of the recording
./nvimrun.sh analyze session_name summarize
# Use custom AI models
MCP_NVIM_TMUX_ANALYZE_MODEL=qwen3:8b ./nvimrun.sh analyze session_name
MCP_NVIM_TMUX_CMD='gemini --model $MODEL' ./nvimrun.sh analyze session_nameLua Code Execution
For simple Lua code:
./nvimrun.sh lua my_session 'print("Hello")'For complex Lua code with special characters, use a temporary file:
# Save your Lua code to a file
cat > /tmp/script.lua << 'EOF'
print("Complex code with special chars: !@#$")
vim.api.nvim_buf_set_lines(0, 0, -1, false, {"Line 1", "Line 2"})
EOF
# Execute it
./nvimrun.sh keys my_session ":luafile /tmp/script.lua" EnterAdvanced Features
Colored Output
./nvimrun.sh screen my_session --color > output.ansiWait for Patterns
./nvimrun.sh wait my_session "Pattern to find" 5 # 5 second timeoutTips
Text Input: Use
typefor literal text (no escaping needed) andkeysfor special keysSpecial Keys: Common keys include
Enter,Tab,Escape,C-w(Ctrl+w),SpaceTiming: Some operations need time to complete. Add small delays with
sleep 0.1Clean Config: nvimrun starts Neovim with
-u NONEto avoid loading user configs
Monitoring Sessions
When you start a session, you can watch it in real-time from another terminal:
# Start a session (this will show the attach command)
./nvimrun.sh start my_session 80 24
# Output includes:
# To watch in another terminal: tmux attach -t 'my_session' -r -x 80 -y 24
# In another terminal, attach with preserved size
tmux attach -t my_session -r -x 80 -y 24
# To detach from watching: Press Ctrl+b, then dImportant: The -x and -y flags preserve the original terminal size, preventing resize issues that could disrupt automation.
Other useful tmux commands:
tmux ls- List all sessionstmux attach -t session_name- Attach with control (careful - may interfere)tmux kill-session -t session_name- Force kill a stuck session
Examples
Create and edit a Python file
./nvimrun.sh start dev
./nvimrun.sh keys dev i # Enter insert mode
./nvimrun.sh type dev "def main():\n print('Hello, World!')\n return 0"
./nvimrun.sh keys dev Escape # Exit insert mode
./nvimrun.sh cmd dev "w main.py"
./nvimrun.sh stop devRun Vim macros
./nvimrun.sh start macro_test
./nvimrun.sh keys macro_test "qa" "0dwA," Escape "q" # Record macro
./nvimrun.sh keys macro_test "5@a" # Run macro 5 times
./nvimrun.sh stop macro_testMCP Server Usage
Setup with Nix
No installation needed! Use directly with nix run.
Configuration for Claude Desktop
{
"mcpServers": {
"nvim": {
"command": "nix",
"args": ["run", "github:aetherall/mcp-nvim-tmux"]
}
}
}For Claude Code (CLI)
claude mcp add nvim -- nix run github:aetherall/mcp-nvim-tmuxAvailable MCP Tools
nvim_start- Start a new Neovim session (with optional recording)nvim_stop- Stop a Neovim sessionnvim_keys- Send keystrokes (for special keys like Enter, Tab, Escape, Ctrl sequences)nvim_cmd- Execute Vim commandsnvim_lua- Execute simple Lua codenvim_lua_file- Execute complex Lua code (multiline safe)nvim_screen- Capture screen contentnvim_edit- Open file at specific linenvim_type- Type literal text without special key interpretation (perfect for code and special chars)nvim_recordings- List available recordingsnvim_play- Play a recordingnvim_cat- Display recording in AI-readable formatnvim_analyze- Analyze recording with AI
Keys vs Type: When to Use Which
Use nvim_keys for:
Navigation:
["h", "j", "k", "l"],["g", "g"],["G"]Mode changes:
["i"],["Escape"],["v"],[":"]Special keys:
["Enter"],["Tab"],["C-w"],["Space"]Vim commands:
["d", "d"],["y", "y"],["p"]
Use nvim_type for:
Code with special characters:
"const url = 'https://example.com?id=${}';"Shell commands:
"docker run -it --rm -v $(pwd):/app node"Any literal text:
"Hello! This has $pecial ch@rs & quotes \"like this\""
Environment Variables
MCP_NVIM_TMUX_CMD- AI command template (default:ollama run $MODEL)MCP_NVIM_TMUX_MODEL- Default model for all AI operationsMCP_NVIM_TMUX_ANALYZE_MODEL- Model for analysis operationsMCP_NVIM_TMUX_SUMMARIZE_MODEL- Model for summarizationNVIMRUN_PROMPTS_DIR- Directory for prompt templates
Troubleshooting
Session exists error: Use
nvimrun.sh stop <session>firstLua errors: Check for special characters that need escaping
Screen not updating: Add small delays with
sleep 0.5AI analysis fails: Ensure ollama or your AI tool is installed and in PATH
Recording not found: Check pattern matches with
nvimrun.sh recordings
Documentation
For comprehensive documentation including all parameters and examples, see MCP_DOCUMENTATION.md.
License
MIT
Available Tools
12 toolsnvim_analyzeB
Analyze a Neovim recording using AI to explain what happened
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Recording file name or pattern to match | |
| summarize | No | If true, provide a brief summary instead of detailed analysis |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It helpfully discloses that analysis is AI-driven, hinting at potential latency or non-determinism, but says nothing about cost, permissions, error behavior, or output format. The AI disclosure is real added value, but significant gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that states the action, the input, the mechanism, and the outcome with no wasted words. Well-sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with full schema coverage but no annotations and no output schema, the description is minimally adequate. It does not clarify what the analysis returns (free text vs structured), whether a recording must already exist, or what 'detailed analysis' versus 'summary' entails.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented in the schema. The description adds no syntax, pattern-matching semantics, or format detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (analyze) and resource (a Neovim recording), plus the mechanism (AI) and the goal (explain what happened). This clearly distinguishes it from sibling nvim_recordings, which likely just lists recordings. It does not explicitly name the sibling it differs from, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like nvim_recordings, nvim_cat, or nvim_play. The purpose implies usage ('when you want to understand a recording') but nothing is stated about prerequisites or exclusions, leaving the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_catB
Display asciinema recording in AI-readable format with input/output timeline
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Recording file name or pattern to match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It does disclose the output shape ('AI-readable format with input/output timeline'), but says nothing about side effects, size/truncation limits, or whether pattern matching returns one or many recordings — all relevant for a display tool fed a glob-like pattern.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the output-format information front-loaded. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
One required param, no output schema, no annotations — the description covers the essentials (what it displays and in what format) but omits selection semantics for the pattern and any limits on the recording size/timeline it returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one parameter, so baseline 3 applies. The description adds nothing about how 'pattern' matching works (glob, substring, exact) beyond what the schema field description already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Display') and resource ('asciinema recording') plus the output form ('AI-readable format with input/output timeline'), which disambiguates it from siblings like nvim_recordings (listing) and nvim_play (playback). It does not explicitly contrast with those siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus nvim_recordings, nvim_play, or nvim_analyze, all of which touch recordings. There is no mention of prerequisites or when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_cmdC
Execute a Vim command
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | Vim command to execute | |
| session | Yes | Session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses nothing: not whether the command mutates buffer state, whether errors abort or return status, whether the session must already be started, or whether the command is executed synchronously. For a tool that can arbitrarily modify an editor session, this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no waste, but the brevity reflects under-specification rather than disciplined conciseness — there is no substantive information to front-load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-mutating tool with no annotations and no output schema, the description should at minimum explain execution semantics, required session state, and error behavior. None of that is present, leaving the agent under-informed before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `session` and `command` are already documented in the schema and the baseline is 3. The description adds no format details (e.g., whether `command` should include the leading ':'), so it does not earn above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Execute a Vim command" states a verb and resource, but the resource is nearly tautological with the tool name and gives no way to distinguish it from siblings like nvim_keys, nvim_source_lua, or nvim_play, which all arguably "execute" things in the same editor session. An agent cannot tell from the description whether this runs an ex-command (':w'), an arbitrary command string, or something else.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to reach for nvim_cmd versus nvim_keys, nvim_edit, or nvim_source_lua, nor any prerequisites such as an existing session or the expected command syntax (leading colon or not). The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_editC
Open a file at a specific line
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path | |
| line | No | Line number (optional) | |
| session | Yes | Session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not say whether the file is opened in an existing editing session, whether a missing file is created, whether an already-open file is reloaded, or whether existing unsaved changes are affected. The mutation-vs-read ambiguity is left unresolved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler or repetition. It is efficient, though arguably under-specified rather than optimally concise for a 3-parameter tool in a large sibling set.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and a crowded sibling namespace, the description should clarify session prerequisites, the line default, and how this differs from other nvim viewing/mutation tools. As written it leaves the agent to infer the entire interaction model.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 'file', 'line', and 'session' adequately. The description's phrase 'at a specific line' merely restates the optional 'line' parameter and adds no format, 1-based/0-based, or default-line semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Open a file at a specific line'), which is clearer than a tautology. However, it does not reconcile the name 'nvim_edit' (which implies mutating text) with the stated behavior, nor does it distinguish this from siblings like nvim_cat or nvim_screen that also display file content. An agent could plausibly confuse this with a read/display tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus the ten sibling tools. It does not say whether 'session' must already exist (via nvim_start) or whether this is the preferred way to move the cursor to a location before calling nvim_type or nvim_keys.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_keysB
Send keystrokes to Neovim. Use for special keys and navigation. Examples: ['i'] to enter insert mode, ['Escape'] to exit, ['Enter'] for newline, ['Tab'] for tab, ['C-w', 'l'] for window navigation, ['d', 'd'] to delete line
| Name | Required | Description | Default |
|---|---|---|---|
| keys | Yes | Array of keys to send. Special keys: Enter, Tab, Escape, Space, BSpace, Delete, Up, Down, Left, Right, Home, End, PageUp, PageDown, C-x (Ctrl+x), M-x (Alt+x), F1-F12 | |
| session | Yes | Session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It shows example inputs but never states that keys mutate the buffer/editor state, whether the session must already exist, whether keys are sent atomically or in sequence, or what is returned. That is a significant gap for a state-changing tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then a usage cue, then compact examples. The example list is slightly long but each entry maps a key to an intent, so it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter tool with a rich schema and no output schema, the description is adequate on inputs but silent on session prerequisites and the effect/observability of sent keys. It covers the essentials but leaves behavioral context thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it demonstrates the array semantics (['C-w','l'] as a sequence, ['d','d'] as a compound command) that the schema's key-name list does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Send keystrokes to Neovim') with a scope hint ('special keys and navigation'). It implies differentiation from a plain typing tool but never names any sibling, so an agent cannot fully disambiguate nvim_keys from nvim_type or nvim_cmd from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for special keys and navigation' gives implied usage context — steer here for control keys rather than literal text. However, no explicit when-not condition or named alternative (e.g., use nvim_type for literal text) is provided, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_playC
Play an asciinema recording
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes | Recording file name or pattern to match |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only says 'play'. It does not disclose whether playback is blocking, whether it streams to a terminal or a buffer, whether an active nvim session is required, or what happens on a pattern miss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero padding. It is efficient, though its brevity borders on under-specification rather than being actively harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the description is too thin: playback mechanics, session requirements, and the result of the call are all unaddressed. One short clause cannot cover the behavior an agent needs before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter with an inline description, so the schema already explains that 'pattern' matches a recording file name. The description adds no format or matching semantics beyond that, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (play) and resource (asciinema recording), so an agent understands the operation. It does not explicitly differentiate itself from the related sibling nvim_recordings, which lists recordings, leaving that routing inference to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus nvim_recordings or nvim_cmd, no prerequisite stated (e.g. whether an nvim session must be running), and no exclusions. The agent must guess the context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_recordingsC
List available asciinema recordings
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not state whether the list is remote or local, what format it returns, whether it's read-only or has side effects, or whether authentication is needed. For a listing tool with zero annotation coverage, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that communicates the core purpose without waste. Appropriate size for a simple listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and no parameter details, the description is too thin. It should at least indicate what a 'recording' is in this context (e.g., asciinema files in a workspace) and what the output looks like, or how it relates to sibling tools like nvim_play.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document. The baseline for zero parameters is 4, and the description does not contradict this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'List' and resource 'asciinema recordings', which is clear enough on its own. However, it does not differentiate from siblings like nvim_play or nvim_cat, which likely involve recordings. The purpose is understandable but boundary with siblings is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance or alternatives are mentioned. It does not say when to call this versus nvim_play (which may play a recording) or other sibling tools, leaving the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_screenC
Capture the current screen content
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Include ANSI color codes | |
| session | Yes | Session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not disclose whether the screen capture is read-only, whether it includes only the visible viewport or scrollback, whether it requires an active session, or what form the returned content takes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence that is front-loaded with the action and resource. It is appropriately sized, though it is terse to the point of omitting useful detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description should explain return format and session requirements. It omits what 'screen content' looks like (plain text, ANSI, image) and any prerequisite state, leaving the agent under-informed for a tool it must call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the 'color' and 'session' parameters are already documented in the schema. The description adds no additional parameter context, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Capture') and resource ('current screen content'), which is clearly distinct from siblings like nvim_edit, nvim_type, or nvim_cmd. It does not explicitly contrast with nvim_cat or nvim_analyze, which may also surface content, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus nvim_cat, nvim_analyze, or nvim_recordings. No preconditions (e.g., a session must be running) or exclusions are stated, leaving the agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_source_luaC
Source a Lua file in Neovim using :luafile command
| Name | Required | Description | Default |
|---|---|---|---|
| session | Yes | Session name | |
| file_path | Yes | Path to the Lua file to source |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. Sourcing a Lua file executes arbitrary code with potential side effects on the running Neovim session, but the description discloses nothing about side effects, reversibility, permissions, or return behavior. Naming the :luafile mechanism is the only added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted words. It is efficient, though its brevity contributes to the missing behavioral detail rather than being purely a virtue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no output schema the description covers the core action, but the absence of annotations means it should ideally disclose the code-execution side effects and session impact. It is minimally adequate but leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'session' and 'file_path' are already documented in the schema. The description adds no syntax, path-resolution, or format details beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Source') and resource ('a Lua file in Neovim') plus the underlying mechanism (:luafile). This clearly distinguishes it from generic siblings like nvim_cmd or nvim_edit, though it doesn't explicitly name those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as nvim_cmd (which could also execute Lua) or nvim_edit. The agent is left to infer that this is the dedicated path for loading Lua files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_startC
Start a new Neovim session in tmux
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Terminal width (default: 50, min: 40, max: 100) lower is better | |
| height | No | Terminal height (default: 20, min: 15, max: 50) lower is better | |
| record | No | Record session with asciinema (default: false) | |
| session | No | Session name (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not disclose side effects such as creating a persistent tmux session, required environment/dependencies, whether sessions survive disconnects, or how to terminate them via nvim_stop.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, appropriately sized for a one-action tool. It is terse, but the missing behavioral context is captured in separate dimensions rather than being verbosity here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a session-creation tool with no annotations and no output schema, the description omits lifecycle or return behavior. The schema fully documents all optional parameters, so basic invocation is possible, but the definition is only adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and all four parameters (width, height, record, session) have detailed schema descriptions with defaults and bounds. The description adds no parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Start') and resource ('new Neovim session in tmux'), so an agent can tell this creates a session rather than editing, sending keys, or stopping. It does not explicitly distinguish itself from siblings like nvim_play or nvim_recordings, but the start-session scope is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, prerequisites, or alternative routing is provided. It does not say to use this before nvim_edit/nvim_cmd, whether tmux must be installed, or how it relates to nvim_stop, leaving usage entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_stopC
Stop a Neovim session
| Name | Required | Description | Default |
|---|---|---|---|
| session | Yes | Session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It says 'Stop' but does not disclose whether the stop is graceful, destructive, reversible, what happens to unsaved session state, or any auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single four-word sentence with no wasted words and the action is front-loaded. It is appropriately compact for a simple stop operation, though extremely minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, one-parameter tool with full schema coverage and no output schema, the description is minimally adequate. However, with no annotations and no behavioral detail, it leaves gaps around what stopping a session actually entails.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'session' parameter is already described as 'Session name' in the schema. The description adds no additional meaning about the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop' and 'Neovim session'. It is clear enough to distinguish from most siblings, especially nvim_start, but it does not explicitly name alternatives or define scope beyond the session parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. The description only states the action, leaving usage context entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nvim_typeA
Type literal text without any special key interpretation. Perfect for code, URLs, or text with special characters. All characters including $, !, quotes, etc. are typed exactly as provided. Example: 'echo $HOME' types literally without shell expansion
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to type literally. Newlines create new lines, tabs create indentation. No escaping needed! | |
| session | Yes | Session name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well on the core behavior: characters including $, !, and quotes are typed exactly, and the '$HOME' example clarifies no shell expansion occurs. It does not mention session prerequisites, current mode, or cursor behavior, leaving some operational context undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, followed by use cases and a concrete example. There is minor redundancy between 'without any special key interpretation' and 'typed exactly as provided,' but every sentence contributes and it stays brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter typing tool with no output schema, the description covers what an agent needs to invoke it correctly: literal typing, no escaping, and a clarifying example. It omits session lifecycle context (e.g., must the session already be started), which is a modest gap for this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented with newline/tab behavior and no-escaping semantics. The description adds an illustrative example but no additional semantic detail beyond what the schema provides, matching the baseline for fully covered parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Type') and resource ('literal text') and distinguishes itself from key-sequence siblings by ruling out 'special key interpretation.' It does not explicitly name an alternative like nvim_keys, so full sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear use cases ('Perfect for code, URLs, or text with special characters') and an implicit exclusion via 'without any special key interpretation.' It stops short of naming the sibling tool to use when special keys are desired, so it lacks explicit alternatives.
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.
12 tool updates
v1.0.0- First observed
nvim_analyze - First observed
nvim_cat - First observed
nvim_cmd - First observed
nvim_edit - First observed
nvim_keys - First observed
nvim_play - First observed
nvim_recordings - First observed
nvim_screen - First observed
nvim_source_lua - First observed
nvim_start - First observed
nvim_stop - First observed
nvim_type
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes: session control, text/keystroke input, Vim commands, screen capture, and recording operations. Some potential overlap exists among recording tools (play/cat/analyze/list) and between nvim_cmd, nvim_edit, and nvim_source_lua, but descriptions help distinguish them.
All tool names use a consistent nvim_ prefix and snake_case. There are minor deviations from a strict verb_noun pattern, since several names are noun/resource-oriented (nvim_screen, nvim_keys, nvim_cmd, nvim_recordings).
The server provides 12 tools, which is within the well-scoped 3-15 range. Each tool appears to cover a distinct facet of Neovim/tmux control and recording workflow without excessive redundancy.
The surface covers core Neovim lifecycle and interaction: start/stop, typing, keystrokes, commands, screen capture, and recording playback/analysis. Minor gaps include no explicit save/quit/buffer-management or tmux pane/window operations, though nvim_cmd can compensate for some of these.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Official MCP server for Agentwork — delegate tasks to AI agents with human-in-the-loop
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP server that gives AI assistants the ability to create, manage, and control terminal sessions through a safe, isolated tmux environment.1-
- AlicenseBqualityCmaintenanceA comprehensive MCP server for driving tmux sessions, windows, panes, sending keystrokes, and reading pane output locally or over SSH, enabling real-time collaborative pairing with AI.714MIT
- AlicenseAqualityBmaintenanceMake 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.23MIT
- AlicenseAqualityDmaintenanceMCP server that gives AI assistants full visibility into your tmux sessions — browse sessions, windows, and panes, read terminal output, and send commands.1451 npm1MIT