Hanzo AI tools - core infrastructure and tool bundles
Project description
hanzo-tools
Core infrastructure and plugin framework for Hanzo AI's modular MCP tool system.
Install
pip install hanzo-tools # Core only
pip install hanzo-tools[dev] # filesystem, shell, editor, lsp, refactor, todo, reasoning, config
pip install hanzo-tools[ai] # llm, agent, memory
pip install hanzo-tools[all] # Everything
Individual tool packages can be installed separately:
pip install hanzo-tools-fs
pip install hanzo-tools-shell
pip install hanzo-tools-browser
pip install hanzo-tools-llm
pip install hanzo-tools-memory
pip install hanzo-tools-editor
pip install hanzo-tools-vector
# ... etc
Usage
Register all discovered tools
from hanzo_tools import discover_tools, register_all
from mcp.server import FastMCP
mcp = FastMCP("my-server")
# Auto-discover and register all installed tool packages
registered = register_all(mcp)
Register individual tool packages
from hanzo_tools.fs import register_tools as register_fs
from hanzo_tools.shell import register_tools as register_shell
register_fs(mcp, permission_manager)
register_shell(mcp)
Build a custom tool
from typing import Any
from mcp.server import FastMCP
from mcp.server.fastmcp import Context as MCPContext
from hanzo_tools.core import BaseTool, ToolRegistry, with_error_logging
class WeatherTool(BaseTool):
@property
def name(self) -> str:
return "get_weather"
@property
def description(self) -> str:
return "Get current weather for a location"
@with_error_logging("get_weather")
async def call(self, ctx: MCPContext, **params: Any) -> str:
location = params["location"]
return f"Weather in {location}: 72°F, sunny"
def register(self, mcp_server: FastMCP) -> None:
@mcp_server.tool()
async def get_weather(location: str, ctx: MCPContext) -> str:
"""Get current weather for a location."""
return await self.call(ctx, location=location)
# Register with the MCP server
ToolRegistry.register_tool(mcp, WeatherTool())
Filesystem tools with permissions
from hanzo_tools.core import FileSystemTool, PermissionManager
pm = PermissionManager(
allowed_paths=["/home/user/projects"],
deny_patterns=[".git", "node_modules", ".env"],
)
class ReadFileTool(FileSystemTool):
def __init__(self):
super().__init__(permission_manager=pm)
@property
def name(self) -> str:
return "read_file"
@property
def description(self) -> str:
return "Read a file"
async def call(self, ctx, **params):
path = params["path"]
if not self.is_path_allowed(path):
return "Access denied"
return open(path).read()
def register(self, mcp_server):
@mcp_server.tool()
async def read_file(path: str, ctx) -> str:
"""Read a file."""
return await self.call(ctx, path=path)
Decorators
from hanzo_tools.core import auto_timeout, with_error_logging, handle_connection_errors
@auto_timeout("search", timeout=120)
@with_error_logging("search")
@handle_connection_errors
async def search_files(pattern: str, path: str) -> str:
...
Timeouts are configurable via environment variables:
HANZO_TIMEOUT_SEARCH=300 # Override search timeout to 5 minutes
HANZO_TIMEOUT_BROWSER=600 # Override browser timeout to 10 minutes
Tool enable/disable
from hanzo_tools.core import ToolRegistry
# Disable a tool at runtime
ToolRegistry.set_tool_enabled("browser", False)
# Check if a tool is enabled
if ToolRegistry.is_tool_enabled("browser"):
...
Tool states persist to ~/.hanzo/mcp/tool_states.json.
Architecture
hanzo-tools (core)
├── BaseTool — Abstract base for all tools
├── FileSystemTool — Base for filesystem tools with permissions
├── ToolRegistry — Enable/disable and registration
├── ToolContext — Execution context with logging/progress
├── PermissionManager — Path-based access control
├── MCPResourceDocument — Structured response formatting
├── auto_timeout — Configurable async timeouts
├── with_error_logging — Error logging to ~/.hanzo/mcp/logs/
├── handle_connection_errors — Graceful disconnect handling
├── validate_path_parameter — Path validation
├── discover_tools() — Plugin discovery via entry points
└── register_all() — Auto-register all discovered tools
hanzo-tools-fs — File read/write/search/glob
hanzo-tools-shell — Shell command execution
hanzo-tools-browser — Browser automation (Playwright)
hanzo-tools-editor — Code editing with AST awareness
hanzo-tools-lsp — Language Server Protocol integration
hanzo-tools-refactor — Refactoring operations
hanzo-tools-llm — LLM inference tools
hanzo-tools-agent — Agent orchestration
hanzo-tools-memory — Persistent memory/context
hanzo-tools-vector — Vector DB operations
hanzo-tools-database — Database query tools
hanzo-tools-jupyter — Jupyter notebook tools
hanzo-tools-todo — Task/todo management
hanzo-tools-reasoning — Chain-of-thought reasoning
hanzo-tools-config — Configuration management
hanzo-tools-mcp — MCP protocol utilities
hanzo-tools-computer — Computer use (screen/keyboard)
Tool packages register via importlib.metadata entry points (group="hanzo.tools"), enabling automatic discovery without explicit imports.
API
Core Classes
| Class | Purpose |
|---|---|
BaseTool |
Abstract base — implement name, description, call(), register() |
FileSystemTool |
Extends BaseTool with permission_manager and validate_path() |
ToolRegistry |
Class-level enable/disable with JSON persistence |
ToolContext |
Wraps MCP context with info(), warning(), error(), progress() |
PermissionManager |
Allowed paths + deny patterns for filesystem access control |
MCPResourceDocument |
Response type with to_json_string(), to_readable_string(), to_dict() |
ValidationResult |
Boolean result with optional error message |
Decorators
| Decorator | Purpose |
|---|---|
@auto_timeout(name, timeout=None) |
Async timeout with env var override (HANZO_TIMEOUT_*) |
@with_error_logging(name) |
Log errors to ~/.hanzo/mcp/logs/ and return friendly messages |
@handle_connection_errors |
Catch disconnects gracefully |
@retry(max_attempts, delay, backoff) |
Exponential backoff retry |
Top-level Functions
| Function | Purpose |
|---|---|
discover_tools() |
Find all installed tool packages via entry points |
register_all(mcp, pm, enabled) |
Register all discovered tools with an MCP server |
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file hanzo_tools-0.3.1.tar.gz.
File metadata
- Download URL: hanzo_tools-0.3.1.tar.gz
- Upload date:
- Size: 19.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df069c6cc4f1c973f02bd119d3e933aeaddf4eaa891948077ee6470eb0595b7c
|
|
| MD5 |
a31af556c398a9e557e614bf15e6ac06
|
|
| BLAKE2b-256 |
1b9164edd20377a7c711a047b4dedfeefba19bac8251393eb219869ca3308e07
|
File details
Details for the file hanzo_tools-0.3.1-py3-none-any.whl.
File metadata
- Download URL: hanzo_tools-0.3.1-py3-none-any.whl
- Upload date:
- Size: 19.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
274cc8903f7937fda1c5d5704e0409472f4f2781535af854a356b62e476c3036
|
|
| MD5 |
ae3b96764a21585a8749d23383dc60ab
|
|
| BLAKE2b-256 |
e79739aaa898dedacd87c1e836adcd07f7624c5283cac71efbd4259cff543fe3
|