mcp-tools.nvim
一个NeoVim插件,它将Lua函数作为MCP(模型上下文协议)工具,用于OpenCode、Claude Code和Cursor等AI编码助手。
特性
- DAP集成:检查调试会话、调用堆栈、变量和计算表达式
- LSP工具:查询悬停信息、文档符号和诊断
- 撤消树:检查撤消历史记录
- 面试工具:AI可以通过原生NeoVim UI向用户提出多项选择或自由文本问题
- OpenCode自动集成:启动时自动向OpenCode注册
- Ampcode集成:通过MCP工具启动Amp CLI
:AmpStartWithMCP - 定制工具:将您自己的Lua函数注册为MCP工具
需求
- NeoVim 0.9+
- 什么之中的一个: 小圆面包 或使用npx的Node.js 18+
- 可选: nvim-dap 用于调试工具
- 可选: nui-components.nvim 用于面试工具
- 可选: opencode.nvim 用于汽车集成
- 可选: 安培 用于Ampcode集成的CLI
安装
lazy.nvim
{
"guill/mcp-tools.nvim",
build = "cd bridge && npm install",
config = function()
require("mcp-tools").setup()
end,
}包装商nvim
use {
"guill/mcp-tools.nvim",
run = "cd bridge && npm install",
config = function()
require("mcp-tools").setup()
end,
}配置
所有工具和集成都是 默认情况下禁用.启用您需要的功能:
require("mcp-tools").setup({
-- Enable/disable built-in tools (all default to false)
tools = {
dap = true, -- Debug Adapter Protocol tools
diagnostics = true, -- LSP diagnostics
lsp = true, -- LSP hover, symbols
undo = true, -- Undo tree
interview = true, -- Interview tool (requires nui-components.nvim)
test = true, -- Test tools (for development)
},
-- Enable/disable integrations (all default to false)
integrations = {
opencode = true, -- Auto-register with OpenCode
ampcode = true, -- Enable :AmpStartWithMCP command
},
-- Bridge configuration
bridge = {
port = 0, -- 0 = OS assigns port
log_level = "info", -- debug, info, warn, error
},
-- Callbacks
on_ready = function(port)
print("MCP bridge ready on port " .. port)
end,
on_stop = function()
print("MCP bridge stopped")
end,
})内置工具
DAP工具(需要nvim-DAP)
会话管理:
| 工具 | 说明 |
|---|---|
nvim_dap_status | 获取调试会话状态 |
nvim_dap_run | 使用配置启动新的调试会话 |
nvim_dap_terminate | 终止当前调试会话 |
nvim_dap_disconnect | 断开与调试适配器的连接 |
执行控制:
| 工具 | 说明 |
|---|---|
nvim_dap_continue | 继续执行(使用可选的wait_until_used) |
nvim_dap_step_over | 跳过(可选wait_until_used) |
nvim_dap_step_into | 进入(可选wait_until_used) |
nvim_dap_step_out | 退出(可选wait_until_used) |
nvim_dap_run_to | 运行到特定的文件和行 |
nvim_dap_wait_until_paused | 等待调试器暂停 |
断点:
| 工具 | 说明 |
|---|---|
nvim_dap_set_breakpoint | 在带有可选条件的file:行设置断点 |
nvim_dap_remove_breakpoint | 删除file:行处的断点 |
nvim_dap_clear_breakpoints | 清除所有断点 |
nvim_dap_breakpoints | 列出所有断点 |
检查:
| 工具 | 说明 |
|---|---|
nvim_dap_stacktrace | 获取当前调用堆栈 |
nvim_dap_scopes | 获取堆栈帧的作用域 |
nvim_dap_variables | 获取作用域中的变量 |
nvim_dap_evaluate | 计算表达式 |
nvim_dap_threads | 列出所有线程 |
nvim_dap_current_location | 使用代码上下文获取当前位置 |
nvim_dap_program_output | 获取程序stdout/stderr/控制台输出 |
LSP工具
| 工具 | 说明 |
|---|---|
nvim_lsp_hover | 获取悬停信息 |
nvim_lsp_symbols | 获取文档符号 |
nvim_diagnostics_list | 获取诊断信息 |
撤消工具
| 工具 | 说明 |
|---|---|
nvim_undo_tree | 获取撤消树结构 |
测试工具(用于开发/调试)
这些工具验证MCP网桥异步/同步执行模式:
| 工具 | 说明 |
|---|---|
nvim_test_async_prompt | 通过用户提示测试异步执行 |
nvim_test_sync_buffers | 通过NeoVim API测试同步执行 |
面试工具(需要nui组件.nvim)
允许AI助手通过原生NeoVim浮动窗口UI向用户提问。支持单选、多选和自由文本问题。
| 工具 | 说明 |
|---|---|
nvim_interview | 使用多项选择或自由文本输入提出问题 |
注册自定义工具
工具使用基于回调的API。呼叫 cb(result) 返回成功或 cb(nil, "error message") 返回错误。
同步工具(最常见):
local mcp = require("mcp-tools")
mcp.register({
name = "my_tool",
description = "Does something useful",
args = {
bufnr = {
type = "number",
description = "Buffer number",
required = false,
default = 0,
},
},
execute = function(cb, args)
local buf = args.bufnr == 0 and vim.api.nvim_get_current_buf() or args.bufnr
cb({ buffer = buf, lines = vim.api.nvim_buf_line_count(buf) })
end,
})异步工具(用于长时间操作或用户交互):
mcp.register({
name = "delayed_response",
description = "Returns after a delay",
args = {
delay_ms = { type = "number", required = false, default = 1000 },
},
execute = function(cb, args)
vim.defer_fn(function()
cb({ message = "Done after delay" })
end, args.delay_ms)
end,
})交互式工具(等待用户输入):
mcp.register({
name = "confirm_action",
description = "Ask user for confirmation",
args = {
prompt = { type = "string", required = true },
},
execute = function(cb, args)
vim.ui.select({"Yes", "No"}, { prompt = args.prompt }, function(choice)
cb({ confirmed = choice == "Yes" })
end)
end,
})集成
OpenCode
当 integrations.opencode = true,插件会自动检测OpenCode何时启动,并向其注册MCP服务器。不需要手动步骤。
安培码
当 integrations.ampcode = true,插件提供 :AmpStartWithMCP 命令如下:
- 启动MCP网桥(如果已经运行,则重用现有网桥)
- 打开NeoVim终端
amp --ide --mcp-config
MCP配置通过临时文件传递,并与现有的Amp设置合并(不会覆盖 .amp/settings.json).
这两种集成可以同时启用,并共享同一个MCP桥。
手动桥接控制
local mcp = require("mcp-tools")
-- Start bridge manually
mcp.start({
nvim_socket = vim.v.servername,
port = 0,
})
-- Stop bridge
mcp.stop()
-- Check status
if mcp.is_running() then
print("Bridge on port " .. mcp.get_port())
end
-- List registered tools
for name, def in pairs(mcp.list_tools()) do
print(name .. ": " .. def.description)
end健康检查
跑 :checkhealth mcp-tools 以验证您的安装。
运作原理
- 插件生成一个TypeScript MCP桥,通过RPC连接到NeoVim
- 该桥通过MCP协议(流式HTTP传输)公开工具
- AI助手通过MCP发现工具
tools/list - 当调用一个工具时,桥通过以下方式调用Lua
nvim.call('luaeval', ...)
OpenCode流: 插件通过以下方式检测OpenCode opencode.state.subscribe 并通过以下方式自动注册 POST /mcp.
安培码流量: 用户运行 :AmpStartWithMCP,这打开了一个终端,其中Amp被配置为连接到电桥。
建筑
NeoVim Instance
├── mcp-tools.nvim (this plugin)
│ ├── Tool Registry (Lua)
│ └── MCP Bridge (TypeScript, child process)
│ ├── Connects to NeoVim via socket
│ ├── Exposes tools via MCP protocol
│ └── Routes tool calls back to Lua
├── opencode.nvim (optional)
│ └── Auto-discovers nvim-tools MCP server
└── Amp terminal (optional, via :AmpStartWithMCP)
└── Connects to nvim-tools MCP server许可证
麻省理工学院
