{"serverId":"mcp-registry/ai.pictomancer/image-processing","tools":[{"name":"analyze_image","fixed":{"name":"analyze_image","description":"Analyze an image\n\nFetch an image from a URL or base64 and return its metadata: size in bytes, pixel dimensions, source format, and what it costs every supported vision model in tokens. Always free. Dimensions are omitted if the image header cannot be read. Also reports whether the input carries a C2PA (Content Credentials) manifest and in which container; the manifest is not validated.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json\n\n**Example Resp","inputSchema":{"type":"object","title":"analyze_imageArguments","required":["source"],"properties":{"source":{"type":"string","title":"source","description":"Image source: a public URL (https://...) or a base64-encoded string (optionally as a data URI like data:image/png;base64,...)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":234,"tokensAfter":234},{"name":"convert_image","fixed":{"name":"convert_image","description":"Convert image format\n\nConvert an image to a different format (jpeg, png, webp, tiff, gif, avif). Optionally set quality, strip metadata, enable lossless mode (webp, avif), or tune encoder effort (avif). Instead of a q number you can set quality_target (0-1]: the smallest file with SSIM at or above the target, searched on the worker (jpeg, webp, avif; flat surcharge; outcome reported in X-Pictomancer-Quality-* headers). Optional enhancement modifiers: denoise (1-3), equalize, sharpen (applied den","inputSchema":{"type":"object","title":"convert_imageArguments","required":["source","format"],"properties":{"q":{"type":"integer","anyOf":[{"type":"integer"},{"type":"null"}],"title":"q","description":"Quality (1-100). Maps to libvips Q parameter."},"strip":{"type":"boolean","anyOf":[{"type":"boolean"},{"type":"null"}],"title":"strip","description":"Strip metadata (EXIF, ICC profile, etc.) from the output."},"effort":{"type":"integer","anyOf":[{"type":"integer"},{"type":"null"}],"title":"effort","description":"AV1 encoder CPU effort (0-9). Higher = smaller file, slower. Only applies to avif."},"format":{"type":"string","title":"format","description":"Target format: jpeg, png, webp, tiff, gif, or avif."},"source":{"type":"string","title":"source","description":"Image source: a public URL (https://...) or a base64-encoded string (optionally as a data URI like data:image/png;base64,...)."},"autorot":{"type":"boolean","anyOf":[{"type":"boolean"},{"type":"null"}],"title":"autorot","description":"Apply EXIF orientation before converting. Opt-in; default false, which preserves current byte-for-byte behavior."},"denoise":{"type":"integer","anyOf":[{"type":"integer"},{"type":"null"}],"title":"denoise","description":"Median denoise before converting: radius 1-3 (window 3x3 to 7x7). Opt-in; no surcharge."},"sharpen":{"type":"boolean","anyOf":[{"type":"boolean"},{"type":"null"}],"title":"sharpen","description":"Unsharp-mask sharpen after converting (libvips defaults). Opt-in."},"delivery":{"type":"string","oneOf":[{"type":"object","title":"InlineDelivery","properties":{"mode":{"type":"string","const":"inline","title":"Mode","default":"inline"}},"additionalProperties":false},{"type":"object","title":"PutUrlDelivery","required":["mode","put_url"],"properties":{"mode":{"type":"string","const":"put_url","title":"Mode"},"headers":{"anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"null"}],"title":"Headers","description":"Optional storage headers to include on the PUT call (Content-Type, Cache-Control, x-amz-acl, etc.). Whitelisted at SSRF layer."},"put_url":{"type":"string","title":"Put Url","format":"uri","maxLength":2083,"minLength":1,"description":"Customer-signed presigned PUT URL where the optimized bytes will be written. Must be https://. Cloud credentials never reach our infrastructure; only the URL itself is used and discarded after the request."}},"additionalProperties":false},{"type":"object","title":"CallbackDelivery","required":["mode","callback_url"],"properties":{"mode":{"type":"string","const":"callback_url","title":"Mode"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Optional HMAC secret. When set, we sign the POST body with HMAC-SHA256 and send 'X-Pig-Signature: sha256=<hex>'. Used per request and never stored. Recompute the HMAC on your endpoint to authenticate the callback (constant-time compare)."},"headers":{"anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"null"}],"title":"Headers","description":"Optional headers to include on the POST call (Content-Type, Cache-Control, x-amz-*, etc.). Whitelisted at SSRF layer."},"callback_url":{"type":"string","title":"Callback Url","format":"uri","maxLength":2083,"minLength":1,"description":"Customer endpoint where the optimized bytes will be POSTed. Must be https://. For async/large jobs. We send an X-Pig-Sha256 header of the body so the receiver can verify integrity. No credentials are stored on our side; secure the endpoint with a token in the URL itself."}},"additionalProperties":false}],"title":"delivery","discriminator":{"mapping":{"inline":"#/components/schemas/InlineDelivery","put_url":"#/components/schemas/PutUrlDelivery","callback_url":"#/components/schemas/CallbackDelivery"},"propertyName":"mode"}},"equalize":{"type":"boolean","anyOf":[{"type":"boolean"},{"type":"null"}],"title":"equalize","description":"Auto-contrast (histogram equalisation of the value channel; hue and saturation preserved) before converting. Opt-in."},"lossless":{"type":"boolean","anyOf":[{"type":"boolean"},{"type":"null"}],"title":"lossless","description":"Enable lossless encoding. Only applies to webp and avif."},"quality_target":{"type":"number","anyOf":[{"type":"number"},{"type":"null"}],"title":"quality_target","description":"Target SSIM (0-1]: the worker searches for the smallest file that still scores at least this. Alternative to q; mutually exclusive with it and with lossless. Only for jpeg, webp, avif. Carries a flat surcharge for the extra encodes."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":1419,"tokensAfter":1419},{"name":"estimate_cost","fixed":{"name":"estimate_cost","description":"Estimate the price of an operation\n\nReturns the exact USD price this API would charge for an operation on an input of the given size, without fetching or processing anything. Free. Use it before paying: send X-Max-Cost-USD on the real request to have the API refuse (412) instead of charging more than you allowed. The list price is returned even when the request could end up free (free tier, or a compress that does not shrink the file).\n\n### Responses:\n\n**200**: Successful Response (Success Respo","inputSchema":{"type":"object","title":"estimate_costArguments","required":["operation","input_bytes"],"properties":{"format":{"type":"string","anyOf":[{"type":"string"},{"type":"null"}],"title":"format","description":"Requested output format; only avif changes the price."},"operation":{"type":"string","title":"operation","description":"Operation to price. One of resize, compress, convert, crop, optimize_for_vision, optimize_generated, remove_background, pipeline. analyze is always free."},"operations":{"type":"array","anyOf":[{"type":"array","items":{"type":"object","title":"EstimateOperation","required":["type"],"properties":{"type":{"type":"string","title":"Type","description":"Operation type: resize, compress, convert, or crop."},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format","description":"Requested output format for this operation; only avif changes the price."}}}},{"type":"null"}],"title":"operations","description":"For pipeline only: the ordered operations, each {type, format?}. Volume discount applies at 3+ operations."},"input_bytes":{"type":"integer","title":"input_bytes","minimum":1,"description":"Size of the input image in bytes. Get it from analyze_image (free) if you do not know it."},"quality_target":{"type":"boolean","title":"quality_target","default":false,"description":"Whether the request will use quality_target (SSIM search surcharge)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":543,"tokensAfter":543},{"name":"get_format_info","fixed":{"name":"get_format_info","description":"Get supported formats and options\n\nReturns supported output formats and their configurable options.\n\n### Responses:\n\n**200**: Successful Response (Success Response)\nContent-Type: application/json","inputSchema":{"type":"object","title":"get_format_infoArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":92,"tokensAfter":92},{"name":"remove_image_background","fixed":{"name":"remove_image_background","description":"Remove the background from an image\n\nCut the subject (person, product, animal, object) out of a photo and return it on a transparent background as png (default), webp or avif. Optional q (1-100) for webp/avif. Runs a segmentation model (U2Net) on CPU: expect a few seconds per image, not milliseconds. Not available in pipeline.\n\n### Responses:\n\n**200**: Processed image binary (Success Response)\nContent-Type: application/json\nContent-Type: image/jpeg\n\n**Example Response:**\n```json\n\"string\"\n```\nCon","inputSchema":{"type":"object","title":"remove_image_backgroundArguments","required":["source"],"properties":{"q":{"type":"integer","anyOf":[{"type":"integer"},{"type":"null"}],"title":"q","description":"Quality (1-100) for webp and avif. Ignored for png, which is lossless. Omit to use the encoder default."},"format":{"type":"string","title":"format","default":"png","description":"Output format: png (default), webp or avif. All three keep the transparency; jpeg is not offered because it has none."},"source":{"type":"string","title":"source","description":"Image source: a public URL (https://...) or a base64-encoded string (optionally as a data URI like data:image/png;base64,...)."},"delivery":{"type":"string","oneOf":[{"type":"object","title":"InlineDelivery","properties":{"mode":{"type":"string","const":"inline","title":"Mode","default":"inline"}},"additionalProperties":false},{"type":"object","title":"PutUrlDelivery","required":["mode","put_url"],"properties":{"mode":{"type":"string","const":"put_url","title":"Mode"},"headers":{"anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"null"}],"title":"Headers","description":"Optional storage headers to include on the PUT call (Content-Type, Cache-Control, x-amz-acl, etc.). Whitelisted at SSRF layer."},"put_url":{"type":"string","title":"Put Url","format":"uri","maxLength":2083,"minLength":1,"description":"Customer-signed presigned PUT URL where the optimized bytes will be written. Must be https://. Cloud credentials never reach our infrastructure; only the URL itself is used and discarded after the request."}},"additionalProperties":false},{"type":"object","title":"CallbackDelivery","required":["mode","callback_url"],"properties":{"mode":{"type":"string","const":"callback_url","title":"Mode"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret","description":"Optional HMAC secret. When set, we sign the POST body with HMAC-SHA256 and send 'X-Pig-Signature: sha256=<hex>'. Used per request and never stored. Recompute the HMAC on your endpoint to authenticate the callback (constant-time compare)."},"headers":{"anyOf":[{"type":"object","additionalProperties":{"type":"string"}},{"type":"null"}],"title":"Headers","description":"Optional headers to include on the POST call (Content-Type, Cache-Control, x-amz-*, etc.). Whitelisted at SSRF layer."},"callback_url":{"type":"string","title":"Callback Url","format":"uri","maxLength":2083,"minLength":1,"description":"Customer endpoint where the optimized bytes will be POSTed. Must be https://. For async/large jobs. We send an X-Pig-Sha256 header of the body so the receiver can verify integrity. No credentials are stored on our side; secure the endpoint with a token in the URL itself."}},"additionalProperties":false}],"title":"delivery","discriminator":{"mapping":{"inline":"#/components/schemas/InlineDelivery","put_url":"#/components/schemas/PutUrlDelivery","callback_url":"#/components/schemas/CallbackDelivery"},"propertyName":"mode"}}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":995,"tokensAfter":995}],"toolsChanged":5,"tokensSaved":0,"todo":[{"tool":"compress_image","params":["delivery"]},{"tool":"convert_image","params":["delivery"]},{"tool":"crop_image","params":["delivery"]},{"tool":"image_pipeline","params":["delivery"]},{"tool":"optimize_for_vision","params":["delivery"]},{"tool":"optimize_generated_image","params":["delivery"]},{"tool":"remove_image_background","params":["delivery"]},{"tool":"resize_image","params":["delivery"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}