{
  "name": "xcropimage.io",
  "description": "Browser-based image toolkit. Crop, resize, convert, and merge images client-side with WebMCP imperative tools for in-browser AI agents.",
  "version": "1.0.0",
  "spec": "https://webmachinelearning.github.io/webmcp/",
  "chromeDocs": "https://developer.chrome.com/docs/ai/webmcp",
  "api": "document.modelContext",
  "permissionsPolicy": "tools=(self)",
  "transport": "browser_imperative",
  "interactionMode": "open_page_then_registerTool",
  "manifest": "https://xcropimage.io/.well-known/webmcp",
  "aiDiscovery": "https://xcropimage.io/ai/ai-manifest.json",
  "siteTools": [
    "navigate_to_image_tool",
    "get_site_info",
    "get_page_context"
  ],
  "pageTools": {
    "crop": [
      "get_crop_state",
      "set_crop_aspect_ratio",
      "set_crop_dimensions",
      "load_image_from_url",
      "set_export_format",
      "set_export_quality",
      "apply_crop",
      "download_result"
    ],
    "resizer": [
      "get_resizer_state",
      "set_target_dimensions",
      "load_image_from_url",
      "set_export_format",
      "set_export_quality",
      "apply_resize",
      "download_result"
    ],
    "convert": [
      "get_convert_state",
      "set_target_format",
      "set_export_quality",
      "load_image_from_url",
      "apply_convert",
      "download_result"
    ],
    "merge": [
      "get_merge_state",
      "set_merge_layout",
      "load_image_from_url",
      "apply_merge",
      "download_result"
    ]
  },
  "pages": [
    {
      "path": "/",
      "url": "https://xcropimage.io",
      "tools": [
        "navigate_to_image_tool",
        "get_site_info",
        "get_page_context"
      ],
      "note": "Site-level tools register on every page via document.modelContext."
    },
    {
      "path": "/crop",
      "url": "https://xcropimage.io/crop",
      "tools": [
        "get_crop_state",
        "set_crop_aspect_ratio",
        "set_crop_dimensions",
        "load_image_from_url",
        "set_export_format",
        "set_export_quality",
        "apply_crop",
        "download_result"
      ]
    },
    {
      "path": "/resizer",
      "url": "https://xcropimage.io/resizer",
      "tools": [
        "get_resizer_state",
        "set_target_dimensions",
        "load_image_from_url",
        "set_export_format",
        "set_export_quality",
        "apply_resize",
        "download_result"
      ]
    },
    {
      "path": "/convert",
      "url": "https://xcropimage.io/convert",
      "tools": [
        "get_convert_state",
        "set_target_format",
        "set_export_quality",
        "load_image_from_url",
        "apply_convert",
        "download_result"
      ]
    },
    {
      "path": "/merge",
      "url": "https://xcropimage.io/merge",
      "tools": [
        "get_merge_state",
        "set_merge_layout",
        "load_image_from_url",
        "apply_merge",
        "download_result"
      ]
    }
  ],
  "tools": [
    {
      "name": "navigate_to_image_tool",
      "description": "Open an xcropimage.io image tool page. Processing is client-side in the browser; no server upload API exists.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string",
            "enum": [
              "crop",
              "resizer",
              "convert",
              "merge"
            ],
            "description": "Target tool route."
          },
          "lang": {
            "type": "string",
            "enum": [
              "en",
              "tr"
            ],
            "description": "Optional UI language query parameter."
          }
        },
        "required": [
          "tool"
        ]
      },
      "page": "https://xcropimage.io",
      "scope": "site"
    },
    {
      "name": "get_site_info",
      "description": "Return xcropimage.io capabilities, privacy model, and available browser tools. Read-only site metadata.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io",
      "scope": "site",
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_page_context",
      "description": "Return the current page path and which image tool (if any) is active.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io",
      "scope": "site",
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "get_crop_state",
      "description": "Read the crop tool state: loaded image dimensions, crop box in source pixels, aspect lock, and export settings.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop",
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "set_crop_aspect_ratio",
      "description": "Apply a preset aspect ratio to the crop selection and lock aspect ratio. Requires an image to be loaded first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "preset": {
            "type": "string",
            "enum": [
              "1:1",
              "9:16",
              "16:9",
              "4:3",
              "3:4",
              "1:3",
              "3:1"
            ],
            "description": "Aspect ratio preset matching on-page buttons."
          }
        },
        "required": [
          "preset"
        ]
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop"
    },
    {
      "name": "set_crop_dimensions",
      "description": "Set crop width and optional height in source-image pixels. Respects aspect-ratio lock when enabled.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "width": {
            "type": "number",
            "minimum": 1,
            "description": "Crop width in source pixels."
          },
          "height": {
            "type": "number",
            "minimum": 1,
            "description": "Crop height in source pixels (optional when locked)."
          }
        },
        "required": [
          "width"
        ]
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop"
    },
    {
      "name": "load_image_from_url",
      "description": "Fetch an image from a URL into the crop tool. Subject to CORS; local file pickers still require user interaction.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Direct image URL."
          }
        },
        "required": [
          "url"
        ]
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop",
      "annotations": {
        "untrustedContentHint": true
      }
    },
    {
      "name": "set_export_format",
      "description": "Choose the download format for the cropped result.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "jpeg",
              "png",
              "webp",
              "gif",
              "avif"
            ]
          }
        },
        "required": [
          "format"
        ]
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop"
    },
    {
      "name": "set_export_quality",
      "description": "Set JPEG/WebP/AVIF export quality from 1 to 100.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quality": {
            "type": "number",
            "minimum": 1,
            "maximum": 100
          }
        },
        "required": [
          "quality"
        ]
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop"
    },
    {
      "name": "apply_crop",
      "description": "Apply the current crop selection and generate an on-page preview. Call download_result afterward to save the file.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop"
    },
    {
      "name": "download_result",
      "description": "Download the cropped preview using the selected export format and quality. Requires apply_crop first. The browser may ask the user to confirm the download.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/crop",
      "scope": "crop"
    },
    {
      "name": "get_resizer_state",
      "description": "Read resizer state: source dimensions, target output size, export settings, and preview status.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer",
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "set_target_dimensions",
      "description": "Set output width and height in pixels for the resized image.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "width": {
            "type": "number",
            "minimum": 1
          },
          "height": {
            "type": "number",
            "minimum": 1
          }
        },
        "required": [
          "width",
          "height"
        ]
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer"
    },
    {
      "name": "load_image_from_url",
      "description": "Fetch an image from a URL into the resizer. Subject to CORS restrictions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "url"
        ]
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer",
      "annotations": {
        "untrustedContentHint": true
      }
    },
    {
      "name": "set_export_format",
      "description": "Choose the download format for the resized result.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "jpeg",
              "png",
              "webp",
              "gif",
              "avif"
            ]
          }
        },
        "required": [
          "format"
        ]
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer"
    },
    {
      "name": "set_export_quality",
      "description": "Set JPEG/WebP/AVIF export quality from 1 to 100.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quality": {
            "type": "number",
            "minimum": 1,
            "maximum": 100
          }
        },
        "required": [
          "quality"
        ]
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer"
    },
    {
      "name": "apply_resize",
      "description": "Resize the loaded image to the target dimensions and generate an on-page preview. Call download_result afterward to save the file.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer"
    },
    {
      "name": "download_result",
      "description": "Download the resized preview using the selected export format and quality. Requires apply_resize first. The browser may ask the user to confirm the download.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/resizer",
      "scope": "resizer"
    },
    {
      "name": "get_convert_state",
      "description": "Read converter state: source format, target format, quality, and conversion status.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/convert",
      "scope": "convert",
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "set_target_format",
      "description": "Choose the output image format.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "jpeg",
              "png",
              "webp",
              "gif",
              "avif"
            ]
          }
        },
        "required": [
          "format"
        ]
      },
      "page": "https://xcropimage.io/convert",
      "scope": "convert"
    },
    {
      "name": "set_export_quality",
      "description": "Set lossy export quality from 1 to 100.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "quality": {
            "type": "number",
            "minimum": 1,
            "maximum": 100
          }
        },
        "required": [
          "quality"
        ]
      },
      "page": "https://xcropimage.io/convert",
      "scope": "convert"
    },
    {
      "name": "load_image_from_url",
      "description": "Fetch an image from a URL into the converter. Subject to CORS restrictions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "url"
        ]
      },
      "page": "https://xcropimage.io/convert",
      "scope": "convert",
      "annotations": {
        "untrustedContentHint": true
      }
    },
    {
      "name": "apply_convert",
      "description": "Convert the loaded image to the selected format and generate an on-page preview. Call download_result afterward to save the file.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/convert",
      "scope": "convert"
    },
    {
      "name": "download_result",
      "description": "Download the converted preview. Requires apply_convert first. The browser may ask the user to confirm the download.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/convert",
      "scope": "convert"
    },
    {
      "name": "get_merge_state",
      "description": "Read merge tool layout: grid size, direction, filled slots, and preview status.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/merge",
      "scope": "merge",
      "annotations": {
        "readOnlyHint": true
      }
    },
    {
      "name": "set_merge_layout",
      "description": "Configure collage grid size (3 or 4 images) and stacking direction. Clearing layout resets image slots.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "gridSize": {
            "type": "integer",
            "enum": [
              3,
              4
            ]
          },
          "direction": {
            "type": "string",
            "enum": [
              "vertical",
              "horizontal"
            ]
          }
        },
        "required": [
          "gridSize",
          "direction"
        ]
      },
      "page": "https://xcropimage.io/merge",
      "scope": "merge"
    },
    {
      "name": "load_image_from_url",
      "description": "Fetch an image from a URL into a merge slot (0-based index). Subject to CORS restrictions.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "slotIndex": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3,
            "description": "Zero-based slot index within the current grid."
          }
        },
        "required": [
          "url",
          "slotIndex"
        ]
      },
      "page": "https://xcropimage.io/merge",
      "scope": "merge",
      "annotations": {
        "untrustedContentHint": true
      }
    },
    {
      "name": "apply_merge",
      "description": "Combine all filled slots into one collage preview. Every slot in the current grid must have an image. Call download_result afterward to save the file.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/merge",
      "scope": "merge"
    },
    {
      "name": "download_result",
      "description": "Download the merged collage as PNG. Requires apply_merge first. The browser may ask the user to confirm the download.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "page": "https://xcropimage.io/merge",
      "scope": "merge"
    }
  ],
  "limitations": [
    "Agents must open a tool page in a browser tab; there is no headless server execution.",
    "Tools register at runtime with document.modelContext after the page loads.",
    "Local file pickers and download dialogs may still require user confirmation.",
    "Image fetches from arbitrary URLs are subject to CORS."
  ]
}
