MCP-Server

thumbnails

io.github.theluckystrike/thumbnails
Design & Kreativ Medien & Inhalte Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Tools for resizing, cropping, converting, compressing, thumbnailing, inspecting and removing metadata from images.

image_batch_resize
Resize several images at once
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.
Eingabeschema
{'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}
image_compress
Compress an image
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.
Eingabeschema
{'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}
image_convert
Convert an image to another format
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.
Eingabeschema
{'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}
image_crop
Crop an image
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.
Eingabeschema
{'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}
image_delete_upload
Delete a stored image
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.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name'], 'properties': {'name': {'type': 'string', 'maxLength': 70, 'minLength': 1}}, 'additionalProperties': False}
image_dominant_colors
Read the dominant colours of an image
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.
Eingabeschema
{'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}
image_files
List uploaded and generated images
List the images stored for your token: what you uploaded, and what this server has written, with their sizes.
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
image_info
Inspect an image
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.
Eingabeschema
{'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}
image_resize
Resize an image
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.
Eingabeschema
{'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}
image_strip_metadata
Strip metadata from an image
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.
Eingabeschema
{'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}
image_thumbnails
Make thumbnails
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.
Eingabeschema
{'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}
image_upload
Upload an image to work on
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.
Eingabeschema
{'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}
image_watermark
Watermark an image with text
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.
Eingabeschema
{'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}
license_activate
Activate license
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.
Eingabeschema
{'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}
license_status
License status
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
Hinzugefügt
image_delete_upload
24. September 2026 02:40
Hinzugefügt
image_files
24. September 2026 02:40
Hinzugefügt
image_upload
24. September 2026 02:40
Hinzugefügt
license_activate
24. September 2026 02:40
Hinzugefügt
license_status
24. September 2026 02:40
Hinzugefügt
image_dominant_colors
24. September 2026 02:40
Hinzugefügt
image_batch_resize
24. September 2026 02:40
Hinzugefügt
image_strip_metadata
24. September 2026 02:40
Hinzugefügt
image_watermark
24. September 2026 02:40
Hinzugefügt
image_thumbnails
24. September 2026 02:40
Hinzugefügt
image_crop
24. September 2026 02:40
Hinzugefügt
image_compress
24. September 2026 02:40
Hinzugefügt
image_convert
24. September 2026 02:40
Hinzugefügt
image_resize
24. September 2026 02:40
Hinzugefügt
image_info
24. September 2026 02:40