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
7.1 KiB
7.1 KiB
hanzo-tools-fs
Filesystem tools for reading, writing, editing, and searching files with permission management.
Installation
pip install hanzo-tools-fs
Or as part of the full toolkit:
pip install hanzo-mcp[tools-all]
Overview
hanzo-tools-fs provides:
- read - Read file contents with line numbers
- write - Write/create files
- edit - Edit files with find/replace
- tree - Directory tree view
- find - Find files by pattern
- search - Search file contents (ripgrep-powered)
- ast - AST-based code structure search
Quick Start
# Read a file
read(file_path="/path/to/file.py")
# Write a file
write(file_path="/path/to/new.py", content="print('hello')")
# Edit a file
edit(file_path="/path/to/file.py", old_string="foo", new_string="bar")
# Search for patterns
search(pattern="TODO", path="./src")
# Find files
find(pattern="*.py", path="./src")
# View directory structure
tree(path="./src", depth=3)
# AST-based code search
ast(pattern="class.*Service", path="./src")
Tools Reference
read
Read file contents with line numbers.
# Basic read
read(file_path="/path/to/file.py")
# Read with offset and limit (for large files)
read(file_path="/path/to/large.py", offset=100, limit=50)
Parameters:
file_path(required): Absolute path to the fileoffset: Starting line number (0-based, default: 0)limit: Maximum lines to read (default: 2000)
Output format:
1→def hello():
2→ print("Hello, World!")
3→
[Showing lines 1-3 of 3]
write
Write content to a file, creating it if it doesn't exist.
# Create new file
write(file_path="/path/to/new.py", content="print('hello')")
# Overwrite existing file
write(file_path="/path/to/existing.py", content="new content")
Parameters:
file_path(required): Absolute path to the filecontent(required): Content to write
edit
Edit a file by replacing text.
# Simple replacement
edit(
file_path="/path/to/file.py",
old_string="def old_name():",
new_string="def new_name():"
)
# Replace multiple occurrences
edit(
file_path="/path/to/file.py",
old_string="TODO",
new_string="DONE",
expected_replacements=5
)
Parameters:
file_path(required): Absolute path to the fileold_string(required): Text to findnew_string(required): Text to replace withexpected_replacements: Expected number of replacements (default: 1)
tree
Display directory tree structure.
# Basic tree view
tree(path="/project")
# Limited depth
tree(path="/project", depth=2)
# Include filtered directories
tree(path="/project", include_filtered=True)
Parameters:
path(required): Directory pathdepth: Maximum depth (default: 3)include_filtered: Include commonly filtered dirs like node_modules (default: false)
Output format:
├── src/
│ ├── main.py
│ └── utils/
│ └── helpers.py
├── tests/
│ └── test_main.py
└── pyproject.toml
find
Find files and directories by pattern.
# Find Python files
find(pattern="*.py", path="/project")
# Find test files
find(pattern="test_*.py", path="/project")
# Find directories
find(pattern="*config*", path="/project", type="dir")
# Limit results
find(pattern="*.md", path="/project", max_results=20)
Parameters:
pattern(required): Glob pattern to matchpath: Directory to search (default: current directory)type: Filter by type - "file", "dir", or None for bothmax_results: Maximum results (default: 100)
search
Search for patterns in file contents using ripgrep.
# Basic search
search(pattern="TODO", path="./src")
# Search with file filter
search(pattern="import", path="./src", include="*.py")
# Search with context lines
search(pattern="error", path="./logs", context_lines=5)
# Limit results
search(pattern="function", path="./src", max_results=20)
Parameters:
pattern(required): Regex pattern to search forpath: Directory or file to search (default: current directory)include: Glob pattern to filter files (e.g., "*.py")context_lines: Lines of context around matches (default: 2)max_results: Maximum results (default: 50)
Features:
- Uses ripgrep (rg) if available for high performance
- Falls back to Python regex if ripgrep not installed
- Async file I/O for non-blocking operation
ast
AST-based code structure search using tree-sitter.
# Find function definitions
ast(pattern="def test_", path="./tests")
# Find class definitions
ast(pattern="class.*Service", path="./src")
# Find with line numbers
ast(pattern="async def", path="./src", line_number=True)
# Case-insensitive search
ast(pattern="config", path="./src", ignore_case=True)
Parameters:
pattern(required): Regex pattern to search forpath(required): File or directory to searchignore_case: Case-insensitive matching (default: false)line_number: Display line numbers (default: false)
Supported Languages:
- Python (.py, .pyw)
- JavaScript/TypeScript (.js, .jsx, .ts, .tsx)
- Go (.go)
- Rust (.rs)
- C/C++ (.c, .cpp, .h, .hpp)
- Java (.java)
- Ruby (.rb)
- PHP (.php)
- And more...
Permission Management
All filesystem tools respect permission boundaries:
from hanzo_tools.fs import register_tools
from hanzo_tools.core import PermissionManager
# Set up permission manager
pm = PermissionManager(
allowed_paths=["/home/user/project"],
denied_paths=["/home/user/project/.env"]
)
# Register tools with MCP server
register_tools(mcp_server, pm)
Read-Only Tools
For sandboxed environments, use read-only tools:
from hanzo_tools.fs import get_read_only_filesystem_tools
# Get only read operations
tools = get_read_only_filesystem_tools(permission_manager)
# Includes: read, tree, find, search, ast
Examples
Code Review Workflow
# Find all TODO comments
search(pattern="TODO|FIXME", path="./src")
# Check code structure
ast(pattern="class.*", path="./src")
# Review specific file
read(file_path="./src/main.py")
Refactoring Workflow
# Find all usages of old function name
search(pattern="old_function_name", path="./src")
# Find function definition
ast(pattern="def old_function_name", path="./src")
# Edit the function
edit(
file_path="./src/utils.py",
old_string="def old_function_name(",
new_string="def new_function_name("
)
Project Exploration
# Get project structure
tree(path="./", depth=3)
# Find configuration files
find(pattern="*.toml", path="./")
find(pattern="*.json", path="./")
# Search for entry points
ast(pattern="def main|if __name__", path="./src")
Best Practices
- Use absolute paths - All tools expect absolute paths for reliability
- Set appropriate limits - Use
limitandmax_resultsto avoid overwhelming output - Prefer search over read - Use search/ast to find relevant code instead of reading entire files
- Use tree for orientation - Start with tree to understand project structure
- Combine tools - Use find + read or search + edit for efficient workflows