MooseCP/tools/__init__.py

91 lines
4.0 KiB
Python

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.",
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 and provides 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
),
]