| """ | |
| MCP Handler Molecule - MCP server integration for Any2SVG. | |
| Purpose: Handle MCP tool requests and file management | |
| Inputs: MCP tool calls with image data | |
| Outputs: SVG file paths and content | |
| Examples: MCP client calls image_to_svg tool | |
| Edge cases: Large files, network timeouts, invalid URLs | |
| Errors: MCPError, FileNotFoundError, NetworkError | |
| """ | |
| import os | |
| from pathlib import Path | |
| from typing import Optional | |
| from urllib.parse import urlparse | |
| from PIL import Image | |
| from ..atoms.vectorizer import ( | |
| VectorizerConfig, | |
| image_to_svg_file, | |
| image_to_svg_string, | |
| ) | |
| def get_output_directory() -> Path: | |
| """ | |
| Get the configured SVG output directory. | |
| Returns: | |
| Path to output directory (created if needed) | |
| """ | |
| output_dir = Path(os.environ.get("SVG_OUTPUT_DIR", "./output")) | |
| output_dir.mkdir(parents=True, exist_ok=True) | |
| return output_dir | |
| def process_mcp_request( | |
| image: Image.Image, | |
| color_mode: str = "color", | |
| filter_speckle: int = 4, | |
| color_precision: int = 6, | |
| save_to_file: bool = True, | |
| ) -> dict: | |
| """ | |
| Process an MCP tool request for image vectorization. | |
| Args: | |
| image: PIL Image to convert | |
| color_mode: "color" or "binary" | |
| filter_speckle: Speckle filter size (1-100) | |
| color_precision: Color precision bits (1-8) | |
| save_to_file: Whether to save SVG to file | |
| Returns: | |
| Dict with 'path' (if saved), 'content', and 'success' keys | |
| """ | |
| config = VectorizerConfig( | |
| color_mode=color_mode, | |
| filter_speckle=filter_speckle, | |
| color_precision=color_precision, | |
| ) | |
| result = {"success": False, "path": None, "content": None, "error": None} | |
| try: | |
| if save_to_file: | |
| output_dir = get_output_directory() | |
| svg_path = image_to_svg_file(image, output_dir, config=config) | |
| with open(svg_path, "r", encoding="utf-8") as f: | |
| svg_content = f.read() | |
| result["path"] = str(svg_path) | |
| result["content"] = svg_content | |
| else: | |
| result["content"] = image_to_svg_string(image, config) | |
| result["success"] = True | |
| except Exception as e: | |
| result["error"] = str(e) | |
| return result | |