107 lines
5.8 KiB
Python
107 lines
5.8 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
|
|
from .get_text_context import handle as get_text_context_handler
|
|
|
|
# Central registry of all available tools
|
|
TOOL_REGISTRY = [
|
|
Tool(
|
|
name="read_image",
|
|
description="Reads an image at full resolution for maximum detail. Use this for final confirmation of a selected image or when deep visual analysis of a specific file is required.",
|
|
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 prompts for AI generated images.",
|
|
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 coarse, high-density overview of images in a directory. This tool is paginated; a single page may not show all images. To perform a comprehensive scan or find specific images, you MUST iterate through multiple pages. If ANYTHING requires selecting individual images, then use indices as inputs to preview_image. Rely on this tool ONLY for a general characterization of images in a directory, NOT anything about specific images.",
|
|
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). Increment this value to navigate through the full list of images in the folder.", "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 text format. Use this for checking file existence, sizes, or dates or for quick filesystem navigation. DO NOT use this tool for any sort of visual or image selection.",
|
|
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="Provides low-resolution previews and information such as filenames, size, and resolution for specific images. It uses the minimum viable token budget, so details WILL be missed. Only use this tool for quick down-selection of images from contact_sheet or where accuracy does not matter. For final confirmation or deep analysis of a single selected image, you MUST use read_image after this tool.",
|
|
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
|
|
),
|
|
Tool(
|
|
name="get_text_context",
|
|
description="Extracts specific sections of a file with absolute line numbers and surrounding context. This tool MUST be called immediately before edit_file to verify the exact line numbers and content of the block being replaced, preventing misalignment errors.",
|
|
schema={
|
|
"type": "object",
|
|
"properties": {
|
|
"path": {"type": "string", "description": "Path to the file"},
|
|
"pattern": {"type": "string", "description": "Regex pattern to search for"},
|
|
"lines": {"type": "string", "description": "1-based indices or ranges (e.g., '10-20, 45')"},
|
|
"context": {"type": "integer", "description": "Number of lines of context to show above and below", "default": 1},
|
|
},
|
|
"required": ["path"],
|
|
},
|
|
handler=get_text_context_handler
|
|
),
|
|
]
|