Editmamei Connect
Server Details
Hosted MCP server for AI photo editing: nothing to install, no desktop photo editor needed.
- Status
- Healthy
- Uptime
- 96.7% over 21 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 49 tools
There are many adjacent tools: add_adjustment/add_effect/apply_look/photo_effect/my_looks all manipulate filters or looks, batch/run_steps both sequence work, and layer/layer_mask/transform_layer all touch layers. The unusually detailed descriptions do draw clear boundaries, but with 49 tools an agent must read carefully to avoid misselection.
All names are lower_snake_case and readable, but the convention is mixed: verb_noun (open_photo, remove_object), bare nouns (layer, text), make_* composites (make_meme, make_story), and noun-like names (product_shot, photo_effect). This is usable but not predictable from one pattern.
49 tools is far above the typical 3-15 range and falls into the 'too many (25+)' category. The domain is broad, but the surface is heavy enough that selection burden and overlap risk are significant.
The surface covers the full photo-editing lifecycle: upload/open, inspection, non-destructive filters, layers/masks, selections and AI selection, geometry, text, retouching, AI object removal, export, checkpoints, batch processing, and social/product composites. No obvious dead ends or major missing CRUD/lifecycle operations stand out.
Available Tools
49 toolsadd_adjustmentAInspect
Add a non-destructive adjustment to a layer, or re-edit one in place with filter_id. It stays live and editable; nothing is baked into pixels until export_photo, and manage_filters op=delete removes it again. type picks the adjustment: curves, levels, exposure, brightness_contrast, hue_saturation, color_balance, color_temperature, shadows_highlights, saturation, vibrance, sharpen, noise_reduction, gaussian_blur. A field that belongs to another type is refused, naming this type's own fields. An adjustment applies to ONE layer (layer_id or layer, else the selected or top layer), not to the flattened photo: on a multi-layer photo, say which layer. For vibrance the knob is the vibrance field (saturation on that type is a separate plain multiplier that normally stays untouched). curves: ONE filter per channel, so add separate filters for red and blue rather than one for both; points are [input, output] pairs on a 0-255 scale, including the endpoints. hue_saturation and color_balance likewise carry ONE range per filter. A large hue shift (more than about 30) on a range that is mostly low-saturation pixels, such as a grey sky, posterizes into blotches and hard bands: shift those colors with color_balance or a small hue move instead. gaussian_blur: radius in pixels at full resolution; combine it with a saved-selection mask for soft-focus or background-blur effects. color_temperature runs the opposite way to what you might expect: raising to_kelvin WARMS the photo. A re-edit MERGES: any field you omit keeps its value, so re-editing {contrast: 50} on a brightness_contrast filter doesn't reset brightness. Only adjustments made by Editmamei can be re-edited; one made outside Editmamei is refused (delete it and re-create it). mask (a saved selection channel name) confines a NEW adjustment; it is fixed at creation and cannot change on a re-edit. ORDER MATTERS: straighten, flip and resize first, then crop, THEN add masked adjustments: rotate, flip and resize all refuse once a masked adjustment exists, or any filter made outside Editmamei. Check the stack afterward with manage_filters (op=list).
| Name | Required | Description | Default |
|---|---|---|---|
| hue | No | hue_saturation only. Degrees. Default (when creating): 0. | |
| mask | No | Name of a saved selection channel, confining a NEW filter to it. Only valid when creating (no filter_id) — a filter's mask is fixed at creation. ORDER MATTERS: straighten / flip / resize the canvas first (transform_image, resize), then crop, THEN add masked adjustments — rotate, flip, and resize all refuse outright once any masked adjustment filter exists on the image, or any filter not created by Editmamei (for example one added outside Connect), since they cannot keep a mask aligned through those transforms. Cropping afterward is always safe. | |
| name | No | Label for a new filter, e.g. "Lift shadows". Made unique automatically. | |
| type | Yes | Which adjustment to apply/re-edit. Each type maps to exactly one operation; see the per-field descriptions below for which fields apply to which type. | |
| gamma | No | levels only. Midtone gamma, 0.1..10 — >1 brightens midtones, <1 darkens. Default (when creating): 1.0. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. The filter applies to that ONE layer, not to the flattened image, so on a multi-layer document name the layer you mean. A layer inside a layer group can be named directly. | |
| range | No | hue_saturation: one of all/red/yellow/green/cyan/blue/magenta (default 'all'). color_balance: one of shadows/midtones/highlights (default 'midtones'). ONE range per filter: adjusting reds and blues, or shadows and highlights, takes one filter per range (the same rule as one curves filter per channel). Passing a value from the other type's set is rejected, naming the real allowed set for the `type` you gave. | |
| scale | No | saturation only. 1.0 = unchanged. Default (when creating): 1.0. | |
| amount | No | sharpen only. Unsharp-mask strength MULTIPLIER, not a percent: 0.5 is the default, 1.0 is strong, and values above ~3 are extreme. Default (when creating): 0.5. | |
| in_low | No | levels only. Input black point; must stay below in_high (an empty or inverted input range is refused). Default (when creating): 0. | |
| points | No | curves only. [input, output] pairs, 0-255 each, ascending input — include the endpoints, e.g. [[0,0],[64,90],[255,255]] lifts shadows. Required when creating (no filter_id); omitted on a re-edit keeps the existing curve. | |
| radius | No | shadows_highlights: spatial falloff radius, 0.1..1500 (default 100 when creating). sharpen: unsharp-mask std-dev, 0..1500 (default 3.0 when creating). gaussian_blur: blur radius (std-dev) in pixels at full resolution, 0..1500 (default 1.5 when creating). All three are SPATIAL (radius-scaled on the proxy preview, see overview). | |
| channel | No | curves/levels only. 'value' adjusts all channels together (tone); red/green/blue adjusts ONE channel (color) — a filter carries only one channel, so shifting color needs separate filters for red and blue. Default (when creating): value. Omitted on a re-edit keeps the existing filter's own channel. | |
| in_high | No | levels only. Input white point; must stay above in_low. Default (when creating): 255. | |
| out_low | No | levels only. Output black. Default (when creating): 0. | |
| shadows | No | shadows_highlights only. Default (when creating): 0. | |
| compress | No | shadows_highlights only. How far the shadows/highlights effect reaches toward the midtones: higher confines it to the darkest and brightest tones. Default (when creating): 50. | |
| contrast | No | brightness_contrast only. Default (when creating): 0. | |
| cyan_red | No | color_balance only. Default (when creating): 0. | |
| exposure | No | exposure only. Stops. Default (when creating): 0. | |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. | |
| out_high | No | levels only. Output white. Default (when creating): 255. | |
| strength | No | noise_reduction only. Neighbourhood size. Default (when creating): 4. | |
| vibrance | No | vibrance only. THE vibrance control — a vibrance adjustment must set this field, not `saturation` (a separate, plain multiplier for this type that normally stays at its default). The scale follows Photoshop's Vibrance: +10 to +30 is a natural boost, +50 a strong one; negative values desaturate. Unlike Photoshop's, it lifts already-saturated colors (a blue sky, a bright shirt) about as much as muted ones, so check those areas with a histogram above about +50. Default (when creating): 0. | |
| filter_id | No | Re-edit this existing filter IN PLACE instead of adding a new one (must match `type`'s operation). Any per-type field you omit keeps the value it already had — this is a MERGE, not a reset. The values manage_filters op=list reports for it are in these same field names and units, so they can be passed straight back. The mask is fixed at creation and cannot change on a re-edit. Only filters Editmamei created can be re-edited (manage_filters op=list shows source: "editmamei"); re-editing any other filter (for example one added outside Connect) is refused, because its current values cannot be read back exactly — delete it and re-create it instead. A re-edit keeps the filter on its own layer; `layer` and `layer_id` are ignored. | |
| lightness | No | hue_saturation only. Default (when creating): 0. | |
| threshold | No | sharpen only. Default (when creating): 0. | |
| to_kelvin | No | color_temperature only. The corrected target temperature. COUNTER-INTUITIVE DIRECTION: RAISING to_kelvin WARMS the image (it means "render as if shot under this light" — a higher assumed light temperature reads as a warmer correction). Example: from_kelvin 6500, to_kelvin 8000 renders WARMER, not cooler. Default (when creating): 6500. | |
| brightness | No | brightness_contrast only. Default (when creating): 0. | |
| highlights | No | shadows_highlights only. Default (when creating): 0. | |
| saturation | No | hue_saturation: -100..100 percent (default 0 when creating), the field that actually adjusts saturation for that type. vibrance: a SEPARATE, plain saturation multiplier layered on top of the vibrance field below — 1.0 = unchanged (default when creating), 0..10 scale. It is NOT the vibrance knob; normally leave it alone and use `vibrance` instead. The precise range is enforced for whichever `type` you gave. | |
| whitepoint | No | shadows_highlights only. Shifts the white point: positive brightens the top end, negative pulls it down. Default (when creating): 0. | |
| black_level | No | exposure only. Shadow black-point shift. Default (when creating): 0.0. | |
| from_kelvin | No | color_temperature only. The temperature the photo currently looks shot under. Default (when creating): 6500. | |
| yellow_blue | No | color_balance only. Default (when creating): 0. | |
| magenta_green | No | color_balance only. Default (when creating): 0. | |
| shadows_ccorrect | No | shadows_highlights only. Colour saturation kept in the lifted shadows (0 = none, 100 = full). Default (when creating): 100. | |
| highlights_ccorrect | No | shadows_highlights only. Colour saturation kept in the recovered highlights (0 = none, 100 = full). Default (when creating): 50. | |
| preserve_luminosity | No | color_balance only. Default (when creating): true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mask | No | |
| name | No | |
| type | No | |
| filter_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnly=false, destructive=false, idempotent=false) already signal a non-idempotent mutation; the description goes well beyond them by disclosing non-destructiveness, that nothing is baked until export_photo, the merge-on-re-edit behavior, the immutability of mask at creation, that only Editmamei-created filters can be re-edited, and the post-masked-adjustment lockout on transforms. It is consistent with destructiveHint=false. It does not, however, cover rate limits or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded sensibly (purpose, then type list, then targeting, then pitfalls, then re-edit, mask, ordering), which suits a 40-parameter tool. However, several sentences restate details already present in the schema (curves endpoints, one-range-per-filter, to_kelvin direction), so not every sentence earns its place independently of structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity mutation tool with 40 parameters and an output schema (so return values need no explanation), it covers layer scoping, type/field coupling, mask constraints, re-edit merge semantics, cross-type rejections, and ordering preconditions. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema only hints at: the vibrance-vs-saturation distinction, one filter per channel/range rules, the counter-intuitive to_kelvin direction, and the layer-targeting rule (layer_id beats layer). Some of this duplicates the per-field schema text, limiting the added value above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: 'Add a non-destructive adjustment to a layer, or re-edit one in place with filter_id.' It distinguishes the add-mode from the re-edit-mode and clearly separates itself from siblings like manage_filters (delete/list), apply_look and add_effect. An agent knows exactly what this tool does without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not routing: it tells the agent to use manage_filters op=delete to remove it, op=list to inspect the stack, and export_photo to bake. It gives ordering prerequisites (straighten/flip/resize, then crop, THEN masked adjustments) and specifies the alternative for a problematic hue shift (color_balance or a small hue move). Alternatives and exclusions are named, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_effectAInspect
Add a non-destructive effect to a layer, or re-edit one in place with filter_id: one of vignette, black_white, motion_blur, lens_blur, add_noise, drop_shadow, outline, outer_glow, surface_blur. It is the same live, editable, maskable mechanism as add_adjustment, on the SAME filter stack: manage_filters (op=list, set_visibility, delete) manages both. type picks the effect; a field that belongs to another effect is refused, naming this type's own fields. An effect applies to ONE layer (layer_id or layer, else the selected or top layer), not to the flattened photo. A re-edit MERGES: any field you omit keeps its value. Only effects made by Editmamei can be re-edited; one made outside Editmamei is refused (delete it and re-create it). mask (a saved selection channel name) confines a NEW effect; it is fixed at creation and cannot change on a re-edit. ORDER MATTERS: straighten, flip and resize first, then crop, THEN add masked effects: rotate, flip and resize all refuse once a masked filter exists, or any filter made outside Editmamei. vignette, motion_blur and drop_shadow stay locked to the content through flip, resize and an exact 90/180/270-degree rotation (their center, angle and offset fields update automatically, and manage_filters op=list shows the new values); rotating by any OTHER angle is refused while a vignette, a motion_blur or a drop_shadow with a non-zero offset is present, rather than letting it drift out of alignment. outline, outer_glow, surface_blur, lens_blur and a zero-offset drop_shadow have no direction, so they survive any rotation. Resizing scales their pixel sizes with the photo (never below the 1 px minimum of outline width, outer_glow radius and surface_blur radius). lens_blur is a uniform soft-focus blur, not a depth-of-field falloff. outline puts a solid stroke around a layer's transparent edge (meme text, sticker cut-outs), width 1 to 50 px; outer_glow adds a soft glow around it (glowing text), spread 0 to 50 px; surface_blur smooths skin and other texture while keeping hard edges. outline and outer_glow need a layer with transparency, and attach to a text layer without rasterizing it: the text stays editable and the effect follows each edit. For a plain blur use add_adjustment type=gaussian_blur. Check the stack afterward with manage_filters (op=list).
| Name | Required | Description | Default |
|---|---|---|---|
| mask | No | Name of a saved selection channel, confining a NEW filter to it. Only valid when creating (no filter_id) — a filter's mask is fixed at creation. ORDER MATTERS: straighten / flip / resize the canvas first (transform_image, resize), then crop, THEN add masked effects — rotate, flip, and resize all refuse outright once any masked filter exists on the image, or any filter not created by Editmamei, since they cannot keep a mask aligned through those transforms. Cropping afterward is always safe. | |
| name | No | Label for a new filter, e.g. "Corner darken". Made unique automatically. | |
| seed | No | add_noise only. RNG seed — the same seed reproduces the identical noise pattern (useful for an exact re-edit round trip). Default (when creating): 0. | |
| type | Yes | Which effect to create/re-edit — see the per-field descriptions below for which fields apply to which effect. | |
| alpha | No | add_noise only. Noise added to the alpha channel too. Default (when creating): 0. | |
| angle | No | motion_blur only. Direction of the streak, in degrees: 0 is horizontal, positive angles rotate clockwise (90 is vertical). Default (when creating): 0. | |
| color | No | outline and outer_glow only. "#rrggbb" hex. Default (when creating): "#000000" for outline, "#ffffff" for outer_glow. | |
| gamma | No | vignette only. Falloff curve shape: lower spreads the darkening further in toward the centre and deepens it; higher confines it to the corners and weakens it. Default (when creating): 2.0. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. The filter applies to that ONE layer, not to the flattened image, so on a multi-layer document name the layer you mean. A layer inside a layer group can be named directly. | |
| width | No | outline only. Stroke thickness in pixels at full resolution, 1..50. Default (when creating): 4. SPATIAL. The stroke grows outward from the layer's alpha edge (round corners) and the layer's own pixels are untouched. | |
| length | No | motion_blur only. Blur length in pixels at full resolution, 0..1000. Default (when creating): 10. SPATIAL (scaled on the proxy preview, see overview). | |
| radius | No | vignette: size of the untouched centre, 0..3, relative to the LAYER (not absolute pixels — the same value looks visually equivalent at any resolution, and consistent with center_x/center_y below). SMALLER is STRONGER. Default (when creating): 2.0, a subtle vignette (corners about a quarter darker, centre untouched). At the default softness and gamma, 1.5 is strong (corners more than half darker) and 1.2 or less turns the corners black. lens_blur: blur radius in pixels at full resolution, 0..150 (default 25 when creating) — capped much lower than the other two effects here (measured live: expensive at full resolution). drop_shadow: blur radius in pixels at full resolution, 0..1500 (default 10 when creating), clipped to the layer bounds rather than growing it. outer_glow: glow blur in pixels, 1..250 (default 20 when creating). surface_blur: smoothing radius in pixels, 1..6 (default 4 when creating) — capped low because its cost grows with the square of the radius (a 24 MP export takes ~17 s at 6). lens_blur, drop_shadow, outer_glow and surface_blur are SPATIAL (radius-scaled on the proxy preview, see overview). The precise range is enforced for whichever `type` you gave. | |
| spread | No | outer_glow only. Pixels the glow's solid core grows past the alpha edge before it blurs, 0..50. Default (when creating): 4. SPATIAL. | |
| opacity | No | drop_shadow: default (when creating) 0.5. The shadow color is black and not configurable yet. outer_glow: default 0.75 (its color is the `color` field). | |
| center_x | No | vignette only. Vignette center, as a fraction of the LAYER's own width (not the whole canvas — 0 = left edge, 1 = right edge). Default (when creating): 0.5. Cropping re-centres the vignette on the new, smaller frame (the same fraction now means a different point) — the intended behaviour, like a post-crop vignette in Lightroom, not something to correct for. | |
| center_y | No | vignette only. Vignette center, as a fraction of the LAYER's own height (not the whole canvas — 0 = top edge, 1 = bottom edge). Default (when creating): 0.5. The vignette color is black and not configurable yet. | |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. | |
| offset_x | No | drop_shadow only. Horizontal shadow offset in pixels at full resolution. Default (when creating): 20. SPATIAL (scaled on the proxy preview, see overview). Only meaningful on a layer with an alpha channel — a shadow is cast from what is transparent around the opaque content. | |
| offset_y | No | drop_shadow only. Vertical shadow offset in pixels at full resolution. Default (when creating): 20. SPATIAL (scaled on the proxy preview, see overview). | |
| softness | No | vignette only. How gradual the falloff is; 0 is a hard edge. Default (when creating): 1.0. | |
| filter_id | No | Re-edit this existing filter IN PLACE instead of adding a new one (must match `type`'s operation). Any per-effect field you omit keeps the value it already had — this is a MERGE, not a reset. The values manage_filters op=list reports for it are in these same field names and units, so they can be passed straight back. The mask is fixed at creation and cannot change on a re-edit. Only filters Editmamei created can be re-edited (manage_filters op=list shows source: "editmamei"); re-editing any other filter (for example one added outside Connect) is refused, because its current values cannot be read back exactly — delete it and re-create it instead. A re-edit keeps the filter on its own layer; `layer` and `layer_id` are ignored. | |
| red_weight | No | black_white only. How much the red channel contributes to the resulting gray. Default (when creating): 0.333. | |
| blue_weight | No | black_white only. Default (when creating): 0.333. | |
| green_weight | No | black_white only. Default (when creating): 0.333. | |
| noise_amount | No | add_noise only. THE amount control — sets red/green/blue uniformly (grayscale-leaning noise, not a color-tinted one). Default (when creating): 0.2. | |
| highlight_factor | No | lens_blur only. Boosts bright out-of-focus highlights (bokeh) above this threshold. Default (when creating): 0 (no boost). lens_blur applies uniformly across the whole layer (a soft-focus effect), not a depth-of-field falloff — mask it (see `mask`) to confine it to part of the image instead. | |
| edge_preservation | No | surface_blur only. How much edge contrast survives, 0..1: LOWER smooths harder (near 0 starts to soften the edges too), HIGHER leaves more detail and noise. Default (when creating): 0.08, which flattens fine noise and skin texture while keeping hard edges sharp. | |
| preserve_luminosity | No | black_white only. Default (when creating): false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mask | No | |
| name | No | |
| type | No | |
| filter_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a generic write profile (readOnly=false, idempotent=false, destructive=false, openWorld=true). The description adds substantial behavior the annotations cannot: re-edit is a MERGE that preserves omitted fields, masks are frozen at creation, external filters are refused and must be deleted and recreated, transform tools refuse once a masked filter exists, and specific effects stay locked or auto-update their center/angle/offset under rotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core create-vs-re-edit distinction and the sibling alternative are front-loaded in the first sentence, which is the right priority. The body is long and partially duplicates schema text (mask, filter_id, ordering), but for a 29-parameter tool with heavy cross-effect interactions most sentences carry distinct constraints rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Given the tool's complexity, the description still covers everything an agent needs before calling: mode selection, effect semantics, spatial vs relative units, ordering hazards, refusal conditions, masking limits, and the verification step with manage_filters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the per-field baseline is 3, but the description adds cross-parameter semantics the schema does not carry: 'type picks the effect; a field that belongs to another effect is refused', the layer-vs-flattened targeting rule, and the mapping of each effect to its controlling fields. It does not need to restate ranges, which are already exhaustively in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence states a specific verb and resource ('Add a non-destructive effect to a layer'), plus the alternate mode ('re-edit one in place with filter_id') and enumerates the exact effect types. It explicitly positions itself against siblings ('the same live, editable, maskable mechanism as add_adjustment', 'For a plain blur use add_adjustment type=gaussian_blur'), so an agent can separate it from add_adjustment, manage_filters and photo_effect without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names concrete alternatives with the condition that selects them (plain blur -> add_adjustment type=gaussian_blur; stack management -> manage_filters op=list/set_visibility/delete). It also spells out when-not and sequencing constraints: order of straighten/flip/resize then crop then masked effects, the refusal conditions, and the delete-and-recreate path for non-Editmamei effects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_lookAIdempotentInspect
Give a photo a named look (cinematic, noir, black and white...) in one call. You pick the look and how strong; the server applies it as live, editable filters, so the same look at the same strength always gives the same result. Applying a look again replaces the earlier one (it never stacks), so "less of it" is the same call at a lower strength; strength 0 removes it. Looks: cinematic (Teal shadows, warm highlights, softened blacks and a darkened frame, like a film still.) noir (Dark, contrasty black and white with a heavy vignette and a little grain.) bleach_bypass (Drained color and hard contrast with a cool cast, gritty like a war film.) bw_classic (Balanced black and white with gentle contrast.) bw_high_key (Bright, airy black and white with lifted blacks and low contrast.) bw_red_filter (Black and white that darkens blue skies and brightens warm tones, as a red lens filter does.) warm_social (Warmer light, livelier color and open shadows; a friendly look for social posts.) vintage_fade (Faded blacks and whites, muted color, warm highlights, grain and a soft vignette, like an old print.) deep_fry (The over-processed meme look: saturation blown out, crushed contrast, a hot red-orange cast, heavy noise and hard sharpening. Add jpeg_crush for the blocky artifacts of a much-reposted JPEG.) On an image with more than one layer, say which layer with "layer". Offer these to people who describe an outcome instead of naming adjustments. It makes no file (unless jpeg_crush): call export_photo afterwards for a download link.
| Name | Required | Description | Default |
|---|---|---|---|
| look | Yes | Which look. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name; required when the image has more than one layer. | |
| strength | No | How much, 0 to 100. | |
| jpeg_crush | No | Also export the result as a JPEG at quality 10 (heavy blocky artifacts, the authentic deep-fried finish) and return the download link. Works with any look. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (non-read-only, idempotent, non-destructive), and the description adds substantial behavior beyond them: looks are live/editable filters, re-application replaces rather than stacks, strength 0 removes the effect, determinism of same-look-same-strength, and that no file is produced except under jpeg_crush. This is unusually rich disclosure for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, replacement semantics, then the look catalog, then the export caveat — a sensible order. It is long and the look glosses are dense, but nearly every clause is load-bearing given how sparse the schema's enum description is; only minor trimming is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining what the call yields (editable filters, no file) and that jpeg_crush returns a download link, plus pointing to export_photo for retrieval. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the schema itself is thin (look is merely "Which look."), so the description carries real semantic load: it enumerates and explains all nine looks, defines strength as intensity with 0 meaning removal, and reiterates the layer requirement. That is meaning well beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Give a photo a named look") with a concrete outcome (named presets, adjustable strength) that clearly separates it from generic siblings like add_adjustment, add_effect, and manage_filters. An agent can identify the tool's job without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing guidance ("Offer these to people who describe an outcome instead of naming adjustments"), the layer precondition for multi-layer images, the repeat-call semantics ("replaces the earlier one, it never stacks; strength 0 removes it"), and the required follow-up with export_photo for a download. When-to-use and downstream dependency are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bakeADestructiveIdempotentInspect
Bake a layer's live filters into its own pixels without merging it into anything: the layer survives as itself, just with no more editable filters; a text layer stays a text layer (baking never rasterizes one). A masked filter's confinement survives the bake exactly. Defaults to the selected layer, or the topmost layer if none is selected. Baking clears the masked-filter refusal of canvas_size, resize and transform_image: it is the way to make a masked adjustment safe to resize, rotate or flip around. all: true bakes every ordinary layer with a live filter at once; a group layer is always skipped, even one that carries its own filter, and is reported under skipped_groups_with_filters. Targeting a group directly (layer / layer_id) is refused. IRREVERSIBLE in this session: there is no undo, so make a checkpoint first when in doubt.
| Name | Required | Description | Default |
|---|---|---|---|
| all | No | Bake every layer on the image that has any live filter, instead of just one. A group layer is always skipped even when it carries its own filter (filters on a group item cannot be merged) — any such group is reported under skipped_groups_with_filters rather than silently ignored. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. Ignored when layer_id or all is given. | |
| layer_id | No | Canonical layer id. Takes priority over `layer`. Ignored when `all` is given. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| baked | No | |
| layer_id | No | |
| baked_layers | No | |
| skipped_groups_with_filters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/idempotent, but the description adds substantial beyond-the-annotation context: irreversibility with no session undo, that text layers are not rasterized, that group layers are skipped and reported under skipped_groups_with_filters, and that targeting a group is refused. These are exactly the behavioral traits an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core effect and survival guarantee, then layers in defaults, batch behavior, and the undo warning. It is long, but nearly every clause carries distinct operational information; a slight trim of the repeated group-skip note (stated in both description and schema) would tighten it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still proactively names skipped_groups_with_filters. Combined with the destructive/irreversibility disclosure, an agent has everything needed to call this correctly on a 4-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters; baseline is 3. The description nonetheless adds real meaning over the schema: it explains the group-skip/reporting semantics of `all`, and the refusal when targeting a group via layer/layer_id, which the schema does not state as a hard rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('bake') and resource ('a layer's live filters into its own pixels'), and immediately disambiguates from merging siblings by clarifying the layer survives as itself. It even distinguishes the outcome for text layers, so an agent can tell it apart from add_effect/apply_look/manage_filters without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context (make a masked adjustment safe to resize/rotate/flip), the default target (selected layer, else topmost), the batch mode (all: true), and the recommended precaution (run `checkpoint` first). It also names the prior refusal from canvas_size/resize/transform_image, routing the agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batchAInspect
Run ONE preset over several photos in one call: apply_look, crop_for_platform, product_shot, make_story, make_sticker, recolor, my_looks (applies one of your saved looks, args {name}), with the same arguments for each. Give sources (1 to 10 upload handles like "upload:abc123" from request_upload, one link can carry several photos, or https:// image URLs), preset, and args: that preset's arguments without image (e.g. {marketplace: "etsy_square"} for product_shot). Each photo is opened, processed, its download link(s) collected, and closed; one image is open at a time. A photo that fails (an address that can't be fetched included) is reported and the batch goes on. A look is exported as a JPEG after it is applied. If the time budget can't fit another photo it stops and returns remaining (the sources not yet done): call again with those. Credits are charged as for the single calls (AI selection included). Only presets you can call yourself can be batched.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | The preset's arguments, without `image`. | |
| preset | Yes | Which preset to run on every photo. | |
| sources | Yes | 1 to 10 photos: "upload:<id>" handles or https:// image URLs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: sequential one-image-at-a-time processing, per-photo failure isolation, JPEG export for looks, time-budget truncation returning `remaining`, and credit charging. Annotations only supply the generic safety/idempotency flags; the description supplies the operational reality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense but front-loaded paragraph that puts purpose first and then handles sources, args, edge cases, and cost. Every sentence carries information, though the single-block format makes some details (failure handling, remaining) slightly harder to scan than bullet-style would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains what comes back (collected download links, `remaining`) and how errors surface. For a non-idempotent, open-world mutation tool, everything an agent needs to invoke and re-invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds genuine meaning: that `sources` accepts 'upload:<id>' handles or https URLs and that one link can carry several photos, and that `args` is the preset's arguments minus `image`, with a concrete example ({marketplace: "etsy_square"}).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Run ONE preset over several photos in one call,' then enumerates the exact preset names it can batch. An agent can distinguish this from the single-photo sibling presets (apply_look, product_shot, etc.) purely from the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it (several photos, same arguments), the constraint that opens the door ('Only presets you can call yourself can be batched'), and the continuation path when the time budget is exhausted ('call again with those'). Also implies the single-call alternative by tying costs back to 'the single calls'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
canvas_sizeADestructiveInspect
Extend the canvas: grow it and reposition the existing content within the larger frame. It never shrinks (use crop for that): REFUSED when either dimension would be smaller than the current one, and when neither dimension actually grows. Choose where the existing content lands with anchor (a 3x3 grid, default 'center') or explicit offset_x / offset_y; give one or the other, not both. fill sets a solid backdrop layer under the WHOLE canvas: white, black, a '#rrggbb' hex color (rendered as luminance on a grayscale photo), or transparent (the default, which adds no backdrop layer at all; see the field description for what that means at export time). IRREVERSIBLE in this session: there is no undo, so make a checkpoint first when in doubt. REFUSES when the photo has a masked filter, or any filter made outside Editmamei, AND the existing content actually moves (offset_x / offset_y not both 0; a top-left anchor never moves anything): extend the canvas before adding masked filters, not after, because a filter's mask does not travel with the layer it confines when the canvas repositions it. An unmasked effect (a vignette and friends) is unaffected. On this server the new canvas must stay within the workspace's pixel limit (less at a higher bit depth).
| Name | Required | Description | Default |
|---|---|---|---|
| fill | No | 'white', 'black', a '#rrggbb' hex color, or 'transparent' (default — no fill layer is added at all; see the note on export_photo/flatten below). Any other choice is painted onto a new, full-canvas layer inserted at the BOTTOM of the whole stack — a solid backdrop behind every existing layer, not just the newly added area, so it also shows through any pre-existing transparency in those layers. On a GRAYSCALE image a hex color renders as its LUMINANCE (a weighted gray, not one channel picked out). transparent: genuinely transparent only in a live, layered document — export_photo and layer op=flatten both flatten first, which fills any transparent area with the ambient background color (white, unchanged by this tool) and drops alpha, not with transparency. A non-transparent fill on an INDEXED image is REFUSED outright, before the canvas resizes at all — indexed has no backdrop layer type to add. | transparent |
| image | Yes | Image id, as returned by open_photo. | |
| width | Yes | New canvas width, in pixels. Must be at least the current width, and at least one of width/height must actually be LARGER than the current size (both equal to the current size is refused — there is nothing to extend). | |
| anchor | No | Where the existing content sits within the new, larger canvas — a 3x3 grid. Defaults to 'center' when neither this nor offset_x/offset_y is given. Mutually exclusive with offset_x/offset_y. | |
| height | Yes | New canvas height, in pixels. Must be at least the current height. See width. | |
| offset_x | No | Explicit horizontal offset (document pixels) for the existing content's left edge in the new canvas, instead of an anchor — must be between 0 and (new width - current width). Requires offset_y too; mutually exclusive with anchor. | |
| offset_y | No | Explicit vertical offset for the existing content's top edge, instead of an anchor — must be between 0 and (new height - current height). Requires offset_x too; mutually exclusive with anchor. |
Output Schema
| Name | Required | Description |
|---|---|---|
| width | No | |
| height | No | |
| offset_x | No | |
| offset_y | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and idempotent=false, but the description goes well beyond them: no undo in this session, refusal on masked/foreign filters, workspace pixel limits at higher bit depths, and the filter-mask-doesn't-travel caveat. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and constraint-first ordering, and most sentences carry non-obvious refusal/caveat information. It is dense and slightly repetitive of the schema's fill wording, but little is genuinely wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't explain returns, and it covers everything else an agent needs: refusal triggers, irreversibility, anchor/offset exclusivity, fill layering, and ordering relative to filters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the field descriptions are themselves detailed (fill semantics, mutual exclusivity, offset bounds). The description restates rather than extends: 'give one or the other, not both' and the anchor grid are already in the schema, and the long fill parenthetical duplicates the field description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Extend the canvas: grow it and reposition the existing content') and immediately disambiguates from the sibling `crop` since it 'never shrinks'. An agent can tell exactly what this does without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes shrinking to `crop`, tells the agent to run `checkpoint` first when in doubt, and gives the ordering rule (extend the canvas before adding masked filters, not after). Refusal conditions (no growth, masked filters with content movement) are spelled out as when-not-to-constraints.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_listingARead-onlyIdempotentInspect
Check whether a photo is ready to list on a marketplace, without changing it. Renders the composite and measures: pixel size and aspect ratio against the marketplace's, how much of the border is pure white (required for amazon, reported for the others), how much of the frame the product fills (about 85% is the guidance) and whether it touches the frame edge. Each check returns rule, pass, measured, required and fix (the call that fixes it, usually product_shot with that marketplace). Marketplaces: amazon (2000x2000), etsy_square (2000x2000), etsy_landscape (2700x2025), shopify (2048x2048), ebay (1600x1600).
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| marketplace | Yes | Which marketplace to check against. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond that: it renders a composite, enumerates exactly what is measured (pixel size, aspect ratio, border whiteness, product fill ~85%, edge touching), and describes the return structure. This is rich, non-redundant disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then return shape, then the marketplace table. Dense and mostly earning its place, though the marketplace enumeration is lengthy and could be slightly compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description explains the return fields (rule, pass, measured, required, fix) and the marketplace-specific targets, so an agent has everything needed to interpret results and act on them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a marketplace enum, so baseline is 3, but the description adds real meaning: the required pixel dimensions per marketplace (amazon 2000x2000, etsy_landscape 2700x2025, etc.), which is not in the schema. The image param is not elaborated, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('check whether a photo is ready to list on a marketplace') and immediately scopes it as non-mutating ('without changing it'). This clearly distinguishes it from siblings like product_shot or export_photo that act on the image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Frames the tool as a pre-listing validation step and explicitly routes to the fix path ('usually product_shot with that marketplace'). No explicit when-not or exclusion, but the usage context and alternative are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checkpointADestructiveInspect
Checkpoints stand in for undo, which this session does not have. op=create saves the photo's CURRENT state, every live filter included, and returns a checkpoint_id. op=restore reopens that snapshot as a NEW image and closes the old one (replace, not copy): the old image id stops working once the close succeeds; if the close fails the result says close_failed: true, the old image stays open and both ids are valid. The result names the new id, e.g. "image N closed; restored as image M — use M from now on". A checkpoint (up to 100 MB; a larger one is said to be kept for this session only) is kept for 24 hours after it is made, whatever happens meanwhile: a crash, the server pausing or restarting, or your assistant reconnecting. One made in an earlier session is restored by its checkpoint_id as a NEW image and closes nothing (close the photo it replaces yourself), and op=list shows it as kept from an earlier session. op=list reports checkpoint_id, the image it belongs to, created_at and size in bytes, plus open: false for a checkpoint whose photo has since closed (still restorable) and pending: true while a create is still in flight. op=delete removes one. An unknown checkpoint_id on restore or delete is refused, naming every id that IS known. op=restore also returns the reopened image's base_type, precision and layers, like open_photo. Each photo holds at most 5 checkpoints (a 6th op=create REFUSES rather than silently evicting the oldest: delete one first) and at most 20 are kept in total across photos, since each takes disk space until deleted. This server also caps checkpoint disk use at 1024.0 MiB per session and 1024.0 MiB across all your sessions; op=create is refused at or above either, so free room with op=delete first.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | 'create' exports the image's current state — every live filter included — to a disk-backed snapshot and returns a checkpoint_id. 'restore' reopens that snapshot as a NEW image and closes the old one (replace semantics, not a copy: the old image id stops working once the close succeeds — see 'close_failed' below for when it doesn't). 'list' reports every checkpoint (optionally scoped to one image): checkpoint_id, the image it currently belongs to (open: false if that image is confirmed gone — still restorable; pending: true while still being created), created_at, bytes — never a file path. 'delete' removes one, freeing its slot. | |
| image | No | Image id, as returned by open_photo. Required for create. Optional for list (omit to list checkpoints for every image). | |
| checkpoint_id | No | Required for restore / delete. The id create (or a prior list) reported for this checkpoint. |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | No | |
| image | No | |
| width | No | |
| height | No | |
| layers | No | |
| deleted | No | |
| base_type | No | |
| old_image | No | |
| precision | No | |
| created_at | No | |
| checkpoints | No | |
| close_failed | No | |
| checkpoint_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only signal destructive/non-idempotent/non-readonly. The description goes far beyond: 24-hour retention surviving crashes/restarts/reconnects, per-photo cap of 5 (6th refused, not evicted), 20 total cap, per-session and cross-session 1024 MiB disk caps, replace-not-copy restore semantics with close_failed handling, unknown-id refusal that names known ids, and open/pending list states. This is exemplary disclosure of edge cases and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the undo-substitute framing and organized by op, with each sentence carrying operational weight for a genuinely complex tool. It is dense and run as one long block, which slightly hurts scanability, but there is little filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return values, yet it explains retention windows, quota limits, restore replace semantics, and failure cases thoroughly. Nothing an agent needs to invoke checkpoint operations correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters (baseline 3). The description adds value on top: it clarifies restore's close-on-success/close_failed behavior, list's reported fields and open/pending flags, and that unknown ids are refused with known ids listed, going beyond the enum text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb for each operation (create saves current state, restore reopens as NEW image, list reports, delete removes) and frames the tool's role as standing in for undo. An agent can distinguish it from siblings like bake or export_photo without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly explains when each op applies (create to snapshot, restore to roll back, list to enumerate, delete to free slots) and the 'undo substitute' framing gives clear context. However it does not explicitly contrast this tool with alternative rollback/serialization siblings such as bake or export_photo, so no explicit exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_photoADestructiveInspect
Close a photo WITHOUT saving it. If the work should be kept, export it first with export_photo (format psd keeps the layers).
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. |
Output Schema
| Name | Required | Description |
|---|---|---|
| closed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true and readOnlyHint=false, so the safety profile is known; the description goes further by spelling out the specific loss ('WITHOUT saving it') and prescribing a data-preserving workaround. It stops short of stating irreversibility/undo availability, so it is strong rather than complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the destructive consequence before the recommended alternative. Every clause earns its place, including the parenthetical about psd preserving layers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the destructive nature, the alternative route, and the format nuance; return values are handled by the existing output schema. What remains unstated is failure behavior (e.g., invalid or already-closed image id), a minor gap for a single-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, with the schema itself explaining 'Image id, as returned by open_photo'. The description adds no additional meaning about the identifier, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('close a photo') and immediately qualifies the scope with 'WITHOUT saving it', which is the key differentiator. It also names the sibling that handles the opposite need (export_photo), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to reach for another tool: 'If the work should be kept, export it first with export_photo'. That is a concrete alternative plus the condition that selects it, and it even names the format (psd) that preserves layers.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compareARead-onlyIdempotentInspect
Compare before and after, or two regions. mode='before_after': the photo without its filters against the photo with them, whole or in a region, as per-channel mean and percentile changes, optionally with paired before/after preview images (include_previews). mode='regions': statistics for two named rectangles (region_a, region_b) on the current, filtered photo.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | 'before_after': proxy base (no filters) vs proxy+filters, whole-image or `region` — per-channel stat deltas. 'regions': two rects on the SAME (filtered) image, stats for each, no delta (compare them yourself). | |
| image | Yes | Image id, as returned by open_photo. | |
| max_px | No | before_after only. Long-edge cap for the proxy render, in pixels. | |
| region | No | before_after only. Restricts the comparison to this rectangle; default whole image. | |
| channels | No | Default: all four. | |
| region_a | No | regions only. First rectangle. | |
| region_b | No | regions only. Second rectangle. | |
| include_previews | No | before_after only. Also return paired before/after preview images (subject to privacy.send_previews_to_llm, same as preview). |
Output Schema
| Name | Required | Description |
|---|---|---|
| after | No | |
| delta | No | |
| proxy | No | |
| before | No | |
| region_a | No | |
| region_b | No | |
| unmirrored_filters | No | before_after only. Names of live filters that could not be re-attached on the "after" proxy render — the delta above is missing that filter's effect entirely. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the bar is lower. The description adds real behavioral context beyond them: the before/after proxy semantics, that 'regions' returns per-rectangle stats without a delta, and that preview output is gated by privacy.send_previews_to_llm. It still says nothing about cost or size of the proxy computation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with the core purpose front-loaded before the mode breakdown, and no filler. The second sentence is dense with parenthetical asides, but each clause carries information the schema alone doesn't convey, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with an output schema (so return values need not be explained here), the description covers both modes, their applicable parameters, and the preview privacy dependency. The only minor gap is timing/cost expectations for proxy rendering, which is not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents mode semantics, mode-scoping of region/region_a/region_b/include_previews, and defaults. The description restates mode semantics in prose and clarifies the before/after meaning, but adds little syntax or constraint detail beyond what the schema fields already say. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Compare before and after, or two regions') and then defines the two modes precisely, including what 'before' and 'after' mean (photo without filters vs with them). It does not, however, distinguish itself from nearby read tools such as get_histogram, inspect, or preview, so an agent gets the tool's own scope but no sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mode breakdown effectively tells the agent which variant to pick: 'before_after' for measuring filter effects, 'regions' for two rectangles on the same filtered image with the explicit instruction 'no delta (compare them yourself)'. It gives no exclusions or pointers to alternative tools, but the context for each mode is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convert_modeADestructiveIdempotentInspect
Convert the photo's base color mode, rgb <-> grayscale; an indexed photo is refused outright as a source. Converting to grayscale permanently discards color; converting a grayscale photo to rgb does not restore it. A no-op when the photo is already in the requested mode (reported as converted: false, nothing else changes; this is checked BEFORE the refusal below, so a no-op call never fails just because a filter is present). Otherwise REFUSES outright while the photo has ANY live filter, since a color-dependent filter (curves on the red channel, hue_saturation, a vignette color...) could change meaning across the mode change: bake it first (bake) or delete it (manage_filters op=delete), then convert. IRREVERSIBLE in this session: there is no undo, so make a checkpoint first when in doubt.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Target base color mode. An indexed source image is refused outright. | |
| image | Yes | Image id, as returned by open_photo. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| converted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/irreversible and idempotent, but the description goes well beyond them: it explains that grayscale permanently discards color, that grayscale-to-rgb does not restore it, that indexed sources are refused, that live filters block conversion, and that the no-op check precedes the refusal. This is unusually rich behavioral disclosure for a destructive mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, with constraints and alternatives following in a logical order. It is dense and parenthetical-heavy, but nearly every clause carries actionable information, so the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema covering the return shape, the description supplies everything an agent needs: refusal conditions, irreversible effects, ordering of the no-op check, and remediation paths. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented; the enum on mode and the image id note carry the structured meaning. The description reinforces the indexed-source refusal and conversion direction but adds little syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (convert the photo's base color mode) with explicit directionality (rgb <-> grayscale) and scoping (indexed refused as source). An agent can distinguish this from siblings like recolor, apply_look, or manage_filters without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and routing: bake or manage_filters op=delete the live filter first, or the call REFUSES; a checkpoint is recommended when in doubt. It also clarifies ordering around the no-op case, so the agent knows exactly when a call will succeed, fail, or be a no-op.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cropADestructiveInspect
Crop the canvas to an explicit rectangle (left, top, width, height in photo pixels). This is not a scale (use resize). IRREVERSIBLE in this session: there is no undo, so make a checkpoint first when in doubt. Every live filter, mask channel and the filter record survive a crop; it is the one geometry change that never refuses because of masked filters.
| Name | Required | Description | Default |
|---|---|---|---|
| top | Yes | Top edge of the new canvas, in document pixels. | |
| left | Yes | Left edge of the new canvas, in document pixels. | |
| image | Yes | Image id, as returned by open_photo. | |
| width | Yes | New canvas width, in pixels. | |
| height | Yes | New canvas height, in pixels. |
Output Schema
| Name | Required | Description |
|---|---|---|
| width | No | |
| height | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description goes well beyond them: it declares there is no undo in this session, prescribes checkpointing first, and explains that live filters, mask channels and the filter record survive the crop. The note that this is 'the one geometry change that never refuses because of masked filters' is distinctive behavioral context an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tightly packed sentences, each front-loaded with its key fact: what to crop, what it is not, that it is irreversible, and what it preserves. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values need not be described, and the mutations' side effects are fully covered. Given the destructive annotation, the coverage of irreversibility, preservation semantics and the checkpoint recommendation makes the definition complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented with their units and the width/height minimum of 1. The description only clarifies that the values are in photo pixels (schema says document pixels), which is a marginal addition. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (crop) and resource (canvas) and enumerates the exact geometry parameters, distinguishing it from scaling: 'This is not a scale (use `resize`)'. An agent can tell this apart from `resize` and `crop_for_platform` without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly ('use `resize`') and gives a concrete when-to-use rule ('make a `checkpoint` first when in doubt'). Both the excluded case and the recommended preceding action are spelled out, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
crop_for_platformADestructiveInspect
Crop a photo for a platform and get the finished JPEG in one call. The server crops to the format's shape, centred on the main subject when it can find one (or the middle), scales DOWN to the format's size (never up), and exports a download link. It takes a checkpoint first and puts the image back if anything fails. Formats: instagram_square (1080x1080), instagram_portrait (1080x1350), story_reel (1080x1920), youtube_thumbnail (1280x720), pinterest_pin (1000x1500), link_preview (1200x630), x_post (1600x900), cinema_wide (2.39:1, crop only). For story_reel the result says where to keep key content.
| Name | Required | Description | Default |
|---|---|---|---|
| focus | No | What to centre the crop on. Default: the subject when the subject finder is available, else the center. | |
| image | Yes | Image id, as returned by open_photo. | |
| format | Yes | Which format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, idempotentHint=false and openWorldHint=true, and the description goes well beyond them: it explains subject-centred cropping with centre fallback, down-only scaling (never upscaling), a pre-emptive checkpoint with rollback on failure, and export of a download link. This is exactly the extra context needed for a destructive, non-idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and outcome, then behaviour, then formats. The format enumeration is long but each entry carries loader-relevant data (dimensions), so it earns its space; the story_reel note is a minor tack-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does most of the work on returns, mentioning the download link and the story_reel key-content hint. A little more on the actual response shape or size of the exported file would make it fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the 3 baseline applies, but the description adds real meaning the schema lacks: concrete output dimensions per enum value and the note that cinema_wide is crop-only. It also explains the `focus` default logic in prose matching the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (crop), resource (photo), and purpose (for a platform), plus the distinguishing outcome: a finished JPEG in one call. This separates it from the generic `crop` and `export_photo` siblings without requiring the schema to be opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is heavily implied by the platform format list and the 'in one call' framing, which hints at the multi-step crop/resize/export alternative. However, it never names the direct sibling alternatives (`crop`, `resize`, `export_photo`) or states when NOT to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_photoAInspect
Write the finished photo: every live filter is baked in and ALL metadata (EXIF, XMP, IPTC, GPS, thumbnail) is stripped. jpg, png, webp and tiff are flattened. psd keeps the layers (masks, opacity, blend modes, groups) for finishing in Photoshop or another editor: text becomes pixels, a group carrying its own filter is merged into one layer, and the result lists layers that may blend slightly differently in Photoshop. A PSD is large (about 50 MB per full-size layer on a 24 MP photo), and a download here is capped at 100 MiB. It is for finishing elsewhere: open_photo does not take a PSD. Returns a download_url (valid 24 hours) plus a preview of what was exported. The link is for the user, and also downloads with a plain GET (e.g. curl -sS -o <dest> <download_url>). Transparency is flattened onto white unless keep_alpha is true (png or webp only), which keeps it, e.g. for a cut-out.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| format | No | Output format. | jpg |
| quality | No | JPEG/WebP quality, 1-100 (higher = better/larger). Ignored for png/tiff. WebP itself accepts 0 too, but JPEG's own bound is 1-100, so this schema uses the tighter bound. | |
| filename | No | Optional name for the downloaded file, e.g. "harbour-warm". The extension is added for you; anything but letters, digits, dot, dash and underscore is replaced. | |
| lossless | No | WebP only: lossless encoding. Ignored for other formats. | |
| bit_depth | No | PNG/TIFF/PSD only: output bit depth. JPEG/WebP are always 8-bit. | |
| keep_alpha | No | PNG/WebP only: keep transparency. The visible layers are merged onto a transparent canvas, so areas no layer covers (a cut-out, say) stay transparent. Default false flattens onto white. Refused for JPEG and TIFF. | |
| png_compression | No | PNG only: compression level, 0 (fastest, largest) to 9 (slowest, smallest). The default is lower than the maximum because level 9 is far slower for negligible size gain on a typical photo. Ignored for other formats. | |
| tiff_compression | No | TIFF only: compression scheme (lzw and adobe_deflate are lossless; jpeg is lossy). Ignored for other formats. | none |
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | No | |
| width | No | |
| format | No | |
| height | No | |
| layers | No | psd only: layers in the file, groups included. |
| filename | No | |
| expires_at | No | |
| download_url | No | |
| merged_groups | No | psd only: groups merged into one layer to keep their filter. |
| rasterized_text | No | psd only: text layers written as pixels. |
| may_blend_differently | No | psd only: visible layers below 100% opacity or with a blend mode, which Photoshop may render slightly differently. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: filters are baked in, ALL metadata (EXIF/XMP/IPTC/GPS/thumbnail) is stripped, PSD layer-merge quirks are disclosed, approximate PSD size per layer and the 100 MiB download cap are stated, the download_url lifetime is 24 hours, and transparency defaults to white unless keep_alpha is set. This is exactly the kind of destructive/behavioral detail an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and format split, and every clause carries real information. It is dense and runs long in places (the PSD layer-merge sentence), but there is little padding to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter export tool with an output schema, the description supplies the missing operational context: format-specific flattening, size/download limits, link lifetime, and how to fetch the artifact. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The prose reinforces rather than extends it — keep_alpha's white-flattening and lossless/bit-depth restrictions largely duplicate the schema, though the explicit 'a download here is capped at 100 MiB' constraint adds a useful non-parameter bound.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (write the finished photo) and immediately qualifies it by format: jpg/png/webp/tiff flattened, psd keeping layers. It distinguishes itself from open_photo and tells the agent exactly which artifact each format produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context ('for finishing elsewhere') and names the sibling relationship (open_photo does not take a PSD), plus how the returned link is consumed. It stops short of stating when to prefer this over other output-path siblings such as bake or share_edit, so it is a strong 4 rather than a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fillAInspect
Add a NEW layer, canvas-sized, filled with a solid colour (op solid), a linear gradient (start to end) or a radial gradient (centre and radius) through 2-8 colour stops. The layer goes directly above the target layer (inside its group), with the blend mode and opacity you give; mode color tints without touching lightness, the usual choice for recolouring. Pass mask (a channel name) to confine the fill to that channel: it becomes the layer mask. Gradients blend in sRGB, are not dithered, and use photo pixels for every point. The current selection is kept and does not clip the fill. Do NOT use for painting strokes or touching up pixels; use retouch for that. Returns layer_id, layer_name, op, mode, opacity and masked. On this server the new layer is canvas-sized, so it counts toward a photo's layers together staying within its layer limit, each counted at the canvas size (or the largest layer size used in the photo, if bigger).
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | 'solid': one flat color. 'linear_gradient': a ramp from start to end. 'radial_gradient': a ramp from a center out to a radius. | |
| end | No | linear_gradient: where offset 1 sits, in image pixels. Default bottom center of the canvas. | |
| mask | No | The name of a selection channel: becomes the new layer's layer mask, white where the channel is selected, so the fill shows only there. | |
| mode | No | The new layer's blend mode. 'color' keeps the lightness underneath exactly and swaps only hue and chroma, the usual choice for recoloring. | normal |
| name | No | New layer's name. Default 'Fill' for solid, 'Gradient' for a gradient. | |
| color | No | solid only: the color as #rrggbb. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Name of the layer the new fill layer goes directly above (inside its group). Defaults to the selected layer, or the topmost layer if none is selected. | |
| start | No | linear_gradient: where offset 0 sits, in image pixels. Default top center of the canvas. | |
| stops | No | Gradient only: 2-8 color stops {offset 0..1, color #rrggbb, opacity 0..100}, sorted by offset. Colors blend in sRGB (a black to white stop pair reads 128 at the midpoint). Before the first stop and after the last, the end colors hold. | |
| center | No | radial_gradient: where offset 0 sits, in image pixels. Default canvas center. | |
| radius | No | radial_gradient: the distance in pixels at which offset 1 is reached. Default half the canvas diagonal. | |
| opacity | No | The new layer's opacity, 0-100. | |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| op | No | |
| mode | No | |
| masked | No | |
| opacity | No | |
| layer_id | No | |
| layer_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states where the new layer is inserted (directly above target, inside its group), that gradients blend in sRGB and are undithered, that the current selection is preserved and does not clip the fill, and how the layer-limit accounting works. Minor gap: it does not say what happens on failure or how the operation is undone, despite destructiveHint=false and non-idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and placement rule in the first sentence, then layers constraints, exclusions, and returns in a logical order. It is dense and slightly repetitive against the schema (sRGB blending and stop count appear twice), which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with nested point/stop objects, an output schema, and full annotation coverage, the description covers insertion position, masking behavior, gradient color space, selection interaction, and layer-size accounting. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description largely restates schema content — '2-8 colour stops', 'mask (a channel name)', 'mode color tints without touching lightness' — all of which already appear in the property descriptions, adding little beyond confirming defaults like start/end positions implicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb ('Add a NEW layer') plus the resource and the three fill operations, so the agent knows exactly what is produced. It also distinguishes itself from `add_adjustment`/`add_effect` style siblings by naming the fill-type enum inline and explicitly excluding `retouch`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit when-not with the replacement: 'Do NOT use for painting strokes or touching up pixels; use `retouch` for that.' It also gives a task-level recommendation ('mode color ... the usual choice for recolouring'), routing the agent away from the `recolor` sibling for that intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_objectsARead-onlyIdempotentInspect
AI: find things by name. Returns candidate boxes [x1,y1,x2,y2] in document pixels, best first, with scores. It never picks: several candidates can mean several objects or a wrong match, so check the boxes (preview with a region) before passing one to select_with_ai target=object.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | ||
| word | Yes | What to find: "dog", "suit", "red car". Letters, digits, spaces. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Run on this layer alone (e.g. a placed photo), not the whole image. | |
| layer_id | No | Layer id (takes priority over `layer`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), but the description adds real behavioral context beyond them: return format, best-first ordering with scores, and the key trait that it 'never picks' because multiple candidates may mean multiple objects or a wrong match. This ambiguity disclosure is exactly what an agent needs and is not captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the return shape, then the workflow caveat — three dense, purposeful sentences with no filler. Slightly compressed but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so (candidate boxes [x1,y1,x2,y2] in document pixels, best first, with scores). The downstream workflow is also covered, leaving only minor gaps like the meaning of the `max` cap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the schema already documents word, image, layer, and layer_id. The description adds no syntax or format detail for parameters beyond the implied 'by name' mapping to `word`, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('find things by name') and immediately distinguishes itself from select_with_ai by noting it 'never picks'. The agent can tell this is a candidate-generation tool, not a selection tool, without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the workflow: check the returned boxes ('preview with a region') before passing one to 'select_with_ai target=object'. It names the downstream alternative and the condition that selects it, so the agent knows both when to call this and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_histogramARead-onlyIdempotentInspect
Statistics for several channels from ONE render: mean, median, 1st/5th/95th/99th percentiles and a 256-bin histogram per channel (bins[v] = pixel count at value v, 0-255, in the structured result); the text also gives each channel's pixel count at 0 and at 255, which tells real clipping from a value merely near the limit. Luminance uses perceptual weights. The default is fast (about 0.3 s, from a 1024 px proxy render): good for iterating, but small clipped highlights can be under-counted. Pass exact: true (about 4 s on 24 MP, much longer on a very large photo) as the final clipping check before export_photo; if it times out the editing session restarts and unsaved work is lost, so checkpoint first. region and mask narrow what is measured.
| Name | Required | Description | Default |
|---|---|---|---|
| mask | No | The name of a selection channel: measure only the pixels it selects at 50% or more (a hard cut, no partial credit for soft edges), e.g. the mean lightness or color of a selected object. Combines with region and exact; pixels in the result is the number of pixels counted. | |
| exact | No | false (default): computed on the 1024px proxy render (~0.3s) — good for iterating, but small clipped highlights can be under-counted. true: full-resolution composite (~4s on 24MP) — the trustworthy final clipping check before export. On a very large document true can take much longer; if it times out the editing session restarts and unsaved work is lost, so save (checkpoint) first. | |
| image | Yes | Image id, as returned by open_photo. | |
| region | No | A rectangle in document pixels: {x, y, width, height}. Must lie entirely within the image — a region partly or fully outside it is refused rather than silently clamped. Computed on the proxy when it maps to a big-enough proxy area, else auto-falls back to a full-resolution crop; exact:true always forces the full-resolution crop. | |
| channels | No | Default: all four (luminance, red, green, blue) in ONE render. |
Output Schema
| Name | Required | Description |
|---|---|---|
| exact | No | |
| width | No | |
| height | No | |
| pixels | No | |
| channels | No | Keyed by channel name (luminance, red, green, blue). |
| unmirrored_filters | No | Names of live filters that could not be re-attached on this proxy render — absent from these stats entirely. Present whenever histogram actually used the (mirrored) preview proxy: the default whole-image path, OR a `region` large enough to be sampled from the proxy rather than falling back to a full-resolution crop. Absent when exact: true, or when a region is too small and falls back to that full-resolution crop — neither path mirrors filters at all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses timings (0.3 s proxy vs ~4 s on 24 MP), a real risk (timeout restarts the editing session and loses unsaved work), a measurement caveat (small clipped highlights under-counted on the proxy), and the luminance weighting model. That is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but dense and front-loaded with what is returned before the cost/risk discussion. Some redundancy — the timeout warning and exact-mode timing are restated almost verbatim in the schema's `exact` description, so a sentence could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present this only needs to explain how to read the result, and it does: bin indexing, clipping detection, luminance weighting, and the proxy-vs-full-resolution accuracy tradeoff. An agent has everything needed to call it correctly and interpret the output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3; the description still adds interpretation the schema lacks, notably `bins[v]` = pixel count at value v and the pixel-count-at-0/255 clipping signal, plus a one-line summary that region and mask narrow the measurement. Not a full 5 since the individual parameter behaviors are already well covered by the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (statistics) and enumerates exactly which statistics — mean, median, percentiles, 256-bin histogram — per channel, with the 'ONE render' cost note clarifying it is a single pass. This clearly separates it from siblings like inspect, preview and overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: default fast mode for iterating, `exact: true` as the final clipping check before `export_photo`, and `checkpoint` first if there is unsaved work. It also names the two sibling tools that bookend its use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspectARead-onlyIdempotentInspect
Read-only. what='documents' lists the photos open in this session by image id. what='uploads' lists your uploads (from any of your signed-in connections) with their upload:<id> handles, names, sizes and expires_at. A photo that has not been opened yet is listed with checked: false and no width or height; its size is read when open_photo first opens it. A photo the user says they already sent shows up in what='uploads'. what='fonts' lists the fonts installed on this server, optionally narrowed by filter. Uploads and open photos belong to this server; a photo opened through another Editmamei connector stays with that connector.
| Name | Required | Description | Default |
|---|---|---|---|
| what | Yes | 'documents': open image ids. 'uploads': your uploads. 'fonts': installed font names. | |
| filter | No | what='fonts' only: case-insensitive substring to narrow the font names by. |
Output Schema
| Name | Required | Description |
|---|---|---|
| what | No | |
| fonts | No | |
| total | No | |
| default | No | |
| samples | No | |
| uploads | No | |
| returned | No | |
| documents | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds real behavior beyond that: the `checked: false` lazy state, that size is only read when `open_photo` first opens a photo, and that uploads aggregate across any signed-in connection. This is meaningful extra context, though return-format specifics are largely delegated to the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It opens with the front-loaded 'Read-only.' and then walks the modes in order, with each sentence carrying specific information. It is slightly dense and longer than strictly necessary, but nothing is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description only needs to explain mode selection and edge cases, which it does thoroughly (lazy size, cross-connection uploads, server scoping). Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by explaining the semantics of each `what` value in terms of the returned data (image ids vs upload handles/sizes/expires_at vs font names) and confirms `filter` applies only to fonts, adding meaning beyond the raw enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('lists') for each distinct resource selected by the `what` enum: open photos by image id, uploads with handles/sizes/expires_at, and installed fonts. It cleanly enumerates the three modes so an agent knows exactly what it returns, and it references `open_photo` to distinguish the read path from the open path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is clear: the `what` value selects the mode and `filter` narrows fonts, with the description explaining each context. It also scopes ownership ('uploads and open photos belong to this server; a photo opened through another connector stays with that connector'), which helps decide relevance. It stops short of explicitly naming when to prefer this over siblings like status/overview or check_listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
layerADestructiveInspect
Layer management. op: create | create_group | delete | duplicate | select | set | reorder | merge_down | flatten (a group is created, addressed and reordered like any layer; there is no separate group tool). Address a layer by layer_id (an id from inspect or a previous layer / bake result) or by layer (its name; names can repeat, so layer_id is the only handle that always tells two apart). Every op except select changes pixels or layer structure, and there is no undo in this session: checkpoint first when in doubt. create adds an empty layer (width/height default to the photo size; fill white, black or transparent, default transparent). create_group adds a group (a folder for other layers). delete removes a layer (a group takes its children with it) and its filters; REFUSED if it is or contains the photo's only remaining layer. duplicate copies a layer directly above the source; REFUSES when the layer (or, for a group, any layer in it) carries an Editmamei filter, since the copy's filter would collide with the original's record: bake it first or delete the filter, then duplicate. select sets the active layer (the default target of add_adjustment and friends when no layer is named) and changes nothing else. set changes opacity, mode (a blend mode from a fixed list), visible and/or name (at least one is required; a name may not be empty). Names are kept unique by suffixing " 2", " 3", ... when taken. reorder changes a layer's stack position and/or moves it into a group (parent_group) or out to top level (to_top_level: true); giving neither keeps the layer in its current group and only changes position; REFUSED if parent_group would nest a group inside itself or one of its own descendants. merge_down bakes ONE layer's live filters (masked ones included) into pixels and merges it into the first VISIBLE layer below it at the same level; REFUSES if the source layer itself is hidden, if the target would be a group, if there is no visible layer below (a hidden one in between is skipped, not merged), or if the result would exceed the size cap resize enforces; a visible text layer involved is rasterized (reported as rasterized_text). flatten collapses the WHOLE photo into a single layer the same way, always drops transparency (reported as has_alpha: false), and REFUSES by default when any layer is hidden, INCLUDING a visible layer inside a hidden group, rather than silently discarding it (discard_hidden: true proceeds and reports what was discarded). On this server a created layer's width x height must stay within the workspace's pixel limit (less at a higher bit depth), and a photo's layers together within its layer limit, each counted at the canvas size (or the largest layer size used in the photo, if bigger).
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | 'create' adds a new, empty layer (width/height default to the image size, capped the same way resize's target is; fill white/black/transparent, default transparent). 'create_group' adds a group layer (a folder for other layers). 'delete' removes a layer (a group takes its children with it) and prunes any of its filters from the ledger — REFUSED if it is or contains the image's only remaining layer. 'duplicate' copies a layer, inserted directly above the source — REFUSED when the layer (or, for a group, any descendant) carries an Editmamei filter, since the copy's filter would collide with the original's own ledger record. 'select' sets the active layer (the default target for add_adjustment and friends when no layer is named) and is the one sub-op that changes nothing else. 'set' changes opacity, mode, visible, and/or name (at least one required, name may not be empty) — mode is a blend mode from a fixed list, not a raw name. 'reorder' changes a layer's stack position and/or moves it into a group (parent_group) or out to top-level (to_top_level: true) — neither given keeps the layer in its current group and only changes `position`; REFUSED if parent_group would nest a group inside itself or one of its own descendants. 'merge_down' bakes ONE layer's live filters (masked ones included) into pixels and merges it into the first VISIBLE layer below it in the same group/level — REFUSED if the SOURCE layer itself is hidden (the editor cannot merge a hidden layer down), if that target would be a group, if there is no visible layer below (a hidden one in between is skipped, not merged), or if the merged result would exceed the same size cap resize enforces; a visible text layer involved is rasterized (reported as rasterized_text). 'flatten' collapses the WHOLE image into a single layer the same way, always drops alpha (reported as has_alpha: false), and REFUSES by default when any layer is hidden, INCLUDING a layer whose own visibility is on but sits inside a hidden group (the editor discards a hidden layer outright rather than compositing it in) unless discard_hidden: true is given. | |
| fill | No | create only. The new layer's initial content. | transparent |
| mode | No | set only. A blend mode from a fixed list. 'color' here is HSL-style, a little different from fill's 'color'. | |
| name | No | create/create_group: the new layer's name (default 'Layer'/'Group'). set: renames the target layer; may not be empty. Every case enforces a unique name, suffixing " 2", " 3", ... if the name is already taken (duplicate names are possible elsewhere; this tool does not allow them). | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. Ignored when layer_id is given. Not used by create, create_group, or flatten. | |
| width | No | create only. Defaults to the image width. | |
| height | No | create only. Defaults to the image height. | |
| opacity | No | set only. | |
| visible | No | set only. | |
| layer_id | No | Canonical layer id (from inspect or a prior layer/bake result) — takes priority over `layer` (name) when both are given, and is the only way to address two layers that happen to share a name. Not used by create, create_group, or flatten. | |
| position | No | create/create_group/reorder: index within the target parent's (or top-level) stack, 0 = topmost. | |
| parent_group | No | create/create_group: the group layer_id to insert the new layer into (omit for top-level). reorder: the group layer_id to move the layer into. Must itself be a group, and cannot be the layer being moved or one of its own descendants. Omit (leaving the layer in its current group) or use to_top_level instead to move it OUT of a group — there is no way to pass "no group" through this field itself. | |
| to_top_level | No | reorder only. Moves the layer to the top level, out of whatever group (if any) it is currently in. Takes priority over parent_group if both are given. | |
| discard_hidden | No | flatten only. Without it, flatten REFUSES when any layer is hidden (naming them) rather than silently discarding them — pass true to proceed; the discarded layers are reported back as discarded_hidden_layers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| name | No | |
| deleted | No | |
| opacity | No | |
| visible | No | |
| is_group | No | |
| layer_id | No | |
| has_alpha | No | |
| parent_group | No | |
| rasterized_text | No | |
| discarded_hidden_layers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, but the description goes far beyond that with concrete refusal rules (delete refused on sole layer, merge_down refused on hidden source, flatten refused on any hidden layer including inside hidden groups), reporting behavior (rasterized_text, has_alpha: false, discarded_hidden_layers), and no-undo warning. This is exactly the added context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single dense paragraph is front-loaded with addressing rules and the no-undo warning, which is good, but it is very long and packs per-op rules into semicolon-laden prose that is hard to scan. The schema already documents ops individually, so much of this is duplicated rather than summarized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-param, 9-op destructive tool with no undo, the description covers refusal conditions, side effects, reporting, addressing precedence, and the checkpoint escape hatch. With an output schema present, return-value detail is appropriately left out. Nothing an agent needs to call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: the default target of select, the name-uniqueness suffix rule (' 2', ' 3'), the 'color' mode HSL distinction, and the parent_group/to_top_level interaction. It falls short of 5 only because a few params (opacity, visible, position defaults) are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource statement ('Layer management') and enumerates all nine ops, each with a distinct meaning. It explicitly distinguishes itself from siblings by noting 'there is no separate group tool,' which prevents an agent from searching for one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-not-to-use guidance across ops: 'checkpoint first when in doubt,' 'Every op except select changes pixels... there is no undo,' and names the specific failure conditions for delete, duplicate, reorder, merge_down, and flatten. It routes the agent to bake before duplicate when an Editmamei filter is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
layer_maskADestructiveInspect
A real layer mask (it moves with the layer). create from a saved selection channel (e.g. from select or select_with_ai) or from white, black, the layer's transparency or grayscale; delete; apply (bake the mask into the layer's transparency: a cut-out); invert. For a cut-out composite: place the photo as a layer, select on that layer, then create its mask from the channel.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | create replaces any existing mask. apply bakes the mask into the layer's alpha. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. | |
| invert | No | create: invert the new mask. | |
| source | No | create: where the mask comes from. | channel |
| channel | No | source=channel: the saved selection to use. | |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| op | No | |
| layer | No | |
| has_mask | No | |
| layer_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, and the description reinforces this with real consequences: apply 'bakes the mask into the layer's transparency: a cut-out', and create replaces any existing mask. It adds the crucial semantic that the mask travels with the layer, which annotations cannot express. No note on undo/reversibility or scoping of the bake, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the definition of what a layer mask is, then packs the four operations and a workflow into one dense paragraph with no filler. The semicolon-chained operation list is efficient, though slightly choppy to parse on first read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the description covers the operation set, source options, and a canonical workflow. Remaining details (layer vs layer_id precedence, invert scoping) are handled by the fully-populated schema, so the description is adequate without being exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description goes beyond it by naming the concrete source values and explaining where a channel comes from ('a saved selection channel, e.g. from select or select_with_ai'). That provenance is genuinely new information not present in the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific resource (a layer mask, explicitly 'real' and layer-bound) and enumerates the four operations it performs: create, delete, apply, invert. The parenthetical '(it moves with the layer)' distinguishes it from selection-style masking, so an agent can separate it from siblings like modify_selection without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance — create masks from a saved selection channel produced by `select` or `select_with_ai`, or from white/black/alpha/grayscale — plus a worked workflow ('place the photo as a layer, select on that layer, then create its mask from the channel'). It never states when *not* to use this tool or contrasts it explicitly with a masking alternative, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_carouselAInspect
Split one wide photo into seamless slides for an Instagram carousel and get one download link per slide, in order. Pick slides (2 to 10; default: as many as the photo's width allows at its full height) and ratio ('4:5' = 1080x1350, the default, or '1:1' = 1080x1080). The server crops a strip of N slides, centred on the main subject when it can find one (else the middle), scales it once to N x 1080 wide (never up: a smaller photo keeps its own size), cuts it into N exact slides and exports each, so the slides join without a seam when swiped. Your photo is left as it was; the result gives its (new) image id. Each slide is cut from a copy of the strip, so a 10-slide carousel takes a while.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| ratio | No | Slide shape: 4:5 (1080x1350) or 1:1 (1080x1080). | 4:5 |
| format | No | Output format. | jpg |
| slides | No | How many slides. Default: as many as fit the photo's width at its full height. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false). It discloses non-obvious behaviors: the origin image is left intact, the result returns a new image id, the subject-centered crop logic, no-upscaling constraint, seamless joining mechanism, and a performance warning for 10-slide carousels.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded with the core action and return value, then parameters, then implementation details. It's dense but every sentence provides actionable information. Slightly long, but the length is justified by the non-trivial behavior being disclosed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of the operation, no output schema, and rich annotations, the description covers everything an agent needs: input requirements, parameter behavior, processing logic, output structure (download links), and a performance caveat. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond the 100% schema coverage: explains the '4:5' and '1:1' ratios with pixel dimensions (already in schema but reinforced), and clarifies what the default slide count means (as many as the photo's width allows at full height). The 'format' parameter is left to the schema, which is fine given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (split) and resource (wide photo into seamless slides) with the exact outcome (one download link per slide, in order). This is clearly distinguishable from siblings like make_grid, make_story, and crop_for_platform.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The photo requirements (wide photo) and use case (Instagram carousel) are clear, and the parameter behavior is well-explained. However, it doesn't explicitly contrast with alternatives like make_grid or crop_for_platform, leaving the agent to infer when this specific approach is preferred over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_gridAInspect
Make a collage or multi-panel meme from 2 to 9 of the user's photos and get one download link. No images are bundled: the layout goes around THEIR photos. sources are upload handles like "upload:abc123" (request_upload; one link can carry several photos) or https:// image URLs (downloaded first; if any fails the grid is not made and the error names which). layout: 2x1 (two side by side), 1x2 (two stacked), 2x2, 3x3 (these need exactly that many photos) or auto (default: the most square grid for the count; empty cells at the end show the background). cell: 1:1 (default), 4:5, or original (the first photo's shape). Each photo is scaled to COVER its cell, centred, and clipped to it. gap: pixels between cells and around them (0 to 100, default 8). background: #rrggbb (default white). labels (optional, one per photo, "" for none): short text at the bottom-left of each cell, white with a black outline, fitted to a box - the two-panel meme. width: the final image width (default 1080 px per column; the default is reduced to fit the server's pixel and layer limits, an explicit width over them is refused). format jpg (default) or png. The grid opens as a NEW image (its id is in the result) as live layers; on any failure the new image is closed again and nothing is left open.
| Name | Required | Description | Default |
|---|---|---|---|
| gap | No | Pixels between cells and around the edge. | |
| cell | No | The shape of each cell: 1:1, 4:5 (portrait), or original (the first photo's shape). | 1:1 |
| width | No | Final image width in pixels. Default 1080 per column. | |
| format | No | Output format. | jpg |
| labels | No | One short text per photo ("" for none), bottom-left in its cell. | |
| layout | No | Columns x rows, or auto. | auto |
| sources | Yes | 2 to 9 photos: "upload:<id>" handles or https:// image URLs, in reading order (left to right, top to bottom). | |
| background | No | Gap and margin color, #rrggbb. | #ffffff |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic safety profile (not read-only, open-world, non-idempotent, non-destructive). The description goes well beyond: it discloses that the grid opens as a NEW image with live layers, that a failed source aborts the whole grid with a named error, that the new image is closed on failure so 'nothing is left open', and that explicit widths over server pixel/layer limits are refused. That is exactly the side-effect and failure-mode context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a long single paragraph, but it is front-loaded with the purpose and then walks parameters in backticked order, so it scans well. Nearly every clause adds operational detail; it would be tighter split into a purpose line and a parameters block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, no output schema, and a mutation-style side effect (creating an image), the description covers the essentials: what is returned (a download link and the new image's id, which is in the result) and what happens on failure. Only minor gaps remain, such as the exact shape of the result object and any ordering of returned links.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: `sources` may be upload: handles (with a cross-reference to request_upload) or URLs fetched first, `layout` sizes require exactly that many photos, `auto` picks the most square grid and leaves background-filled cells, and photos are scaled to COVER and clipped. It also explains the width-vs-server-limit interaction that the schema's 200-10000 range does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Make a collage or multi-panel meme from 2 to 9 of the user's photos and get one download link.' An agent can see it produces a single new composite image, distinct from single-photo edits. However, it never names or distinguishes itself from close siblings like make_carousel, make_meme, or make_story, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the constraints (2-9 photos, upload handles vs URLs, layout counts) but there is no explicit when-to-use/when-not statement and no routing to alternatives such as make_carousel or make_meme. The agent must infer when a grid is the right tool from the parameter descriptions alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_memeADestructiveInspect
Turn the user's photo into a meme in one call, in one of three layouts, and get the finished image as a download link. No meme images are bundled: the layout goes around THEIR photo. style classic: top and/or bottom text in an Impact-style condensed bold face (Anton if installed, then Oswald Bold, Bebas Neue, League Gothic, then the boldest condensed font that is, then any bold sans; the result says which), UPPERCASE unless uppercase is false, white with a black outline, centred, each fitted to a box about 92% of the width by 22% of the height at the top and bottom edges. style caption_bar: a white bar added above the photo with caption in black, left-aligned (Inter, Roboto or Open Sans if installed), the bar as tall as the text needs, at most 40% of the image. style demotivational: a black frame with a thin white keyline around the photo, title in a large serif (Playfair Display or Times if installed) and a smaller subtitle below, both white. The photo is not resized (a very large one is slow; the demotivational frame makes the canvas about 1.7 times larger, so photos over about 14 MP are refused by the pixel cap: resize first). It takes a checkpoint first and puts the image back if anything fails; on success the meme stays on the image as live layers (the text stays editable text layers) and the result gives the checkpoint id for the plain photo. Text longer than the box allows is shrunk down to a minimum size and then clipped (the result says so); keep it short.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | classic: the text at the top. | |
| image | Yes | Image id, as returned by open_photo. | |
| style | Yes | Which layout. | |
| title | No | demotivational: the title. | |
| bottom | No | classic: the text at the bottom. | |
| format | No | Output format. | jpg |
| caption | No | caption_bar: the caption. | |
| subtitle | No | demotivational: the smaller line under the title. | |
| uppercase | No | classic: set the text in UPPERCASE (default). false keeps the case you typed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, non-idempotent, open-world), and the description adds substantial context beyond them: a checkpoint is taken first and the image is restored on failure, success leaves the meme as live editable text layers, the result returns the plain photo's checkpoint id, oversized inputs are refused, and long text is shrunk then clipped with the result saying so.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and output are front-loaded, which is good, but the body is a dense wall of text and the font fallback enumerations (Anton, Oswald Bold, Bebas Neue, League Gothic, Inter, Roboto, Open Sans, Playfair Display, Times) are low-value padding that hurts scannability without changing how an agent calls the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With nine parameters, no output schema, and destructive non-idempotent semantics, the description carries the full burden and does it: it describes the return payload (download link plus checkpoint id), the failure/revert behavior, the size limit, and per-style rendering. An agent has everything needed to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description meaningfully expands it: it maps top/bottom/caption/title/subtitle to the layouts that consume them and explains typography, alignment, casing and sizing for each style (e.g. classic is white-with-outline, centered, fitted to a 92% x 22% box). It does not restate the format or uppercase enums beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (turn into a meme), the resource (the user's photo), the scope (three layouts), and the output (a download link). It is trivially distinguishable from make_sticker, make_grid, make_carousel and make_story, all of which are separate meme-adjacent siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies real operating context: the input must be a photo id, photos over ~14 MP are refused by the pixel cap and must be resized first, and text should be kept short or it will be shrunk and clipped. It stops short of naming alternative tools or stating when NOT to reach for it, so it lands just below the explicit when/when-not/alternatives bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_stickerAInspect
Cut the subject of a photo out as a die-cut sticker and get a transparent PNG (or WebP) download link. The server finds the subject, cuts it out on a copy of the photo layer, adds a solid border around it (border, 4 to 50 px, default 2.5% of the subject's long side; border_color, default #ffffff) and, unless shadow is false, a soft drop shadow, crops to the sticker with room for both, and exports with the transparency kept. Your photo is left as it was (the call restores it, so the result gives its NEW image id). If the subject lies on its side or upside down, say which edge its top points toward with subject_up. The image must have a single layer. Needs the selection service.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| border | No | Border width in pixels. Default: 2.5% of the subject's long side. | |
| format | No | png, or webp (lossless). Both keep the transparency. | png |
| shadow | No | A soft drop shadow under the sticker. | |
| subject_up | No | The edge the subject's top points toward, if it is not upright. | |
| border_color | No | Border color, #rrggbb. | #ffffff |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses non-obvious behavior: the source photo is left untouched and the call restores it, so the result carries a NEW image id, plus the full processing pipeline (find subject, cut on a copy, add border, add shadow unless shadow is false, crop with room, keep transparency). This is consistent with destructiveHint=false and readOnlyHint=false and adds genuinely useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and output are front-loaded, and the pipeline/constraint sentences each carry real information. It is slightly long and repeats schema-level default values (border, border_color, shadow), which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return value (a transparent PNG/WebP download link plus the new image id), the destructive/restore behavior, the layer-count constraint, and the rotated-subject edge case. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters with defaults and enums. The description mostly restates these (border default 2.5% of the subject's long side, border_color #ffffff, format keeps transparency) and only marginally extends meaning via the subject_up orientation hint, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: cut the subject out as a die-cut sticker and return a transparent PNG/WebP download link. The output (bordered, shadowed die-cut sticker) is unmistakably distinct from the sibling generative tools (make_meme, make_grid, make_carousel, make_story), so no confusion is possible even without naming an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear preconditions and context — the image must have a single layer, the selection service is required, and subject_up should be set when the subject is not upright — which tells the agent when the call will work. It never states when to prefer this over a sibling or any exclusion cases, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
make_storyADestructiveInspect
Make a 9:16 story frame (1080x1920) from a photo and get one download link. The photo is scaled to fit the width and placed on a background: blur (default: a blurred, scaled-up copy of the photo itself), a solid color like #1a1a2e, or gradient (top to bottom, gradient_top default white, gradient_bottom default a 15% darker shade of the top). Optional caption: white bold text with a black outline, fitted to a box inside the safe zone (the top 250 px and bottom 340 px of 1920 are covered by the app), sitting just above the handle. Optional handle: small text at the bottom centre, just above the unsafe band. The image must have a single layer. A very wide or tall photo (a panorama) cannot take the blurred background: use a color or gradient for it. It takes a checkpoint first and puts the image back if anything fails; on success the story stays on the image as live layers and the result gives the checkpoint id for the plain photo.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| format | No | Output format. | jpg |
| handle | No | A short line at the bottom centre, e.g. "@name". | |
| caption | No | Text over the lower part of the frame, inside the safe zone. | |
| background | No | blur, gradient, or #rrggbb. | blur |
| gradient_top | No | background gradient only: the top color, #rrggbb. Default white. | |
| gradient_bottom | No | background gradient only: the bottom color, #rrggbb. Default a 15% darker shade of the top. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it discloses that a checkpoint is taken first and the image is restored on failure, that on success the story persists as live layers, and that the result carries the checkpoint id. It also documents the safe-zone geometry (top 250 px / bottom 340 px unsafe bands) and the single-layer and panorama constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads output type and dimensions, and every subsequent sentence carries required information (background modes, safe zone, constraints, checkpoint behavior). It is a dense single paragraph rather than organized sections, and the final checkpoint sentence is a run-on, which costs a point on structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the returns: one download link plus the checkpoint id for the plain photo. Given seven parameters and destructive/open-world behavior, it supplies the constraints, defaults, and side-effect behavior an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning the schema lacks: blur defaults to a blurred scaled-up copy of the photo, gradient runs top-to-bottom with gradient_top defaulting to white and gradient_bottom to a 15% darker shade, and caption styling (white bold with black outline, fitted above the handle). This meaningfully extends the terse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ("Make a 9:16 story frame (1080x1920) from a photo") with exact output dimensions and format, which clearly separates it from siblings like make_meme, make_grid and make_carousel. An agent knows exactly what this produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operative context and constraints: the image must have a single layer, and a panorama (very wide/tall photo) cannot take the blurred background and must use a color or gradient. It never names a sibling alternative or explicitly says when another tool is preferred, so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_filtersADestructiveInspect
Manage the filter stack: op list | set_visibility | delete. list returns every filter on the photo (layers inside groups included), top of the stack first; it is the way to check what add_adjustment and add_effect produced and to find a filter's id for a re-edit. set_visibility switches one filter on or off without deleting it. delete permanently removes it (there is no undo). There is no apply op (creating or re-editing a filter is the job of add_adjustment and add_effect) and no reorder: delete and re-create the filters in the order you want.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | 'list' returns every filter on the image (including filters on layers inside groups), top of stack first, with layer/layer_id (which layer the filter lives on, and that layer's id), id/name/type/visible/mask/source and params. source "editmamei" = exact ledger record, with params in add_adjustment's own field names and units, so they can be passed straight back on a re-edit. source "readback" = a filter made outside Editmamei: it is listed as type "other" without its settings, and cannot be re-edited. 'set_visibility' toggles one filter without deleting it. 'delete' removes one. There is no 'reorder' — the editor has no API for it; delete and re-create the filters in the desired order instead. | |
| image | Yes | Image id, as returned by open_photo. | |
| visible | No | Required for set_visibility. | |
| filter_id | No | Required for set_visibility / delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| deleted | No | |
| filters | No | |
| visible | No | |
| filter_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so safety is partly covered. The description adds valuable specifics beyond that: delete is permanent with 'no undo', set_visibility is non-destructive, and no reorder API exists. Slightly redundant with the destructive hint but adds real operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the op enumeration, then usage and constraints in logical order; every sentence carries information. Some minor overlap with the schema's op description (layer inclusion, no reorder), which is the only reason it isn't a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return formats need not be explained, and the description still covers all three ops, their side effects, and the absence of apply/reorder. Complete for a multi-op mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents op, image, visible, and filter_id plus the editmamei/readback source semantics. The description largely restates op behavior already in the enum description, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource plus an enumerated op list ('Manage the filter stack: op list | set_visibility | delete'), and explicitly distinguishes itself from siblings add_adjustment/add_effect for creation/editing. An agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use: 'list' is the way to check what add_adjustment/add_effect produced and to find a filter's id for re-edit; set_visibility vs delete are contrasted by reversibility. It also names the alternatives for the absent operations ('no apply... no reorder: delete and re-create').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modify_selectionADestructiveInspect
Expand, contract, border, feather, smooth, invert or harden a saved selection channel. Refused if the target channel already confines a filter.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | expand/contract/border/feather require `px` (> 0). harden: threshold a soft mask at 50%. smooth: round off jagged edges (`px` optional, floors at 1px). | |
| px | No | Radius in document pixels, rounded to the nearest whole pixel. Required (> 0) for expand/contract/border/feather; optional for smooth; unused otherwise. expand/contract/border cap at 150 on an ordinary document, LOWER on a very large one (morphological ops whose cost scales with both the radius and the document's own megapixels — the error names the actual cap for that document when a value is refused); feather has no such cap up to 1000 (a blur, flat cost regardless of radius). | |
| image | Yes | Image id, as returned by open_photo. | |
| output | No | Write to this saved selection instead of modifying `channel` in place. | |
| channel | Yes | The saved selection to modify. |
Output Schema
| Name | Required | Description |
|---|---|---|
| channel | No | |
| fraction | No | |
| selected_pixels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so the safety profile is carried. The description adds a genuine behavioral precondition not in the annotations: refusal when the target channel already confines a filter. It does not explain in-place overwrite semantics or auth/limits, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, purpose front-loaded, with the refusal constraint second. The op enumeration slightly duplicates the schema enum, which keeps it from a perfect score, but there is no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations, and 100% schema description coverage, the description covers what an agent needs: what it edits, the operations, and the one refusal condition. It omits in-place vs output write behavior, but that is largely covered by the schema's output parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the enum values, px requirements, caps, and the optional output/channel semantics are fully documented in the schema itself. The description only restates the op list and adds no parameter meaning beyond the schema, which matches the baseline 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource (modify a saved selection channel) and enumerates the seven operations, making the scope clear without opening the schema. It implicitly distinguishes itself from siblings like select_with_ai and selection_preview, which create or preview selections rather than edit a saved one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage guidance is the guard 'Refused if the target channel already confines a filter,' which tells the agent a precondition but not when to choose this over alternatives. No explicit when-not or sibling routing (e.g., selection_preview, select_with_ai) is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
my_looksADestructiveInspect
Your saved looks: filter recipes kept on this server, for you only. op says what to do. op=save (needs image, name; layer or layer_id when the image has more than one layer): read the live adjustment and effect filters on a layer (manage_filters op=list) and keep them under a name. Only the filters the filter tools can recreate are kept, in the order they are applied (settings only, never a photo); a filter that is switched off, confined to a mask or not made with these tools is skipped and listed in the result. Nothing to save is an error. At most 20 looks per person and 50 filters per look; saving under an existing name replaces it. op=apply (needs image, name; layer, layer_id, replace optional): put one of your saved looks on a layer as live, editable filters named "My look · · ...". Every stored setting is run through the same filter tools you have, so each is validated again; it takes a checkpoint first and puts the image back if any step is refused. A layer that already carries this look is refused unless replace is true (then those filters are taken off first). There is no strength option: the filter tools have no per-filter strength, so the look applies as saved (save a gentler look for less). op=list: your saved looks, with the number of steps and when each was saved (a look that cannot be read is reported, never used). op=delete (needs name): delete one of your saved looks; filters it already added to a photo stay on it. op=apply works in batch (preset my_looks, args {name}) to give several photos the same look.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | save, apply, list or delete. | |
| name | No | The look's name: lowercase letters, digits and hyphens, 1 to 40 characters, e.g. warm-film. Needed by op=save, apply and delete. | |
| image | No | Image id, as returned by open_photo. Needed by op=save and apply. | |
| layer | No | op=save and apply: layer name; required when the image has more than one layer (or use layer_id). | |
| replace | No | op=apply only: take off an earlier apply of this look on the layer first. Without it, a layer that already has the look is refused. | |
| layer_id | No | op=save and apply: layer id (takes priority over `layer`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the 20-look / 50-filter caps, that saving under an existing name replaces it, that only recreatable settings are kept while masked/disabled/foreign filters are skipped and reported, that apply takes a checkpoint and rolls back on refusal, and that nothing-to-save is an error. This is the kind of operational detail an agent must have before mutating a user's photo.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads purpose and the rest is organized op-by-op with consistent op=... labels, so it is navigable despite being a single dense paragraph. A tight per-op bulleted layout would scan faster, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-shape burden and does so: list returns step counts and save times, unreadable looks are reported rather than used, and skipped filters are listed in the save result. Error, limit, and rollback behavior are all covered, leaving nothing an agent needs before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: which params each op requires, that layer is required only for multi-layer images, that layer_id takes priority, and that replace forces an earlier apply to be removed first. That is more than restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ("Your saved looks: filter recipes kept on this server, for you only") with a clear scope and ownership qualifier, and the sub-operations are enumerated explicitly. It is clear what the tool manages, but it never differentiates itself from the sibling apply_look, which an agent could reasonably confuse with op=apply here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each op is given explicit when/why guidance: save reads live filters from a layer and requires a named layer when multi-layer, apply puts a look back on a layer with replace semantics, list is for enumeration, delete removes the definition but leaves already-added filters on the photo. It also names the prerequisite sibling (manage_filters op=list) and covers the batch-invocation case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_canvasAInspect
Create a new, empty photo from scratch (not from a file: that is open_photo). width/height, mode (rgb or grayscale, default rgb), fill for the single background layer (white, black or transparent; default white), optional precision (16-bit; the same promotion as open_photo's precision) and name. Returns the same shape as open_photo (image id, size, color mode, precision, layer list), so every other tool treats it like an opened file. On this server width x height must stay within the workspace's pixel limit; '32' precision is refused, and '16' only up to a smaller size limit (memory). At most 2 photos may be open at once.
| Name | Required | Description | Default |
|---|---|---|---|
| fill | No | The single background layer's initial content. | white |
| mode | No | The new image's base color mode. | rgb |
| name | No | The background layer's name. Defaults to 'Background'. | |
| width | Yes | Canvas width, in pixels. | |
| height | Yes | Canvas height, in pixels. | |
| precision | No | Promote bit depth at creation, same as open_photo's own `precision` — use this ahead of an aggressive tone move to avoid visible banding. Omit for ordinary 8-bit. The megapixel cap this tool enforces scales down with bit depth (a 16-bit request costs 2x the memory of the same pixel count at 8-bit, 32-bit float 4x): 250 MP at 8-bit, 125 MP at 16-bit, 60 MP at 32-bit — the same per-side 30000px limit applies at every depth. |
Output Schema
| Name | Required | Description |
|---|---|---|
| image | No | |
| width | No | |
| height | No | |
| layers | No | |
| base_type | No | |
| precision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only tell the agent this is a non-readOnly, non-idempotent, non-destructive, open-world write. The description goes well beyond them by disclosing server-side resource limits, the refusal of 32-bit precision, the reduced size ceiling at 16-bit, and the two-photos-open ceiling — genuine operational constraints an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, front-loaded with the verb and the sibling disambiguation, followed by parameter notes and limits in a sensible order. Every sentence carries information, though the restatement of schema defaults (rgb, white, Background) is mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description sensibly just notes the return shape mirrors open_photo rather than re-documenting it. Limits, mode, fill and precision behavior are covered, leaving only the unresolved discrepancy between the prose '32 is refused' and the schema's 32-bit cap as an incompleteness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so width/height/mode/fill/name are already fully documented and the description largely restates them. It adds a behavioral note about precision usage, but that note ('32' precision is refused on this server) conflicts with the schema, which documents a 60 MP 32-bit mode — the added meaning is unreliable as a result.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Create a new, empty photo from scratch') and immediately differentiates it from the nearest sibling by naming open_photo as the file-based path. An agent can distinguish this from open_photo, place_image, or make_* tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative ('not from a file: that is `open_photo`') and lays out the conditions under which this tool will or will not work: the workspace pixel limit, '32' precision refused, '16' only up to a smaller size, and a hard cap of 2 open photos. That is explicit when/when-not/alternative guidance rather than inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_photoAInspect
Open a photo and get its image id, which every other tool uses. source is an upload handle "upload:" (from request_upload), the name of one of your uploads, or a public https:// image URL the server downloads itself (a photo share link works). It never opens a file path. Accepts JPEG, PNG, TIFF, WebP and HEIC, and RAW camera files on the larger workspace (the optional raw object sets white balance, exposure and highlights for a RAW file). A source can also be one of the built-in sample photos, listed by inspect what=uploads (sample:<name>, or its file name when none of your uploads has it). precision promotes bit depth before grading (16-bit only only up to a size limit that overview lists). At most 2 photos may be open at once. Uploads and open photos belong to this server; a photo opened through another Editmamei connector stays with that connector.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Only for a RAW camera file (an error for any other source): how it is developed. White balance, exposure and highlight recovery; each is optional. | |
| source | Yes | "upload:<upload_id>" as returned by the upload (the name of one of your uploads also works), or an https:// image URL. | |
| precision | No | Promote bit depth on open. 'keep' leaves the file's own precision; '16' converts to 16-bit BEFORE any grading, which avoids banding from an aggressive tone move on an 8-bit source. On this server '16' is refused above a size limit (memory); overview lists it. | keep |
Output Schema
| Name | Required | Description |
|---|---|---|
| image | No | |
| width | No | |
| height | No | |
| layers | No | |
| base_type | No | |
| precision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a non-read-only, non-idempotent, open-world operation, so the bar is lower. The description adds real behavioral context beyond them: the two-photos-open-at-once limit, cross-connector scoping ('a photo opened through another Editmamei connector stays with that connector'), supported format list, and that RAW is restricted to the larger workspace.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The essential purpose is front-loaded in the first sentence, and the remaining sentences each carry functional detail (formats, limits, scoping). It is dense but not padded, though a couple of clauses are run-on and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers the full operational surface for a 3-param tool with a nested object: sources, formats, RAW development, precision, concurrency cap, and server scoping. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds meaning: the accepted `source` forms (upload handle, upload name, public https URL, `sample:<name>`), that `raw` errors for non-RAW sources, and that `precision` promotes bit depth before grading. These go beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Open a photo') plus its key output ('get its image id, which every other tool uses'), which immediately distinguishes it from siblings like close_photo, request_upload, and inspect. The role in the workflow is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong context on what qualifies as a `source`, routes the agent to `request_upload` for upload handles and to `inspect what=uploads` for sample photos, and states an exclusion ('It never opens a file path'). It stops short of an explicit 'use this before adjusting/exporting' sequencing statement, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
overviewARead-onlyIdempotentInspect
A static brief on how this server works: how photos get in and out, the workflow (assess, plan, edit, check), how adjustments and filters work, why geometry comes before masked adjustments, checkpoints in place of undo, how previews work, and this server's limits. Read-only and needs no photo. A single simple edit doesn't need it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| bytes | No | |
| sections | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description partially repeats 'read-only', but it adds genuinely new behavioral context: it needs no photo loaded and is static documentation. For a zero-param doc tool this is adequate disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then enumerates covered topics, then closes with constraints. The topic list is fairly long but each item signals real content, so it mostly earns its place rather than being padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description already names the content areas plus the read-only, no-photo nature. Nothing an agent needs to decide whether to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters, so there is nothing for the description to disambiguate; baseline is 4. The description correctly signals the no-input nature by stating it needs no photo.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('a static brief on how this server works') and enumerates exactly what it covers, distinguishing it from the action-oriented siblings like add_adjustment or edit tools. The agent can immediately tell this is orientation content, not an operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-not condition ('A single simple edit doesn't need it') and notes it needs no photo, which helps an agent decide whether to spend a call on it. It stops short of naming an explicit alternative tool, but no sibling serves the orientation role, so the guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photo_effectAIdempotentInspect
Effects on a photo in one call, as named layers (nothing is flattened): type says which. It makes no file: call export_photo afterwards for a download link. Each takes a checkpoint first and puts the image back if anything fails; running it again replaces its earlier layer, and strength 0 removes it. A multi-layer image needs layer. type=background_blur: portrait mode. The server finds the subject with the selection service, copies the photo layer as "Background blur" directly above it, blurs the copy with a live Gaussian blur and hides the blur over the subject with a layer mask (the inverted subject, pulled in 1-2 px from its edge and feathered, so the subject's edge stays the original). strength 0-100 (default 50) sets the blur radius from 0.3% to 2.5% of the image's long side. It leaves the channels "Portrait subject" and "Portrait blur mask" on the image (replacing channels called that); a layer you named "Background blur" yourself is left alone. Known gap: the subject's colours can bleed a little into the blur right at its edge. type=skin: smooth skin for portraits and influencer shots. The server finds the person with the selection service, finds the skin inside them by colour (a YCbCr rule on a small render of the photo, cleaned up), copies the photo layer as "Skin smoothing" directly above it, smooths the copy with a live edge-preserving surface blur plus a faint grain (so the skin keeps some texture) and shows it only through the feathered skin mask. Eyes, lips and hair mostly fall outside the colour rule, and the blur keeps hard edges. strength 0-100 (default 50) sets the copy's opacity from 0 to 85% and its blur radius from 0.25% to 0.6% of the image's long side (at most 6 px, the effect's limit). It leaves the selection channels "Skin subject", "Skin" and "Skin mask" on the image, and replaces channels already called that; a layer you named "Skin smoothing" yourself is left alone (the new one gets another name). Known gaps: skin is found by colour, so skin-toned areas that are not skin (a wooden wall, an orange shirt) inside the person get smoothed too, and very pale, very dark or heavily tinted skin can be missed. For background_blur and skin: if the subject lies on its side or upside down, say which edge its top points toward with subject_up. type=sky: replace the sky. You supply the sky photo in sky (an upload handle from request_upload, or an https:// image URL); no sky images are bundled. The server selects the sky with the selection service (it refuses when less than 3% of the photo is sky), places the sky photo as the layer "New sky" above the photo, scaled to cover the sky's box without distortion, masks it with the feathered sky channel, then nudges the foreground's colour toward the new sky's average colour with live curve filters confined to everything but the sky. strength 0-100 (default 70) scales that nudge: at 100 the foreground moves 25% of the way, and never more than 24 levels in a channel; 0 leaves the foreground alone. It leaves the channels "Sky", "Sky mask" and "Sky foreground" on the image (replacing channels called that); a layer you named "New sky" yourself is left alone. Known gaps: the old sky can show as a thin fringe along fine edges, and the foreground light is not relit.
| Name | Required | Description | Default |
|---|---|---|---|
| sky | No | type=sky only (required there): the new sky photo, "upload:<id>" or an https:// image URL. | |
| type | Yes | Which effect: background_blur, skin or sky. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name; required when the image has more than one layer. | |
| strength | No | How strong the effect is, 0 to 100; 0 removes it. Default by type: background_blur 50, skin 50, sky 70. | |
| subject_up | No | type=background_blur and type=skin only: which edge of the image the subject's head/top points toward, if not the top. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations covering read-only, destructive, and idempotent hints, the description adds rich behavioral context: checkpoint/rollback on failure, layer replacement on re-run, strength=0 removal, channel side effects, layer naming collisions, and known gaps. This goes well beyond what annotations provide and gives an agent confidence about mutating behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the overall purpose but then becomes extremely long, diving into implementation details (YCbCr rules, channel names, exact blur percentages) that an agent may not need for tool selection. It is well-structured by type but likely contains more detail than necessary for efficient invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (three effect types, layer handling, external upload dependency, no output schema), the description is remarkably complete: it covers parameter requirements, side effects, failure recovery, and known limitations. An agent has all information needed to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds substantial meaning beyond schema text—e.g., how strength maps to blur radius, opacity, and curve intensity per type—plus the requirement conditions for `sky`, `layer`, and `subject_up`. This extra semantic depth warrants a 4, though the schema already covers the basic parameter purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Effects on a photo'), resource ('photo'), and output form ('as named layers, nothing is flattened'), immediately distinguishing it from tools that bake or flatten. It also names a required follow-up sibling (export_photo), so an agent can place it correctly in a workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates when each effect type is appropriate (portrait mode, skin smoothing, sky replacement) and states that export_photo is needed for a file. However, it does not explicitly compare itself to sibling effect tools like add_effect or apply_look, leaving some alternative selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_imageAInspect
Place another uploaded photo into an open photo as a NEW LAYER (compositing). source is an upload handle "upload:" from request_upload (or the name of one of your uploads); a built-in sample photo listed by inspect what=uploads also works. Optional x, y, width, height, name and position work as for layer op=create. For a cut-out: place, then select_with_ai target=subject with that layer, then layer_mask op=create from the channel. If the file holds several pictures (a multi-page TIFF), only ONE is placed (not a flattened composite). On this server the placed layer's scaled box must stay within the workspace's pixel limit (less at a higher bit depth), and a photo's layers together within its layer limit. Uploads and open photos belong to this server; a photo opened through another Editmamei connector stays with that connector.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | The new layer's ABSOLUTE horizontal offset in document pixels (not a delta). | |
| y | No | The new layer's ABSOLUTE vertical offset in document pixels (not a delta). | |
| name | No | The new layer's name. Defaults to the source file's own base filename. Every case enforces a unique name, suffixing " 2", " 3", ... if the name is already taken. | |
| image | Yes | Image id, as returned by open_photo. | |
| width | No | Scale the placed layer to this width. With height, stretches to exactly that box. Alone, height is derived to keep the source file's own aspect ratio. Omit both to place at the source file's natural size. | |
| height | No | Scale the placed layer to this height. See width. | |
| source | Yes | "upload:<upload_id>" (the name of one of your uploads also works). | |
| position | No | Index within the target parent's (or top-level) stack, 0 = topmost. | |
| parent_group | No | The group layer_id to insert the new layer into (omit for top-level). |
Output Schema
| Name | Required | Description |
|---|---|---|
| x | No | |
| y | No | |
| name | No | |
| width | No | |
| height | No | |
| layer_id | No | |
| parent_group | No | |
| baked_filters | No | Names of the placed layer's own live filters that were baked into its pixels before placing. Omitted when the source layer had none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only flag it as a writable, non-idempotent, open-world op), the description discloses multi-page TIFF handling (only ONE picture placed), workspace pixel/layer limits that constrain placement, and the server-scoping of uploads versus other connectors. These are non-obvious behavioral constraints an agent could not infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, then details follow in a logical order (source, geometry, cut-out recipe, multi-page caveat, limits). It is dense and long, but nearly every clause carries information; a small amount could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, non-idempotent compositing tool with an output schema already present, the description covers the source contract, geometric defaults, edge cases (multi-page files), workflow integration, and resource limits. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds meaning by mapping x/y/width/height/name/position to the semantics of 'layer op=create' and restating the 'upload:<id>' source format. This cross-references an existing contract rather than merely echoing the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource ('Place another uploaded photo into an open photo as a NEW LAYER') and even parenthetically frames the operation as compositing, which distinguishes it from adjustment/filter siblings. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the source format (upload handle from request_upload, or a built-in sample via inspect what=uploads) and gives an explicit workflow recipe for cut-outs using select_with_ai and layer_mask. It references 'layer op=create' as the semantic model but never states when NOT to use this tool versus those siblings, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
previewARead-onlyIdempotentInspect
Render the photo with its live filters applied and return it as a JPEG so you can look at it. It is fast (about a third of a second at 1024 px). Previews are most of the bytes a session returns: prefer get_histogram for a numeric check (did the tone move?) and use this for spatial questions. region renders a full-resolution crop instead of the whole-photo proxy, which is exact for spatial filters rather than approximate.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| max_px | No | Long-edge cap for the proxy render, in pixels. | |
| region | No | A rectangle in document pixels: {x, y, width, height}. Must lie entirely within the image — a region partly or fully outside it is refused rather than silently clamped. When given, renders a full-resolution crop of just that region (exact for spatial filters, unlike the default whole-image proxy). |
Output Schema
| Name | Required | Description |
|---|---|---|
| proxy | No | |
| width | No | |
| height | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses latency (~1/3 second at 1024px), the byte/context cost ('previews are most of the bytes a session returns'), the proxy-vs-exact tradeoff, and that out-of-bounds regions are refused rather than clamped. These are exactly the traits an agent needs to budget calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core action, then cost, then routing, then the region nuance. No sentence is filler; the latency and byte-cost details are load-bearing for call budgeting.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the return type needn't be described further, and the description still covers performance, cost, exactness, and refusal behavior. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3, but the description adds real meaning: region produces an exact full-resolution crop rather than the approximate whole-image proxy, and the 1024px latency figure gives max_px practical weight. It does not restate the coordinate syntax, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — render the filtered photo as a JPEG — and explicitly frames it as the visual counterpart to get_histogram. An agent can distinguish it from numeric/sibling inspection tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between alternatives: prefer get_histogram for a numeric check, use this for spatial questions, and use region when an exact full-resolution crop is needed. It names both the alternative and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_shotADestructiveInspect
Turn a product photo into a marketplace-ready listing image in one call. The server finds the product, cuts it out, frames it at the marketplace's size and shape, puts it on a background, adds a soft ground shadow, gives it digital-first color (screens and a white page make products look muted) and exports a JPEG (a PNG when the background is transparent). It takes a checkpoint first and puts the image back if anything fails or no product is found. The image must have a single layer. Marketplaces: amazon (2000x2000; main image: pure white background, product at least 85% of the frame.) etsy_square (2000x2000; Etsy recommends listing photos at least 2000 px on the short side.) etsy_landscape (2700x2025; Etsy recommends listing photos at least 2000 px on the short side.) shopify (2048x2048; square product images up to 2048 x 2048 px zoom well in most themes.) ebay (1600x1600; eBay recommends at least 1600 px on the longest side for zoom.) background: white (default), transparent (a PNG with no background), a color like #f3e9dc, gradient (top to bottom, from gradient_top, default white, to gradient_bottom, default a 15% darker shade of the top), or upload: (another photo as the background); amazon allows only white. backdrop: flat (default) or studio (a soft darker falloff, 15% darker at the corners, white or color backgrounds only). shadow: on by default (off for amazon). color: digital (default) or true (no color change), color_strength 0-100 (eased automatically for a product whose colors are already strong, so they don't clip). fill: the product's share of the frame's limiting side, 0.5-0.95, default 0.85.
| Name | Required | Description | Default |
|---|---|---|---|
| fill | No | The product's share of the frame's limiting side. | |
| color | No | digital: a little more contrast and color for screens. true: no color change. | digital |
| image | Yes | Image id, as returned by open_photo. | |
| shadow | No | Soft ground shadow. Default: on (off for amazon). | |
| backdrop | No | studio adds a soft darker falloff toward the corners. | flat |
| background | No | white, transparent, gradient, #rrggbb, or upload:<id>. | white |
| marketplace | Yes | Which marketplace. | |
| gradient_top | No | background gradient only: the top color, #rrggbb. Default white. | |
| color_strength | No | How much digital color at most, 0 to 100. A product whose colors are already strong gets less, and the result says so. | |
| gradient_bottom | No | background gradient only: the bottom color, #rrggbb. Default a 15% darker shade of the top. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, openWorldHint=true), the description discloses real behavior: it takes a checkpoint first and restores the image on failure or when no product is found, it exports JPEG (PNG only when the background is transparent), and color_strength is auto-eased so strong colors don't clip. The single-layer precondition and amazon-specific overrides further reduce surprise.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with a one-sentence summary, then dense but information-bearing clauses; almost every phrase carries a default, range, or constraint. It is a long run-on paragraph rather than a structured list, which costs a point but wastes little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, no-output-schema tool, the description covers the pipeline, output format, per-marketplace sizing, all option domains, defaults, and failure/rollback behavior. Nothing essential for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not: amazon forces a white background and disables shadow, gradient_bottom defaults to 15% darker than gradient_top, 'upload:<id>' supplies another photo as background, and fill is bounded 0.5-0.95. These constraint interactions justify a bump above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource+outcome ('Turn a product photo into a marketplace-ready listing image in one call') and then enumerates the full pipeline it performs (find, cut out, frame, background, shadow, color, export). An agent can distinguish this from generic siblings like export_photo or crop_for_platform without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives rich selection context: per-marketplace dimensions and constraints, 'amazon allows only white', shadow auto-off for amazon, and the 'image must have a single layer' precondition. It does not, however, explicitly route the agent away from the visually similar siblings (crop_for_platform, export_photo) or say when this tool is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recolorAInspect
Show one object (a product, a garment) in several colors, and get one download link per color, in one call. Say what the object is with word (e.g. "shirt"; the server finds it), box [x1,y1,x2,y2] in image pixels, or channel (an existing selection channel, e.g. from select_with_ai target=object). For each color the server slides the object's tones toward that color's lightness (shading and highlights are kept), tints it with LCh Color through the object's mask, exports it, and removes its layers again, so the document is left as it was. A big jump in lightness (white to navy, black to near white) also moves the curve's black or white point, keeping at least a quarter of the tonal range so the object's shading survives; a jump still out of reach is reported with the lightness reached. Each variant also reports the object's measured average color and how far that is from the one asked for. Needs a single-layer image, or name the layer with layer. names optionally sets each file's name. The image's active selection is replaced while it works. If time runs short it stops and returns the colors made so far; call again with the rest. The links expire.
| Name | Required | Description | Default |
|---|---|---|---|
| box | No | The object's box [x1, y1, x2, y2] in image pixels. | |
| word | No | What to recolor, e.g. "shirt" or "sofa". Letters, digits, spaces. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Name of the layer that holds the object; required when the image has more than one layer. | |
| names | No | Optional file name per color (same order), e.g. ["navy", "sage"]. | |
| colors | Yes | 1 to 8 target colors, #rrggbb. | |
| format | No | File format of each variant. | jpg |
| channel | No | An existing selection channel that holds the object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it details the internal pipeline (tone slide, LCh tint, mask export, layer removal so the document is left as it was), the lightness-point fallback rule, that the active selection is replaced, that links expire, and the partial-results-on-timeout behavior. Annotations are non-destructive and non-read-only, and the description confirms the document is restored.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, with purpose and output stated first, then mechanism, then caveats (layer requirement, selection replaced, timeout, link expiry). Almost every sentence carries new information, though the mechanism sentence is long and can be skimmed poorly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description fully compensates: it describes the per-color link, the measured average color and its distance from the target, the fallback reporting, and failure/timeout semantics. Nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: it frames `word`/`box`/`channel` as three alternative ways to identify the object, explains that the server resolves `word`, and that `names` maps positionally to colors. It does not clarify `format` or parameter interaction beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Show one object in several colors, and get one download link per color, in one call'), plus the concrete output shape. It is clearly distinguishable from siblings like apply_look or select_with_ai.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real prerequisites (needs a single-layer image, or name the layer), points to the producing sibling for `channel` (select_with_ai target=object), and explains the retry path when time runs short. It does not explicitly contrast itself with color-adjacent siblings such as apply_look or product_shot, so it falls short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_objectAInspect
AI: removes an object and fills in the background (AI). Say what to remove with word (e.g. "dog", "sign"; the server finds it), box [x1,y1,x2,y2] in image pixels, or channel (an existing selection channel, e.g. from any selection tool). The server grows the object's mask a little (grow_px, default about 0.5% of the object's long side, at most 50), cuts out a square of the photo around it at full resolution, has the AI fill the hole, and adds the result as a NEW layer "Removed: ..." directly above the layer it was cut from (the top of the stack when no layer is given), covering only the filled area. Nothing else is changed: delete that layer to undo. Check the result with preview or compare. The AI is shown a square of the photo around the object (about 2x its long side, at most 4000 px), so large objects work. One is refused before anything is sent when it is longer than that square allows, or when its hole would be more than a quarter of what the AI works on (an object that fills most of the photo): select a smaller part, or remove it in pieces. Takes about 5 to 15 s (longer the first time). Do NOT use for small blemishes or dust (retouch spot_heal is faster).
| Name | Required | Description | Default |
|---|---|---|---|
| box | No | The object's box [x1, y1, x2, y2] in image pixels. | |
| word | No | What to remove, e.g. "dog" or "red car". Letters, digits, spaces. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Work on this layer alone (and add the fill directly above it), not the whole picture. | |
| channel | No | An existing selection channel that holds the object; it is left untouched. | |
| grow_px | No | Pixels to grow the object's mask before filling, so its edge and shadow go too. Default: about 0.5% of the object's long side. | |
| layer_id | No | Layer id (takes priority over `layer`). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly=false, destructiveHint=false, idempotent=false, openWorld=true. The description goes well beyond: it discloses that a NEW layer is created, that deleting that layer undoes the operation (non-destructive in practice, consistent with destructiveHint=false), the 5-15s runtime, and two pre-flight refusal conditions (object larger than the AI's square, or hole exceeding a quarter of the AI's working area).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded: purpose, target specification, mechanics, undo, verification, limits, and exclusions in that order. It is a long single block, and a couple of clauses (mask-growth arithmetic, preview/compare) could be tightened, but essentially every sentence carries decision-relevant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no output schema, the description covers everything an agent needs: how to target the object, where the result lands, how to undo, how long it takes, failure/refusal conditions, and when not to use it. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds interaction semantics the schema cannot: the three target-specification routes are alternatives, the server resolves `word` itself, and the new layer is placed directly above the cut layer 'the top of the stack when no `layer` is given'. It also clarifies grow_px's default rationale (0.5% of long side, max 50).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('removes an object and fills in the background') and immediately names the AI-based mechanism, distinguishing it from siblings like retouch and fill. It also names the alternative (retouch spot_heal) for the small-blemish case, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states explicitly how to specify the target (word/box/channel), when to prefer each, and a clear negative case: 'Do NOT use for small blemishes or dust (retouch spot_heal is faster).' It also tells the agent how to verify the result (preview or compare), which is genuine usage guidance rather than restated mechanics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_uploadAInspect
Get a one-time way to send photos from the user's device to this server. Photos the user already sent are listed by inspect (what='uploads'), so a photo already there needs no new link. The result leads with page_url, a web page the user opens, from a phone camera roll or a browser; it works in every client. It also carries a curl command that uploads a file from a shell that can reach this host. On claude.ai with code execution on, a photo attached in chat is usually also a file under /mnt/user-data/uploads. A sandbox that blocks this host answers with a 403 or "host not allowed" every time, and the result's if_curl_blocked says how the user can allow it. Nothing announces a page upload: once the user has sent it, it shows up in inspect (what='uploads') as upload:<id>. A curl upload's JSON reply carries upload_id (or an uploads list). open_photo opens either with source "upload:". One link takes several photos: up to 10, and it closes 5 minutes after its last photo arrives and expires in 15 minutes; nothing else limits links (asking for another cancels none). The curl takes one file per command. An upload it produces can be opened from any of your signed-in connections, not only this one. Limits per photo: 40 MB and a pixel limit that depends on the workspace size (overview lists it). RAW camera files up to 100 MB are accepted too; they open on the larger workspace. For an image already online, pass its https:// URL to open_photo instead. Uploads and open photos belong to this server; a photo opened through another Editmamei connector stays with that connector.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| curl | No | |
| token | No | |
| page_url | No | |
| expires_at | No | |
| upload_url | No | |
| if_curl_blocked | No | |
| cancelled_link_minted_at | No | |
| cancelled_link_token_prefix | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only set readOnlyHint=false and idempotentHint=false; the description goes far beyond them, disclosing one-time link semantics, the 10-photo cap, the 5-minute idle close / 15-minute expiry, 40 MB and RAW 100 MB limits, the curl 403/'host not allowed' path with `if_curl_blocked`, and cross-connection visibility. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose, and almost every sentence carries actionable detail (limits, curl fallback, inspect cross-reference). However, it is dense and long for a zero-parameter tool, and the `inspect`(what='uploads') reference is repeated, which slightly dilutes conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description needn't explain returns, yet it still clarifies the key result fields (page_url, curl, if_curl_blocked, upload_id). Combined with the limits and expiry rules, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so per the rubric the baseline is 4; there is nothing for the description to disambiguate in the schema. The description's detail about output fields is not input-parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get a one-time way to send photos from the user's device to this server.' It then distinguishes itself from siblings by naming `inspect` (what='uploads') for already-sent photos and `open_photo` for online images, so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when NOT to call it: 'a photo already there needs no new link' (use `inspect`) and 'For an image already online, pass its https:// URL to `open_photo` instead.' It also covers the sandbox-blocked case and cross-connection opening, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resizeADestructiveInspect
Scale the whole photo up or down. This is not a crop (use crop). Give width+height to stretch to an exact box, one alone to keep the aspect, or long_edge to scale by the longer side. IRREVERSIBLE in this session: there is no undo, so make a checkpoint first when in doubt. REFUSES when the photo has a masked filter, or any filter made outside Editmamei: resize before adding masked filters, not after. A large target can take tens of seconds; if the call times out the editing session restarts and unsaved work (filters, masks, any other open photo) is lost, so make a checkpoint before an aggressive resize. On this server the result must stay within the workspace's pixel limit.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| width | No | Target width, px. With height, stretches to exactly that box. Alone, height is derived to keep aspect. Capped at 30000 px/side and 250 MP total (a hard limit). | |
| height | No | Target height, px. See width. | |
| long_edge | No | Scale so the longer side lands here, preserving aspect. Use this OR width/height. |
Output Schema
| Name | Required | Description |
|---|---|---|
| width | No | |
| height | No | |
| effect_update_failures | No | Names of effect filters (position/direction/size-dependent ones tracked through geometry changes — a center, an angle, an offset, or a size-dependent blur radius under resize) whose own params could not be updated for this transform (a live update failure) -- they were restored to their OLD values in manage_filters's own ledger (guaranteed), and the live render was also asked to restore those same OLD values (best effort — it can, rarely, also fail). Omitted when every filter updated cleanly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint, non-idempotent) by disclosing that the operation is irreversible with no undo, that it refuses with masked/foreign filters, that large targets can take tens of seconds, and that a timeout restarts the session and loses unsaved work. It also notes the workspace pixel-limit constraint on the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and sibling distinction, then layers refusal conditions and timeout risk in a logical order. Efficient per sentence, though the checkpoint advice appears twice ('when in doubt' and 'before an aggressive resize'), a minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers everything else an agent needs for a destructive, timeout-prone mutation: reversibility, refusal conditions, ordering constraints, and the workspace pixel limit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the width/height/long_edge descriptions already carry the semantics. The description restates the same rules (width+height stretches, one alone keeps aspect, long_edge targets the longer side) without adding new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Scale the whole photo up or down') and immediately distinguishes itself from the sibling 'crop' by name. An agent can tell resize apart from crop, canvas_size, and transform_image without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative to avoid ('not a crop, use crop'), spells out the exact parameter combinations for the three scaling modes, and states explicit preconditions and refusals (masked filters, filters made outside Editmamei). It even prescribes the ordering: resize before adding masked filters, not after.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retouchADestructiveInspect
Heal or clone pixels with a round brush. method heal paints a stroke that samples texture from elsewhere and blends it into its surroundings, for blemishes, dust and scratches; clone paints a stroke that copies the sampled pixels exactly; spot_heal takes round spots {x, y, radius} and picks each one's source automatically, from the nearby area whose brightness and texture best match the ring around the spot. Everything is in photo pixels. By default (target retouch_layer) the paint lands on a "Retouch" copy of the layer directly above it, shown only where you painted, so the original and the picture everywhere else stay untouched; later calls reuse that copy while it stays directly above the layer it was made from. target in_place paints the layer itself, and is required for a layer that is below 100% opacity, not in Normal mode, or has a layer mask; a layer with semi-transparent pixels also shows its original through the copy, so use in_place there. The current selection is kept and does not clip the retouch. Refuses layer groups, text layers, locked or hidden layers, indexed photos, and any point or spot outside the layer. A call has a work limit (a long stroke with a big brush, or many large spots): split it into several calls or use a smaller brush. Do NOT use for removing whole objects (use remove_object for those); a stroke or spot only blends in texture at the size of the brush. Returns layer_id, layer_name, created_layer, painted_bbox [x, y, w, h] and, for spot_heal, each spot's chosen source offset and score (lower is a closer match). To remove a whole object, use remove_object.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Name of the pixel layer to retouch. Defaults to the selected layer, or the topmost layer if none is selected. | |
| spots | No | spot_heal: [{x, y, radius}] in image pixels (1-50 spots, radius 1-500). The source for each is picked from 8 directions at about 2.2x and 3.5x the radius, by how closely its brightness and texture match the ring around the spot. Every source is chosen before anything is painted, so a spot with no usable source fails the whole call unchanged. | |
| method | Yes | 'heal': paint a stroke that blends the sampled texture into its surroundings (blemishes, dust, scratches). 'clone': paint a stroke that copies the sampled pixels exactly. 'spot_heal': round spots, each healed from an automatically chosen nearby source. | |
| points | No | heal / clone: the stroke as [[x, y], ...] in image pixels (1-500 points), every one inside the layer. | |
| source | No | heal / clone: the image-pixel point to sample for points[0]; the rest of the stroke samples at the same offset. Give this OR source_offset. | |
| target | No | 'retouch_layer': paint on a 'Retouch' copy directly above the layer (made on the first call, reused while it stays directly above the layer it was made from); needs a Normal mode, 100% opacity layer without a layer mask. 'in_place': paint the layer itself. | retouch_layer |
| hardness | No | heal / clone: brush edge hardness, 0 soft to 1 hard. Default 0.5 for heal, 0.8 for clone. Not allowed with spot_heal. | |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. | |
| brush_size | No | heal / clone: brush diameter in pixels. spot_heal sizes its own brush. | |
| source_offset | No | heal / clone: sample this many pixels from each stroke point (source = point + offset). Give this OR source. | |
| source_layer_id | No | clone only: sample from this pixel layer instead of the one being painted. The source point plus the stroke must lie inside it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spots | No | |
| method | No | |
| target | No | |
| hardness | No | |
| layer_id | No | |
| brush_size | No | |
| layer_name | No | |
| painted_bbox | No | |
| created_layer | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructive/open-world/non-idempotent; the description adds the real behavioral context: a 'Retouch' copy is created above the layer on first call and reused while it stays adjacent, selection is kept and does not clip, and the tool refuses groups, text layers, locked/hidden layers, indexed photos and out-of-layer points. It also warns about a per-call work limit and how to split calls, which annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well front-loaded: method semantics first, then target/placement, then refusals, then limits. The object-removal warning is stated twice (mid-paragraph and again as the final sentence), which is redundant for a description this long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, nested-object, destructive tool, the description covers placement semantics, failure modes, work limits and recovery advice; the output schema exists and the return-value sentence is just a convenience pointer. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding cross-parameter meaning, notably the `target` decision rules tied to layer opacity/mode/mask and the fact that all coordinates are photo pixels and the source is chosen before any paint. Minor gap: `hardness`, `brush_size` and `layer_id` precedence are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb-plus-resource with the three methods (heal, clone, spot_heal) defined inline and differentiated from each other. It also explicitly distinguishes itself from the sibling `remove_object`, so an agent can route between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use each method (blemishes/dust vs exact copy vs auto-sourced spots), when `in_place` is required (below 100% opacity, non-Normal mode, layer mask, semi-transparent pixels), and gives an explicit exclusion: 'Do NOT use for removing whole objects (use `remove_object`)'. Alternatives and boundaries are named, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_stepsADestructiveInspect
Run several edits in one call. Give an ordered list of steps, each {tool, args} naming a tool you already have (1 to 25 steps). These can't be steps; call them on their own: run_steps, apply_look, crop_for_platform, product_shot, recolor, remove_object, photo_effect, make_carousel, make_story, make_meme, make_grid, make_sticker, my_looks, batch. Each step sees the image as the one before left it, and keeps the time limit its tool has on its own; the whole sequence has a time budget that is checked before each step starts. Use it when you already know the steps and do not need to look in between; for exploratory work, call the tools one at a time. on_error: stop (default) halts at the first failing step; continue records the failure and runs the rest; rollback takes a checkpoint first and, on a failure, restores it and checks the restore worked (the image then has a NEW id, given in the result). Rollback is refused up front if any step is one of: open_photo, new_canvas, close_photo, export_photo, checkpoint, request_upload, and needs every step to name the same image. return: summary (default) gives one line per step plus the last step's full result; full gives every step's full result. If the last step returns a preview image, it is shown with the result; earlier steps' images are dropped. The whole sequence counts as one call.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | The steps, in order. | |
| return | No | How much of each step's result to return. | summary |
| on_error | No | What to do when a step fails. | stop |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses per-step time limits, a sequence-wide time budget checked before each step, the three on_error strategies with rollback checkpoint/restore behavior and new image ID, rollback refusal conditions, and return-mode behavior including preview image handling. This is unusually detailed behavioral context for a destructive, open-world tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and constraints, and nearly every sentence earns its place given the tool's complexity. It is dense and could be more scannable with formatting, but there is little redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a complex compositional tool, the description covers return modes, error handling, time limits, image ID changes, and preview behavior. An agent has enough information to invoke run_steps correctly in normal and failure cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning beyond the enum labels: it explains the effects of stop/continue/rollback, the checkpoint and new image ID behavior, and how summary versus full affects returned results. That is meaningful semantic expansion for the on_error and return parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Run several edits in one call." It immediately clarifies the mechanism as an ordered list of steps, each naming a tool the agent already has, and distinguishes itself from the many sibling tools that cannot be composed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit rule: use it when you already know the steps and do not need to look in between, and for exploratory work call tools one at a time. It also names the sibling tools that cannot be steps, so the agent knows exactly which alternatives to use directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selectADestructiveInspect
Make a selection, saved as a NAMED channel (no live selection persists between calls): rectangle, ellipse, polygon, colour range, magic wand, layer transparency, gradient, or another channel. Combine with add, subtract or intersect by reusing a name. Use the channel as add_adjustment's or add_effect's mask when creating a filter, or layer_mask for a real layer mask. Make selections after straighten, resize and crop.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | rectangle/ellipse/magic_wand, or color_range's sample point: left edge or point x, in image pixels from the canvas origin, also when `layer` names a layer that sits at an offset (never counted from that layer's own corner). | |
| y | No | rectangle/ellipse/magic_wand, or color_range's sample point: top edge or point y, in image pixels from the canvas origin, also when `layer` names a layer that sits at an offset (never counted from that layer's own corner). | |
| cx | No | gradient_radial: center x, document pixels. Default the image's own center. | |
| cy | No | gradient_radial: center y, document pixels. Default the image's own center. | |
| x1 | No | gradient_linear: start point x, document pixels. Default 0. | |
| x2 | No | gradient_linear: end point x, document pixels. Default the image's width. | |
| y1 | No | gradient_linear: start point y, document pixels. Default 0. | |
| y2 | No | gradient_linear: end point y, document pixels. Default 0. | |
| mode | Yes | rectangle/ellipse: x, y, width, height. polygon: points (>=3 [x,y] pairs). color_range: every pixel near `color` (hex) or the colour at a sample point x,y, anywhere in the image. magic_wand: the contiguous region around x,y. alpha: a layer's opaque pixels. channel: copy another saved selection (`source`). gradient_linear: a ramp from (x1,y1) to (x2,y2), default the full image width. gradient_radial: a ramp from full effect at the center (cx,cy) fading to none at radius, default centered at the image's own center with radius = half the shorter side. | |
| name | No | Channel to save the selection in (replaced). | Selection |
| color | No | color_range: a hex colour like "#c0392b". | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. alpha: which layer. color_range/magic_wand: only matters when sample_merged:false (otherwise the visible composite is sampled, and which layer this names makes no difference to the result). | |
| width | No | rectangle/ellipse: width, document pixels. | |
| height | No | rectangle/ellipse: height, document pixels. | |
| invert | No | Applied to the NEW shape alone, before any `combine`. rectangle/ellipse/polygon/color_range/magic_wand/alpha/channel: invert the selection. gradient_linear/gradient_radial: swap which end is black vs white. | |
| points | No | polygon: 3-10,000 [x, y] pairs, document pixels. | |
| radius | No | gradient_radial: radius, document pixels. Default half the shorter image side. | |
| source | No | mode=channel: the saved selection to copy. | |
| combine | No | Combine with the existing saved selection of the same `name` (like shift/alt in a GUI). `invert`/`feather_px` apply to the NEW shape alone, before it is combined. | replace |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. alpha: which layer. color_range/magic_wand: only matters when sample_merged:false. | |
| threshold | No | color_range/magic_wand tolerance, 0-255. | |
| feather_px | No | Feather radius in document pixels, applied to the NEW shape alone before any `combine`. Refused (nonzero) on gradient_linear/gradient_radial -- already a continuous ramp, nothing to feather. | |
| sample_merged | No | color_range/magic_wand: sample the visible composite. false samples the one named/selected layer's own raw pixels instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| channel | No | |
| fraction | No | |
| selected_pixels | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotence, so the safety profile is covered. The description adds real context beyond them: no live selection persists between calls and the result lives in a named channel that later combine operations reuse. It does not explicitly warn that an existing channel of the same name is overwritten (the schema says this).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense, front-loaded sentences with no filler; the channel model comes first, then combining, then downstream use, then ordering. The trailing 'Make selections after straighten, resize and crop' is slightly abrupt but earns its place as sequencing guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 24-parameter, 10-mode tool with an output schema, the definition covers purpose, mode landscape, combination semantics, downstream consumption and ordering. Return values are handled by the output schema, and the only real gap is explicit routing away from sibling selection tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the per-parameter docs are unusually rich (mode semantics, defaults, coordinate origins), so the schema carries the burden. The prose adds mode-level framing but no parameter detail beyond what the schema already states, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Make a selection, saved as a NAMED channel') and enumerates the supported modes, so the agent knows exactly what the tool produces: a saved channel, not a live selection. It stops short of naming sibling alternatives such as select_with_ai or modify_selection, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete usage conditions: combine via add/subtract/intersect by reusing a name, consume the channel as add_adjustment/add_effect's mask or layer_mask, and sequence it after straighten/resize/crop. It does not say when to prefer this over select_with_ai or modify_selection, so the 'vs alternatives' half is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selection_previewARead-onlyInspect
See a saved selection: an overlay (red over what is NOT selected) or the mask itself, which shows whether a selection caught what was meant before it is used.
| Name | Required | Description | Default |
|---|---|---|---|
| image | Yes | Image id, as returned by open_photo. | |
| style | No | overlay: the image with red over what is NOT selected. mask: white = selected. | overlay |
| max_px | No | Long-edge cap for the proxy render, in pixels. | |
| channel | Yes | The saved selection to show. |
Output Schema
| Name | Required | Description |
|---|---|---|
| width | No | |
| height | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value by explaining the visual semantics (red = not selected, mask = white for selected), but says nothing about the proxy render, size limits, or why it is marked non-idempotent. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted clauses; the purpose and both modes are established immediately. It could be marginally tighter but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the read-only safety profile. The description is complete for a preview tool; the only minor gap is not clarifying the non-idempotent hint or the max_px render cap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum descriptions already define overlay vs mask, so the schema carries the load. The description restates the same overlay/mask contrast but adds no new syntax, defaults, or format detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('See a saved selection') and immediately names the two render modes, so the agent knows exactly what it produces. It distinguishes itself from siblings like modify_selection or the generic preview by scoping to a *saved* selection, though it does not explicitly name an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'shows whether a selection caught what was meant before it is used' implies the verification-before-apply use case, which is useful context. However, there is no explicit when-to-use/when-not-to-use rule or named alternative, leaving the agent to infer the workflow position.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_with_aiADestructiveIdempotentInspect
AI: select into a NAMED channel, soft-edged. target says what: "subject" the main subject (person, animal, product), "sky" the sky, "object" one object you point at. With layer, selects that layer's own content: for a cut-out, place the photo as a layer, select its subject, then layer_mask op=create from the channel. target=subject only: if the subject is lying on its side or upside down in the photo, set subject_up to the edge its head/top points toward (the model is far more accurate on an upright subject); leave it at top otherwise. target=object only: give a box [x1,y1,x2,y2] in document pixels around it (from find_objects, or your own), or a word to use find_objects's best candidate (the result says which box was used; look at the selection to check it); a second object on the same image is fast, and select mode=channel adds objects together. target=sky: use the channel as add_adjustment's mask for sky-only grades, or invert it with modify_selection. name is the channel to write (replaced); it defaults to Subject, Sky or Object by target. Takes ~5-10 s.
| Name | Required | Description | Default |
|---|---|---|---|
| box | No | target=object only: [x1,y1,x2,y2] in document pixels around the object. | |
| name | No | Channel to write (replaced). Default: Subject, Sky or Object, by target. | |
| word | No | target=object only: alternative to `box`: what to select, e.g. "suit". | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Run on this layer alone (e.g. a placed photo), not the whole image. | |
| target | Yes | What to select: subject, sky or object. | |
| layer_id | No | Layer id (takes priority over `layer`). | |
| subject_up | No | target=subject only: which edge of the image the subject's head/top points toward (default top). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructive=true, idempotent=true, openWorld=true and readOnly=false, so the write/replace profile is largely covered structurally. The description adds genuinely useful context beyond that – the named channel is replaced, output is soft-edged, runtime is ~5-10 s, a second object is faster, and select mode=channel accumulates objects – but it does not describe recovery of a replaced channel or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and essentially every clause carries operational information (mode-specific rules, defaults, fallbacks), so there is little filler. The tradeoff is that it is delivered as one dense run-on paragraph with mixed topics, which slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With eight parameters, three modes and no output schema, the description covers the full operational surface: per-target rules, layer handling, defaults, fallback paths, and even a hint at result feedback. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, which sets the baseline at 3. The description nonetheless adds real meaning beyond the schema: how word resolves through find_objects, that the result reports which box was used, the default naming rule (Subject/Sky/Object by target), and that subject_up only applies to target=subject.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening states a specific verb and resource: an AI-driven selection written into a NAMED channel with soft edges. It then enumerates the three distinct modes (subject, sky, object) and what each selects, so an agent can immediately tell this apart from find_objects or modify_selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance per target, including the layer workflow (place photo, select subject, then layer_mask op=create), the sky workflow (use as add_adjustment mask or invert via modify_selection), and box-vs-word selection for objects. It names concrete alternative tools and the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusARead-onlyIdempotentInspect
Check that the editing session is up. It starts the session on the first call, which usually takes a few seconds; the very first launch can take a few minutes, and then the result says starting: true instead of failing (the session is usually ready about 30 seconds later). Read-only. It never returns an error: a failed or still-starting connection is reported with connected: false and a message.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| starting | No | Present and true only when the session is still on its very first launch — call status again in about 30 seconds. |
| connected | No | |
| open_images | No | |
| session_state | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnlyHint, openWorldHint, idempotentHint); the description goes well beyond them with latency expectations (seconds on first call, minutes on first launch), the `starting: true` non-failure state with a ~30 second ready window, and the guarantee that it never raises an error but reports `connected: false` plus a message. These are exactly the behavioral traits an agent needs to avoid mis-handling startup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information is front-loaded (what it does, then timing, then error semantics), and every sentence carries real content. The second sentence is long and stacks several clauses, which slightly hurts scannability, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, yet the description still pre-empts the two states an agent will actually encounter (`starting: true`, `connected: false`). Combined with annotations covering safety and idempotency, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. The description correctly adds no parameter noise; schema coverage is 100% and there is nothing further to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Check that the editing session is up.' That purpose is unique among the siblings, all of which are editing operations (crop, retouch, export_photo), so an agent can immediately tell this is the connectivity/session probe rather than a content mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage by explaining that the first call starts the session, which signals this should be called before dependent editing tools, but it never states that explicitly nor names what to do on `connected: false`. The guidance is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
textAInspect
Create a live, editable text layer or restyle one, chosen with op (create, set_content, set_font, set_color, set_alignment, set_box), with an optional fixed box that wraps the text and a fit option. create adds a layer at x / y with text, font_size in points and optional font_name, red / green / blue and alignment; it reports layer_id, name, bounds, the photo's ppi and the font size in pixels. The set_* ops change the text layer named by layer_id or layer (a non-text layer is refused). Fonts accept a family ("Inter") or a full name ("Inter Bold"), case-insensitive; a miss is refused with the closest installed names (list them with inspect what=fonts). Text is capped at 2000 characters, and a layer that would render past the size limit is refused and leaves the photo unchanged. Alignment is LEFT, CENTER, RIGHT or FULLYJUSTIFIED only. box {width, height?} (create, set_box) fixes the text box so text wraps at width; fit shrinks the size to approximately the largest size at which the wrapped text fits a box with both sides; the result then carries box and, for fit, fitted and fit_probes. Text sits at the top of the box (there is no vertical alignment). There is no undo in this session: checkpoint first when in doubt.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | create only: the layer's left edge in document pixels. | |
| y | No | create only: the layer's top edge in document pixels. | |
| op | Yes | create: a new text layer at the top of the stack with `text` at `x`/`y` (default 100,100) and `font_size` (default 24), optionally with font_name, red/green/blue and alignment. set_content: replace the text with `text`. set_font: set `font_name` (optionally `font_size`). set_color: set red/green/blue. set_alignment: set `alignment`. set_box: put the layer in a fixed `box` (re-wrapping its text). The set_* ops act on the text layer named by `layer_id` or `layer`. | |
| box | No | create, set_box: a fixed text box {width, height?} in image pixels (each side 1 to 30000, area within the text-box cap: 64 MP at 8-bit, 32 MP at 16-bit, 16 MP at 32-bit). The text wraps at `width` (newlines in the text are kept) and is placed at the top of the box; there is no vertical alignment, so a taller box leaves the space below. Omit `height` and the layer grows to the wrapped text's height. The box survives later set_content / set_font / set_alignment edits. Emoji and some scripts depend on installed fonts and may render as empty boxes. | |
| fit | No | create, set_box: with a `box` that has both width and height (at most 16 MP), shrink the text to approximately the largest size (at most font_size, or the current size for set_box) at which the wrapped text fits inside the box, searched in at most 12 trial renders. A word wider than the box counts as not fitting. The result reports `fitted`: false when even min_size overflows (the text is left at min_size). | |
| red | No | Text colour red, 0-255. red, green and blue go together. | |
| blue | No | Text colour blue, 0-255. | |
| text | No | create: initial text. set_content: the new text, replacing the existing text. At most 2000 characters. For a line break, put a newline character in the string (not a backslash followed by n). | |
| green | No | Text colour green, 0-255. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | set_*: name of the text layer to change. Ignored when layer_id is given. Not used by create. | |
| layer_id | No | set_*: id of the text layer to change (create reports it; inspect flags text layers with is_text_layer). Takes priority over `layer`. Not used by create. | |
| min_size | No | fit only: the smallest font size to try, in pixels (default 8). | |
| alignment | No | Text alignment: LEFT, CENTER, RIGHT or FULLYJUSTIFIED (the justified-with-last-line variants are refused). In a box, alignment applies within the box width. | |
| font_name | No | Font family ("Inter", "Open Sans") or full name ("Inter Bold"), case-insensitive. create: omit for a default sans. A name that matches nothing is refused with the closest installed names; inspect what=fonts lists them all. | |
| font_size | No | Font size in points, 1 to 1296, converted to pixels with the image resolution. create: initial size (default 24). set_font: new size (omit to keep the current size). |
Output Schema
| Name | Required | Description |
|---|---|---|
| box | No | create / set_box with a box: the resulting box in pixels. |
| ppi | No | The image's resolution. |
| font | No | |
| name | No | |
| text | No | Capped at 200 characters for reporting. |
| color | No | |
| bounds | No | |
| fitted | No | fit only: false when even min_size overflows the box. |
| layer_id | No | |
| alignment | No | |
| font_size | No | Points. |
| fit_probes | No | fit only: trial renders used (at most 12). |
| has_markup | No | |
| fit_seconds | No | fit only: time the search took. |
| text_length | No | |
| font_size_px | No | The font size in pixels at the image resolution (the height of a line). |
| text_truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/open-world profile; the description adds substantial non-obvious behavior: the 2000-character cap, that an oversized layer is refused and leaves the photo unchanged, that font misses are refused with closest matches, that fit searches at most 12 trial renders and can return `fitted: false`, and that there is no undo in the session. It also discloses caveats such as emoji/script fallback and the absence of vertical alignment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads purpose and op routing, and nearly every sentence carries operational detail rather than filler. It is delivered as one dense block and repeats a few facts already in the schema (the 2000-character cap, the alignment values), which slightly blunts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, nested-object, op-dispatched tool, the description covers op selection, box/fit interaction, refusal conditions, layer targeting precedence, and session-level caveats, and an output schema exists so return shapes need not be fully restated. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description earns above that by clarifying cross-parameter semantics the schema alone doesn't convey (font_size is in points and converted using ppi, `layer` is ignored when `layer_id` is given, `fit` requires a box with both sides, min_size bounds the search). It also flags that the justified-with-last-line enum members are refused, which the enum list alone would not reveal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Create a live, editable text layer or restyle one') and enumerates the op values that select each behavior. This clearly separates it from siblings such as `layer`, `transform_layer`, `add_adjustment` and `make_meme`, which handle non-text layers or templated text. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the create-vs-set_* split, that set_* needs `layer_id`/`layer` and refuses non-text layers, that unknown fonts are refused, and that `checkpoint` should be run first when in doubt. It also routes to `inspect what=fonts` as an alternative for listing fonts. It stops short of saying when to prefer `text` over neighbouring layer tools, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transform_imageADestructiveInspect
Rotate or flip the whole photo: op 'rotate' (any degrees, so you can straighten, plus expand) or 'flip' (orientation horizontal or vertical). IRREVERSIBLE in this session: there is no undo, so make a checkpoint first when in doubt. REFUSES when the photo has a masked filter, or any filter made outside Editmamei: straighten and flip before adding masked filters, not after (crop is the one geometry change that is always safe afterward). A rotate by anything other than exactly 0/90/180/270 degrees is also refused while a position- or direction-dependent filter is present, since only a right angle keeps such a filter locked to the content: rotate at a right angle instead, or delete the filter (manage_filters op=delete) and re-add it afterwards. expand resizes the canvas to the rotated content's new bounds (like 'reveal all'); without it the corners fall outside the canvas and are cropped. Rotating a very large photo can take tens of seconds; if it times out the editing session restarts and unsaved work (filters, masks, any other open photo) is lost, so make a checkpoint first. With expand the rotated canvas must stay within the workspace's pixel limit.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | 'rotate' takes an arbitrary `degrees` (straighten) + `expand`. 'flip' takes `orientation`. | |
| image | Yes | Image id, as returned by open_photo. | |
| expand | No | rotate only. Resize the canvas to the rotated content's new bounds. Without it, rotated content can fall outside the original canvas and be cropped. | |
| degrees | No | rotate only. Arbitrary angle (straighten), not limited to 90° multiples. Positive rotates clockwise. | |
| orientation | No | flip only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| width | No | |
| height | No | |
| degrees | No | |
| effect_update_failures | No | Names of effect filters (position/direction/size-dependent ones tracked through geometry changes — a center, an angle, an offset, or a size-dependent blur radius under resize) whose own params could not be updated for this transform (a live update failure) -- they were restored to their OLD values in manage_filters's own ledger (guaranteed), and the live render was also asked to restore those same OLD values (best effort — it can, rarely, also fail). Omitted when every filter updated cleanly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/irreversible, but the description adds concrete failure modes beyond them: refusal with masked or externally-created filters, refusal of off-right-angle rotation when position/direction-dependent filters exist, timeout causing session restart and loss of unsaved work, and the workspace pixel limit with expand. This is rich behavioral context an agent cannot infer from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and op semantics before the constraint warnings, and each sentence earns its place (refusals, data-loss, pixel limits). It is dense and long for one tool, but not padded or redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. Given a destructive geometry tool with refusal conditions and timeout risk, the description covers edge cases, ordering constraints, and data-loss scenarios thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five params. The description nonetheless adds useful meaning: expand is characterized as 'like reveal all' with the consequence that corners fall outside the canvas without it, and degrees is framed as arbitrary straightening. This exceeds the baseline without fully duplicating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Rotate or flip the whole photo') and disambiguates the two ops with their parameters. It also names sibling operations it is not (crop, manage_filters), so an agent can distinguish it from adjacent tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit ordering rules ('straighten and flip before adding masked filters, not after'), routing to alternatives (rotate at a right angle instead, or delete the filter via manage_filters), and a prerequisite ('make a checkpoint first when in doubt'). When/when-not/alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transform_layerADestructiveInspect
Transform one layer (layer / layer_id, else the active layer): op selects fit | scale | move | rotate | flip | skew | free, each documented on op. Rotate, skew and free grow the layer so nothing clips; a layer with no transparency gets one (alpha_added). REFUSES when the layer, or the layers inside a group target, carries a masked filter or an unmasked effect this transform cannot keep locked to the content.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | 'fit' scales the layer to fit (letterbox) or fill (cover) the canvas, preserving aspect, and centers it (mode fit|fill, idempotent). 'scale' is uniform (scale_percent) or non-uniform (scale_x_percent/scale_y_percent) — multiplicative, anchored at the layer's own center; a NON-uniform scale is refused while an unmasked position/direction-dependent effect filter (vignette/motion_blur/drop_shadow) is present. 'move' translates — pass exactly ONE of delta (relative), absolute (top-left target), or center_on (center target), each a {x, y} object (flat delta_x/absolute_x fields are not accepted); mixing modes is refused. 'rotate' rotates by relative degrees (positive clockwise) around the layer's own center; the layer GROWS to fit the rotated content — nothing is clipped; an arbitrary (non-90°-multiple) angle is refused while such an effect is present. 'flip' mirrors horizontal|vertical in place (axis). 'skew' slants the layer (skew_h_degrees/skew_v_degrees) around its own center. 'free' is a numeric free transform in one matrix: scale_x_percent/scale_y_percent + degrees + offset_x/offset_y. skew and free are always refused while such an effect is present (no angle is safe for either). A text layer stays a text layer through every op, never rasterized. | |
| axis | No | flip only. 'horizontal' mirrors left-right; 'vertical' mirrors top-bottom. | |
| mode | No | fit only. 'fit' letterboxes inside the canvas (shorter edge touches); 'fill' covers it (longer edge touches, overflow is left outside the canvas, not cropped). Defaults to 'fit'. | |
| delta | No | A document-pixel point: {x, y}. move, RELATIVE mode: offset from the layer's current top-left. Mutually exclusive with absolute/center_on. | |
| image | Yes | Image id, as returned by open_photo. | |
| layer | No | Layer name. Defaults to the selected layer, or the topmost layer if none is selected. Ignored when layer_id is given. | |
| degrees | No | rotate: relative rotation angle, positive clockwise, around the layer's own center. free: relative rotation angle (default 0), applied in the same combined matrix as the scale and offset. | |
| absolute | No | A document-pixel point: {x, y}. move, ABSOLUTE mode: target for the layer's top-left corner. Mutually exclusive with delta/center_on. | |
| layer_id | No | Layer id, as inspect (and any tool that creates a layer) reports it. Takes priority over `layer`, and is the only way to address one of two layers that share a name. | |
| offset_x | No | free only. Horizontal translation in document pixels, applied last. Defaults to 0. | |
| offset_y | No | free only. Vertical translation in document pixels, applied last. Defaults to 0. | |
| center_on | No | A document-pixel point: {x, y}. move, CENTER mode: target for the layer's center point. Mutually exclusive with delta/absolute. | |
| interpolation | No | Resampling filter for this call, every op. Always set explicitly here — never carried over from a previous transform_layer call. | cubic |
| scale_percent | No | scale only. Uniform scale percentage (100 = unchanged). 1..10000. | |
| skew_h_degrees | No | skew only. Horizontal slant angle in degrees — positive slants the top edge right. At least one of skew_h_degrees/skew_v_degrees is required. | |
| skew_v_degrees | No | skew only. Vertical slant angle in degrees — positive slants the left edge down. | |
| scale_x_percent | No | scale/free: horizontal scale percentage (100 = unchanged), 1..10000. scale: pair with scale_y_percent for non-uniform stretch/squash; the other axis defaults to scale_percent, or 100 if that is absent too. | |
| scale_y_percent | No | scale/free: vertical scale percentage. See scale_x_percent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| axis | No | |
| mode | No | |
| bounds | No | |
| degrees | No | |
| layer_id | No | |
| offset_x | No | |
| offset_y | No | |
| text_layer | No | |
| alpha_added | No | |
| interpolation | No | |
| scale_percent | No | |
| skew_h_degrees | No | |
| skew_v_degrees | No | |
| scale_x_percent | No | |
| scale_y_percent | No | |
| effect_update_failures | No | Names of effect filters (position/direction/size-dependent ones tracked through geometry changes — a center, an angle, an offset, or a size-dependent blur radius under resize) whose own params could not be updated for this transform (a live update failure) -- they were restored to their OLD values in manage_filters's own ledger (guaranteed), and the live render was also asked to restore those same OLD values (best effort — it can, rarely, also fail). Omitted when every filter updated cleanly. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, but the description adds substantial context beyond them: rotate/skew/free grow the layer so nothing clips, a layer without transparency gains one (alpha_added), and the precise refusal conditions for masked filters / unmasked effects. This tells the agent about side effects and failure modes the annotations do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler, with the layer-resolution rule and op list front-loaded ahead of side effects and refusals. The first sentence is dense with stacked clauses and backticked tokens, but every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. Combined with coverage of side effects (alpha_added, layer growth), refusal preconditions, and the op selector, an agent has everything needed to invoke this 18-parameter tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself is unusually rich (per-op semantics, mutual exclusions, interpolation carry-over caveat), so the baseline is 3. The description mostly restates the op enum and points to 'each documented on op' rather than adding syntax or format meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (transform) and a clearly scoped resource (one layer, resolved via layer/layer_id or the active layer), and enumerates the op selector values. The 'one layer' scope implicitly separates it from image-level siblings like transform_image, but no sibling is named explicitly, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-not: it REFUSES when the layer or a group's inner layers carry a masked filter or an unmasked effect that cannot stay locked to the content. That is a real applicability gate. It does not, however, route the agent to an alternative tool (e.g. bake, add_effect) when refusal occurs, leaving some inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
- Changed
add_effect4 fields changed- changed
Input schema / properties / spread / descriptionPrevious value: -"outer_glow only. Pixels the glow's solid core grows past the alpha edge before it blurs, 0..100. Default (when creating): 4. SPATIAL."New value: +"outer_glow only. Pixels the glow's solid core grows past the alpha edge before it blurs, 0..50. Default (when creating): 4. SPATIAL." - changed
Input schema / properties / spread / maximumPrevious value: -100New value: +50 - changed
Input schema / properties / width / descriptionPrevious value: -"outline only. Stroke thickness in pixels at full resolution, 1..100 (the grow is capped at 100). Default (when creating): 4. SPATIAL. The stroke grows outward from the layer's alpha edge (round corners) and the layer's own pixels are untouched."New value: +"outline only. Stroke thickness in pixels at full resolution, 1..50. Default (when creating): 4. SPATIAL. The stroke grows outward from the layer's alpha edge (round corners) and the layer's own pixels are untouched." - changed
Input schema / properties / width / maximumPrevious value: -100New value: +50
- Changed
fill6 fields changed- changed
Input schema / properties / center / descriptionPrevious value: -"radial_gradient: where offset 0 sits, in image pixels. Default canvas centre."New value: +"radial_gradient: where offset 0 sits, in image pixels. Default canvas center." - changed
Input schema / properties / color / descriptionPrevious value: -"solid only: the colour as #rrggbb."New value: +"solid only: the color as #rrggbb." - changed
Input schema / properties / end / descriptionPrevious value: -"linear_gradient: where offset 1 sits, in image pixels. Default bottom centre of the canvas."New value: +"linear_gradient: where offset 1 sits, in image pixels. Default bottom center of the canvas." - changed
Input schema / properties / op / descriptionPrevious value: -"'solid': one flat colour. 'linear_gradient': a ramp from start to end. 'radial_gradient': a ramp from a centre out to a radius."New value: +"'solid': one flat color. 'linear_gradient': a ramp from start to end. 'radial_gradient': a ramp from a center out to a radius." - changed
Input schema / properties / start / descriptionPrevious value: -"linear_gradient: where offset 0 sits, in image pixels. Default top centre of the canvas."New value: +"linear_gradient: where offset 0 sits, in image pixels. Default top center of the canvas." - changed
Input schema / properties / stops / descriptionPrevious value: -"Gradient only: 2-8 colour stops {offset 0..1, color #rrggbb, opacity 0..100}, sorted by offset. Colours blend in sRGB (a black to white stop pair reads 128 at the midpoint). Before the first stop and after the last, the end colours hold."New value: +"Gradient only: 2-8 color stops {offset 0..1, color #rrggbb, opacity 0..100}, sorted by offset. Colors blend in sRGB (a black to white stop pair reads 128 at the midpoint). Before the first stop and after the last, the end colors hold."
- Changed
get_histogram1 field changed- changed
Input schema / properties / mask / descriptionPrevious value: -"The name of a selection channel: measure only the pixels it selects at 50% or more (a hard cut, no partial credit for soft edges), e.g. the mean lightness or colour of a selected object. Combines with region and exact; pixels in the result is the number of pixels counted."New value: +"The name of a selection channel: measure only the pixels it selects at 50% or more (a hard cut, no partial credit for soft edges), e.g. the mean lightness or color of a selected object. Combines with region and exact; pixels in the result is the number of pixels counted."
- Changed
make_sticker1 field changed- changed
Input schema / properties / border / maximumPrevious value: -60New value: +50
- Added
select - Added
text - Added
transform_layer
3 tool updates
- Changed
fill2 fields changed- changed
Input schema / properties / mode / descriptionPrevious value: -"The new layer's blend mode: layer's list plus 'lch_color'. 'color' is HSL Color; 'lch_color' (LCh Color) keeps the lightness underneath exactly and swaps only hue and chroma, the better choice for recolouring."New value: +"The new layer's blend mode. 'color' keeps the lightness underneath exactly and swaps only hue and chroma, the usual choice for recoloring." - changed
Input schema / properties / mode / enumPrevious value: -[ - "normal", - "multiply", - "screen", - "overlay", - "soft_light", - "hard_light", - "darken", - "lighten", - "difference", - "exclusion", - "addition", - "subtract", - "divide", - "dodge", - "burn", - "hue", - "saturation", - "color", - "luminosity", - "grain_extract", - "grain_merge", - "lch_color" -]New value: +[ + "normal", + "multiply", + "screen", + "overlay", + "soft_light", + "hard_light", + "darken", + "lighten", + "difference", + "exclusion", + "linear_dodge", + "subtract", + "divide", + "color_dodge", + "color_burn", + "hue", + "saturation", + "color", + "luminosity" +]
- Changed
layer2 fields changed- changed
Input schema / properties / mode / descriptionPrevious value: -"set only. A fixed blend-mode list, not a raw mode name."New value: +"set only. A blend mode from a fixed list. 'color' here is HSL-style, a little different from fill's 'color'." - changed
Input schema / properties / mode / enumPrevious value: -[ - "normal", - "multiply", - "screen", - "overlay", - "soft_light", - "hard_light", - "darken", - "lighten", - "difference", - "exclusion", - "addition", - "subtract", - "divide", - "dodge", - "burn", - "hue", - "saturation", - "color", - "luminosity", - "grain_extract", - "grain_merge" -]New value: +[ + "normal", + "multiply", + "screen", + "overlay", + "soft_light", + "hard_light", + "darken", + "lighten", + "difference", + "exclusion", + "linear_dodge", + "subtract", + "divide", + "color_dodge", + "color_burn", + "hue", + "saturation", + "color", + "luminosity" +]
- Changed
manage_filters1 field changed- changed
Input schema / properties / op / descriptionPrevious value: -"'list' returns every filter on the image (including filters on layers inside groups), top of stack first, with layer/layer_id (which layer the filter lives on, and that layer's id), id/name/operation/visible/mask/source and params. source \"editmamei\" = exact ledger record, with params in add_adjustment's own field names and units, so they can be passed straight back on a re-edit. source \"readback\" = a filter Editmamei did not create; its params are raw property names and units (not add_adjustment fields), lossy for per-channel curves after a reload, and such a filter cannot be re-edited. 'set_visibility' toggles one filter without deleting it. 'delete' removes one. There is no 'reorder' — the editor has no API for it; delete and re-create the filters in the desired order instead."New value: +"'list' returns every filter on the image (including filters on layers inside groups), top of stack first, with layer/layer_id (which layer the filter lives on, and that layer's id), id/name/type/visible/mask/source and params. source \"editmamei\" = exact ledger record, with params in add_adjustment's own field names and units, so they can be passed straight back on a re-edit. source \"readback\" = a filter made outside Editmamei: it is listed as type \"other\" without its settings, and cannot be re-edited. 'set_visibility' toggles one filter without deleting it. 'delete' removes one. There is no 'reorder' — the editor has no API for it; delete and re-create the filters in the desired order instead."
1 tool update
- Changed
open_photo1 field changed- added
Input schema / properties / rawAdded value: +{ + "description": "Only for a RAW camera file (an error for any other source): how it is developed. White balance, exposure and highlight recovery; each is optional.", + "properties": { + "exposure": { + "default": 0, + "description": "Exposure change in stops, -2 to +3.", + "maximum": 3, + "minimum": -2, + "type": "number" + }, + "highlights": { + "default": "blend", + "description": "'clip' cuts blown highlights, 'blend' softens them into the surroundings, 'rebuild' tries to reconstruct them.", + "enum": [ + "clip", + "blend", + "rebuild" + ], + "type": "string" + }, + "white_balance": { + "default": "camera", + "description": "'camera' uses the white balance the camera recorded, 'auto' averages the whole picture.", + "enum": [ + "camera", + "auto" + ], + "type": "string" + } + }, + "type": "object" +}
1 tool update
- Changed
share_edit4 fields changed- changed
Input schema / properties / image / descriptionPrevious value: -"The id of the edited image, as returned by open_photo."New value: +"The id of the edited image, as returned by open_photo. Required unless `share_id` is given." - added
Input schema / properties / previewAdded value: +{ + "description": "True returns the numbered steps (and the chapters, checked, when given) at once, with no draft and no pictures. Default false.", + "type": "boolean" +} - added
Input schema / properties / share_idAdded value: +{ + "description": "A draft's share_id, from an earlier call: revises that draft's `title` or `chapters` instead of making a new one, with no new pictures.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "image" -]
1 tool update
- Changed
open_photo1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Promote bit depth on open. 'keep' leaves the file's own precision; '16' converts to 16-bit BEFORE any grading, which avoids banding from an aggressive tone move on an 8-bit source. On this server '16' is refused above 12.2 MP (memory)."New value: +"Promote bit depth on open. 'keep' leaves the file's own precision; '16' converts to 16-bit BEFORE any grading, which avoids banding from an aggressive tone move on an 8-bit source. On this server '16' is refused above a size limit (memory); overview lists it."
1 tool update
- Changed
add_adjustment1 field changed- changed
Input schema / properties / vibrance / descriptionPrevious value: -"vibrance only. THE vibrance control — a vibrance adjustment must set this field, not `saturation` (a separate, plain multiplier for this type that normally stays at its default). Positive values boost muted/less-saturated colours more than already-saturated ones (skin tones move less than a bright sky); negative desaturates the same way in reverse. Default (when creating): 0."New value: +"vibrance only. THE vibrance control — a vibrance adjustment must set this field, not `saturation` (a separate, plain multiplier for this type that normally stays at its default). The scale follows Photoshop's Vibrance: +10 to +30 is a natural boost, +50 a strong one; negative values desaturate. Unlike Photoshop's, it lifts already-saturated colors (a blue sky, a bright shirt) about as much as muted ones, so check those areas with a histogram above about +50. Default (when creating): 0."
1 tool update
- Changed
share_edit1 field changed- added
Input schema / properties / chaptersAdded value: +{ + "description": "At most 8 chapters covering every step once, in order. Without them the steps are grouped by kind of work.", + "items": { + "properties": { + "steps": { + "description": "The first and last step it covers, numbered from 1.", + "items": { + "minimum": 1, + "type": "integer" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "text": { + "description": "One or two plain sentences on what changed in the photo and why.", + "maxLength": 200, + "type": "string" + }, + "title": { + "description": "What this chunk of work did, e.g. \"Brought out the water\".", + "maxLength": 60, + "type": "string" + } + }, + "required": [ + "title", + "steps" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" +}
1 tool update
- Changed
open_photo1 field changed- changed
Input schema / properties / precision / descriptionPrevious value: -"Promote bit depth on open. 'keep' leaves the file's own precision; '16' converts to 16-bit BEFORE any grading, which avoids banding from an aggressive tone move on an 8-bit source. On this server '16' is refused above 12 MP (memory)."New value: +"Promote bit depth on open. 'keep' leaves the file's own precision; '16' converts to 16-bit BEFORE any grading, which avoids banding from an aggressive tone move on an 8-bit source. On this server '16' is refused above 12.2 MP (memory)."
1 tool update
- Added
share_edit
4 tool updates
- Changed
canvas_size1 field changed- changed
Input schema / properties / fill / descriptionPrevious value: -"'white', 'black', a '#rrggbb' hex color, or 'transparent' (default — no fill layer is added at all; see the note on export_photo/flatten below). Any other choice is painted onto a new, full-canvas layer inserted at the BOTTOM of the whole stack — a solid backdrop behind every existing layer, not just the newly added area, so it also shows through any pre-existing transparency in those layers. On a GRAYSCALE image a hex color renders as its LUMINANCE (a weighted gray, not one channel picked out). transparent: genuinely transparent only in a live, layered document (e.g. saved via save_project) — export_photo and layer op=flatten both flatten first, which fills any transparent area with the ambient background color (white, unchanged by this tool) and drops alpha, not with transparency. A non-transparent fill on an INDEXED image is REFUSED outright, before the canvas resizes at all — indexed has no backdrop layer type to add."New value: +"'white', 'black', a '#rrggbb' hex color, or 'transparent' (default — no fill layer is added at all; see the note on export_photo/flatten below). Any other choice is painted onto a new, full-canvas layer inserted at the BOTTOM of the whole stack — a solid backdrop behind every existing layer, not just the newly added area, so it also shows through any pre-existing transparency in those layers. On a GRAYSCALE image a hex color renders as its LUMINANCE (a weighted gray, not one channel picked out). transparent: genuinely transparent only in a live, layered document — export_photo and layer op=flatten both flatten first, which fills any transparent area with the ambient background color (white, unchanged by this tool) and drops alpha, not with transparency. A non-transparent fill on an INDEXED image is REFUSED outright, before the canvas resizes at all — indexed has no backdrop layer type to add."
- Changed
export_photo6 fields changed- changed
Input schema / properties / bit_depth / descriptionPrevious value: -"PNG/TIFF only: output bit depth. JPEG/WebP are always 8-bit."New value: +"PNG/TIFF/PSD only: output bit depth. JPEG/WebP are always 8-bit." - changed
Input schema / properties / format / enumPrevious value: -[ - "jpg", - "png", - "webp", - "tiff" -]New value: +[ + "jpg", + "png", + "webp", + "tiff", + "psd" +] - added
Output schema / properties / layersAdded value: +{ + "description": "psd only: layers in the file, groups included.", + "type": "number" +} - added
Output schema / properties / may_blend_differentlyAdded value: +{ + "description": "psd only: visible layers below 100% opacity or with a blend mode, which Photoshop may render slightly differently.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / merged_groupsAdded value: +{ + "description": "psd only: groups merged into one layer to keep their filter.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / rasterized_textAdded value: +{ + "description": "psd only: text layers written as pixels.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
get_histogram1 field changed- changed
Input schema / properties / exact / descriptionPrevious value: -"false (default): computed on the 1024px proxy render (~0.3s) — good for iterating, but small clipped highlights can be under-counted. true: full-resolution composite (~4s on 24MP) — the trustworthy final clipping check before export. On a very large document true can take much longer; if it times out the editing session restarts and unsaved work is lost, so save (save_project) first."New value: +"false (default): computed on the 1024px proxy render (~0.3s) — good for iterating, but small clipped highlights can be under-counted. true: full-resolution composite (~4s on 24MP) — the trustworthy final clipping check before export. On a very large document true can take much longer; if it times out the editing session restarts and unsaved work is lost, so save (checkpoint) first."
- Removed
save_project
46 tool updates
- First observed
add_adjustment - First observed
add_effect - First observed
apply_look - First observed
bake - First observed
batch - First observed
canvas_size - First observed
check_listing - First observed
checkpoint - First observed
close_photo - First observed
compare - First observed
convert_mode - First observed
crop - First observed
crop_for_platform - First observed
export_photo - First observed
fill - First observed
find_objects - First observed
get_histogram - First observed
inspect - First observed
layer - First observed
layer_mask - First observed
make_carousel - First observed
make_grid - First observed
make_meme - First observed
make_sticker - First observed
make_story - First observed
manage_filters - First observed
modify_selection - First observed
my_looks - First observed
new_canvas - First observed
open_photo - First observed
overview - First observed
photo_effect - First observed
place_image - First observed
preview - First observed
product_shot - First observed
recolor - First observed
remove_object - First observed
request_upload - First observed
resize - First observed
retouch - First observed
run_steps - First observed
save_project - First observed
select_with_ai - First observed
selection_preview - First observed
status - First observed
transform_image
Publisher details
- Operator
- Editmamei · Publisher source
- Operator website
- https://editmamei.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://connect.editmamei.com/account · Publisher source
- Trust center
- Not available
- Restrictions
- Free and paid plans · Publisher source
Related MCP Connectors
MCP server for Midjourney AI image generation and editing
MCP server for Qwen Image 3 AI image generation
MCP server that lets your AI assistant build and deploy apps, hosting each one at a live URL.
MCP server for Flux AI image generation
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAn MCP server for AI image generation and editing, allowing users to generate images from text, edit existing images with instructions, and manage iterative editing sessions with undo/redo.41 npm1MIT
- AlicenseAqualityDmaintenanceMCP server for AI image generation and editing using Google Gemini image models.7879 npmMIT
- AlicenseAqualityDmaintenanceAn MCP server that provides AI image generation and editing capabilities using Google's Gemini 2.5 Flash Image API. It allows users to create new images from text, modify existing files, and perform iterative edits through natural language prompts.6879 npmMIT
- AlicenseAqualityDmaintenanceMCP server for multi-provider AI image generation (AWS Bedrock, OpenAI, Google Gemini) enabling image generation, transformation, and editing through a unified interface.41MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.