MCP Server

pixelvault

io.github.pixelvault-dev/pixelvault
Cloud & Infrastructure Media & Content Public & reachable MCP 2025-11-25

What this MCP does

Uploads, stores, lists, signs, deletes, and transforms images while providing CDN URLs and optional image rescue, resizing, effects, and background removal.

delete_image
Delete image
Permanently delete one PixelVault image by id. Maps to DELETE /v1/images/:id. Requires a PixelVault API key sent as a Bearer token in the Authorization header.
Destructive
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'Image id to delete, e.g. img_abc123'}}, 'additionalProperties': False}
get_image
Get image
Get metadata (CDN URL, size, MIME type, dimensions) for one PixelVault image by id. Maps to GET /v1/images/:id. Requires a PixelVault API key sent as a Bearer token in the Authorization header. The returned CDN URL supports on-the-fly transforms via query params — e.g. ?w=400&fit=cover (resize/crop), ?fmt=webp (format), ?segment=foreground (AI background removal → transparent PNG), effects like ?blur=30&saturation=0&rotate=90, and ?tile=<image_id.ext> (tile another of your images as a watermark). Or call the transform_image tool to build a valid transform URL for you. See https://pixelvault.dev/docs#transforms.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'Image id to fetch, e.g. img_abc123'}}, 'additionalProperties': False}
list_images
List images
List images in your PixelVault project, most recent first. Maps to GET /v1/images with pagination. Requires a PixelVault API key sent as a Bearer token in the Authorization header. The returned CDN URL supports on-the-fly transforms via query params — e.g. ?w=400&fit=cover (resize/crop), ?fmt=webp (format), ?segment=foreground (AI background removal → transparent PNG), effects like ?blur=30&saturation=0&rotate=90, and ?tile=<image_id.ext> (tile another of your images as a watermark). Or call the transform_image tool to build a valid transform URL for you. See https://pixelvault.dev/docs#transforms.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'page': {'type': 'integer', 'minimum': 1, 'description': 'Page number (default 1)'}, 'per_page': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Items per page (default 20, max 100)'}}, 'additionalProperties': False}
rescue_imgur
Rescue Imgur images
Scan a web page for hotlinked Imgur images and return a PixelVault rescue URL for each — a proxy that lazily rehosts the image on first request, keeping it working through the UK Imgur block. The anonymous rescue tier is a durable ~30-day edge cache (see `cache_ttl_days` in the result), not permanent storage. Maps to POST /v1/imgur-scan (server-side page fetch; no API key required). Provide `page_url` (a public https:// page). Drop each returned rescue_url into your HTML to rehost on first request.
Read only Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['page_url'], 'properties': {'page_url': {'type': 'string', 'minLength': 1, 'description': 'Public https:// URL of a page to scan for hotlinked Imgur images.'}}, 'additionalProperties': False}
sign_url
Sign private image URL
Mint a time-limited signed URL for a private image. Maps to POST /v1/images/:id/sign-url. Provide `id` and optional `expires_in` (seconds, default 3600). The signature binds the image, so the URL can't be replayed against another image; strip it and the CDN returns 403. Deleting the image revokes its URLs. Requires a PixelVault API key sent as a Bearer token in the Authorization header.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'Image id to mint a signed URL for, e.g. img_abc123.'}, 'expires_in': {'type': 'integer', 'maximum': 2592000, 'minimum': 60, 'description': 'Signature lifetime in seconds (60–2,592,000). Default 3600 (1 hour).'}}, 'additionalProperties': False}
transform_image
Build transform URL
Build an on-the-fly transform URL for a PixelVault image (resize, crop, format/quality, AI background removal, blur/sharpen/rotate/flip, brightness/contrast/saturation, and same-project watermark tiling). Provide exactly one of `url` (a PixelVault CDN URL) or `id` (an image id, resolved via the API — requires an API key), plus one or more transform params. Returns the ready-to-use CDN URL; the transform is produced and cached on first request. See https://pixelvault.dev/docs#transforms.
Read only
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'description': 'PixelVault image id (e.g. img_abc123); its CDN URL is resolved via the API. Provide this OR url. Requires an API key when used.'}, 'fit': {'enum': ['scale-down', 'contain', 'cover', 'crop', 'pad'], 'type': 'string', 'description': 'Resize mode. scale-down (default) never enlarges; contain/cover/crop/pad resize to the exact box and may upscale. Only meaningful alongside width/height.'}, 'url': {'type': 'string', 'description': 'Absolute CDN URL of a PixelVault image, as returned by upload_image / get_image / list_images. Provide this OR id.'}, 'blur': {'type': 'number', 'maximum': 250, 'minimum': 0, 'description': 'Gaussian blur (0-250); snapped to the nearest of 10/30/60/120. <=0 is ignored.'}, 'flip': {'enum': ['h', 'v', 'hv'], 'type': 'string', 'description': 'Mirror horizontally (h), vertically (v), or both (hv).'}, 'size': {'enum': ['s', 'm', 'l', 'social'], 'type': 'string', 'description': 'Named size preset: s=256px, m=640px, l=1280px, social=1200x630 OG card. Wins over width/height.'}, 'tile': {'type': 'string', 'description': 'Filename (optionally folder-prefixed, with extension) of another image in the SAME project to tile edge-to-edge as a watermark, e.g. watermark.png.'}, 'zoom': {'type': 'number', 'maximum': 1, 'minimum': 0, 'description': 'Face-crop tightness 0.0-1.0, only with gravity=face.'}, 'width': {'type': 'integer', 'maximum': 4000, 'description': 'Target width in px (1..4000). Snapped UP to the nearest allowed step. scale-down never upscales.', 'exclusiveMinimum': 0}, 'format': {'enum': ['auto', 'webp', 'avif', 'jpg', 'png'], 'type': 'string', 'description': "Output format. auto negotiates WebP/AVIF from the client's Accept header."}, 'height': {'type': 'integer', 'maximum': 4000, 'description': 'Target height in px (1..4000). Snapped UP to the nearest allowed step.', 'exclusiveMinimum': 0}, 'rotate': {'type': 'number', 'description': 'Rotate clockwise; rounded to the nearest right angle (90/180/270).'}, 'gravity': {'type': 'string', 'description': "Crop anchor, only with fit=cover|crop: face, left, right, top, bottom, auto, or 'XxY' coords 0.0-1.0. face enables zoom."}, 'quality': {'enum': ['auto', '60', '75', '85'], 'type': 'string', 'description': 'Output quality. auto lets Cloudflare choose.'}, 'segment': {'enum': ['foreground'], 'type': 'string', 'description': 'AI background removal (BiRefNet): foreground keeps the subject and makes the background transparent. Output is forced to PNG unless an opaque background is set. Not available on anonymous/playground images.'}, 'sharpen': {'type': 'number', 'maximum': 10, 'minimum': 0, 'description': 'Sharpen strength (0-10); snapped to the nearest of 1/3/5.'}, 'contrast': {'type': 'number', 'maximum': 2, 'minimum': 0, 'description': 'Contrast multiplier 0-2 (1=no change); snapped to 0.5/0.75/1.25/1.5/2.'}, 'background': {'type': 'string', 'description': 'Fill color behind a removed (segment) or padded (fit=pad) background: hex (#ffaa00), rgb()/rgba(), or a common CSS color name. No effect otherwise.'}, 'brightness': {'type': 'number', 'maximum': 2, 'minimum': 0, 'description': 'Brightness multiplier 0-2 (1=no change); snapped to 0.5/0.75/1.25/1.5/2.'}, 'saturation': {'type': 'number', 'maximum': 2, 'minimum': 0, 'description': 'Saturation multiplier 0-2 (1=no change, 0=grayscale); snapped to 0/0.5/1.5/2.'}}, 'additionalProperties': False}
upload_batch
Upload image batch
Upload many images (1–50) in one call, grouped into a collection — e.g. a CI run or a set of generated variants. Maps to POST /v1/images/batch. Each item is `data` (base64) or `source_url` (server-fetched, SSRF-guarded), with optional `filename`/`metadata`. Set `visibility: "private"` to get a signed URL per image (free plan: up to 100 private images) instead of a public CDN URL. Optional `type`/`name` (idempotent by (type, name)), `expires_in` (image TTL), `sign_expires_in` (signature lifetime), and collection `metadata`. Partial-failure tolerant: each returned item has its own `ok`. Requires a PixelVault API key sent as a Bearer token in the Authorization header. The returned CDN URL supports on-the-fly transforms via query params — e.g. ?w=400&fit=cover (resize/crop), ?fmt=webp (format), ?segment=foreground (AI background removal → transparent PNG), effects like ?blur=30&saturation=0&rotate=90, and ?tile=<image_id.ext> (tile another of your images as a watermark). Or call the transform_image tool to build a valid transform URL for you. See https://pixelvault.dev/docs#transforms.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['images'], 'properties': {'name': {'type': 'string', 'maxLength': 255, 'description': 'Idempotency key — re-running with the same (type, name) upserts the same collection.'}, 'type': {'type': 'string', 'maxLength': 32, 'description': "Collection type/discriminator (e.g. ci_build, generation). Default 'batch'."}, 'images': {'type': 'array', 'items': {'type': 'object', 'properties': {'data': {'type': 'string', 'description': 'Base64-encoded image bytes. Provide this OR source_url.'}, 'filename': {'type': 'string', 'description': 'Original filename, e.g. diff.png.'}, 'metadata': {'type': 'object', 'description': 'Freeform per-image metadata, e.g. { testName, viewport }.', 'additionalProperties': {}}, 'source_url': {'type': 'string', 'description': 'Public http(s) URL the server fetches (SSRF-guarded). Provide this OR data.'}}, 'additionalProperties': False}, 'maxItems': 50, 'minItems': 1, 'description': '1–50 images to upload into the collection.'}, 'metadata': {'type': 'object', 'description': 'Freeform collection metadata, e.g. { commit, pr_number, branch }.', 'additionalProperties': {}}, 'expires_in': {'type': 'integer', 'maximum': 2592000, 'minimum': 60, 'description': 'Image deletion TTL in seconds (60–2,592,000). Omit for permanent.'}, 'visibility': {'enum': ['public', 'private'], 'type': 'string', 'description': "'private' returns a signed URL per image (free plan: up to 100 private images); 'public' returns a plain CDN URL. Default 'public'."}, 'sign_expires_in': {'type': 'integer', 'maximum': 2592000, 'minimum': 60, 'description': 'Signature lifetime for private URLs in seconds (60–2,592,000, default 7 days).'}}, 'additionalProperties': False}
upload_image
Upload image
Upload an image to PixelVault and get an instant CDN URL. Maps to POST /v1/images. Provide exactly one of `source_url` (a public http(s) URL the server fetches) or `data` (base64-encoded bytes); optional `folder`, `filename`, and `expires_in` (seconds, for an auto-expiring image). Max 5 MB; JPG/PNG/GIF/WebP/AVIF/SVG. Requires a PixelVault API key sent as a Bearer token in the Authorization header. The returned CDN URL supports on-the-fly transforms via query params — e.g. ?w=400&fit=cover (resize/crop), ?fmt=webp (format), ?segment=foreground (AI background removal → transparent PNG), effects like ?blur=30&saturation=0&rotate=90, and ?tile=<image_id.ext> (tile another of your images as a watermark). Or call the transform_image tool to build a valid transform URL for you. See https://pixelvault.dev/docs#transforms.
Open world
Input schema
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'data': {'type': 'string', 'description': 'Base64-encoded image bytes (data URLs accepted). Provide this OR source_url.'}, 'folder': {'type': 'string', 'description': 'Optional folder/path prefix for the image.'}, 'filename': {'type': 'string', 'description': 'Optional original filename, e.g. photo.png.'}, 'expires_in': {'type': 'integer', 'maximum': 2592000, 'minimum': 60, 'description': 'Optional time-to-live in seconds. The image is auto-deleted after this many seconds (must be 60–2,592,000, i.e. 1 minute to 30 days). Omit for a permanent image.'}, 'source_url': {'type': 'string', 'description': 'Public http(s) URL of an image to fetch and upload. Provide this OR data.'}}, 'additionalProperties': False}
Added
rescue_imgur
Sept. 17, 2026, 12:49 p.m.
Added
transform_image
Sept. 17, 2026, 12:49 p.m.
Added
sign_url
Sept. 17, 2026, 12:49 p.m.
Added
upload_batch
Sept. 17, 2026, 12:49 p.m.
Added
upload_image
Sept. 17, 2026, 12:49 p.m.
Added
delete_image
Sept. 17, 2026, 12:49 p.m.
Added
list_images
Sept. 17, 2026, 12:49 p.m.
Added
get_image
Sept. 17, 2026, 12:49 p.m.