Add detailed documentation with examples for: - hanzo-tools-fs: read, write, edit, tree, find, search, ast - hanzo-tools-shell: cmd, ps, zsh, bash, auto-backgrounding - hanzo-tools-browser: 70+ Playwright actions, device emulation - hanzo-tools-memory: memories, facts, knowledge bases, scopes - hanzo-tools-reasoning: think and critic tools - hanzo-tools-lsp: go-to-definition, references, rename, hover - hanzo-tools-refactor: rename, extract, inline, batch operations - hanzo-tools-agent: multi-agent orchestration, consensus, swarm - hanzo-tools-llm: unified LLM interface with 100+ models Each doc includes: - Installation instructions - Quick start examples - Full API reference - Usage examples - Best practices
6.4 KiB
hanzo-tools-lsp
Language Server Protocol tool for code intelligence. Provides go-to-definition, find references, rename, hover, and more.
Installation
pip install hanzo-tools-lsp
Or as part of the full toolkit:
pip install hanzo-mcp[tools-all]
Overview
hanzo-tools-lsp provides on-demand LSP configuration and automatic installation:
- definition - Go to definition of symbol at position
- references - Find all references to symbol
- rename - Rename symbol across codebase
- hover - Get hover information at position
- completion - Get code completions at position
- diagnostics - Get errors and warnings for file
- status - Check LSP server status
Supported Languages
| Language | LSP Server | Install Command |
|---|---|---|
| Go | gopls | go install golang.org/x/tools/gopls@latest |
| Python | pyright | npm install -g pyright |
| TypeScript/JS | typescript-language-server | npm install -g typescript typescript-language-server |
| Rust | rust-analyzer | rustup component add rust-analyzer |
| Java | jdtls | brew install jdtls |
| C/C++ | clangd | brew install llvm |
| Ruby | solargraph | gem install solargraph |
| Lua | lua-language-server | brew install lua-language-server |
Quick Start
# Go to definition
lsp(action="definition", file="/path/to/file.go", line=10, character=15)
# Find all references
lsp(action="references", file="/path/to/file.py", line=25, character=8)
# Rename symbol
lsp(action="rename", file="/path/to/file.ts", line=5, character=10, new_name="newName")
# Get hover info
lsp(action="hover", file="/path/to/file.rs", line=42, character=20)
# Get completions
lsp(action="completion", file="/path/to/file.py", line=30, character=5)
# Check status
lsp(action="status", file="/path/to/file.go")
Actions Reference
definition
Find where a symbol is defined.
lsp(action="definition", file="main.go", line=42, character=15)
Response:
{
"action": "definition",
"file": "main.go",
"definition": {
"file": "/project/pkg/utils.go",
"start": {"line": 25, "character": 5},
"end": {"line": 25, "character": 15}
}
}
references
Find all references to a symbol.
lsp(action="references", file="utils.py", line=10, character=4)
Response:
{
"action": "references",
"file": "utils.py",
"references": [
{"file": "main.py", "start": {"line": 15, "character": 8}},
{"file": "tests/test_utils.py", "start": {"line": 22, "character": 12}}
],
"count": 2
}
rename
Rename a symbol across the codebase.
lsp(action="rename", file="models.ts", line=5, character=10, new_name="newClassName")
Response:
{
"action": "rename",
"file": "models.ts",
"new_name": "newClassName",
"changes": {
"/project/models.ts": [
{"range": {...}, "newText": "newClassName"}
],
"/project/index.ts": [
{"range": {...}, "newText": "newClassName"}
]
},
"files_affected": 2
}
hover
Get documentation and type information at a position.
lsp(action="hover", file="main.rs", line=30, character=8)
Response:
{
"action": "hover",
"file": "main.rs",
"position": {"line": 30, "character": 8},
"contents": "fn process(data: &[u8]) -> Result<(), Error>\n\nProcesses the input data..."
}
completion
Get code completions at a position.
lsp(action="completion", file="app.py", line=25, character=10)
Response:
{
"action": "completion",
"file": "app.py",
"position": {"line": 25, "character": 10},
"completions": [
{"label": "append", "kind": 2, "detail": "(element) -> None"},
{"label": "extend", "kind": 2, "detail": "(iterable) -> None"}
],
"count": 2
}
status
Check if LSP server is installed and get capabilities.
lsp(action="status", file="main.go")
Response:
{
"language": "go",
"lsp_server": "gopls",
"installed": true,
"capabilities": ["definition", "references", "rename", "diagnostics", "hover", "completion"]
}
Architecture
Automatic Server Management
The LSP tool automatically:
- Detects language from file extension
- Finds project root based on language markers (go.mod, package.json, etc.)
- Checks if LSP server is installed
- Installs LSP server if needed
- Starts and initializes the server
- Maintains singleton server per language:project_root
Server Lifecycle
Request → Detect Language → Find Project Root
↓
Check Cache (language:root_uri)
↓
If not running: Install → Start → Initialize
↓
Execute LSP Request → Return Result
Global Server Registry
LSP servers are managed globally to avoid redundant instances:
# Servers are keyed by language:root_uri
# e.g., "go:/home/user/project"
# Cleanup happens automatically on process exit
Examples
Code Navigation
# Find where a function is defined
lsp(action="definition", file="handlers/user.go", line=45, character=12)
# Find all places that call this function
lsp(action="references", file="handlers/user.go", line=45, character=12)
Safe Refactoring
# First, check all references
refs = lsp(action="references", file="models.py", line=10, character=6)
# Then rename
lsp(action="rename", file="models.py", line=10, character=6, new_name="UserProfile")
IDE-like Experience
# Get documentation on hover
lsp(action="hover", file="main.rs", line=25, character=8)
# Get completions while typing
lsp(action="completion", file="app.ts", line=30, character=15)
Configuration
Project Root Detection
The LSP tool finds project roots using language-specific markers:
| Language | Markers |
|---|---|
| Go | go.mod, go.sum |
| Python | pyproject.toml, setup.py, requirements.txt |
| TypeScript | tsconfig.json, package.json |
| Rust | Cargo.toml |
| Java | pom.xml, build.gradle |
| C/C++ | compile_commands.json, CMakeLists.txt |
| Ruby | Gemfile |
Custom LSP Servers
For custom configurations, ensure the LSP server is in your PATH before using the tool.
Best Practices
- Use status first - Check if LSP is available before heavy operations
- Provide accurate positions - Line and character must match exact symbol position
- Let servers persist - Servers are cached; avoid restarting unnecessarily
- Combine with other tools - Use with search/ast for comprehensive code analysis