Overview
Adobe unlocks more ways to create and get work done from the conversation. Previously available as Photoshop, the Adobe connector now brings creativity and productivity capabilities across Creative Cloud and Acrobat. Describe what you want to make or change, and Adobe can help turn ideas, images, videos, and documents into polished outputs — from editing photos and creating PDFs to designing social assets, resizing videos, searching Creative Cloud assets, and generating data-driven documents. Key capabilities: Retouch portraits or edit photos in bulk: Drop in photos and describe the look you want — adjust color, lighting, and tone; remove distractions and generate new elements; apply Lightroom presets; remove backgrounds; blur, crop, resize, and expand images. Design from template: Start from an Express template, update text and colors, and then animate for social media or convert to PDF. Refine video for any platform: Upload a horizontal clip and ask to reformat it for YouTube Shorts, Instagram Reels, or any platform. You can also stitch clips into a single sequence. Search and organize creative work: Describe what you're looking for and surface assets from your Creative Cloud library — by subject, style, mood, or content — without browsing folders. Work with PDFs and documents: Create and convert polished PDFs and documents. Create data-driven documents: Describe your output and provide your data — the connector turns raw data or content into formatted, shareable PDFs, including badges, cards, catalogs, and more. You can get started as a guest, and sign in with your Adobe account for more capabilities and tools, Creative Cloud storage, and saved work across sessions.
Tools
acrobat_readonly_proxy
ChatGPTadobe_home
ChatGPTadobe_mandatory_init
ChatGPTanimate_design
ChatGPTasset_copy_assets
ChatGPTasset_create_folders
ChatGPTasset_finalize_file_upload
ChatGPTasset_initialize_file_upload. Pass the transfer_document from init, updated so _links["http://ns.adobe.com/adobecloud/rel/block/transfer"] lists only the block links you actually used (same objects or { href } entries). Keep the finalize link from the init response. Optionally set repo:md5 for integrity verification. Returns: - assets: array containing the created asset (currently one asset per finalized upload) - Each asset includes ID, name, media type, and presigned URLs when available Important: - This is a mutating operation and should be called once per initialized upload session - For retries after uncertain network failures, expect backend conflict handling (for example filename renaming)asset_get_mime_type
ChatGPTasset_get_presigned_url
ChatGPTasset_get_presigned_urls
ChatGPTasset_initialize_file_upload
ChatGPTpath is just a filename (e.g. "photo.png"), the file is placed directly in cloud-content/. - If path includes a directory (e.g. "my-project/photo.png"), the path is interpreted relative to cloud-content/ and any missing intermediate directories are created automatically. - Do not include cloud-content/ as a prefix — it is added automatically. Block transfer: Use transfer_document['repo:blocksize'] as the chunk size (last chunk may be smaller). Read pre-signed PUT targets from transfer_document._links["http://ns.adobe.com/adobecloud/rel/block/transfer"] (array of link objects with href). PUT each chunk in order. Do not send an Authorization header on block transfer requests. Returns: - filename: resolved filename — pass to finalize_file_upload - directory_asset_id: destination directory asset ID - transfer_document: RAPI bulk transfer document from block/init (includes repo:blocksize, block transfer / finalize / extend links under _links). After uploading blocks, replace the block/transfer link array with only the links you used (same href values), then pass the updated document to asset_finalize_file_upload. Important: - Call this once per upload intent; repeated calls create separate upload sessions - shorten_block_upload_urls defaults to true so transfer/finalize URLs stay compact in context; AI agents should leave it true.asset_inline_preview
ChatGPTasset_license_and_download_stock
ChatGPTasset_lr_get_presigned_url
ChatGPTasset_migrate_guest_storage
ChatGPTassetsTransferred: count of assets that copied successfully (HTTP 2xx). The tool succeeds when this count is positive, when there were no assets to migrate, or when guest storage already matches authenticated storage. The tool fails only when there were assets to migrate and every copy failed.asset_openai_file_upload
ChatGPTfiles: array of file specifiers for upload. The schema of each entry adheres to the OpenAI 'fileParams' spec as documented below - path: optional directory path extending from the cloud-content/OpenAI root. Do not choose, invent, or add a destination folder/path. By default, upload files to the connector’s default Adobe destination. Only provide path when the user explicitly specifies an Adobe destination folder, upload path, or exact filename/path. When the user simply says “upload these files to Adobe,” omit path. File Specifiers The file specifiers use the openai/fileParams extension schema. Each entry must adhere to the following: - download_url: pre-signed or unauthenticated HTTP URL source for the input file - file_id: Stable ChatGPT file identifier (e.g. "file_...") - mime_type: MIME/media type for the incoming file - file_name: Original file name of the asset, when known. Must include extension (e.g. "document.pdf") Path behavior: - path is optional. It should not be provided unless the user makes a specific request to upload the assets to a specific folder. - path is interpreted relative to cloud-content/OpenAI. Do not include cloud-content/OpenAI as a prefix — it is added automatically. - If path is just a filename (e.g. "photo.jpg"), ignore it in favor of the file's file_name. - Any leading / will be trimmed from the path - If path includes a directory and name (e.g. "my-folder/photo.jpg"), truncate to just the directory - If path is a nested directory (e.g. photos/animals/dogs), the assets will be created at the end of the path (in dogs, citing the example). Returns: assets array with the created file (asset id, name, presigned download URL, etc.).asset_preview_file
ChatGPTasset_resolve_short_url
ChatGPTasset_search
ChatGPTboards_add_items_to_board
ChatGPTfailedItems[] lists ONLY the items that failed (logicalIndex, stage, errorCode, errorMessage ending in "(item: <id/url>)"). Re-send ONLY the failed items after fixing the named cause; never resend ones that already succeeded. - HTTP 422: NONE could be added (message inlines the first few failures). Fix inputs and retry. OTHER ERRORS (isError: true, body = { status, ...details }): - 400 invalid payload or >12 images; 401 auth; 404 board or asset not found (if the board_id is wrong or expired, create a new board and retry); 413 too large; 415 unsupported media type; 502 upstream fetch/persistence; 503 busy (retry shortly); 504 timeout. Fix the request for 400/401/404/415; a single retry is reasonable for 503/504. GUIDANCE: prefer presignedUrl / generationUrn over rawBlob. If a rawBlob call fails with a decode error, the image was likely truncated — upload it and retry with a URL/URN type.boards_create_new_board
ChatGPTchange_background_color
ChatGPTconvert_pdf_to_indd
ChatGPTdocument_convert_pdf
ChatGPTdocument_merge_data_layout
ChatGPTdocument_merge_data_vector
ChatGPTdocument_render_layout
ChatGPTdocument_render_vector
ChatGPTdownload_design
ChatGPTenhanceSpeechPoll
ChatGPTexport_idml
ChatGPTfill_text
ChatGPTfont_activate
ChatGPTfont_identifier is required, e.g. {"postscript_name": "...", "font_id": "..."} from a recommended font's nested result returned by the font-recommendation tool. Supplying font_identifier.font_id when already known is used directly; when only font_identifier.postscript_name is given (font_id is None), it is resolved first. Successful JSON includes: `success` (bool), `user_message` (plain-language outcome for the end user—read this first), `steps` (variations + selections with ok per step), `summary` (technical flow), `variation_step`, `selections_step`, `selections_result`, and an `error_code` when something went wrong (invalid_input, not_authenticated, not_entitled, not_found, upstream_error, or upstream_timeout for a retryable transient failure — a timeout, connection error, or 5xx). On failure the response is {success, error_code, user_message} (plus steps/summary for context) — there is no error or status_code key in the response body. Re-adding a font the user already has does not create duplicates; the call is treated as a no-op and reflected in user_message ("added or was already present in your library"). Requires the caller to be authenticated (via OAuth, or the optional bearer_token arg for a caller that already holds a token). Anonymous adds are never allowed: when no usable token is available, this returns error_code="not_authenticated". not_authenticated and not_entitled are kept distinct: an auth/scope problem (an expired or under-scoped token that a plan upgrade can't fix) is error_code="not_authenticated", while a plan that doesn't include the font is error_code="not_entitled", with an actionable user_message naming the plans (Fonts Standard or Fonts Pro) that unlock it. A PostScript name that matches no font is surfaced as error_code="not_found", not not_entitled.font_create_kit
ChatGPTdomains is a list of site domains this kit will be used on — localhost, file://..., a bare dev hostname with a port, or a normal https://example.com are all accepted. Values are trimmed and blank entries dropped; there is no URL/hostname format validation beyond a basic length and safe-character check. All-or-nothing entitlement: every requested font must be found and entitled to the caller's current Adobe Fonts plan. If even one font fails either check, NO kit is created at all — the whole call is rejected with the specific failing font(s) named, rather than silently creating a kit with fewer fonts than asked for. font_identifiers is a list of {"postscript_name": "...", "font_id": "..."} (font_id optional, e.g. from a font-recommendation tool result). kit_name is optional; if omitted, a human-readable name is generated from the first font's family name, the font count, and the first domain, so the kit is recognizable when the caller looks it up later at fonts.adobe.com. locale (default en_US) selects the language the font family names are translated into, and affects only that auto-generated default kit name (when kit_name is omitted) — the kit's fonts, domains, and entitlement are unaffected, and an explicit kit_name ignores it entirely. Pass a region-qualified value (en_US, ja_JP); hyphen, bare-code, and region-mismatched variants are normalized to the closest supported locale, and an unsupported value falls back to en_US rather than being rejected. See this server's MCP instructions for the list of supported locales. Successful JSON includes: `success` (bool), `user_message` (plain-language outcome), `steps` (per-stage ok), `summary` (technical flow), and `kit` (the created/published kit: id, name, domains, families, and the embed snippets — css_embed_code, embed_code, advanced_embed_code). On an all-or-nothing rejection, `kit` is null and `failures` lists each rejected font as {"postscript_name", "reason"} where reason is "not_found", "not_entitled", or "upstream_error" (found and entitled, but missing data needed to add it to a kit). Requires a Bearer token with tk_platform OAuth scope (via OAuth, or the bearer_token arg) — the same requirement as the library-add tool. Anonymous callers are refused with error_code="not_authenticated"; the same code is used if the token is missing the tk_platform scope, since that is an authentication problem, not an entitlement one. error_code is null on success. Other values: invalid_input, not_entitled, not_found, upstream_error. If kit creation succeeds but publishing fails, the response still includes the created (unpublished) kit.id so the caller isn't left with an invisible orphaned kit. Suite-wide error contract, with one intentional exception: error_code, when non-null, is always one of the canonical codes shared by every tool in this server (invalid_input, not_found, forbidden, not_authenticated, not_entitled, upstream_error, upstream_timeout, response_too_large). Unlike the six failure-only read tools (details/styles/similar/recommendations/search/preview), which only carry user_message alongside error_code on a failure, this tool's response is a combined success/failure envelope — user_message is the human-readable outcome on every call, success included, not just failures. **Not safe to blindly retry on a netw…font_details
ChatGPTresults list, one entry per requested font, in the same order as the input. Each entry is either resolved metadata (family_name, style_name, full_name, designers, foundry, detail_url, preview_url, language_support, library_availability, weight, style, is_variable_font, axes, resolved_via, requested, and a font_identifier or bare postscript_name) or {"postscript_name": ..., "error_code": "<code>", "user_message": "...", "requested": {...}} where error_code is one of invalid_input, not_found, upstream_error, upstream_timeout, and user_message is human-readable text safe to show the caller as-is. weight is the numeric OpenType weight class (e.g. 400, 700); the same class can look visually different across different families. style is "normal" or "italic". Use these rather than inferring boldness or slant from style_name or postscript_name text. is_variable_font is always present (true/false). axes is present exactly when is_variable_font is true (and only then) -- always a list, though it may be empty ([]) for a variable font that exposes no usable named instances -- a list of axis tags (e.g. ["wght", "wdth"]) this font exposes — tags only, deliberately no min/max/default. This tool has no access to the font's true axis range, so it doesn't claim numeric ranges it can't verify — only that these axes exist. Do not guess at or state a specific min/max/default for an axis from this tool's output. resolved_via is "font_id" or "postscript_name" — whichever identifier actually produced this result. When only one was supplied it's that one; when both were supplied it tells you which one decided the outcome, since they aren't cross-validated against each other. requested ({postscript_name, font_id — font_id present only if you supplied one}) is always present, on every entry, success or error, echoing exactly what you sent for that entry (not the resolved identity) — use it to match a result back to its request after filtering, reordering, or merging results downstream, rather than relying on array positio…font_preview
ChatGPTfont_recommend
ChatGPTfont_search
ChatGPTuser_query and the facet filters (foundry, designers, styles, moods, topics, font_group, writing_systems, exclude_variable_fonts) combine: the query is the search text and each facet narrows the matches, so supplying more of them tightens the result set rather than broadening it. The minimal call is a single user_query or one facet; sort orders the matches and page/per_page page through them. Args: user_query: Free-form text query (max 150 characters) doc_type: Document type (e.g., 'postcard', 'Instagram post', 'movie poster') styles: Comma-separated list of styles moods: Comma-separated list of moods topics: Comma-separated list of design topics font_query: Set true when user_query is (or contains) a specific font/family NAME the user wants to find (e.g. "Acumin", "Minion Pro"), rather than a descriptive query. This performs a literal name search: the matching family's styles are ranked to the top. Leave false for descriptive/semantic queries. text_hierarchy: Text focus ('heading' or 'body'); unrecognized values are dropped and ignored rather than rejected selected_font: PostScript name of a selected font for similarity foundry: Comma-separated foundries to filter by designers: Comma-separated designer names to filter by library: Font library ('full' or 'trial'); unrecognized values (e.g. 'adobe_fonts') normalize to 'full' rather than being rejected. 'trial' is always honored as requested. 'full' is clamped server-side to the caller's real Adobe Fonts entitlement (via OAuth context, bearer_token, or a server-configured fallback) — a free-tier caller cannot widen their catalog by passing 'full'; with no resolvable identity the effective value is 'trial'. writing_systems: Comma-separated writing systems the results must cover, as ISO 15924 script codes (e.g. 'latn,cyrl' or 'hani'). Case, surrounding whitespace, common full names ('Latin', 'Korean', 'Chinese Simplified'), and BCP-47 tags ('zh-Hans', 'ja') are normalized to the closest supported script; unrecognized tokens are dropped, and an empty result falls back to 'latn' rather than being rejected. See this server's MCP instructions for the list of supported writing systems. Distinct from locale (which language names are translated into) and from supported_languages (a font's own language capability). supported_languages: Optional list of language codes a returned font must support all of (AND semantics), via that font's language_support field. Case and separator variants ('zh_hans' -> 'zh-Hans', 'JA' -> 'ja') are normalized to the supported vocabulary; unrecognized codes are dropped rather than rejected, and if none remain no language filter is applied. Omit for no filtering. See this server's MCP instructions for the list of recognized language codes. exclude_variable_fonts: When False (the default), variable fonts are included in results alongside static fonts. Set True to omit variable fonts entirely. There is no variable-only mode — this only toggles whether variable fonts are included. font_group: Comma-separated font groups (e.g., 'Sans Serif,Display') sort: Result ordering ('relevance', 'name', or 'newest') locale: Language the returned font family/style names (and recommendation/search group names) are translated into, when a translation is available (default en_US). Hyphen, bare-code, and region-mismatched forms are all normalized to the closest supported locale (e.g. ja-JP and ja both become ja_JP; en_GB becomes en_US); an unsupported value falls back to en_US rather than being rejected. See this server's MCP instructions for the list of supported locales. Distinct from writing_systems (which script this call matches against). Group/category names in the response are localized only when the backend has a translation for the resolved locale -- your …font_similar
ChatGPTsupported_languages below). For open-ended, context-driven suggestions merely nudged toward a font's style rather than a specific licensed replacement, use the font-recommendation or font-search tool instead, if one is available on this surface. Args: font_identifiers: Seed fonts to find similar fonts for (up to 20 per call). Only postscript_name is used for the lookup; any font_id given is accepted for input-shape consistency but not required or used. library: Font library ('full' or 'trial'); clamped server-side to the caller's real Adobe Fonts entitlement, same as the font-recommendation and font-search tools. locale: Language the returned font family/style names (and recommendation/search group names) are translated into, when a translation is available (default en_US). Hyphen, bare-code, and region-mismatched forms are all normalized to the closest supported locale (e.g. ja-JP and ja both become ja_JP; en_GB becomes en_US); an unsupported value falls back to en_US rather than being rejected. See this server's MCP instructions for the list of supported locales. Distinct from supported_languages (a font's own language capability). For CJK locales this also improves match quality for CJK scripts, not just display translation. per_page: Maximum number of similar fonts to return per seed font (1-100, default 10). supported_languages: Optional list of language codes a returned font must support all of (AND semantics), via that font's language_support field. Case and separator variants ('zh_hans' -> 'zh-Hans', 'JA' -> 'ja') are normalized to the supported vocabulary; unrecognized codes are dropped rather than rejected, and if none remain no language filter is applied. Omit for no filtering. See this server's MCP instructions for the list of recognized language codes. Silently excludes brought-your-own-font (byof) matches, which carry no language metadata. exclude_variable_fonts: When False (the default), variable fonts are eligible similarity matches. Set True to omit variable fonts from the results. Same include/exclude toggle as the font-recommendation and font-search tools. bearer_token: Optional Adobe IMS access token. Resolves the caller's real entitlement tier (see library above) — usually not needed for that alone, since the MCP server's OAuth context already supplies one when available. Separately, only an explicit token passed here also unlocks the caller's own brought-your-own-font (byof) matches in the response — OAuth context alone does not unlock BYOF. Without an explicit token, only library-source matches are possible. Returns: JSON string: {"results": [...], "library": "full" | "trial", "instructions": <model guidance>}. library is the tier actually queried after clamping to the caller's entitlement (see library above). results has one entry per seed font, in the same order as the input font_identifiers. Each results entry is either a success entry {"requested": {...}, "similar_fonts": [...]} or an error entry {"postscript_name": ..., "error_code": "<code>", "user_message": <message>, "requested": {...}}. requested ({postscript_name, font_id — font_id present only if you supplied one}) is always present, on every entry, echoing exactly what you sent for that seed, so you can match a result back to its input after any reordering. Error error_code is one of: invalid_input (a client-side format check on the postscript_name, no network call — the offending value is echoed in requested.postscript_name, not the message) or upstream_error / upstream_timeout (the lookup itself failed — upstream_error for a hard error, upstream_timeout for a transient one: a timeout, connection error, or 5xx, where retrying may help). Because every seed shares one upstr…font_styles
ChatGPTresults list, one entry per requested font, in the same order as the input. Each entry is either {"resolved_via": "font_id" | "postscript_name", "requested": {...}, "family": {"name", "slug", "foundry", "designers", "detail_url", "language_support"}, "styles": [{"postscript_name", "style_name", "full_name", "weight", "style", "font_id", "preview_url", "language_support", "library_availability", "is_variable_font", "axis_values"}, ...]} or {"postscript_name": ..., "error_code": "<code>", "user_message": "...", "requested": {...}} where error_code is one of invalid_input, not_found, forbidden, upstream_error, upstream_timeout, and user_message is human-readable text safe to show the caller as-is. There is no top-level font_identifier on a success entry — use requested (below) to match a result back to its input, or find the input font's own entry inside styles by matching postscript_name (its resolved font_id is there too). resolved_via tells you which identifier decided the outcome when both font_id and postscript_name were supplied, since they aren't cross-validated against each other — same meaning as the font-details tool's resolved_via. requested ({postscript_name, font_id — font_id present only if you supplied one}) is always present on every entry, echoing exactly what you sent — same field and meaning as the font-details tool's requested. The requested postscript_name may not even appear in styles if font_id resolved to an unrelated family. family.language_support is present only when every style in the family shares the same language_support; a style then only carries its own language_support when its languages differ from that shared value. When styles disagree, family has no language_support at all and every style carries its own explicitly — there is no majority-vote default, so never assume a missing per-style language_support means it matches the family's unless family.language_support is actually present. invalid_input / not_found follow the font-details tool's exact semantics (same client-side format check; same "the font itself doesn't exist" meaning). forbidden means the font itself resolved fine but its family's style list is restricted for anonymous access — distinct from not_found. upstream_error means the lookup itself failed with a hard error. upstream_timeout means the lookup hit a transient failure — a timeout, a connection error, or a 5xx — so retrying may succeed. weight is the numeric OpenType weight class (e.g. 400, 700) — same field as the font-details tool — and the same class can look visually different across different families. is_variable_font (true/false) is present on every style — the same flag every font-returning tool exposes — so a variable style is never indistinguishable from a static one. axis_values (present only on a variable font's style, and only when that style's named instance carries concrete settings) is that specific named style's own variation-axis settings, e.g. {"wght": 400, "opsz": 12} — the exact values this style uses, not a min/max range (there's no reliable range data available; see the font-details tool's axes field for why). Where the font-level tools can only report …generate_indd_mapping_prompt
ChatGPTimage_apply_adjustments
ChatGPTactionHistory lists each edit with its current mask. To carry a mask forward from an earlier edit, find that edit's most recent entry and pass its mask.maskURI, not the URL you originally passed; isMaskUpdated means the user edited it, so keep maskDescription / toBeInverted unchanged. If the entry has userRemovedMaskURI instead of maskURI, the user removed that mask: don't reuse it — call a selection tool if the request still targets that region, and pass userRemovedMaskURI only if the user explicitly asks for that mask again. To use the original AI selection instead of the user's edit, or after a crop, expand, straighten or undo-all, call a selection tool again. Use the attached context when present; call interactive_image_get_context only when none is attached. ROUTING — `interactive_image_apply_adjustments_app` owns single-image tonal/color adjustments (exposure, contrast, hue/saturation, vibrance, color balance, B&W). Count only the images this turn asks you to edit, not what the session holds. - 1 image this turn: call interactive_image_apply_adjustments_app, not this tool. Never ask the user to choose; never offer a server-side edit. - 2+ images this turn: THIS tool for the whole set — interactive_image_apply_adjustments_app has no batch form; never call or mention it. - 1-image exceptions, use THIS tool when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; interactive_image_apply_adjustments_app is unavailable; the output feeds another tool, not the user. MANDATORY PREREQUISITE — before every call to this tool, you must first call asset_inline_preview or read_image (whichever is available) on each input image, including intermediate outputs from prior tool calls, and inspect the returned visual. Do not call this tool from the filename, the user's description, or prior assumptions alone. Do not proceed until the preview has returned and you have used it to judge the image's actual brightness, tonal balance, highlight/shadow state, and color cast. Without that visual grounding, parameter values are guesses. Adobe Photoshop and Lightroom professional image adjustments. Use when: brighten, darken, too dark, too bright, overexposed, underexposed, recover highlights, lift shadows, reveal shadow detail, crush blacks, boost contrast, boost saturation, muted colors, more colorful, desaturate, too yellow, too blue, warm up, cool down, white balance, color grade, hue shift, recolor an object, tone down a specific color, make it pop, looks dull, flat, lifeless, lacks contrast, professional look, polished, clean look — for specific, targeted adjustments where the direction or parameter is clear. For vague problem descriptions without a specified direction or amount, call image_apply_auto_tone first; use this tool only for follow-up fine-tuning. Adjustment groups — set only the fields you need: - Exposure: exposure, gamma, exposureOffset - Tonal regions: highlights, lights, darks, shadows - Brightness / contrast: brightness, contrast - Color temperature: tempA + tempB + tempLuminance (all three required) - Hue / sat / lightness: hslHue + hslSaturation + hslLightness (all three required; optionally add colorize or targetColor) - Vibrance / saturation: vibrance, saturation - Per-channel saturation: channelTarget + channelSaturation (both required) Why this tool: - CIELAB color temperature: precise warm/cool via Lab colorspace - Vibrance: smart saturation that protects skin tones - Camera Raw tone controls: exposure, gamma, offset, tonal regions - Deterministic single-pass pipeline: all adjustments applied in optimal fixed order in one call To target a specific object or area in the image: 1. If the user provides a mask URL, use …image_apply_auto_tone
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. Automatically corrects the tonal balance of the images in one step by adjusting exposure, contrast, highlights, shadows, whites, and blacks. No prior image analysis or preview is needed — call this tool directly. Use when: the user describes a tonal or visual problem without specifying exact values or a direction — e.g., "improve", "fix the lighting", "I can't see the subject", "looks flat". Always call this tool first; use image_apply_adjustments afterward only if finer manual control is still needed. Not for: adjustments where the user specifies a clear direction or amount (e.g., "make shadows warmer", "boost saturation") — use image_apply_adjustments directly for those. Long-running batches: A batch may take longer than a single call can wait. If the response is a single result with status: "working", NO images are ready yet — call image_get_task_status with its taskId to collect them all at once. Do NOT call image_apply_auto_tone again, which would redo the work and bill for it twice.image_apply_effects
ChatGPTactionHistory lists each edit with its current mask. To carry a mask forward from an earlier edit, find that edit's most recent entry and pass its mask.maskURI, not the URL you originally passed; isMaskUpdated means the user edited it, so keep maskDescription / toBeInverted unchanged. If the entry has userRemovedMaskURI instead of maskURI, the user removed that mask: don't reuse it — call a selection tool if the request still targets that region, and pass userRemovedMaskURI only if the user explicitly asks for that mask again. To use the original AI selection instead of the user's edit, or after a crop, expand, straighten or undo-all, call a selection tool again. Use the attached context when present; call interactive_image_get_context only when none is attached. ROUTING — `interactive_image_apply_effects_app` owns single-image artistic effects and filters. Count only the images this turn asks you to edit, not what the session holds. - 1 image this turn: call interactive_image_apply_effects_app, not this tool. Never ask the user to choose; never offer a server-side edit. - 2+ images this turn: THIS tool for the whole set — interactive_image_apply_effects_app has no batch form; never call or mention it. - 1-image exceptions, use THIS tool when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; options.effect is colorOverlay — not in the widget; interactive_image_apply_effects_app is unavailable; the output feeds another tool, not the user. Applies a single Photoshop filter/style effect to the image or an area, chosen via options.effect. Effects — set `options.effect` to one of: - grain: film grain, analog grain, add grain, cinematic texture, grainy photo, shot on film. - noise: add noise, digital noise, pixel noise, noisy image, uniform noise, digital texture. - colorOverlay: color overlay, color wash, tint filter, color layer on photo. Adds a new flat-color layer on top — a graphic/stylized tint. For a natural-looking global warm/cool or color-cast shift that preserves existing lighting, shadows, and detail, use image_apply_adjustments's color temperature or HSL params instead. Cannot set opacity — for "at 20%"/semi-transparent requests use image_fill_area. Without a mask covers the whole canvas. Do not use to fill or replace a background behind a subject (even a transparent cutout); use image_remove_background with options.backgroundColor instead. - gaussianBlur: blur, soften, defocus, bokeh, out of focus, hazy background. Uniform-radius; for falloff/shallow depth-of-field use image_apply_lens_blur. To blur the background behind a subject, the interactive_image_blur_background_app routing rule above applies. - glitch: glitch, chromatic aberration, broken screen, VHS distortion, cyberpunk. Larger absolute offset = more intense. - halftone: halftone, dot pattern, comic book, newspaper, screen printing, risograph. - monochromaticTint: black and white, grayscale, sepia, duotone, faded, washed out, single color wash. One effect per call — to layer several, call once per effect, chaining each result's outputUrl into the next call's imageURIs. To target a specific object or area in the image: 1. If the user provides a mask URL, use it to limit the effect to that region. 2. If no mask URL is provided but the user wants to target a specific area, first use available masking tools to create a mask based on their description, then apply the effect. 3. If no mask is specified and no targeting is requested, apply the effect to the entire image. Long-running batches: A batch may take longer than a single call can wait. If the response is a single result with status: "working", NO images are ready yet — call image_get_task_status with …image_apply_lens_blur
ChatGPTinteractive_image_blur_background_app, not this tool. Never ask the user to choose; never offer a server-side edit. - 2+ images this turn: THIS tool for the whole set — interactive_image_blur_background_app has no batch form; never call or mention it. - 1-image exceptions, use THIS tool when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; no subject mask is available or obtainable (the widget requires one); interactive_image_blur_background_app is unavailable; the output feeds another tool, not the user. Blurs the background with depth-of-field falloff (bokeh) while keeping the subject sharp. Auto-detects the primary subject and progressively blurs the background — no manual masking. Output Format: ALWAYS use outputFileType: "png". PNG is required — it preserves lossless quality and transparency through multi-step edits and selection-mask chains. Only use "jpeg" when the user has explicitly requested JPEG format for the final result. **Use ONLY when the user explicitly asks for blur, bokeh, depth-of-field, or out-of-focus background. Takes no mask and ignores selection state — do not chain image_select_subject / image_invert_selection ahead of it; subject masking is built in. For a uniform-radius blur instead of DoF falloff/bokeh, use image_apply_gaussian_blur: either blurTarget: 'background' (auto subject detection), or pass a maskURI from image_select_subject or image_select_by_prompt + image_invert_selection when you need a custom region or a sharper mask boundary. Example: <example> Apply lens blur: {} </example>image_apply_preset
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. Applies named Lightroom preset(s) to one or more images in a single batched call, transforming each image's look in one step. A preset adjusts tone, color, contrast, grain, and sharpening together as a unified look. Group the work into edits: each entry pairs one presetName with the images it applies to. Use multiple entries to apply different presets to different images in the same call. WHEN TO USE: the user's request is about color/tone/mood only — preset, color grade, film look, vintage, black and white conversion, matte finish, warm tone, cool tone, skin tone edit, vignette, cinematic grade, dramatic sky, sharpen, add grain, subject pop. WHEN NOT TO USE: composed-look requests that imply a different background, subject/background separation, or relighting — e.g. "studio photo", "product shot", "clean white backdrop", "magazine cover", "headshot on grey", "professional portrait". Those require structural changes that presets cannot produce. In those cases, build the composition first (isolate subject, replace background, relight) using the subject-selection / fill / blur / exposure tools, and only then apply a preset as the final color pass if needed. One look per result: Presets are a complete look, not additive filters. Apply a single preset as the final color/tone step for any given output, and do NOT re-run this tool on an image that already has a preset baked in — chaining presets on the same pixels compounds the effect and looks unnatural. Listing the same source image under different presets is fine: each preset is applied independently to the original image and produces a separate variant. 100+ presets across 14 categories: B&W (10), Color (6), Creative (13), Curve (4), Defaults (4 profiles with optional lens correction / noise reduction), Grain (3), Optics (3), Portraits (13: light/medium/deep skin variants), Sharpening (3), Vignetting (3), Adaptive (19: portrait, sky, subject, background blur), Auto+ (3: retro), Style (12: futuristic, cinematic II, film-inspired, vintage, B&W), Subject (8: travel, food, lifestyle). The catalog also includes a handful of curated custom presets that apply as a complete look exactly like the built-in ones. Important: The categories above are summaries, not exact preset names. You MUST call image_list_presets first to get the exact display names — preset names have specific formatting (e.g. "B&W - B&W High Contrast", not "B&W High Contrast"). Do not guess preset names. Returns one result per (preset, image) pair, each carrying the applied presetName in its metadata. Long-running preset applications: A batch may take longer than a single call can wait. If the response is a single result with status: "working", NO images are ready yet — call image_get_task_status with its taskId to collect them all at once. Do NOT call this tool again, which would re-apply the presets and bill for them twice. Examples: <example> One preset on two photos: { "edits": [ { "presetName": "B&W - B&W High Contrast", "images": [ "https://example.com/a.jpg", "https://example.com/b.jpg" ] } ] } </example> <example> A different preset per photo: { "edits": [ { "presetName": "B&W - B&W High Contrast", "images": [ "https://example.com/a.jpg" ] }, { "presetName": "Style: Vintage - VN07", "images": [ "https://example.com/b.jpg" ] } ] } </example> <example> Two looks of one ph…image_auto_straighten
ChatGPTimage_crop_and_resize
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. Smart crop and resize with subject-aware positioning. Automatically detects subjects and positions crops intelligently. Preferred tool for tight subject / product / face crops — uses server-side face/subject/prompt detection, which is far more reliable than estimating 0-1 bounds visually. If the user asks to "crop to only X", "tight crop on X", "isolate X", or frame any nameable subject, use this tool with fit: "extract" rather than image_crop_to_bounds. For geometric crops (halves, quarters, fixed percentages, letterbox bars) where no subject detection is needed, use image_crop_to_bounds directly. Key capabilities: - Crop to exact dimensions with subject-aware focus (face, upper_body, or custom point) - Focus on arbitrary objects by text prompt (e.g., "the red car", "the dog") - Crop to aspect ratio at source resolution ("16:9", "4:5", etc.) - Resize to a single dimension (proportional scaling) - Pad mode: fit entire image within target dimensions with transparent (PNG only) or white background (JPEG only) fill - Adjustable per-side margins around detected subjects (margin: 0.15 = 15% of subject size added to each side) - Custom alignment (rule of thirds, etc.) align parameter — controls where the focus point lands in the output frame (0=left/top, 0.5=center, 1=right/bottom). Only set the axis you want to shift; omit for centered crops. - "subject in the left third" → align: { x: 0.33 } - "subject in the right third" → align: { x: 0.67 } - "face in upper third" → align: { y: 0.33 } - "rule of thirds, upper-left" → align: { x: 0.33, y: 0.33 } - "leave space on the right for text" → align: { x: 0.3 } - "leave space above for a title" → align: { y: 0.6 } - "subject at the bottom" → align: { y: 0.75 } Values below 0.5 push the subject toward top-left; above 0.5 toward bottom-right. Note: align has no effect on an axis when the crop spans the full source dimension on that axis (e.g., cropping a landscape to portrait uses the full source height, so align.y cannot move the crop). When this happens, an "align_constrained" tradeoff is recorded in metadata. align may also be partially overridden to keep the detected subject visible in the crop. Aspect compatibility & clipping: fit: "reframe" cannot grow the crop; when source and target aspect differ sharply (portrait → landscape or vice versa) the subject will clip and no focus/align/margin can prevent it. On focus: "subject" the tool auto-retries with focus: "face" when the subject looks upright (tall bbox, a proxy for "person"); non-upright subjects (pets, produce, landscapes) skip this step. If still clipped (visible_fraction < 0.7), onSubjectClipping kicks in: "expand" (default — emits a requires_expand_chain tradeoff with pre-filled image_generative_expand args; baseline action is an extract crop) · "extract" (tight crop, may upscale) · "pad" (letterbox, no loss) · "error" (fail with guidance) · "ignore" (tradeoffs only). `requires_expand_chain` tradeoff: invoke the pre-filled next_call (image_generative_expand) exactly as given, then re-invoke image_crop_and_resize with the same arguments, replacing imageURI with the expand output URL. The baseline action returned alongside this tradeoff is an extract crop — usable as a fallback, but chaining yields the content-preserving result. Read cause to know which problem it…image_crop_to_bounds
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. PREREQUISITE: call asset_inline_preview or read_image (whichever is available) on the input image first. Choosing bounds without a current visual can clip subjects, miss borders or crop the wrong region. If the only information you have is the filename or a description, you do NOT have enough grounding; preview first, then choose bounds from what you see. Crop images to exact geometric bounds using normalized coordinates (0-1). Each coordinate is a fraction of the image dimension: 0 = top/left edge, 1 = bottom/right edge. The same normalized bounds are applied to every image — since coordinates are relative, images of different sizes produce proportionally equivalent crops. Use ONLY for geometric / compositional crops where the region is specified by position, not by subject: - "the left half", "center 50%", "top-right quarter" - "remove 10% from all edges", "trim the black letterbox bars" - "16:9 letterbox from the center" - Fast, deterministic crops with no detection overhead needed. Do NOT use this tool as the first choice for subject / product / face crops — even if you can see the subject clearly. Visual coordinate estimation is unreliable for tight framing and frequently leaves empty regions on one side or clips the subject on the other (a recurring failure mode). For any of these, use image_crop_and_resize first: - "crop to only the product", "crop to the tube / bottle / box", "isolate X", "just the dog" → image_crop_and_resize with fit: "extract" + focus + margin - "crop this to 16:9 keeping the subject in frame", social media crops with a subject → image_crop_and_resize with default fit: "reframe" + focus - Any request to frame a nameable subject — server-side face/subject/prompt detection is far more reliable than eyeballing 0-1 coordinates from a preview. - Decorative frame / ornate border / rotated-subject-on-background (e.g. a framed document, certificate, photo on a desk, scanned paper that isn't axis-aligned): the inner content is a subject, not a geometric crop — the frame edges don't align with the image edges. Use image_crop_and_resize with fit: "extract" and focus: { prompt: "<the subject>" }. Use this tool as a fallback when image_crop_and_resize detection misses (empty match, wrong region, or subject in an unexpected position). In that case the subject is already visually located in the preview, so explicit coordinates are the right escape hatch — pad bounds by 5–8% outward around the subject to avoid clipping limbs / edges that are easy to under-estimate visually. Border / letterbox / frame removal — overshoot, single call. Rule: if the visible border is V% on a side, set the inner bound to at least V + 5 on that side. Never equal, never less. Measure each side independently — for asymmetric frames (e.g. Polaroid with a thicker bottom), do NOT default to symmetric bounds. If a sliver survives, jump by another 5–10% — do not nudge by 1%. After the call, follow the importantNote on the result to verify the output visually before reporting success. Long-running batches: A batch may take longer than a single call can wait. If the response is a single result with status: "working", NO images are ready yet — call image_get_task_status with its taskId to collect them all at once. Do NOT call image_crop_to_bounds again, which would redo the work and bill for it twice. E…image_fill_area
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. Reusing a mask (only when the editing context with `actionHistory` is available): the user can edit or remove masks in the editor, so a mask URL you passed earlier may be stale — the context's actionHistory lists each edit with its current mask. To carry a mask forward from an earlier edit, find that edit's most recent entry and pass its mask.maskURI, not the URL you originally passed; isMaskUpdated means the user edited it, so keep maskDescription / toBeInverted unchanged. If the entry has userRemovedMaskURI instead of maskURI, the user removed that mask: don't reuse it — call a selection tool if the request still targets that region, and pass userRemovedMaskURI only if the user explicitly asks for that mask again. To use the original AI selection instead of the user's edit, or after a crop, expand, straighten or undo-all, call a selection tool again. Use the attached context when present; call interactive_image_get_context only when none is attached. Fills a masked area of the image with a solid color at a specified opacity. The mask's white pixels are filled; black pixels are preserved. WHEN TO USE: filling a specific masked region (not the whole background-behind-the-subject) with a solid color. Typical cases: a sub-region selected by prompt (e.g. "the sky", "the wall"), a user-supplied mask, a region from image_select_by_prompt, or compositing flat color into part of a layout. WHEN NOT TO USE: replacing the entire background behind a subject with a solid color — however phrased (e.g. "fill the background with green", "make the background white", "give it a red background", "put a solid <color> behind the subject"). Use image_remove_background with options.backgroundColor instead (single call) — it detects the subject and composites it onto the color in one step. Do not use a generative tool such as image_instruct_edit for this, and do not chain image_select_subject → image_invert_selection → this tool — either mistake fills the subject instead of the background. Do not feed the transparent PNG output of image_remove_background into this tool as a mask — it has alpha, not black/white mask semantics, and will produce wrong polarity. Long-running batches: A batch may take longer than a single call can wait. If the response is a single result with status: "working", NO images are ready yet — call image_get_task_status with its taskId to collect them all at once. Do NOT call image_fill_area again, which would redo the work and bill for it twice. Examples: <example> Create solid white fill layer: { preset: 'white' } </example> <example> Create 50% opacity white fill layer: { preset: 'white', opacity: 50 } </example> <example> Create custom RGB color fill layer: { color: { red: 255, green: 128, blue: 0 }, opacity: 75 } </example> <example> Create gray fill layer with multiply blend mode: { preset: 'gray', blendMode: 'multiply' } </example>image_generate
ChatGPTimage_generative_expand
ChatGPTimage_get_presigned_urls
ChatGPTimage_get_task_status
ChatGPTstatus: "working" together with a taskId. That result is NOT finished — there is no output yet — and this tool is the only way to get the real one. Call this with the taskId verbatim. If it comes back status: "working" again, the operation is still running: call this tool again with the taskId from the LATEST result. Usually that is the same value you sent, but for a batch it can be a new one — always use the most recent. Repeat until you get results. One taskId may cover SEVERAL operations. It is then all-or-nothing: while any operation is unfinished you get a single status: "working" result with no outputs, and once they are all done you get every result together, in the order of the original request. You will never receive some of a batch's images now and the rest later. Do not report the operation as complete, and do not end your turn, until every result contains outputUrl. Example: <example> Continue waiting: { "taskId": "v1.aGVsbG8…" } </example>image_instruct_edit
ChatGPTimage_invert_selection
ChatGPTimage_list_presets
ChatGPTimage_open_file_app
ChatGPTimage_remove_background
ChatGPTinteractive_image_remove_background_app, not this tool. Never ask the user to choose; never offer a server-side edit. - 2+ images this turn: THIS tool for the whole set — interactive_image_remove_background_app has no batch form; never call or mention it. - 1-image exceptions, use THIS tool when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; a solid-color backdrop is wanted (options.backgroundColor) — the widget only makes transparent cutouts; no subject mask is available or obtainable (the widget requires one); interactive_image_remove_background_app is unavailable; the output feeds another tool, not the user. Detects the main subject and creates a cutout. Default: transparent PNG with subject isolated. With backgroundColor (hex): JPEG with subject composited onto that solid color. WHEN TO USE: remove background, cut out subject, isolate subject, strip background, transparent cutout, OR replace/fill the background behind the subject with a solid color ("fill the background white", "make the background blue", "put it on a white backdrop"). This works even when the input is ALREADY a transparent cutout — it re-detects the subject and composites it onto the solid color, so it is the correct tool for "fill the (transparent) background with a color" on a cutout PNG. Reach for this tool whenever the user wants a clean solid-color backdrop behind the subject — pass options.backgroundColor. This is the core building block of any "studio photo", "product shot on white", "headshot on grey", or "professional ID photo" request. A solid neutral backdrop (white, light grey, or black) is what defines the studio look far more than any color grade or blur. Do NOT try to fake the studio look with lens blur, gaussian blur, vignettes, or color presets alone — the background must actually be replaced. Default output is a cutout PNG (transparent background), not a mask. Do not pass this result as maskURI to other tools — it has transparency, not black/white mask semantics, and feeding it into mask-accepting tools will produce the wrong result. WHEN NOT TO USE: anything else targeting subject or background — blurring only the background, selectively adjusting the subject, applying effects to either region, or any downstream masked edit. Use image_select_subject instead to get a proper mask. Downscale behavior: If input exceeds the API resolution limit, it is automatically downscaled before processing and the cutout is returned at reduced resolution (not upscaled back). When this happens, output metadata includes a tradeoffs array with a downscaled entry and output_width/output_height will be smaller than source_width/source_height. Examples: <example> Transparent PNG cutout: {} </example> <example> Studio / headshot on white: { "backgroundColor": "#ffffff" } </example> <example> Headshot on neutral grey: { "backgroundColor": "#cccccc" } </example> <example> Any 6-digit hex is accepted (not just neutrals): { "backgroundColor": "#1a73e8" } </example>image_remove_blemishes
ChatGPTimage_select_by_prompt
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. Background / negative-space selection takes two calls. Step 1: this tool with prompt: "the subject" or the named positive object. Step 2: image_invert_selection on the returned mask. Never use "the background", "everything except X", or "the area around X" as the prompt. DO NOT USE for generative requests. This tool only creates selection masks — it does not generate, remove or replace content. If the user asks to remove objects/people, replace backgrounds, generate content, or perform any generative AI editing, inform them that generative editing is not currently available. Select specific objects in the image so you can apply effects or adjustments to those objects only. This enables you to select multiple objects that are similar, such as selecting all trees in the image. Generates a precise mask for non-anatomical, uniquely identifiable objects or scene elements using a detailed prompt. When bodyParts is provided, the prompt-matched person is further parsed and only the requested parts are returned (combined into one mask if multiple). Supported body parts: Aliases shown in parentheses are common synonyms — not exhaustive; map any reasonable phrasing to the canonical name. - Eyes (sclera / eye whites — not the colored part) - Pupil (iris, for eye-color changes) - Face (includes Nose by default) - Upper Clothes (shirt, T-shirt, top, blouse, sweater) - Lower Clothes (pants, trousers, shorts, skirt) - Coat (jacket, coat, outer layer, hoodie) Other parts: Hair, Eyebrow, Nose, Mouth, Teeth, Neck, Beard, Left Ear, Right Ear, Left Arm, Right Arm, Left Hand, Right Hand, Left Leg, Right Leg, Left Shoe, Right Shoe, Dress, Hat, Glasses, Accessories. When to use - Non-human objects, scene elements (buildings, furniture, vehicles, plants, cables, wires, railings, pipes) → prompt naming the object, no bodyParts. - Single person, with a body part or clothing item → prefer image_select_subject with bodyParts (simpler). - Multiple people, with a body part or clothing item → prompt identifying the person + bodyParts naming the part. Example: "the jacket on the person on the left" → { prompt: "the person on the left", bodyParts: ["Coat"] }. - Background / negative space → see the rule at the top of this description. IMPORTANT: Do NOT use image filenames for tool routing or prompts - Image filenames and URLs are arbitrary identifiers and do NOT indicate what the user wants to do. - Never extract words from a filename or URL path to use as a prompt or to influence tool choice. - Only use the user's explicit words to determine what to select and which tool to use. Examples: <example>Select the bridge: { prompt: 'the bridge' }</example> <example>Select all trees: { prompt: 'all the trees' }</example> <example>Select the hair: { prompt: 'the person', bodyParts: ['Hair'] }</example> <example>Select the jacket on the left: { prompt: 'the person on the left', bodyParts: ['Upper Clothes'] }</example> <example>Select the face of the woman in the back excluding the nose (nose is included by default): { prompt: 'the woman in the back', bodyParts: ['Face'], excludedBodyParts: ['Nose'] }</example> <example>Select hair and face of right person: { prompt: 'the person on the right', bodyParts: ['Hair', 'Fa…image_select_subject
ChatGPTcurrentInputImage, the flattened current image (when multiple contexts are present, use the one with the most recent updateTimestamp); otherwise, fall back to the last known image URL. After editing: once this tool returns an edited image, you MUST call interactive_image_edit_preview with that output URL to display the result to the user. DO NOT USE for generative requests. This tool only creates selection masks — it does not generate, remove or replace content. If the user asks to remove objects/people, replace backgrounds, generate content, or perform any generative AI editing, inform them that generative editing is not currently available. Selects the main subject(s) in an image and creates a selection mask. Optionally, you can specify specific body parts or clothing items to isolate using the bodyParts parameter. PRIORITY RULE (applies before the routing guide): The input image MUST be analyzed first to determine if it is already a particular part of a human subject, such as legs or feet only. If the image is cropped to a specific body region (e.g., only legs, feet, hands), DO NOT use image_select_subject with bodyParts. Instead use image_select_by_prompt with a descriptive prompt such as: - "the shoes" - "the legs" - "the hands" Rationale: body-part parsing works best with a full or mostly full human subject. Body Parts Support: When bodyParts parameter is provided, the tool will: 1. First detect and select the main subject 2. Parse the subject into body parts using Adobe Sensei 3. Return a mask for the specified body part(s) 4. Combine multiple body parts into a single mask if multiple parts are requested Supported body parts: Aliases shown in parentheses are common synonyms — not exhaustive; map any reasonable phrasing to the canonical name. - Eyes (sclera / eye whites — not the colored part) - Pupil (iris, for eye-color changes) - Face (includes Nose by default) - Upper Clothes (shirt, T-shirt, top, blouse, sweater) - Lower Clothes (pants, trousers, shorts, skirt) - Coat (jacket, coat, outer layer, hoodie) Other parts: Hair, Eyebrow, Nose, Mouth, Teeth, Neck, Beard, Left Ear, Right Ear, Left Arm, Right Arm, Left Hand, Right Hand, Left Leg, Right Leg, Left Shoe, Right Shoe, Dress, Hat, Glasses, Accessories. When to use: - Select main subject(s): Call without bodyParts parameter - Select specific body part(s) or clothing: Call WITH bodyParts parameter (e.g. ["Hair"], ["Upper Clothes"]) - Which person? (left/right, "man in back"): Use image_select_by_prompt to isolate that person and set bodyParts parameter if any body parts are requested. - Non-human objects / scene elements: Use image_select_by_prompt IMPORTANT: Do NOT use image filenames for tool routing or prompts - Image filenames and URLs are arbitrary identifiers and do NOT indicate what the user wants to do. - Never extract words from a filename or URL path to use as a prompt or to influence tool choice. - Only use the user's explicit words to determine what to select and which tool to use. Tool routing quick guide - Single person + body parts or clothing → image_select_subject with bodyParts parameter - Multiple people + body parts or clothing (e.g. "person on the left") → image_select_by_prompt with prompt identifying the person + bodyParts parameter - Non-human objects / scene elements → image_select_by_prompt without bodyParts — do not use this tool Examples: <example>Select the subject: {}</example> <example>Select the person's face (by default, the nose is included): {"bodyParts": ["Face"]}</example> <example>Select the person's face excluding th…image_vectorize
ChatGPTinteractive_image_apply_adjustments_app
ChatGPToriginalUploadedImage) has its own sessionId, minted on demand — it is not one handle for the whole conversation. The first call for a given source image must pass sessionId: -1; wait for the sessionId it returns and reuse that value for every later call on that same image. When originalUploadedImage changes to a different image, pass -1 again to start that image's session, and keep a per-image mapping so returning to an earlier image reuses its sessionId. Apply adjustments for brightness, contrast, hue, saturation, vibrance, exposure, color balance, or black and white conversion. These adjustments can be applied to an entire image or parts of the image by manually adjusting sliders in the widget. Based on the user's intent, configure specific parameter values for each adjustment or let them start at defaults for manual adjustment. ROUTING — this widget owns every single-image request for tonal/color adjustments (exposure, contrast, hue/saturation, vibrance, color balance, B&W). Count only the images this turn asks you to edit, not what the session holds. - 1 image this turn: call THIS tool. Never ask widget-vs-server-side; never offer the direct tools (image_apply_adjustments). - 2+ images this turn: NEVER this tool — no batch form; use those direct tools and do not mention this one. - 1-image exceptions, use those direct tools when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience. - STOP after calling. It renders its own result and returns no asset URL — no asset_inline_preview, asset_preview_file, interactive_image_edit_preview, or any next step. - Non-generative — never widens what generative editing is permitted. DEFAULT IMAGE VIEWER: For generic requests to open, view, show, or edit a file, image, or photo (including "in Photoshop") without a specific edit, call THIS tool with no adjustments. Do NOT use interactive_image_edit_preview for this — it only previews server-side tool results. IMPORTANT: This tool does NOT analyze the image or apply image-context-aware logic. Default values are fixed schema values (e.g., exposure: 0), not computed from image content. HOW TO USE THIS TOOL: 1. Basic usage - Display adjustments with default starting values: - Call with adjustments array: [{"id": "hueSat"}, {"id": "exposure"}] - All parameters start at their default values; user adjusts manually via sliders 2. Advanced usage - Pre-configure specific parameter values: - Call with adjustments array including params: [{"id": "hueSat", "params": {"hue": 15, "saturation": 20}}, {"id": "exposure", "params": {"exposure": 0.5}}] - Adjustment sliders will start at your specified values instead of defaults - IMPORTANT: Only include parameters related to the user's intent - omit other parameters that would stay at defaults 3. User can click on the settings icon on each image to reveal adjustment sliders for real-time refinement MANDATORY PARAMETER DISCOVERY (ENFORCED): If any entry in the adjustments array includes a params object, you must use correct parameter names and constraints for that adjustment. If you do not already have the specific details (parameter names, ranges, defaults) for the adjustment in question, call interactive_image_get_options_for_adjustments_app (no input) first to get them. When you receive results from interactive_image_get_options_for_adjustments_app, you MUST follow the "instruction" for each parameter when configuring adjustment parameters—the instruction describes valid ranges, units, and how to interpret values. ENFORCEMENT RULES: 1. For each adjustments[i].id where adjustments[i].params is present: a. Use specific details (parameter names, ranges, defaults) for the adjustment in question when you already have them; otherwise call interactive_image_get_options_for_adjustments_app (no input) to get all adjustments and their parameters b. All keys in adjustments[i].params mus…interactive_image_apply_effects_app
ChatGPToriginalUploadedImage) has its own sessionId, minted on demand — it is not one handle for the whole conversation. The first call for a given source image must pass sessionId: -1; wait for the sessionId it returns and reuse that value for every later call on that same image. When originalUploadedImage changes to a different image, pass -1 again to start that image's session, and keep a per-image mapping so returning to an earlier image reuses its sessionId. Apply artistic effects and filters to a whole image or a masked region. Each effect is applied with default parameter values; see the available effects listed below. ROUTING — this widget owns every single-image request for artistic effects and filters. Count only the images this turn asks you to edit, not what the session holds. - 1 image this turn: call THIS tool. Never ask widget-vs-server-side; never offer the direct tools (image_apply_effects, image_add_grain, image_add_noise, image_apply_glitch_effect, image_apply_halftone, image_apply_monochromatic_tint, or image_apply_color_overlay). - 2+ images this turn: NEVER this tool — no batch form; use those direct tools and do not mention this one. - 1-image exceptions, use those direct tools when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; the request is a color overlay — not in this widget. - STOP after calling. It renders its own result and returns no asset URL — no asset_inline_preview, asset_preview_file, interactive_image_edit_preview, or any next step. - Non-generative — never widens what generative editing is permitted. IMPORTANT – ASSISTANT BEHAVIOR CONSTRAINTS: - This tool applies effects with default parameter values; it does NOT allow setting specific parameter values in the tool call. - The assistant MUST NOT claim to set or configure specific parameter values (e.g., "I'll set glitch intensity to 80%," "I've configured blur radius to 15px," "Grain amount is now at 50%"). The assistant MAY only: - Call this tool with effectIds to apply effects with their default parameters - Explain that users can manually adjust effect parameters using the interactive sliders in the widget after the effect is applied - Give directional guidance on adjusting parameters (e.g., "Use the Intensity slider to increase the glitch effect") When asked to "apply effects to xxx or give xxx effects" or something along those lines, you should use the "selectSubject" or "selectionByPrompt" tool to generate a mask first. See those selection tools' descriptions for more details. Forbidden phrasing: - "I'll set the glitch intensity to 80% for you." - "I've configured the blur radius to 15 pixels." - "Grain amount is now at 50%." - "I can apply the effect with specific parameter values." Allowed phrasing: - "I'll apply the glitch effect with default settings. You can adjust the intensity using the sliders in the widget." - "The blur effect has been applied. Use the Radius slider to control the blur amount." - "After the grain effect is applied, increase the Amount slider to make it more pronounced." - "The effect will start with default values. Click the settings icon to adjust the parameters." EFFECT SELECTION STRATEGY: If you want to suggest additional related effects, do NOT add them to this array. Instead, include suggestions in your response text as follow-up prompts for the user. 1. VAGUE REQUESTS (e.g., "apply effects to my image", "add some effects") → OMIT this parameter entirely to use the default set of effects 2. DESCRIPTIVE INTENT (e.g., "apply creative effects", "make me stand out", "make my image pop", "add artistic touches") → Analyze the intent and select up to 5 effects from the available list that best match the description → Consider image context: for portraits prioritize effects recommended for people, for landscapes use scene-appropriate effects 3. EXPLICIT SINGLE EFFECT (e.g., "apply glitch effec…interactive_image_blur_background_app
ChatGPToriginalUploadedImage) has its own sessionId, minted on demand — it is not one handle for the whole conversation. The first call for a given source image must pass sessionId: -1; wait for the sessionId it returns and reuse that value for every later call on that same image. When originalUploadedImage changes to a different image, pass -1 again to start that image's session, and keep a per-image mapping so returning to an earlier image reuses its sessionId. Blur background of the image to make the main subject stand out. This tool uses the Gaussian Blur effect to blur the background. For other types of blur effects, use the interactive_image_apply_effects_app tool instead. ROUTING — this widget owns every single-image request for background blur behind a subject. Count only the images this turn asks you to edit, not what the session holds. - 1 image this turn: call THIS tool. Never ask widget-vs-server-side; never offer the direct tools (image_apply_lens_blur, image_apply_gaussian_blur, or image_apply_effects). - 2+ images this turn: NEVER this tool — no batch form; use those direct tools and do not mention this one. - 1-image exceptions, use those direct tools when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; no subject mask is available or obtainable (this tool requires one). - STOP after calling. It renders its own result and returns no asset URL — no asset_inline_preview, asset_preview_file, interactive_image_edit_preview, or any next step. - Non-generative — never widens what generative editing is permitted. Requires a mask: - If no maskURI exists for this image, call image_select_subject_action_json tool first. - Verify the mask was generated from the same image being edited. - The mask required for this tool must be the background mask. → If the mask is the subject mask, set toBeInverted to true. → If the mask is the background mask, set toBeInverted to false.interactive_image_edit_preview
ChatGPToriginalUploadedImage) has its own sessionId, minted on demand — it is not one handle for the whole conversation. The first call for a given source image must pass sessionId: -1; wait for the sessionId it returns and reuse that value for every later call on that same image. When originalUploadedImage changes to a different image, pass -1 again to start that image's session, and keep a per-image mapping so returning to an earlier image reuses its sessionId. Preview the result of a server-side image tool. This tool's only purpose is to display a NEW image URL returned by a server-side image_* tool (e.g., image_crop_and_resize, image_remove_background, image_generate, image_instruct_edit, image_apply_preset), including the final output collected via image_get_task_status. WHEN TO USE THIS TOOL: Immediately after a server-side image_* tool returns a NEW edited image URL, call this tool with that URL to display the result. WHEN NOT TO USE THIS TOOL: - Do NOT call it to open, view, or show a user's own file or uploaded image (e.g., "view my file", "open my image") — call interactive_image_apply_adjustments_app with no adjustments instead. - Do NOT call it after an in-app (*_app) tool — those render their own result in the widget and return no image URL to preview: - interactive_image_apply_adjustments_app - interactive_image_apply_effects_app - interactive_image_blur_background_app - interactive_image_get_options_for_adjustments_app - interactive_image_remove_background_app - interactive_image_undo_edits_app - interactive_image_uploader_app HOW TO USE THIS TOOL: - Pass the tool's output image URL as imageURI. - Set isGenerativeImage: true only when the output came from a generative-AI tool.interactive_image_get_context
ChatGPTsessionId, the per-originalUploadedImage handle — not one handle for the whole conversation): the flattened currentInputImage a destructive edit should build on, plus originalUploadedImage and actionHistory (each masked edit's current mask.maskURI, or userRemovedMaskURI if the user removed it). WHEN TO USE THIS TOOL: - Before a DESTRUCTIVE edit (e.g. image_instruct_edit, image_generate) that must build on the flattened result of prior non-destructive interactive_*_app edits, and only when you have no outputUrl from the previous tool. Call it, then pass the returned currentInputImage as the destructive tool's imageURI. - Before reusing a mask from an earlier edit, when no context is attached: the user may have edited or removed it in the editor. Pass the matching actionHistory entry's mask.maskURI. Reusing the same mask.maskURI across edits ties them together like a shared Photoshop layer mask: if the user later refines that mask in the editor, every edit sharing it moves to the refined mask. To target the same subject independently, generate a new mask instead — a fresh mask URL is treated as a separate mask. DO NOT CALL THIS TOOL: - Before a non-destructive interactive_*_app tool just to choose its image. Those stack on one base, so reuse the SAME imageURI you passed to the previous *_app edit (or the previous tool's outputUrl, or the freshly uploaded image) — NEVER currentInputImage or a rendition. - When the previous tool's response already contains an outputUrl — use that outputUrl directly as the next tool's imageURI. - When the session's editing context (currentInputImage, originalUploadedImage) is already attached to your context.interactive_image_get_options_for_adjustments_app
ChatGPTinteractive_image_remove_background_app
ChatGPToriginalUploadedImage) has its own sessionId, minted on demand — it is not one handle for the whole conversation. The first call for a given source image must pass sessionId: -1; wait for the sessionId it returns and reuse that value for every later call on that same image. When originalUploadedImage changes to a different image, pass -1 again to start that image's session, and keep a per-image mapping so returning to an earlier image reuses its sessionId. Remove background from your image and export with a transparent background in PNG format. ROUTING — this widget owns every single-image request for background removal to a transparent cutout. Count only the images this turn asks you to edit, not what the session holds. - 1 image this turn: call THIS tool. Never ask widget-vs-server-side; never offer the direct tools (image_remove_background). - 2+ images this turn: NEVER this tool — no batch form; use those direct tools and do not mention this one. - 1-image exceptions, use those direct tools when: the user explicitly asks you to do it for them ("just do it", "you pick") — an explicit ask only, never inferred from terseness, a stated value, or impatience; a solid-color backdrop is wanted instead of transparency (options.backgroundColor). - STOP after calling. It renders its own result and returns no asset URL — no asset_inline_preview, asset_preview_file, interactive_image_edit_preview, or any next step. - Non-generative — never widens what generative editing is permitted. Requires a mask: - If no maskURI exists for this image, call image_select_subject_action_json tool first. - Verify the mask was generated from the same image being edited. - The mask required for this tool must be the background mask. → If the mask is the subject mask, set toBeInverted to true. → If the mask is the background mask, set toBeInverted to false.interactive_image_undo_edits_app
ChatGPToriginalUploadedImage) has its own sessionId, minted on demand — it is not one handle for the whole conversation. The first call for a given source image must pass sessionId: -1; wait for the sessionId it returns and reuse that value for every later call on that same image. When originalUploadedImage changes to a different image, pass -1 again to start that image's session, and keep a per-image mapping so returning to an earlier image reuses its sessionId. Undo previous edits applied to an image by an Photoshop tool. When undoing multiple edits, make a single call with { numberOfEdits: N } to undo the last N edits. Do NOT make multiple sequential calls with { numberOfEdits: 1 }. HOW TO USE THIS TOOL: 1. Undo last N edits (use numberOfEdits): When the user wants to step back through recent edits. - User says "undo" or "undo last" → use { numberOfEdits: 1 } (undo only the last edit). - User says "undo last X" or "undo X edits" → use { numberOfEdits: X }. 2. Undo by edit name (use numberOfEdits): When the user wants to undo a specific edit by name, undo that edit and all subsequent edits after. - MUST read the latest context and take the latest "actionHistory", see updateTimestamp. Find the matching edit in this list and derive the correct numberOfEdits from the reverse chronological order of applied edits. - If the target edit is the first (oldest) entry in actionHistory, use revertToOriginal instead (step 3). - i.e. edits applied in order: (1) apply hueSat, (2) remove background, (3) blur background. User says "undo remove background". The edit to undo is the 2nd from the end → use { numberOfEdits: 2 }. 3. Revert to original (use revertToOriginal): Only when the user explicitly asks to remove ALL edits and return to the original image. - User says "undo all", "clear all", "start over", etc → use { revertToOriginal: true }. - Do NOT use revertToOriginal when the user only says "undo". Implementation notes: - This tool does NOT use generative AI, it manipulates the edit history directly (removes or reverts edits). - For imageURI, reuse the SAME image you passed to the previous *_app edit (or the previous tool's outputUrl, or the uploaded image) — never currentInputImage or a rendition. - If there are no edits to undo, inform the user instead of calling the tool.interactive_image_uploader_app
ChatGPTlog_analytics
ChatGPTmarkdown_to_pdf
ChatGPTmedia_enhance_speech
ChatGPTmedia_summarize
ChatGPTpdf_compress
ChatGPTpdf_create
ChatGPTpdf_edit_ui
ChatGPTpdf_export
ChatGPTpdf_file_open
ChatGPTpdf_highlight
ChatGPTpdf_ocr
ChatGPTpdf_operation_status
ChatGPTpdf_properties
ChatGPTpdf_to_image
ChatGPTpdf_to_markdown
ChatGPTpdf_viewer
ChatGPTprepare_indd_merge_template
ChatGPTquickCutPoll
ChatGPTreplace_image
ChatGPTresizeVideoPoll
ChatGPTsearch_design
ChatGPTsummarizePoll
ChatGPTvectorPollingHelper
ChatGPTvideoMetadataPoll
ChatGPTvideoRenderFramePoll
ChatGPTvideoRenderPoll
ChatGPTvideo_create_quick_cut
ChatGPTvideo_metadata
ChatGPTvideo_render
ChatGPTvideo_render_frame
ChatGPTvideo_resize
ChatGPTacrobat_proxy
Claudeacrobat_readonly_proxy
Claudeadobe_mandatory_init
Claudeanimate_design
Claudeasset_add_file
Claudeasset_add_file_check_status
Claudeasset_copy_assets
Claudeasset_create_folders
Claudeasset_finalize_file_upload
Claudeasset_get_brand
Claudeasset_get_brand_color_themes
Claudeasset_get_brand_colors
Claudeasset_get_brand_fonts
Claudeasset_get_brand_guidelines
Claudeasset_get_brand_logos
Claudeasset_get_presigned_urls
Claudeasset_initialize_file_upload
Claudeasset_inline_preview
Claudeasset_invite_collaborators
Claudeasset_license_and_download_stock
Claudeasset_list_brands
Claudeasset_list_collaborators
Claudeasset_migrate_guest_storage
Claudeasset_preview_file
Claudeasset_search
Claudeasset_share_link
Claudeboards_add_items_to_board
Claudeboards_create_new_board
Claudechange_background_color
Claudeconvert_pdf_to_indd
Claudecreate_firefly_board
Claudecreate_visual_design_express_skill
Claudedocument_convert_pdf
Claudedocument_merge_data_layout
Claudedocument_merge_data_vector
Claudedocument_render_layout
Claudedocument_render_vector
ClaudeenhanceSpeechPoll
Claudeexport_html_to_express
Claudeexport_idml
Claudefill_text
Claudefind_fonts
Claudefont_activate
Claudefont_create_kit
Claudefont_details
Claudefont_preview
Claudefont_recommend
Claudefont_search
Claudefont_styles
Claudegenerate_indd_mapping_prompt
Claudeget-motion-import-job-status
Claudeget_account_type
Claudeget_fontkit_embed_url
Claudeget_type_palette
Claudehtml_export_readiness_skill
Claudeimage_add_grain
Claudeimage_add_noise
Claudeimage_adjust_brightness_and_contrast
Claudeimage_adjust_color_temperature
Claudeimage_adjust_dark_portions
Claudeimage_adjust_exposure
Claudeimage_adjust_highlights
Claudeimage_adjust_hsl
Claudeimage_adjust_light_portions
Claudeimage_adjust_single_color_saturation
Claudeimage_adjust_vibrance_and_saturation
Claudeimage_apply_adjustments
Claudeimage_apply_auto_tone
Claudeimage_apply_color_overlay
Claudeimage_apply_gaussian_blur
Claudeimage_apply_glitch_effect
Claudeimage_apply_halftone
Claudeimage_apply_lens_blur
Claudeimage_apply_monochromatic_tint
Claudeimage_apply_preset
Claudeimage_auto_straighten
Claudeimage_crop_and_resize
Claudeimage_crop_to_bounds
Claudeimage_fill_area
Claudeimage_generative_expand
Claudeimage_invert_selection
Claudeimage_list_presets
Claudeimage_remove_background
Claudeimage_select_by_prompt
Claudeimage_select_subject
Claudeimage_vectorize
Claudeimport-claude-design-from-url
Claudeimport-claude-motion-from-url
Claudemarkdown_to_pdf
Claudemedia_enhance_speech
Claudemedia_summarize
Claudepdf_combine
Claudepdf_compress
Claudepdf_create
Claudepdf_delete_pages
Claudepdf_edit_ui
Claudepdf_export
Claudepdf_highlight
Claudepdf_ocr
Claudepdf_operation_status
Claudepdf_page_organize
Claudepdf_properties
Claudepdf_redact
Claudepdf_reorder_pages
Claudepdf_rotate_pages
Claudepdf_split
Claudepdf_to_image
Claudepdf_to_markdown
Claudepdf_viewer
Claudeprepare_indd_merge_template
ClaudequickCutPoll
ClauderesizeVideoPoll
Claudesearch_design
Claudesuggest_type_palettes
ClaudesummarizePoll
ClaudevectorPollingHelper
Claudevideo_create_quick_cut
Claudevideo_metadata
Claudevideo_render
Claudevideo_render_frame
Claudevideo_resize
ClaudeCapabilities
Example Prompts
Click any prompt to copy it.
Links
App Stats
225
Tools
Claude
Platforms
Category
Create VisualsWorks with
Similar Apps
Data refreshed daily






