Files
hanzo-dev 6c3c86b408 feat(mcp): native MCP ImageContent — tools return images the client can SEE
HIP-0300 tools serialize results to JSON text, which flattened images into
useless base64-in-text. Add a ToolImage value type + one converter in
BaseTool.register: any ToolImage anywhere in a result becomes a real
mcp.types.ImageContent block; text-only results stay byte-for-byte JSON.
Emitters wired: fs read of image files, browser screenshots (bidi+playwright).
This gives hanzo-mcp vision parity with zai-mcp — an agent with native vision
(Claude) sees pixels directly, no per-task vision tool needed.

Also decomplect the core-package collision that caused this class of bug:
hanzo-tools-core shipped a DUPLICATE hanzo_tools/core/ that nondeterministically
shadowed canonical hanzo-tools (dropping ToolImage, the sophisticated register,
etc. — same shadow class as the 0.3.0 error-reexport gap). Finish the
'merge core into hanzo-tools' refactor: move id_tool into hanzo-tools, make
hanzo-tools-core a pure empty metapackage. Now ONE package owns hanzo_tools.core.

Versions: hanzo-tools 0.3.2, -core 0.3.1 (shim), -browser 0.5.9, -fs 0.3.4,
hanzo-mcp 0.15.12 (floors bumped). Verified: fs read PNG -> [text, image];
fs stat -> [text]; 29 tools intact; 9 tests pass.
2026-07-03 00:45:49 -07:00
..

hanzo-tools-core

Core infrastructure for Hanzo MCP tools.

Installation

pip install hanzo-tools-core

Components

BaseTool

Base class for all Hanzo tools.

from hanzo_tools.core import BaseTool

class MyTool(BaseTool):
    name = "my_tool"
    
    @property
    def description(self) -> str:
        return "My custom tool"
    
    async def call(self, ctx, **params) -> str:
        return "result"

ToolRegistry

Manage tool registration and discovery.

from hanzo_tools.core import ToolRegistry

ToolRegistry.register_tools(mcp_server, [MyTool()])

PermissionManager

Access control for file and command operations.

from hanzo_tools.core import PermissionManager

pm = PermissionManager(allowed_paths=["/home/user/project"])
if pm.can_access("/home/user/project/file.py"):
    # proceed

Decorators

from hanzo_tools.core import auto_timeout

@auto_timeout("my_tool")
async def my_function():
    # Auto-backgrounds after timeout
    pass

License

MIT