91 lines
4.0 KiB
Python
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 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
|
|
),
|
|
]
|