feat(mcp): implement Prompts capability, Resources, and clean up daemon architecture
This commit is contained in:
1 parent
9b9b403ef2
commit
251757f8fc
29 files changed
+1276
-182
No files matched your search
@@ -0,0 +1,45 @@
|
||||
# Antigravity Neovim MCP Instructions
|
||||
|
||||
When connected to this Neovim MCP server (win-nvim or linux-nvim), you have powerful tools to interact directly with the active Neovim editor.
|
||||
|
||||
## The Tool Arsenal
|
||||
The following tools are available (many should be agerTools):
|
||||
- **File/Buffer Mgmt:**
|
||||
vim_open_file,
|
||||
vim_open_buffer,
|
||||
vim_close_buffer,
|
||||
vim_split_window,
|
||||
vim_reload_buffer,
|
||||
vim_save_buffer
|
||||
- **State Reading:**
|
||||
vim_get_active_buffer,
|
||||
vim_get_cursor,
|
||||
vim_get_visual_selection,
|
||||
vim_get_viewport,
|
||||
vim_get_messages
|
||||
- **Diagnostics & Visuals:**
|
||||
vim_set_diagnostics,
|
||||
vim_highlight_lines,
|
||||
vim_set_quickfix
|
||||
- **God Mode:**
|
||||
vim_execute_lua
|
||||
|
||||
## 1. Using Dedicated Tools First
|
||||
Always prefer the specific dedicated tools (like
|
||||
vim_open_file,
|
||||
vim_highlight_lines, etc.) over writing raw Lua scripts. These tools are tested and safe.
|
||||
|
||||
## 2. Lua God Mode (
|
||||
vim_execute_lua)
|
||||
If you need to access *any* Neovim API that does not have a dedicated tool (e.g., complex buffer edits, changing options, LSP interactions), you MUST use
|
||||
vim_execute_lua as your escape hatch.
|
||||
|
||||
### CRITICAL RULES for
|
||||
vim_execute_lua:
|
||||
1. **Never Block:** Never use interactive prompts (im.fn.input, im.ui.select, im.fn.confirm) or confirmation flags in regex substitutions (e.g., %s/old/new/gc). This will cause the headless MCP bridge to deadlock forever.
|
||||
2. **Visual Feedback:** Always trigger a notification using ␍equire("notify")("Antigravity: [Action]", "info", { title = "Antigravity" }).
|
||||
3. **Auto-Save:** If you modify a file buffer, always save it using im.cmd('write') within the same Lua script so external tools can see the changes, unless you explicitly want to pause for manual human review.
|
||||
4. **Buffer Focus:** When making changes to a specific buffer, always ensure the active window is switched to that buffer, and optionally move the cursor so the human can see the change visually.
|
||||
|
||||
## 3. The "Unix is NOT King" Rule
|
||||
When Neovim is running and you need to perform file read/writes or search and replace within an opened project, **prioritize Neovim tools over basic unix terminal utilities** (like cat, grep, sed, wk, or PowerShell equivalents). Use Neovim as your primary interface to the codebase.
|
||||
+125
-1
@@ -605,7 +605,8 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
||||
app_name.clone(),
|
||||
app_version.clone(),
|
||||
))
|
||||
.with_protocol_version(rmcp::model::ProtocolVersion::V_2024_11_05);
|
||||
.with_protocol_version(rmcp::model::ProtocolVersion::V_2024_11_05)
|
||||
.with_instructions(include_str!("instructions.md"));
|
||||
|
||||
send_response(JsonRpcResponse {
|
||||
jsonrpc: "2.0".to_string(),
|
||||
@@ -696,6 +697,129 @@ pub async fn run_mcp_loop(app_name: &str, app_version: &str) {
|
||||
},
|
||||
"required": ["code"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_open_file",
|
||||
"description": "Safely opens a file in the active Neovim window",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"file": { "type": "string" },
|
||||
"filetype": { "type": "string" }
|
||||
},
|
||||
"required": ["file"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_open_buffer",
|
||||
"description": "Creates and opens a transient, scratch buffer that is not tied to a file on disk",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": { "type": "string" },
|
||||
"content": { "type": "string" },
|
||||
"filetype": { "type": "string" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_close_buffer",
|
||||
"description": "Closes the current active buffer (or a specified buffer)",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"buf_id": { "type": "integer" },
|
||||
"force": { "type": "boolean" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_split_window",
|
||||
"description": "Opens a file or buffer in a split window alongside the current buffer",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"file": { "type": "string" },
|
||||
"buf_id": { "type": "integer" },
|
||||
"direction": { "type": "string", "enum": ["vertical", "horizontal"] }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_reload_buffer",
|
||||
"description": "Forces Neovim to reload the buffer from the filesystem, picking up external changes",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"buf_id": { "type": "integer" },
|
||||
"force": { "type": "boolean" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_save_buffer",
|
||||
"description": "Explicitly saves the current active buffer",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_set_quickfix",
|
||||
"description": "Populates Neovim's quickfix list with search results, compile errors, or lint warnings",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"items": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"filename": { "type": "string" },
|
||||
"lnum": { "type": "integer" },
|
||||
"text": { "type": "string" }
|
||||
},
|
||||
"required": ["filename", "lnum", "text"]
|
||||
}
|
||||
},
|
||||
"action": { "type": "string", "enum": ["replace", "append", "prepend"] }
|
||||
},
|
||||
"required": ["items"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_highlight_lines",
|
||||
"description": "Temporarily or permanently highlights a block of code, or clears existing highlights.",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"buf_id": { "type": "integer" },
|
||||
"start_line": { "type": "integer" },
|
||||
"end_line": { "type": "integer" },
|
||||
"group": { "type": "string" },
|
||||
"duration_ms": { "type": "integer", "description": "Duration to show highlight in milliseconds. Set to 0 for permanent (until cleared manually)." },
|
||||
"clear_only": { "type": "boolean", "description": "If true, will only clear existing highlights and ignore start/end lines." }
|
||||
},
|
||||
"required": ["start_line", "end_line"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_get_messages",
|
||||
"description": "Retrieves the recent Neovim command-line messages, including warnings, error popups, and plugin outputs",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"tail": { "type": "integer" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "nvim_get_viewport",
|
||||
"description": "Retrieves the exact range of lines currently visible on your screen",
|
||||
"inputSchema": {
|
||||
"type": "object",
|
||||
"properties": {}
|
||||
}
|
||||
}
|
||||
]
|
||||
})),
|
||||
|
||||
Reference in new issue
Block a user