from typing import Any, Callable, Dict # Define the Tool class here so it's available to all handlers and the registry class Tool: def __init__(self, name: str, description: str, schema: Dict[str, Any], handler: Callable): self.name = name self.description = description self.schema = schema self.handler = handler def to_mcp_dict(self): return { "name": self.name, "description": self.description, "inputSchema": self.schema } # Import handlers from separate files from .read_image import handle as read_image_handler from .read_metadata import handle as read_png_metadata_handler from .contact_sheet import handle as contact_sheet_handler from .list_directory import handle as list_directory_details_handler from .preview_image import handle as preview_image_handler # Central registry of all available tools TOOL_REGISTRY = [ Tool( name="read_image", description="Reads an image from the disk and returns it as a full size image content object.", schema={ "type": "object", "properties": {"path": {"type": "string", "description": "Path to the image file"}}, "required": ["path"], }, handler=read_image_handler ), Tool( name="read_png_metadata", description="Reads the metadata (tEXt, zTXt, iTXt) from a PNG image to fetch info such as AI prompts.", schema={ "type": "object", "properties": {"path": {"type": "string", "description": "Path to the PNG file"}}, "required": ["path"], }, handler=read_png_metadata_handler ), Tool( name="contact_sheet", description="Generates a high-density contact sheet of images in a directory, for low-token previews.", schema={ "type": "object", "properties": { "path": {"type": "string", "description": "Path to the directory containing images"}, "page": {"type": "integer", "description": "The page number to retrieve (1-indexed)", "default": 1}, "sort_by": {"type": "string", "description": "Sort order: 'mtime' (newest first, default), 'name' (alphabetical), or 'size' (largest first)", "default": "mtime"}, }, "required": ["path"], }, handler=contact_sheet_handler ), Tool( name="list_directory", description="Lists the contents of a directory in a simplified format. Directories first, then files. Supports pagination and sorting.", schema={ "type": "object", "properties": { "path": {"type": "string", "description": "Path to the directory to list"}, "page": {"type": "integer", "description": "The page number to retrieve (1-indexed)", "default": 1}, "page_size": {"type": "integer", "description": "Number of items per page", "default": 64}, "sort_by": {"type": "string", "description": "Sort order: 'mtime' (newest first, default), 'name' (alphabetical), or 'size' (largest first)", "default": "mtime"}, }, "required": ["path"], }, handler=list_directory_details_handler ), Tool( name="preview_image", description="Generates small thumbnails (~70 tokens) and detailed info for images. Can take file paths, or indices/ranges from a contact sheet.", schema={ "type": "object", "properties": { "path": {"type": "string", "description": "Path to an image file or a directory containing images"}, "indices": {"type": "string", "description": "1-based indices or ranges (e.g., '1, 3-5, 10') to preview from the directory. Required if path is a directory."}, "sort_by": {"type": "string", "description": "Sort order to resolve indices: 'mtime' (default), 'name', or 'size'."}, }, "required": ["path"], }, handler=preview_image_handler ), ]