Resize, convert, compress, crop, thumbnail and watermark images from your AI chat.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <Pro license key or anonymous token from GET https://mcp.zovo.one/mcp/token>
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Call this tool to resize every image in paths at once, keeping aspect ratio, each named <name>-<W>x<H>.<ext>. One of width/height lets the other follow; with both, each fits inside the box. Free: 5 files a call, 4 MP.
Names of images uploaded with image_upload
Not a directory here: every output comes back as its own download link valid for one hour. Any value is accepted and ignored
Target width in pixels
Target height in pixels
Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Call this tool to resize every image in paths at once, keeping aspect ratio, each named <name>-<W>x<H>.<ext>. One of width/height lets the other follow; with both, each fits inside the box. Free: 5 files a call, 4 MP.
| Argument | Type | Description |
|---|---|---|
| paths* | array | Names of images uploaded with image_upload |
| width | integer | Target width in pixels |
| height | integer | Target height in pixels |
| out_dir* | string | Not a directory here: every output comes back as its own download link valid for one hour. Any value is accepted and ignored |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"paths",
"out_dir"
],
"properties": {
"paths": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Names of images uploaded with image_upload"
},
"width": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Target width in pixels"
},
"height": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Target height in pixels"
},
"out_dir": {
"type": "string",
"description": "Not a directory here: every output comes back as its own download link valid for one hour. Any value is accepted and ignored"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Call this tool to re-encode an image smaller and report byte counts before/after. quality (default 80) applies to JPEG; for PNG only max_width shrinks it, and the answer names which one worked. Free: sources up to 4 MP.
| Argument | Type | Description |
|---|---|---|
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| quality | integer | JPEG quality 1-100, default 80 |
| out_path* | string | Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept |
| max_bytes | integer | Largest the output may be, in bytes. The server searches JPEG quality down from `quality` until it fits and reports the quality it used. JPEG output only |
| max_width | integer | Scale down so the width is at most this, keeping the aspect ratio. Never scales up |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path",
"out_path"
],
"properties": {
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"quality": {
"type": "integer",
"default": 80,
"maximum": 100,
"minimum": 1,
"description": "JPEG quality 1-100, default 80"
},
"out_path": {
"type": "string",
"description": "Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept"
},
"max_bytes": {
"type": "integer",
"minimum": 1024,
"description": "Largest the output may be, in bytes. The server searches JPEG quality down from `quality` until it fits and reports the quality it used. JPEG output only"
},
"max_width": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Scale down so the width is at most this, keeping the aspect ratio. Never scales up"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Call this tool to re-encode an image as PNG, JPEG, BMP, GIF or TIFF. quality is JPEG-only. Transparency converted to JPEG flattens onto white; the answer says so. Free tier: sources up to 4 MP.
| Argument | Type | Description |
|---|---|---|
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| format* | string | The output format |
| quality | integer | JPEG quality 1-100, default 80. Ignored for the other formats |
| out_path* | string | Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path",
"format",
"out_path"
],
"properties": {
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"format": {
"enum": [
"png",
"jpeg",
"bmp",
"gif",
"tiff"
],
"type": "string",
"description": "The output format"
},
"quality": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "JPEG quality 1-100, default 80. Ignored for the other formats"
},
"out_path": {
"type": "string",
"description": "Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Call this tool to cut a rectangle out of an image. x, y are the top-left corner in pixels from the image's top-left. A rectangle past an edge is refused with the image's real size, not clamped. Free: sources up to 4 MP.
| Argument | Type | Description |
|---|---|---|
| x* | integer | Left edge of the crop, in pixels from the left of the image |
| y* | integer | Top edge of the crop, in pixels from the top of the image |
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| width* | integer | Width of the crop in pixels |
| height* | integer | Height of the crop in pixels |
| out_path* | string | Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path",
"x",
"y",
"width",
"height",
"out_path"
],
"properties": {
"x": {
"type": "integer",
"minimum": 0,
"description": "Left edge of the crop, in pixels from the left of the image"
},
"y": {
"type": "integer",
"minimum": 0,
"description": "Top edge of the crop, in pixels from the top of the image"
},
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"width": {
"type": "integer",
"minimum": 1,
"description": "Width of the crop in pixels"
},
"height": {
"type": "integer",
"minimum": 1,
"description": "Height of the crop in pixels"
},
"out_path": {
"type": "string",
"description": "Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Delete one image stored for your token, uploaded or generated: name is the name it is stored under. image_files lists them. A name nothing is stored under is refused and nothing is deleted.
| Argument | Type | Description |
|---|---|---|
| name* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 70,
"minLength": 1
}
},
"additionalProperties": false
}Call this tool to read the colours covering most of an image, as hex codes with each one's pixel share. Sampled from a 200 px copy, so cost is fixed. Read-only. Free gives the top 3; Pro up to 16.
| Argument | Type | Description |
|---|---|---|
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| count | integer | How many colours to report, default 5 |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"count": {
"type": "integer",
"default": 5,
"maximum": 16,
"minimum": 1,
"description": "How many colours to report, default 5"
}
},
"additionalProperties": false
}List the images stored for your token: what you uploaded, and what this server has written, with their sizes.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Call this tool to inspect an image: format, pixel dimensions, megapixels, file size in bytes, and whether it carries an alpha channel. Read-only, never modifies the file. Free tier: unlimited, any size.
| Argument | Type | Description |
|---|---|---|
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
}
},
"additionalProperties": false
}Call this tool to write a resized copy. fit inside keeps aspect; cover fills and crops; exact stretches. One of width/height alone keeps aspect. Input untouched. Free: sources up to 4 MP.
| Argument | Type | Description |
|---|---|---|
| fit | string | inside = fit within the box, cover = fill and crop, exact = stretch |
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| width | integer | Target width in pixels |
| height | integer | Target height in pixels |
| out_path* | string | Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path",
"out_path"
],
"properties": {
"fit": {
"enum": [
"inside",
"cover",
"exact"
],
"type": "string",
"default": "inside",
"description": "inside = fit within the box, cover = fill and crop, exact = stretch"
},
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"width": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Target width in pixels"
},
"height": {
"type": "integer",
"maximum": 10000,
"minimum": 1,
"description": "Target height in pixels"
},
"out_path": {
"type": "string",
"description": "Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Call this tool to write a copy carrying pixels and nothing else: it decodes and re-encodes from raw pixels, so EXIF, GPS, camera, capture time, XMP and colour-profile data are dropped. Free tier: sources up to 4 MP.
| Argument | Type | Description |
|---|---|---|
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| out_path* | string | Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path",
"out_path"
],
"properties": {
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"out_path": {
"type": "string",
"description": "Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Call this tool to write one thumbnail per input into out_dir as <name>-thumb.<ext>, fit inside size by size, aspect kept. Paths are reserved before writing, so a collision leaves nothing half-done. Free: 5/call, 4 MP.
| Argument | Type | Description |
|---|---|---|
| size | integer | Longest side of the thumbnail in pixels, default 256 |
| paths* | array | Names of images uploaded with image_upload |
| out_dir* | string | Not a directory here: every output comes back as its own download link valid for one hour. Any value is accepted and ignored |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"paths",
"out_dir"
],
"properties": {
"size": {
"type": "integer",
"default": 256,
"maximum": 10000,
"minimum": 8,
"description": "Longest side of the thumbnail in pixels, default 256"
},
"paths": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Names of images uploaded with image_upload"
},
"out_dir": {
"type": "string",
"description": "Not a directory here: every output comes back as its own download link valid for one hour. Any value is accepted and ignored"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Send an image to this hosted endpoint. There is no filesystem here, so instead of a path you upload the file once with image_upload and then pass its name as `path` (or inside `paths`) to image_info, image_resize, image_convert, image_compress, image_crop, image_thumbnails, image_batch_resize and image_dominant_colors. PNG, JPEG, BMP, GIF and TIFF are accepted and the format is read from the file's magic bytes, not from the name. Give exactly one of image_base64 or url. url: fetch a public file instead of pasting base64 (recommended above about 10 KB): writing out a real photo as base64 is a long tool call and 50 KB or more can stall the turn before the upload is sent, while a url costs one line and the fetch happens here (10 second timeout, at most 3 redirects, public http(s) hosts only, 2 MB cap). Uploads are kept for your token between calls; image_files lists them and image_delete_upload removes one. A file this server writes is named the same way and comes back as a download link valid for one hour, served with the real image content type. The request body cap is 256 KB, which is about 190 KB of image once base64-encoded.
| Argument | Type | Description |
|---|---|---|
| url | string | url: fetch a public file instead of pasting base64 (recommended above about 10 KB). Public http(s) only; private, link-local and this endpoint's own zone are refused |
| name* | string | Name to refer to this image by: 1-64 characters of letters, digits, underscore or dash, e.g. "shot" |
| image_base64 | string | The image file, base64-encoded |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"url": {
"type": "string",
"description": "url: fetch a public file instead of pasting base64 (recommended above about 10 KB). Public http(s) only; private, link-local and this endpoint's own zone are refused"
},
"name": {
"type": "string",
"maxLength": 70,
"minLength": 1,
"description": "Name to refer to this image by: 1-64 characters of letters, digits, underscore or dash, e.g. \"shot\""
},
"image_base64": {
"type": "string",
"description": "The image file, base64-encoded"
}
},
"additionalProperties": false
}Not available on this hosted endpoint: the watermark is drawn with bitmap font files loaded from a filesystem, which this endpoint does not have. Watermark on a local install instead - download image.mcpb from https://github.com/theluckystrike/mcp-servers/releases/latest and open it in Claude Desktop - or upload an image you have already watermarked.
| Argument | Type | Description |
|---|---|---|
| path* | string | Name of an image uploaded with image_upload, or one this server wrote earlier |
| text | string | The watermark text. Default: the business name from the shared profile. Custom text is Pro |
| opacity | number | 0.05 to 1, default 0.5 |
| out_path* | string | Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept |
| position | string | Where to draw it |
| overwrite | boolean | Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path",
"out_path"
],
"properties": {
"path": {
"type": "string",
"description": "Name of an image uploaded with image_upload, or one this server wrote earlier"
},
"text": {
"type": "string",
"description": "The watermark text. Default: the business name from the shared profile. Custom text is Pro"
},
"opacity": {
"type": "number",
"default": 0.5,
"maximum": 1,
"minimum": 0.05,
"description": "0.05 to 1, default 0.5"
},
"out_path": {
"type": "string",
"description": "Name for the file to write; it comes back as a download link valid for one hour. The extension decides the output format; without a known one the input's format is kept"
},
"position": {
"enum": [
"bottom-right",
"bottom-left",
"bottom-center",
"top-right",
"top-left",
"top-center",
"center"
],
"type": "string",
"default": "bottom-right",
"description": "Where to draw it"
},
"overwrite": {
"type": "boolean",
"description": "Replace out_path if it already exists. Default false. Never allows an output to be one of the inputs"
}
},
"additionalProperties": false
}Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.
| Argument | Type | Description |
|---|---|---|
| key* | string | License key from checkout, MCPL1.<payload>.<signature> |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "License key from checkout, MCPL1.<payload>.<signature>"
}
},
"additionalProperties": false
}Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}